Piet - интересный язык программирования по ряду причин. Сегодня мы остановимся на одной причине: команда крена . Команда roll была изначально написана на PostScript и является мощным способом манипулирования стеком.
Команда roll выводит на экран два верхних элемента стека и использует их в качестве параметров. Мы назовем первое значение попсовым, turns
а второе depth
. Поворот на глубину n займет самый верхний элемент стека, превратит его в n-й элемент стека и переместит каждый из элементов над ним на один. Если turns
отрицательно, это делается в противоположном направлении. То есть n-й элемент перемещается вверх, а остальные элементы перемещаются вниз. Это повторяется abs(turns)
раз.
Вызов
Напишите программу или функцию, которая берет стек и возвращает этот стек после выполнения броска.
правила
- Ввод и вывод могут быть в виде списка, массива, строки с разделителем, передаваемых по одному элементу за раз, или в любом другом приемлемом формате. Вывод должен быть в том же формате, что и ввод.
depth
никогда не будет отрицательным и никогда не будет больше длины стека.- Стек ввода всегда будет содержать как минимум два элемента.
- Это код-гольф, поэтому выигрывает самый короткий ответ на каждом языке. Таким образом, я не буду принимать ответ.
- Стандартные лазейки запрещены.
Тестовые случаи
in: out:
2
4
1 3
2 4
3 1
4 2
5 5
6 6
in: out:
-2
3
1 2
2 3
3 1
in: out:
-42
0
1 1
2 2
3 3
4 4
5 5
Ответы:
Haskell ,
6462 байтаИзменить: -2 байта: @xnor увидел то, что я думал неправильно.
r
принимает и возвращает списокInt
с.Попробуйте онлайн!
splitAt n l
разбивает списокl
по индексуn
,mod
вычисляет остаток от деления,++
объединяет списки.источник
(%)=splitAt
инфикс.JavaScript (ES6),
4947 байтИзменить: 2 байта сохранены благодаря @Shaggy, принимая элементы стека в качестве отдельных параметров. Объяснение:
1
перемещает верхний элемент кdepth
элементу. Поворот2
перемещает два верхних элемента и т. Д. Однако этого также можно добиться, переместив элементы между поворотом и глубиной вперед.splice
удаляет эти элементы иconcat
добавляет их к остальным элементам. (Я мог бы использовать вместо этого понимание массива, так как он такой же длины.)slice
, вторым параметромsplice
является количество удаляемых элементов.источник
(t%d+d)%d
же, какt%d
?%
это остаток, поэтому он дает отрицательный ответ, когдаt
отрицательный.(t,d,...a)=>
поскольку правила допускают передачу ввода по одному элементу за раз.CJam, 31 байт
Ввод и вывод - это массивы в стеке, причем последний элемент представляет вершину стека.
Трассировки стека:
источник
Mathematica,
5850 байтРедактировать: Спасибо Мартину Эндеру за сохранение 8 байтов.
Объяснение:
Чистая функция, которая ожидает список, где начало списка представляет вершину стека. Мы передаем элементы списка в чистую функцию
Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&
.x
устанавливается в последовательность элементов, начиная с третьего аргумента., затем мы поворачиваем первый#2
(второй аргумент) элементx
влево#
(первый аргумент) раз, затемJoin
остальные элементыx
.Это сохранит
3
байты, если мы просто передадим элементы стека в качестве аргументов функции напрямую, а не в списке вначале, но тогда форматы ввода и вывода не будут совпадать.Оригинальное решение:
Есть что-то действительно приятное в этой цепочке инфиксных функций. Заменяет список первым элементом
t
, вторым элементомd
и оставшимися элементами,x
в результате поворота первыхd
элементов{x}
влевоt
и соединения оставшихся элементов{x}
.источник
±
вставленную в правило замены, и еще один байт, используяTakeDrop
следующее:±{t_,d_,x___}:=#~RotateLeft~t~Join~#2&@@{x}~TakeDrop~d
...&[1, 1, 3, 4]
и возврат,{3, 4}
либо делайте это вручную с помощьюApply
начала:Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&@@#&
(для ясности, мое первое предложение опускает@@#&
.)Рубин, 40 байт
Попробуйте онлайн!
Принимает входные данные в виде списка, возвращает список. Тот факт, что существует встроенная система,
rotate
которая может обрабатывать как положительные, так и отрицательные вращения, делает это тривиальным.источник
Python,
141988774 байта11 байтов сохранено благодаря @Cole
Получает входные данные в виде списка, где последний элемент является вершиной стека.
Использует трюк 0ⁿ для фильтрации с нулевой глубиной и оператор по корректировке знака Python по модулю для определения части списка, подлежащего измельчению.
источник
f(s,t,d)
?f(s,t,d)
(входные данные - весь стек).r=-t%d-d
. Кроме того, заменаs*0**d
наs*(d<1)
поддерживает количество байтов, но, возможно, улучшает читабельность (не в этом цель). Я не знал этого0**0==1
в Python, хотя это интересно.-t%d-d
качестве значения (как я делал раньше), потому что , когдаd
это0
это повлечет за собой исключение деления на ноль.JavaScript ES6,
10992 байтаПопробуйте онлайн!
Получает входные данные в виде массива целых чисел.
Также имеет счетчик стрелок: P
Объяснение:
Код использует функцию сдвига для извлечения первых двух элементов списка.
Затем он получает абсолютное значение первого элемента, которое является числом витков.
Поскольку Javascript индексируется нулем, индекс глубины необходимо уменьшить на 1.
Если бы индекс глубины был 0 или 1, ничто не должно измениться, но из-за уменьшения индекс 0 вызовет изменения. Поэтому выйдите из цикла, если индекс глубины не равен <= 0.
Функция splice (a, b) возвращает подмассив длины b с начальным индексом a из массива и оставляет исходный массив без этих элементов.
При объединении с остальной частью исходного массива это один поворот массива по индексу глубины.
Выполняя эту операцию n раз, где n - число оборотов, результирующий массив является результатом оператора крена.
источник
Python 2 , 48 байт
Попробуйте онлайн!
источник
TI-Basic,
141150 байт (неконкурентный)Редактировать: исправлен случай, когда глубина равна нулю (+9 байт)
TI-Basic не поддерживает списки с 0 длинами, поэтому этот подход не будет работать для ввода с двумя длинами.
Объяснение:
источник
seq(
.Пакетный, 163 байта
Принимает ввод в качестве параметров командной строки и выводит разделенный пробелами список. Параметры между
t
иd
извлекаются вr
переменную, чтобы их можно было добавить кs
переменной, которая получает все остальные параметры.источник