N детей, у которых нет двух одинаковых по размеру, выстроены в определенном порядке. Каждый может сравнивать высоты только со своими непосредственными соседями. Когда учитель кричит «подними руки, если ты самый высокий», они делают это, если они выше, чем оба их соседа, и делают это одновременно. Если только один поднимает руку, он выигрывает. Если несколько человек поднимают руки, все они исключаются из ряда (сохраняя порядок остальных детей), и они повторяют процесс.
Напишите программу, которая берет массив различных целых чисел (вы можете предположить, что они строго положительны) и выводит победителя этой игры. Это код-гольф, поэтому выигрывает самый короткий код.
Примеры (показаны промежуточные этапы):
5 3 9 8 7 → 3 8 7 → 8
1 2 9 4 → 9
9 3 8 7 4 12 5 → 3 7 4 5 → 3 4 → 4
Нынешние лидеры:
- Желе: 17 байт [Деннис ♦]
- MATL: 20 байт [Луис Мендо]
- APL: 28 байт.
- k: 40 байт [Пол Керриган]
Там также идет битва питонов. Все еще жду, чтобы появилось больше языков для игры в гольф.
В настоящее время я принял ответ Дениса ♦ - если будут новые победители, я обновлю выбор.
Ответы:
Желе , 17 байт
Ввод - это целая строка через запятую.
Попробуйте онлайн!
Кредиты отправляются @Xanderhall, @Sherlock и @ErikGolfer для создания основы.
Как это работает
источник
JavaScript (ES6),
787672 байтаСпасибо @ edc65 за -4 байта
Принимает массив целых чисел и выводит массив, содержащий только победителя.
Тестовый фрагмент
Показать фрагмент кода
Вот несколько других попыток использования
.filter
и массивов:Или двойной цикл, ужасно длинный:
объяснение
Это работает довольно просто: он строит массив тех, кто относительно выше (
r
), и массив тех, кто не (q
), а затем возвращает,r
если у него есть только один элемент; если нет, он запускается самq
и возвращает результат этого.источник
q
иr
. Вы избегаете,&&r
и выражение фильтра тоже оказывается на байт короче.MATL , 20 байтов
Ввод - это вектор-столбец, использующий в
;
качестве разделителя.Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Это прямая реализация процедуры, описанной в задании. Цикл
do
...while
продолжает удалять элементы, пока не будет удален только один; и это один выход.Элементы, которые должны быть удалены, определяются путем взятия различий, подписи, а затем различий снова. Те, которые дают отрицательное значение, должны быть удалены.
источник
Python3,
265260248243203121117112111 байтСпасибо @ZacharyT, @orion и @mathmandan за сохранение
545больших байтов!источник
Haskell, 85 байт
Пример использования:
f [9,3,8,7,4,12,5]
->4
.Как это работает:
Вариант, также 85 байт:
Привязать список
b
(см. Выше) к n и вернуть элемент,s
еслиx\\n
это одноэлементный список, и вf n
противном случае.источник
f x|y@(_:z)<-x++[0]=(#)=<<(x\\)$[b|(a,b,c)<-zip3(0:y)y z,b<a||b<c]
.\\
все еще нуждается в импорте. Кстати,tails
также может быть заменен на...|a:b:c:_<-scanr(:)[]$0:x++[0],...
.Mathematica,
107108 байтобъяснение
Сначала установите
x
иy
равняйте вводуList
. Цикл продолжается доLength@y==1
.x~Split~Less
список списков последовательных элементов, увеличивая,Split[x,#>#2&]
список списков последовательных, убывающих элементов. ВзятиеMax
всех списков в первом дает список детей выше, чем ребенок справа от них (вместе с самым правым ребенком). Принятие первого аргумента (#&
) из всех списков в последнем дает список детей выше, чем ребенок слева от них (вместе с самым левым ребенком). Пересечение этих двух будет список детей, которые подняли руку. Установите это равнымy
.x=DeleteCases[x,#|##&@@y]
удаляет изx
любых элементов, соответствующих элементуy
(#|##&
эквивалентноAlternatives
). Как только цикл завершится, вернитесьy
. Если выходные данные должны быть целыми числами (а не списком, содержащим одно целое число), вернуть#&@@y
(+4 байта).Спасибо Мартину Эндеру за то, что он сэкономил 2 байта и заставил меня соблюдать правила. Открыт для предложений.
источник
!Less
работает, как вы ожидаете, так как это на самом деле не оценивает функцию. Возможно, вам придется использоватьGreater
(или#>#2&
) там. Вы можете использоватьx~Split~Less
для первого,Split
хотя и>
дляLength
условия.Clear@y
между вызовами функций, я боюсь, что это не правильно . Вам придется либо сбросить его самостоятельно, улучшить его, либо превратить в полноценную программу с помощьюInput
иPrint
.Perl 6 , 111 байт
Expanded:
источник
Python 2,
10098 байтИспользует возврат с коротким замыканием, как в ответе Йодля (Захария Т)
источник
+=b,
вместо+=[b]
(кредит на матмандан), с помощью,t=[0]
чтобы использовать,t
чтобы добавить кA
, и затем, так как теперь мы начинаем с 0 вt
, проверкаt[-2]<1
короче, чемlen(t)<2
, и использоватьt[1]
в качестве результата в этом случае.return t[-2]and f(l)or t[1]
.Mathematica, 101 байт
Безымянная рекурсивная функция, принимающая список чисел в качестве входных данных и возвращающая список с одним числом (победителем) в качестве выходных данных.
Ядро алгоритма
Max/@Partition[#,3,1,{2,2},0]
, которое вычисляет массив (-max-of-me-and-my-соседей) из входного списка.a=Position[...-#,0]
затем вычитает исходный список и возвращает, где 0; это дети, поднимающие руки.If[Equal@@a, #[[Last@a]], #0@Fold[Drop@##&,#,Reverse@a]]&
ветви в зависимости от того, все ли элементыa
равны или нет (в этом случае они будут только в том случае, еслиa
это одиночный элемент); если так, то этот ребенок является победителем, и мы выводим ее номер; если нет, то мы рекурсивно вызываем эту функцию в списке со всеми элементами вa
удаленных позициях .источник
Python 2, 99 байт
источник
PHP, 131 байт
Берет числа из аргументов командной строки. Сбой, если имя файла начинается с положительного числа.
сломать
источник
к, 40 байт
Объяснение:
$ - это if-else.
Условием является то, является ли 1 суммой B, которая определяется как минимум двух списков, сгенерированных путем проверки, больше ли x, чем предыдущая и последующая позиции (труба обратная).
Если это правда, мы возвращаем x, где B верно.
В противном случае мы вернемся без истинных позиций.
источник
Scala 129 байт
Golfed
Ungolfed
Заполняя список влево и вправо нулями, можно затем сгруппировать в наборы по 3 и разбить список на те, где рука поднята, большинство левого и правого элементов сравниваются с 0 на внешней стороне, поэтому получают правильное число (при условии, что высота nobodys отрицательно!)
источник
C ++ 14, 182 байта
Узнал, что троичный оператор может использоваться с объектами C ++. Требует, чтобы входные данные были контейнером произвольного доступа с
push_back
, вродеvector
,deque
иlist
.Создает два контейнера
t
иs
одного и того же типа и добавляет местное самое высокое вt
и остальноеs
. Если есть только 1 элементt
взамен этого, в противном случае рекурсивный вызов сам сs
.Ungolfed:
источник
R, 83 байта
Две разные версии:
Этот занимает вектор N:
Эта функция создает рекурсивную функцию F:
источник
APL (Dyalog Unicode) , 28 байтов SBCS
Попробуйте онлайн!
источник