Вдохновленный этим вопросом:
Создайте функцию (или полную программу), которая получает список чисел и выводит список, перестроенный таким образом, чтобы числа с четными индексами появлялись первыми, а за номерами с нечетными индексами следовали. Значения самих чисел не влияют на порядок - влияют только их индексы. Все индексы начинаются с нуля.
Например:
Входные данные: [0, 1, 2, 3, 4]
Выход: [0, 2, 4, 1, 3]
Другой пример:
Входные данные: [110, 22, 3330, 4444, 55555, 6]
Выход: [110, 3330, 55555, 22, 4444, 6]
Используйте наиболее естественное представление для списков, которые есть у вашего языка. Нет никаких ограничений на сложность (например, распределение временного списка в порядке - нет необходимости делать это на месте).
PS Это должно работать для пустого списка (пустой ввод => пустой вывод).
источник
Ответы:
Japt , 1 байт
Попробуйте онлайн!
источник
Python, 23 байта
Попробуйте онлайн
источник
lambda
? Почему нетmu
илиnu
? : Plambda
наλ
и уменьшить количество байт на 5! : PПиф, 5
Попробуйте онлайн или запустите Test Suite
объяснение
источник
CJam, 7 байтов
Выдвигает блок (ближайший к неназванной функции), который преобразует верхний элемент стека по мере необходимости.
Проверьте это здесь.
объяснение
В объяснении предполагается, что вершиной стека является массив
[0 1 2 3 4]
. Фактические значения не влияют на вычисления.источник
Лабиринт ,
2825242322 байтаЭто было безумно весело! :) Это самая плотно сжатая программа Лабиринт, которую я когда-либо писал. У меня было так много версий на 20 и 21 байт, которые почти сработали, и я все еще сомневаюсь, что это оптимально ...
Он принимает входные данные в виде списка натуральных чисел (с произвольным разделителем) и выводит результат в STDOUT как целые числа, разделенные переводом строки.
Охота на 20/21 байт: я проверил все программы вида
где
X
любой разумный характер грубой силой, но не нашел каких-либо действительных решений. Конечно, это не означает, что более короткого решения не существует, но невозможно заставить 20-байтовые программы без приличного количества предположений о его структуре.объяснение
(Объяснение немного устарело, но я все еще не уверен, что решение является оптимальным, поэтому я подожду с его обновлением.)
Итак, обычно лабиринтные программы должны выглядеть как лабиринты. Пока указатель инструкций находится в коридоре, он будет следовать за этим коридором. Когда IP-адрес достигает любого вида соединения, направление определяется на основе верхнего значения основного стека Лабиринта (Лабиринт имеет два стека с бесконечным количеством нулей внизу). Как правило, это означает, что любой нетривиальный цикл будет довольно дорогим, потому что если у вас повсюду непустые ячейки, все является соединением, и в большинстве случаев вершина стека не будет иметь правильное значение для IP. идти по пути, который вы хотели бы выбрать. Итак, что вы делаете, вы увеличиваете петли так, чтобы они имели единое целое в центре только с одной четко определенной точкой входа и выхода каждая.
Но в этот раз мне действительно повезло, и все так хорошо сочеталось друг с другом, что я мог сложить все в один большой комок. :)
Поток управления начинается на
_
юге._
Толкает ноль на основной стек. Это может показаться неактивным, но это увеличивает (неявную) глубину стека, до1
которой мы будем нуждаться позже.?
читает целое число из STDIN. Если больше нет целых чисел для чтения, это толкает ноль. В этом случае IP-адрес продолжает двигаться на юг и сразу же@
завершает работу программы (поскольку список ввода пуст). В противном случае IP поворачивает на восток.Сейчас мы входим в очень узкий цикл с двумя точками выхода:
!
возвращает целое число обратно в STDOUT, оставляя только ноль в стеке. IP продолжает двигаться на восток и?
читает следующее целое число. Если это не ноль, мы берем право и движемся на юг.?
читает другой (следующий четный индекс). Опять же, если это не ноль, мы берем право и движемся на запад.Затем
\
печатает перевод строки без изменения стека, поэтому мы делаем еще один поворот вправо, двигаясь на север.!
выводит следующее целое число четного индекса Поскольку теперь в стеке есть хотя бы одно (положительное) нечетное целое число, мы продолжаем поворачивать направо и цикл повторяется.Как только один из них
?
попадает в конец списка, они нажимают ноль и двигаются прямо на соответствующий;
, который отбрасывает этот ноль.В случае, если в списке был только один элемент, мы закончили (потому что мы распечатали это сразу), поэтому IP продолжит двигаться на восток до самого
@
конца, снова завершив программу (печатая завершающий перевод строки в пути).В противном случае нам также необходимо вывести нечетные целые числа. В этом случае два пути (из двух точек выхода первого цикла) сливаются в середине
"
, поворачивая на восток в любом случае._
толкает ноль, чтобы избежать перехода влево@
, и;
сбрасывает этот ноль. Теперь мы входим в новый цикл:IP вводит это в левую нижнюю ячейку, двигаясь на север, обходя петлю по часовой стрелке.
}
Сдвигает верхнюю часть основного стека к вспомогательной стеке. Пока в стеке все еще есть элемент, IP продолжает делать свое дело. Как только все было перемещено во вспомогательный стек (и полностью изменено в процессе), IP продолжает двигаться на восток, входя в последний цикл:\
снова печатает перевод строки,{
перемещает элемент из вспомогательного стека обратно в основной. Если это все еще был элемент списка, он будет положительным, и IP поворачивается на юг, где элемент печатается!
. Затем#
толкает глубину стека (и именно здесь_
важна начальная буква, потому что это#
обеспечивает положительную глубину стека), так что IP все еще поворачивается направо, через\
и{
снова.После того, как мы распечатали все,
{
вытянули ноль из нижней части вспомогательного стека, IP-адрес продолжился на восток и@
завершил программу.источник
МАТЛАБ, 24
похож на питона.
Спасибо @LuisMendo за сохранение 2 байта!
источник
@(x)x([1:2:end 2:2:end])
Haskell , 37 байт
Попробуйте онлайн!
foldr
Рекурсивно создает список четные и нечетные список. Добавление элемента к списку обновляется путем добавления его к нечетному списку, вызова нового четного списка и вызова предыдущего четного списка новым нечетным списком. Затем пара[l,r]
конкатернируется кl++r
.Спасибо Эрджану Йохансену за сохранение 5 байтов с использованием двухэлементных списков вместо кортежей.
42 байта:
Добавляет индексы в список
l
и фильтрует четные или нечетные.Еще один формат для 44. Функция
g
принимает каждый элемент с четным индексом. Нечетные индексы получают, сначала отбрасывая элемент, а затем применяяg
. Если быl
был гарантирован непустой, мы могли бы просто сделатьtail
за 41источник
l#(a:b:c)=a:(l++[b])#c;l#x=x++l;f=([]#)
сf
основной функцией.concat
не кортежи иuncurry(++)
.PowerShell v3 +,
75674947 байтПопробуйте онлайн!
Ожидается ввод через сплаттинг, как показано на ссылке TIO.
Создает матрицу
$l
в виде массива массивов, а затем направляет входные данные$args
в цикл|%{}
. Каждый раз в цикле мы добавляем элемент в один из двух дочерних массивов$l
, переворачивая$f
переменную с помощью логической логики. Первый раз через,$f
является$null
, то!
из которых$true
, или1
при индексации в массив. Это означает, что первый элемент помещается во второй массив$l
, поэтому$l[1]
выводится первым.Реквизиты TessellatingHeckler за помощь в игре в гольф и этот вариант.
-2 байта благодаря масси.
Предостережения
Строго говоря, когда вопрос написан, это технически неверно, поскольку PowerShell не имеет понятия «списки» как псевдо-неизменяемые объекты, только массивы или хеш-таблицы (или словари). Итак, я рассматриваю строку вопроса « Использовать наиболее естественное представление для списков, которые есть у вашего языка », как вопрос о массивах, так как это самый близкий PowerShell. Кроме того, выходные данные представляют собой один элемент в строке, поскольку это стандартный способ PowerShell для записи массива. Это означает ввод
(0,1,2,3,4)
воли0\r\n2\r\n4\r\n1\r\n3\r\n
.источник
$args
+ splatting вместо$input
и,@()*2
вместо@(),@()
F #,
797756Основано на одном из ответов на Haskell
Сначала мы индексируем список, а затем разбиваем его по критериям: первый элемент (индекс) с 1 равен 0.
Это дает нам пару списков пар; первый список будет содержать все проиндексированные четы, а другой - индексированные шансы.
Исходя из этого, мы собираем два списка с помощью оператора добавления и, наконец, отбрасываем индекс.
Редактировать: пропущено очевидное, нет необходимости называть арг "xs" (привычки), поэтому можно сократить до 1-буквенного имени
У меня также есть потенциальный 76-байтовый, который в основном такой же, но определяется как композиция функций. Проблема в том, что он не компилируется как значение, но эффективно работает с любым заданным аргументом списка, поэтому неуверенно, нормально это или нет:
Примечание: List.indexed доступен только с F # 4.0, хотя еще не документирован в MSDN
источник
fun
правда?-> \xs { xs.pairs.classify( *.key%%2, :as( *.value ) ).map( *.value.Slip ) }
Предполагая, что|>
в F # примерно эквивалентно правому оператору подачи==>
в Perl 6. Я также только догадываюсь относительно того, чтоfst>>(&&&)1>>(=)0
делаетJavaScript (ES6), 52 байта
Это также делает это за один проход
Показать фрагмент кода
источник
F=
с самого начала; Вы можете сохранить байт, используя это:(i*=2)>=(z=x.length)?i-z+--z%2:i
Юлия, 23 байта
источник
J, 8 байт
Это монадический (с одним аргументом) глагол, используемый следующим образом:
объяснение
источник
/:0:`1:\
также 8 байтов.Желе , 4 байта
Попробуйте онлайн!
Основано на ответе Мартина CJam
источник
Mathematica, 40 байт
{}[[2;;;;2]]
выдаст ошибку.источник
Бурлеск, 12 байт
Использование как в:
Объяснение:
Хотя после выпуска нового обновления вы можете сделать это с помощью нового встроенного Unmerge (что противоположно
**
встроенному слиянию ):источник
Perl,
3533 байта31 байт + 2 байта для
-ap
. Читает разделенную пробелами строку из STDIN:Когда ввод пуст, печатается один пробел, который я бы посчитал эквивалентным пустому списку. Если нет, может быть исправлено по стоимости 4 байта с помощью:
(требуется Perl 5.10+, печатает завершающий перевод строки)
или по стоимости 5 байтов с:
(без пробелов)
Как это работает
В этом решении используется
-a
флаг, который разбивает входные данные на пробелы и помещает результаты в@F
массив.Настоящая магия происходит в
push
:$|
Переменная обычно используется для принудительного вывода гиперемию, но у него есть еще одно интересное свойство: когда декрементируется раз, его значение переключению между 0 и 1.Воспользовавшись тем , что нет никаких ограничений на идентификаторах , указанных с помощью символического разыменования , мы попеременно толкать элементы массива на
@0
и@1
массивы, поэтому в@0
конечном итоге со всеми четными индексированными элементами и@1
с коэффициентом. Затем мы просто объединяем строковые массивы, чтобы получить наш вывод.источник
С, 70
Ничего особенного, только функция отображения индекса.
Меньше гольфа
источник
Pyth, 8 байт
Относительно просто
источник
Витси, 22 байта
Витси действительно не был создан, чтобы сделать это ...
источник
Perl 6 , 25 байт
Это самая короткая лямбда, которую я смог придумать.
источник
Минколанг 0,12 , 15 байт
Попробуй это здесь.
объяснение
источник
R, 49 байт
Назовите это как q (бла). Или, если x уже содержит список для перестановки, то
всего 35 байтов.
источник
F #, 64
Вдохновлен ответом Sehnsucht (но не достаточно представителя, чтобы комментировать).
Сопоставляет каждое значение с кортежем, где вторая запись является модулем индекса списка, сортируется по модулю, а затем возвращается к исходному значению.
источник
Пролог, 103 байта
пример
источник
coreutils bash и GNU, 68 байт
Мы предполагаем, что список разделен символом новой строки и передан на стандартный ввод.
К сожалению, это будет игнорировать любые входные данные, кроме индекса 1999 года, поэтому он не совсем соответствует спецификации.
Он также забивает жестко закодированный временный файл ('x'), который может быть проблематичным при параллельном запуске, и впоследствии не удаляет его. Прости за это!
источник
PHP,
7869 байтPHP может разбивать на фрагменты, но не чередовать массивы; это делает это немного громоздким:
Позвоните по ссылке или попробуйте онлайн .
Первый подход (программы на 78 байт):
печатает начальную запятую; вставьте
[!$i]
перед первым,$argv
чтобы удалить его.Два других 78-байтовых решения (напечатайте начальную и конечную запятую):
Запустите
php -nr '<code>' <arguments>
или попробуйте их онлайнисточник
Japt , 3 байта
Попытайся
Попытайся
источник
Clojure / ClojureScript, 52 байта
Написано в ClojureScript REPL, также должен быть действительным Clojure.
источник
К, 10 байт
На основании 5-байтового ответа Pyth.
источник
гания , 191 байт
Этот был довольно длинным :(
Он читает массив из аргументов, поэтому запустите его с
hassium file.has 0 1 2 3 4
Запустите и посмотрите расширенный с тестовым примером здесь
источник