Учитывая массив неотрицательных целых чисел, ваша задача - сохранить только некоторые его элементы, как описано ниже.
Допустим, массив есть
[1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1]
.Сначала получите первый элемент массива
n
. Сохраните первыеn
элементы и откажитесь от следующих (откажитесьn+1
). Новый массив есть[1, 2, 4, 11, 5, 2, 0, 13, 10, 1]
.Затем вы берете элемент, следующий за удаленным, и делаете то же самое. Повторно применяя процесс, мы получаем
[1, 2, 11, 5, 2, 0, 13, 10, 1]
Вы повторяете процесс, пока не достигнете границ массива / в нем не останется элементов. Мы останавливаемся, потому что
11
он превышает длину массива.Теперь вы должны вывести результат.
Ввод / вывод может быть взят / предоставлен в любой стандартной форме. Массив никогда не будет пустым и будет содержать только неотрицательные целые числа. Все стандартные лазейки запрещены.
Это код-гольф, поэтому выигрывает самый короткий код в байтах!
Тестовые случаи
Вход -> Выход [1, 2, 3, 4, 5] -> [1, 3, 4] [6, 1, 0, 5, 6] -> [6, 1, 0, 5, 6] [1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1] -> [1, 2, 11, 5, 2, 0, 13, 10, 1] [2, 2, 2, 2, 2, 2] -> [2, 2] [1, 2, 3, 1, 2, 3, 1, 2, 3] -> [1, 2] [3, 1, 2, 4, 0] -> [] *
* Последний контрольный пример включает в себя 0
, поэтому я решил опубликовать процесс так, чтобы он был более понятным:
[3, 1, 2, 4, 0] --> [3, 1, 2, 0] --> [1, 2, 0] --> [1, 0] --> [0] --> [] )
( Вдохновленный этим вызовом со стороны Эрик Outgolfer )
2
удаляется на первом шаге вместо3
?[1, 2, 3, 1, 2, 3, 1, 2, 3]
n
», вы всегда начинаете с начала массива, чтобы сохранитьn
элементы? Не (как я думал на первый взгляд) хранитьn
элементы там, где первый элемент - этоn
то, что вы оцениваете?Ответы:
Pyth, 18 байт
Попробуй это здесь.
источник
JavaScript (ES6), 45 байт
Контрольные примеры
Показать фрагмент кода
источник
Haskell , 50 байтов
g.pure.(0:)
является анонимной функцией, принимающей и возвращающей списокInt
s, используйте как(g.pure.(0:))[1,2,3,4,5]
.Попробуйте онлайн!
Как это устроено
g
принимает аргумент кортежа, представляющий разделенный список.a
список начальных элементов, сохраненных на предыдущем шаге,_
элемент, который должен быть отброшен,b
следующий элемент, который будет использоваться в качестве длины, иc
остальные элементы.b
, то выполняется новое разбиение и выполняетсяg
рекурсивный анализ. В противном случае он останавливаетсяa
в результате.g.pure.(0:)
запускает все это, вызываяg
кортеж([],0:l)
, гдеl
находится вход, и0
немедленно отбрасываетсяg
.pure
здесь используетсяApplicative
экземпляр для (двоичных) кортежей, а с типом результата([Int],[Int])
удобно помещать свой аргумент в качестве второго элемента в кортеже с[]
первым элементом.источник
Python 3 , 59 байт
Попробуйте онлайн!
источник
Haskell , 51 байт
Попробуйте онлайн! Пример использования:
f [1,2,3,4,5]
.источник
Java 8, 68 байт
Эта лямбда принимает изменяемый
List<Integer>
(поддерживаетremove(int)
, напримерArrayList
). Выход является мутированным входом. ПрисвоитьConsumer<List<Integer>>
.Попробуйте онлайн
Поток управления для этой проблемы очень раздражает. На каждой итерации мы должны удалить элемент и получить элемент на следующей позиции, и обе эти операции требуют проверки диапазона (и любая из них может вызвать завершение программы). Одна из стратегий состоит в том, чтобы выполнить обе операции за одну итерацию цикла с обновлением индекса, защищенным собственной проверкой диапазона. Другая стратегия, которая оказалась короче, заключается в чередовании операций на каждой итерации цикла, что и делает это решение.
источник
APL (Dyalog Classic) , 32 байта
объяснение
Попробуйте онлайн!
источник
Perl 5 , 38 + 1 (-a) = 39 байт
Попробуйте онлайн!
источник
Haskell, 99 байт (88 без отступа)
источник
VI,
3125 байт<C-?>
соответствуетControl + ?
, и<Esc>
кEscape
очевидно. Каждый из них считается за 1 байт (см. Мета ).вход
Входной файл должен содержать 1 целое число в строке + 1 пустую строку в конце, например:
Мы можем видеть каждую строку входного файла как элемент массива, например
1 :: 2 :: 3 :: 4 :: 5 :: []
, как в некоторых языках (например, caml).запуск
Вы можете запустить vi с помощью следующей команды и набрать штрих решения по штриху:
Вы также можете использовать этот однострочник:
Это должно создать файл
output
с правильным результатом из входного файлаinput
.Пояснения
Чтобы представить решение, я сначала представлю 19-байтовое решение, работающее только для массивов без 0. Это решение использует рекурсивный макрос, используемый с небольшими изменениями в конечном решении:
Объяснение частичного решения
Хитрость здесь в том, чтобы использовать
"0
регистр для хранения текущего целого числа (и очень важен разрыв строки). Поэтому команда@0
позволяет переходить поn
строкам (вызыватьn
значение"0
). Если переход превышает количество строк в файле, макрос завершится ошибкой, поэтому программа остановится (за пределами границ массива, как требуется).Но это решение не работает, если вход содержит
0
. Действительно, если"0
значение регистра равно0
, то@0
будет переходить на одну строку (из-за разрыва строки),0
а не так, как нам понравилось. Поэтому следующая команда (dd
) не будет удалять 0-е целое число, а 1-е (не правильно).Правильное решение для обработки
0
- всегда увеличивать целое число перед его восстановлением и уменьшать его сразу после. Таким образом,@0
команда будет переходить поn+1
строкам (n
текущее целое число, которое было увеличено).k
Команда Затем необходимо перейти к линииn
(предыдущей строке). Используя этот трюк, в конце входного файла требуется пустая строка, чтобы избежать выпрыгивания за пределы массива (таким образом, завершая программу), поскольку теперь мы всегда переходимn+1
строки перед переходом к предыдущей строке.Объяснение окончательного решения
Запись содержимого макроса в файл перед его регистрацией позволяет сохранить несколько байтов:
qa...q
и отмены всех изменений после регистрации:let @a="..."
)Правки
# 1
источник
Pyth, 32 байта
Попробуйте онлайн
источник
#VlQ.(Q@QN;Q
делает работу в 12 байтов, и я уверен, что это может быть сделано еще лучшеW<Zl=Q+<Q@QZ>Qh@QZ=Z@QZ)Q
(25). подход pizzakingme гораздо лучше, хотя.#VlQ .(Q@QN)%;Q
. Обратная связь от игроков в гольф Pyth будет приветствоваться, я все еще учусь!C # (.NET Core) , 74 байта
Попробуйте онлайн!
Это берет список целых и изменяет его. Я видел некоторые ответы на Java, которые обходят импорт, используя полное имя в определении аргумента Lambda. Если это не разрешено, я могу удалить этот ответ.
источник
System.Collections.Generic.List<int>
вместо тогоusing System.Collections.Generic
, чтобы добавить это к количеству байтов. Но я думаю, это не отличается от использования массива.using
если хотите; до тех пор, пока сама лямбда не полагается на утверждение, вам не нужно будет включать его в число байтов. Лично я всегда использую полностью квалифицированные имена в тестовом коде просто для того, чтобы было понятно и легко проверить, какой импорт использует лямбда.R ,
6453 байтаРекурсивная функция. Имеет один обязательный ввод,
a
список для пропуска.i
является индексом количества элементов, через которые необходимо перейти (по умолчанию1
), иd
индексом следующего элемента после удаления требуемого значения, который также является индексом элемента, подлежащего удалению. Возвращаетnumeric(0)
пустой вектор для пустого вывода.Попробуйте онлайн!
Ungolfed:
источник