вход
Список неотрицательных целых чисел.
Выход
Наибольшее неотрицательное целое число, h
такое, что по крайней мере h
число в списке больше или равно h
.
Тестовые случаи
[0,0,0,0] -> 0
[12,312,33,12] -> 4
[1,2,3,4,5,6,7] -> 4
[22,33,1,2,4] -> 3
[1000,2,2,2] -> 2
[23,42,12,92,39,46,23,56,31,12,43,23,54,23,56,73,35,73,42,12,10,15,35,23,12,42] -> 20
правила
Вы можете написать либо полную программу, либо функцию, также разрешены анонимные функции. Это код-гольф, поэтому побеждает меньшее количество байтов. Стандартные лазейки запрещены.
Задний план
Ч-индекс представляет собой понятие , которое используется в научных кругах , которая стремится захватить влияние и производительность исследователя. Согласно Википедии, у исследователя есть индекс h , если он опубликовал h научных статей, каждая из которых была процитирована в других статьях как минимум h раз. Таким образом, эта задача заключается в вычислении h-индекса из списка счетчиков цитирования.
Обновить
Вау, отличные ответы со всех сторон! Я принял самый короткий вариант, но если кто-то придумает еще более короткий, я соответствующим образом обновлю свой выбор.
Победители по языку
Вот таблица победителей по языкам, которые я также постараюсь держать в курсе. Я включил все посты с неотрицательной оценкой. Пожалуйста, поправьте меня, если я допустил ошибку здесь.
- APL : 7 байтов @MorisZucca
- Bash + coreutils : 29 байт от @DigitalTrauma
- C # : 103 байта от @ LegionMammal978
- C ++ : 219 байт, @ user9587
- CJam : 15 байтов @nutki
- GolfScript : 13 байтов @IlmariKaronen
- Haskell : 40 байтов @proudhaskeller
- J : 12 байт от @ ɐɔıʇǝɥʇuʎs
- Java : 107 байт @Ypnypn
- JavaScript : 48 байт, @ edc65
- Mathematica : 38 байтов @ kukac67
- Perl : 32 байта @nutki
- Pyth : 10 байтов @isaacg
- Python : 49 байтов @feersum
- R : 29 байт @MickyT
- Рубин : 41 байт @daniero
- Scala : 62 байта @ChadRetz
- SQL : 83 байта @MickyT
- TI-BASIC : 22 байта @Timtech
CJam, 15 байтов
Прямой перевод моего Perl-решения.
источник
l~$W%{W):W>},,
- 14 байт{$W%ee::<1b}
(ee
было добавлено 2015-04-17) и{$W%_,,.>1b}
(.
было добавлено 2015-02-21).J (
1312)Очень похоже на решение Рандомры. Демонстрация:
источник
#\<:
вместоi.@#<
сохранения персонажа.Mathematica,
44424038 байтАнонимная функция:
Запустите его, прикрепив ввод до конца так:
источник
#>i++
. Я проверил еще несколько случаев. (И спасибо за все предложения!)SQL
819483Учитывая таблицу (I) значений (V), следующий запрос вернет h. Протестировано в PostgreSQL, а также будет работать в SQL Server. Редактировать Сделайте так, чтобы он возвращал 0, а не NULL. Сделано лучше с COUNT, спасибо @nutki
SQLFiddle пример
По сути, он нумерует строки в порядке убывания значений. Затем он возвращает максимальный номер строки, где номер строки больше, чем равно значению.
источник
COUNT(R)
вместоCOALESCE(MAX(R),0)
более короткого решения проблемы NULL.Р,
393529Учитывая вектор целых чисел в i и используя логику обратной сортировки, возвращается
длинавектора, где номер элемента меньше s. Спасибо @plannapus за хороший совет.источник
s=sort(i);sum(s>=length(s):1)
CJam, 23 байта
Это принимает список в виде массива на STDIN, как
Проверьте это здесь.
Вы можете использовать это для запуска всех тестовых случаев:
объяснение
Логика немного отсталая, но она сэкономила пару байтов. По сути, блок, переданный для сортировки, возвращает
0
допустимых кандидатов и т1
. Д. Таким образом, действительные кандидаты идут первыми в отсортированном массиве. И поскольку сортировка стабильна, и мы начинаем со списка от N до 1, это вернет наибольшее допустимое значение h.источник
Perl 5: 32 (30 + 2 для
-pa
)Занимает разделенный пробелами ввод в STDIN:
источник
sort{$b-$a}
сохраняет еще 2Python (63)
В основном прямой порт моего решения J. Очевидно, намного дольше, как можно себе представить.
источник
enumerate
.Хаскелл, 40
это ищет первое число, которое не соответствует схеме и возвращает его предшественника.
источник
until
: Попробуйте онлайн!Руби
4441Рекурсивная, более или менее та же стратегия, что и в решении xnor Python:
Ruby 52
Нерекурсивна:
«Стабби» лямбда / анонимные функции, требующие Ruby 1.9 или новее. Позвоните, например, с
f[[22,33,1,2,4]]
источник
Bash + coreutils, 29
Ввод взят из стандартного ввода в виде списка, разделенного новой строкой.
sort
целые числа в порядке убыванияnl
добавляет к каждой строке префикс с номером строки на основе 1, отделяя номер строки и остаток строки большим, чем>
bc
. Целые числа, меньшие, чем их номер строки, приводят к 0. В противном случае 1.grep
подсчитывает количество0
s, то есть число целых чисел, больше или равноеh
пример
источник
JavaScript (ES6) 48
Рекурсивное решение.
Тест в консоли FireFox / FireBug
Выход
источник
f=(l,h=0)=>l.map(v=>x+=v>h,x=0)&&x>h?f(l,h+1):h
. Тем не менее, ваше решение будет 47 байт тоже , если вы просто изменитьh=-1
кh=0
.Java 8, 116 байт.
Полный класс:
Функция:
источник
APL, 12 символов
(+/⊢≥⍒)⊂∘⍒⌷⊢
источник
C ++
815219 из (wc -c main.cpp)Хорошо, вот один из худших кодов, которые я когда-либо писал! :)
источник
Желе, 6 байт
Объяснение:
источник
CJam, 22 байта
Принимает список в качестве входных данных:
Выход:
Попробуй здесь
источник
GolfScript, 13 байт
Протестируйте этот код онлайн. 1
Принимает ввод как массив в стеке. Использует тот же алгоритм, что и решение Pyers feersum , перебирая числа в массиве и увеличивая счетчик от 0 до тех пор, пока он не станет равным или не превосходит текущий элемент массива.
1) Кажется, что онлайн сервер GolfScript снова испытывает случайные таймауты. Если для программы истекло время ожидания, попробуйте перезапустить ее.
источник
TI-BASIC, 22 байта
ASCII представление:
Шестнадцатеричный дамп:
Получает список в качестве входных данных. Начиная с Ans = 0, проверяется, являются ли хотя бы Ans + 1 из чисел хотя бы Ans + 1. Если это так, увеличивает Ans и повторяет цикл. Если нет, выводит Ans.
источник
JAGL Alpha 1.2 - 14
Не считается, потому что функциональность обратного массива 'C' была добавлена после вопроса, но все равно отвечаю для шутки.
Предполагается, что массив является первым элементом в стеке и помещает ответ на вершину стека.
Для печати просто добавьте
P
в конце, добавив байт.Объяснение:
источник
J,
1511 символов(Текущее самое короткое J-решение.)
Сравнивает
<:
отсортированные\:~
элементы списка с 1..n + 1#\
и считает истинные сравнения+/
.Проверка сходства с другим J-решением на 100 случайных тестовых случаях:
источник
Reng v.3.2, 43 байта
Попробуй это здесь! Этот код можно разделить на три части: начальную, вычислительную и конечную.
начальный
Это хранит
1
доx
, длина стека вводаk
кy
, и получает все входные данные (aïí
) , который затем отсортированные ('
).1ø
переходит к следующей строке, т. е. к следующей части.вычислительный
Ренг не имеет встроенного неравенства. Таким образом, алгоритм должен быть реализован. Самый короткий алгоритм, который я нашел,
a < b
это%:1,%1e
; это выглядит так:Я уверен, что это прояснилось! Позвольте мне объяснить дальше.
x % 1
модуль с 1, отображаетсяx
на(-1,1)
. Мы знаем, что(a/b) % 1
этоa/b
когдаa < b
. Таким образом, это выражение равноa < b
.Тем не менее, это не очень хорошо работает из-за проблем с модулем с нуля. Итак, мы изначально увеличиваем каждый элемент стека и счетчик.
После того, как мы получаем неравенство Boolean в стеке,
x+
добавляем его в x, но оставляем его в стеке на данный момент.y1-
уменьшаетсяy
и?^
повышается тогда, когдаy == 0
мы переходим к финальной фазе. В противном случае мы вкладываемy-1
вy
и новоеx
вx
.окончательный
Это извлекает остаток
y-1
из стека, уменьшает результат, выводит его и завершает программу.источник
05AB1E , 5 байтов
Попробуйте онлайн! или как тестовый набор
объяснение
источник
Mathematica, 57 байт
Это анонимная функция, принимающая список и возвращающая целое число, например
Используйте это, чтобы проверить все тестовые случаи:
источник
C #, 103
Анонимная функция.
Отступ:
источник
Скала, 62
источник