Учитывая массив Integer:
- Начните с первого номера
- Перейти вперед на n позиций, где n - значение текущей позиции
- Удалить текущую позицию, сделав следующую позицию текущей позицией.
- Переходите к шагу 2, пока не останется один номер
- Распечатать этот номер
правила
Обтекание массива (следующее число после последнего числа в массиве является первым числом).
Ноль удаляет себя (очевидно).
Отрицательные числа не допускаются в качестве входных данных.
Тестовые случаи
[1] => 1
[1,2] => 1
[1,2,3] => 3
[1,2,2] => 1
[1,2,3,4] => 1
[6,2,3,4] => 4
[1,2,3,4,5] => 5
[0,1] => 1
[0,0,2,0,0] => 0
Пошаговый пример
[1,4,2,3,5]
^ start from the first position
^ jump 1 position (value of the position)
[1, 2,3,5] remove number in that position
^ take next position of the removed number (the 'new' 'current' position)
^ jump 2 positions
[1, 2,3 ] remove number in that position
^ take next position (looping on the end of the array)
^ jump 1 position
[1, 3 ] remove number in that position
^ take next position (looping)
^ jump 3 positions (looping on the end of the array)
[ 3 ] remove number in that position
print 3
Пример № 2
[4,3,2,1,6,3]
^ start from the first position
^ jump 4 positions
[4,3,2,1, 3] remove number in that position
^ take next position
^ jump 3 positions
[4,3, 1, 3] remove number in that position
^ take next position
^ jump 1 positions
[4,3, 1 ] remove number in that position
^ take next position
^ jump 4 positions
[4, 1 ] remove number in that position
^ take next position
^ jump 1 position
[ 1 ] remove number in that position
print 1
Это код-гольф , выигрывает самый короткий ответ в байтах!
code-golf
array-manipulation
workoverflow
источник
источник
Ответы:
Шелуха , 7 байт
Это возвращает результат в виде одноэлементного списка
Попробуйте онлайн!
объяснение
источник
Haskell ,
545048 байтовПопробуйте онлайн!
Объяснение:
f[x]=x
: Если данный список является одноэлементным списком, вернуть его элемент.f(x:r)=f$ ...
: В противном случае рекурсивно применимоf
к следующему списку:cycle$x:r
),x+1
удаленными первыми элементами (drop(x+1)$
),r
. (snd<$>zip r
это более короткая альтернативаtake(length r)
).Предыдущая 54-байтовая версия:
Попробуйте онлайн!
источник
Рубин , 37 байт
Изменяет массив на месте, что представляется приемлемым в качестве вывода. Попробуйте онлайн!
источник
MATL , 21 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Python 3 ,
5451 байтВыход представляет собой одноэлементный список.
Попробуйте онлайн!
источник
CJam , 15 байтов
Попробуйте онлайн!
объяснение
Вместо отслеживания указателя, я просто циклически сдвигаю массив так, чтобы текущий элемент всегда был впереди.
Интересная альтернатива, которая, к сожалению, не сохраняет байтов:
источник
Brain-Flak , 88 байт
Попробуйте онлайн!
объяснение
источник
Python 2 , 55 байт
Попробуйте онлайн!
Выводится в виде одноэлементного списка, как это разрешено по умолчанию . Благодаря Деннису удалось сэкономить несколько байтов , напомнив мне, что изменение аргумента функции разрешено.
Как это устроено
def f(a)
- Определяет функцию с параметромa
.while a[1:]:
- Хотяa
с первым удаленным элементом является правдой, запустите блок кода, чтобы следовать. Список с одним или несколькими элементами является правдивым, а пустые списки ложными в Python, поэтому это остановится, как толькоa
достигнет длины 1.l=a[0]%len(a)
- Возьмите первый элемент и получите остаток от его деления на длинуa
. Присвойте результатl
.a[:]=a[-~l:]+a[:l]
- Повернитеa
влево поl
элементам и удалите первый, назначая его наa
место.Python 2 , 63 байта
Попробуйте онлайн!
Хотя и дольше, это выглядит намного элегантнее. Также спасибо ovs за помощь в чате.
источник
a,*b=input()
(python3) и сохранить несколько байтов? Однако я не уверен, как это повлияло быl
и на ломтикЖеле , 7 байт
Попробуйте онлайн!
Полная программа.
источник
ḷ/
чертовски умно.Желе , 9 байт
Попробуйте онлайн!
-2 байта благодаря пользователю 202729
объяснение
источник
Python 3 , 60 байт
Попробуйте онлайн!
-3 байта благодаря овсу
источник
APL (Дьялог) ,
2018 байтПопробуйте онлайн!
источник
Mathematica, 36 байт
использует алгоритм Мартина
-5 байтов от Миши Лаврова и Мартина Эндера
Попробуйте онлайн!
источник
#//.{x_,y__}:>Rest@RotateLeft[{x,y},x]&
. (Это останавливается, когда есть только один элемент, потому что он{a}
больше не соответствует шаблону{x_,y__}
.)y
, вызвав весь список,l
а затем используяl
вместо{x,y}
.#//.l:{x_,__}:>Rest@RotateLeft[l,x]&
?J ,
2117 байт-4 байта благодаря FrownyFrog
Попробуйте онлайн!
Оригинал:
([:}.{.|.])^:(1<#)^:_
Как это устроено:
^:_
повторяйте, пока результат не перестанет меняться^:(1<#)
если длина списка больше 1{.|.]
поверните список влево его первый элемент раз[:}.
бросьте первый элемент и закройте вилкуПопробуйте онлайн!
источник
JavaScript (ES6),
5460 байтСохранено 1 байт благодаря исправленной версии @Shaggy
(+6 байт)
Модифицирует входной массив , который уменьшается до одиночного.
Контрольные примеры
Показать фрагмент кода
Как?
Мы рекурсивно применяем алгоритм, описанный в задаче. Только условие остановки
1/a
может показаться немного странным. При применении арифметического оператора:NaN
и1/NaN
такжеNaN
(ложно).1/0 = +Infinity
или1/N = positive float
для N> 0 (как truthy).источник
splice
модифицирует исходный массив, вы могли бы сделатьf=(a,p=0)=>1/a||f(a,p=p+a[p]%a.length,a.splice(p,1))
для 52 байтовf=(a,p=0)=>1/a?a:f(a,p=(p%a.length+a[p%a.length])%a.length,a.splice(p,1))
это нормально, но может быть оптимизированоp+a[p]
могут быть удалены. Что, конечно, не так. Спасибо за сообщение об этом!Юлия 0,6 ,
4642 байтаПопробуйте онлайн!
Простая рекурсивная версия Юлии.
x[]
обращается к первому элементу x.источник
Java 8, 79 байт
Эта лямбда принимает
Stack<Integer>
и возвращаетint
илиInteger
.Попробуйте онлайн
Ungolfed
Подтверждения
источник
i%=s
может быть удалено в случаеl.get(i)
измененияl.get(i%s)
Pyth , 9 байт
Попробуй это здесь!
Это выводит результат в виде одноэлементного списка, как это разрешено по умолчанию .
Как это устроено
Примечание. Если вы не хотите видеть эти скобки, просто добавьте
h
илиe
перед целым кодом.источник
Swift , 87 байт
Возвращает как одноэлементный список путем изменения ввода . Попробуйте онлайн!
объяснение
источник
Perl 6 ,
4645 байт(-1 байт благодаря Брэду Гилберту)
Попробуйте онлайн!
($_, { ... } ... 1)
генерирует последовательность списков, начиная со входного списка$_
, каждый последующий элемент генерируется выражением фигурной скобки и заканчивая, когда список smart-совпадает1
--ie, имеет длину 1. Трейлинг[* - 1]
получает последний элемент и последний[0]
удаляет единственный элемент из этого списка.(|$_ xx *)
генерирует плоскую, бесконечно реплицированную копию текущего элемента. Этот список индексируется с диапазоном.[0] + (1 ..^ $_)
для извлечения следующего конечного списка в серии.источник
[*-1][0]
может быть объединен в[*-1;0]
сохранение байта. И1..$_-1
лучше написано как1..^$_
снова сохранение байта.[*-1;0]
, но, похоже, это не эквивалентно. Затем функция возвращает список, а не число.1..^$_
оптимизациюPerl 5 ,
474341 + 2 (-ap
) = 43 байтаПопробуйте онлайн!
Принимает ввод в виде разделенных пробелами чисел.
источник
$x%=@F,splice@F,$x=($x+$F[$x])%@F,1while$#F;$_="@F"
Haskell , 56 байт
Попробуйте онлайн!
источник
Python 3 ,
5756 байтПопробуйте онлайн!
источник
Java 8 , 325 байт
Golfed:
Ungolfed:
источник
static
ключевые слова. Обычно мульти-методические решения реализуются как нестатические члены класса иmain
создают экземпляр для тестирования. Кроме того, если вы делаете это таким образом, вы поддерживаете Java 7 и можете представить просто «решение Java». Для дальнейшего использования формат ввода здесь достаточно гибок, поэтому, например, вы можете принять входные данные какList
(что весьма полезно для этой проблемы).APL + WIN, 36 байт
Объяснение:
Подсказки для ввода с экрана.
источник
Python 2, 61 байт
источник
JavaScript,
585659 байтВозвращает результат как единственный элемент, оставшийся во входном массиве, который обновляется на месте.
Два байта сохраняются с помощью оператора, разделенного запятыми, вместо оператора блока в теле цикла for! Три байта потеряны, чтобы пропустить элемент, удаленный в конце массива (:
Менее гольф:
источник
[3, 5, 7, 9]
.[3,5,7,9]
. Ожидаемое значение 5Brain-Flak , 104 байта
H.PWiz имеет более короткий ответ здесь , что я помог сделать, вы должны проверить его.
Попробуйте онлайн!
объяснение
источник
Чисто , 78 байт
Использует тот же метод, что и ответ Лайкони на Haskell .
Попробуйте онлайн!
источник
R 111
117126байтСпасибо @Giuseppe за то, что он проиграл 11 байтов, переключившись на цикл while, получил еще 4, удалив функцию и непосредственно прочитав ввод пользователя.
Я не очень хорошо себя чувствую о том, что потребовалось, чтобы попасть туда - я уверен, что существует более элегантное решение.
Попробуйте онлайн!
Код без правил
источник
f=
необходимо включить имяwhile
я думаю, это потенциально на 1-3 байта короче с циклом.while
цикломf=
часть рекурсивной функции. :(