Вступление:
Хотя у меня изначально была голландская песня в моей голове, где текст звучит так : « Doe 'n stapje naar voren, en' n stapje terug » (что переводится как « Сделай шаг вперед и сделай шаг назад »), когда Я искал полную лирику, я понял, что они только взад и вперед, и никогда не боком.
Итак, вместо этого я сейчас использую текст песни Mr. C The Slide Man или DJ Casper - Cha-Cha Slide для этой задачи.
Если мы проигнорируем все остальное и посмотрим только на слова «влево», «вправо», «назад» и «прыжок» (я посчитал «прыжок» вперед), включая упомянутые суммы, полная песня будет иметь следующий список ( Я использую сокращения LRBH здесь):
LBHRLLBHRLBHHRRLLLRLBHHHHRRLLLBHHHHHRLRLRLHRLLBHHLRLBHH
Здесь полный текст песни в скрытом фрагменте кода JavaScript (для экономии места), где ходы и суммы заключены в квадратные скобки:
Вызов:
Теперь на сам вызов. Мы берем один, два или три входа † . Одним из них является список целых чисел индекса (поэтому либо неотрицательный для 0-проиндексированного, либо положительный для 1-индексированного). (Другие входные данные являются необязательными и объясняются в правилах конкурса.)
Каждый тестовый случай начинается с позиции {x=0, y=0}
.
Теперь используйте текстовый список ходов и удалите все ходы по заданным индексам входного списка. Затем «пройдитесь» по ходам (до самого большого индекса входного массива) и выведите позицию, в которой вы окажетесь.
Ходы изменят координаты следующим образом:
- R
: x+1
- L
: x-1
- H
: y+1
- B
:y-1
Правила вызова:
- Доступ к списку ходов можно получить любым способом. †: может быть дополнительным входом; может быть в отдельном файле на диске, с которого вы будете читать; может быть в переменной класса класса, к которой вы обращаетесь. Он должен будет находиться в форме
L
,R
,B
иH
хотя (может быть строка или символ-лист / массив), так что вы не можете сохранить движется-лист , как1
с и-1
х или целых чисел. - Приведенный выше список ходов жестко запрограммирован и всегда будет одинаковым. (По этой же причине лучше указывать его как поле уровня класса, а не принимать его в качестве входных данных, если это помогает подсчету байтов в вашем ответе.)
- Список ввода может быть как 0-индексирован, так и 1-индексирован (до вас)
- Мы только «идем» по шагам вверх и исключаем самый большой индекс в списке.
- †: Вам также разрешено принимать этот последний элемент как отдельный целочисленный ввод вместо последнего элемента входного массива.
- Вывод координат x и y, в которых мы в итоге окажемся, может быть в любом разумном формате (целочисленный массив, содержащий два элемента, строку с разделителями, напечатанную в STDOUT в две разделенные строки и т. Д.)
- Вы можете предположить, что входной список отсортирован от низшего к высшему (или от наивысшего к низшему, если это то, что вы предпочитаете, и в этом случае первый элемент является начальным размером списка ходов - если не воспринимается как отдельный ввод). И он также не будет содержать дублированных индексов.
- Если самый большой индекс входного списка больше, чем список ходов выше (55 ходов находятся в списке ходов выше), мы снова переходим к началу списка (столько раз, сколько необходимо, в зависимости от самого большого индекса). вход).
- Вам разрешено выводить
y,x
вместоx,y
, но, если это так, укажите это в своем ответе.
Пример:
Входные данные: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]
Здесь движется и (0-индексируется) индексы друг над другом:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
L, B, H, R, L, L, B, H, R, L, B, H, H, R, R, L, L, L, R, L, B, H, H, H, H, R, R, L, L, L, B, H, H, H, H, H, R, L, R, L, R, L, H, R, L, L, B, H, H, L, R, L, B, H, H, L, B, H, R, L, L, B, H, R, L
Удалив индексы из списка ввода, у нас останется следующий список ходов:
1, 2, 3, 5, 6, 7, 9,11,12,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,35,36,37,38,39,40,41,45,46,47,48,49,51,52,54,55,57,58,61,62,63
B, H, R, L, B, H, L, H, H, L, L, L, R, L, B, H, H, H, H, R, R, L, L, B, H, H, H, H, R, L, R, L, R, L, L, B, H, H, L, L, B, H, L, H, R, B, H, R
Теперь, если мы {0, 0}
пройдем от позиции по оставшимся ходам, у нас будут следующие новые координаты после каждого хода:
{0,0};B,{0,-1};H,{0,0};R,{1,0};L,{0,0};B,{0,-1};H,{0,0};L,{-1,0};H,{-1,1};H,{-1,2};L,{-2,2};L,{-3,2};L,{-4,2};R,{-3,2};L,{-4,2};B,{-4,1};H,{-4,2};H,{-4,3};H,{-4,3};H,{-4,5};R,{-3,5};R,{-2,5};L,{-3,5};L,{-4,5};B,{-4,4};H,{-4,5};H,{-4,6};H,{-4,7};H,{-4,8};R,{-3,8};L,{-4,8};R,{-3,8};L,{-4,8};R,{-3,8};L,{-4,8};L,{-5,8};B,{-5,7};H,{-5,8};H,{-5,9};L,{-6,9};L,{-7,9};B,{-7,8};H,{-7,9};L,{-8,9};H,{-8,10};R,{-7,10};B,{-7,9};H,{-7,10};R,{-6,10}
Таким образом, окончательный результат будет: {-6, 10}
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.
Тестовые случаи:
0-indexed input: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]
1-indexed input: [1,5,9,11,14,15,28,35,43,44,45,51,54,57,60,61,65]
Output: {-6, 10}
0-indexed input: [55] (Note: There are 55 moves in the unmodified list)
1-indexed input: [56] (Note: There are 55 moves in the unmodified list)
Output: {-6, 11}
0-indexed input: [0,1,4,5,6,9,10,15,16,17,19,20,27,29,30,37,38,39,41,44,45,46,49,51,52]
1-indexed input: [1,2,5,6,7,10,11,16,17,18,20,21,28,30,31,38,39,40,42,45,46,47,50,52,53]
Output: {10, 16}
0-indexed input: [2,3,7,8,11,12,13,14,18,21,22,23,24,25,26,31,32,33,34,35,36,38,40,42,43,47,48,50,53]
1-indexed input: [3,4,8,9,12,13,14,15,19,22,23,24,25,26,27,32,33,34,35,36,37,39,41,43,44,48,49,51,54]
Output: {-18, -7}
0-indexed input: [0]
1-indexed input: [1]
Output: {0, 0}
0-indexed input: [4,6,7,11,12,13,15,17,20,28,31,36,40,51,59,66,73,74,80,89,92,112,113,114,116,120,122,125,129,134,136,140,145,156,161,162,165,169,171,175,176,178,187,191,200]
1-indexed input: [5,7,8,12,13,14,16,18,21,29,32,37,41,52,60,67,74,75,81,90,93,113,114,115,117,121,123,126,130,135,137,141,146,157,162,163,166,170,172,176,177,179,188,192,201]
Output: {-17, 37}
0-indexed input: [25,50,75,100,125,150,175,200,225,250]
1-indexed input: [26,51,76,101,126,151,176,201,226,251]
Output: {-28, 49}
источник
Ответы:
05AB1E ,
1512 байтСохранено 3 байта благодаря Эрику Аутгольферу
Попробуйте онлайн! или как тестовый набор
объяснение
источник
Æ
. Умный способ просто сосчитать все хода и использоватьÆ
для вычисления разницы дляRL
иBH
пара.Æ
существовал вечно, не так ли? Я предположил бы так, видя, поскольку я не знал об этом. Похоже, команды, которые я считаю «новыми», существуют с самого начала, но я никогда не знал, как их использовать. О, +1Рубин ,
98 ... 5855 байтПопробуйте онлайн!
Объяснение:
Основной трюк заключается в использовании комплексных чисел для представления ходов: «B» - это -i, «H» - + i, «L» - -1 и «R» - +1. Если мы преобразуем все ходы в комплексные числа, то с одной суммой мы получим правильный результат.
Я пробовал разные способы, но потом нашел магическое число 19: нам не нужно возиться с соответствием регулярному выражению, потому что:
Итак, сложите все вместе, суммируйте, переверните знак, и все готово.
Спасибо Якобу за -3 байта
источник
(m*c+m)[c]
наm[c%55]
.JavaScript (ES6), 85 байт
Согласно правилам вызова, этот код ожидает, что строка глобальной области m будет содержать список ходов. (Сохранение 3 байтов, как предложено @KevinCruijssen.)
Принимает входные данные в виде списка на основе 0 индексов, упорядоченных по убыванию.
Попробуйте онлайн!
Как?
Каждый символ движения преобразуется в свою позицию в строке перемещения
"LBHR..."
. Мы умножаем результат на 3 и применяем по модулю 5 , что дает р . Затем мы имеем:Где знак мода б это знак а .
источник
Желе , 14 байт
Попробуйте онлайн!
Аргумент 1 / Левый аргумент: максимальный индекс на основе 1.
Аргумент 2 / Правильный аргумент: индексы на основе 1.
Аргумент 3: список перемещений в виде строки. Функция все еще может использоваться повторно, если для этой цели используется третий аргумент командной строки.
источник
Java 10,
12911911210710086 байтПринимает максимум в качестве дополнительного ввода; Move-List - это массив символов на уровне класса.
Вдохновлен ответом @Emigna 05AB1E .
-7 байт благодаря @Jakob .
-14 байт благодаря @ Geobits .
Попробуйте онлайн.
Объяснение:
s[m%55]/73
отображается на координату x или y в зависимости от символа ( попробуйте онлайн ):s[m%55]*3%5-2
соответствует правильному+1
или-1
зависимому персонажу ( попробуйте онлайн ):источник
a.add(m)
какif
условие.int c[]
может бытьint[]c
.int c[]
был из предыдущей версии, где я все еще использовал индексi
вместо использованияm
. И умно использовать наборadd
вместо!contains
, спасибо!c[2]
для оси (сs[m%55]/73
) и обходя его чем-то вроде3*s[m%55]%5-2
(я хотел бы увидеть способ сократить это, но ...). Вместе с троичным, этоa->m->{var c=new int[2];for(;m-->0;)c[s[m%55]/73]-=a.add(m)?3*s[m%55]%5-2:0;return c[1]+","+c[0];}
для 98.int[]
вместо строки. :)Python 3, 85 байт
b
является индексным списком (aset
) иl
является конечным индексом. Список перемещения (список строк или символов) отображается какs
. Это порт ответа Ruby от GB , и объяснение подхода можно найти там.Попробуйте онлайн
Ungolfed
источник
MATL , 16 байт
Попробуйте онлайн!
Принимает 3 входа, такие как ответ Jelly, самый большой индекс, список пропускаемых индексов и массив из 55 символов.
источник
Чисто ,
148... 130 байтПопробуйте онлайн!
Определяет функцию
$ :: [Int] -> (Int, Int)
, беря список (отсортированных от наименьшего к наибольшему) индексов, которые будут удалены из ходов передfoldr
выполнением применимых операций(0,0)
.источник