Индексирование Cha-Cha Slide

12

Вступление:

Хотя у меня изначально была голландская песня в моей голове, где текст звучит так : « 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}
Кевин Круйссен
источник
Можем ли мы вывести координаты в обратном порядке?
Лохматый
3
@ Шэгги Хмм, конечно, почему бы и нет. Пока вы четко указываете это в своем ответе.
Кевин Круйссен
@Arnauld Да, ходы отображаются и никогда не изменятся. Возможно, я поясню это более четко, если это еще не ясно. (Именно поэтому вы можете использовать его в качестве жестко запрограммированного поля класса, если это будет полезно для подсчета байтов.)
Кевин Круйссен
Может ли вывод быть парой с плавающей точкой?
Якоб
1
Очень поздно для задачи, но два из ваших тестовых случаев, кажется, неверно введены для случая с 1 индексом: дополнительные 82 в шестом и 29 вместо 39 в третьем (сортировка показывает, что вы могли предполагать, что на самом деле будет 28/29, но показанный ожидаемый результат от использования 38/39 там).
sundar - Восстановить Монику

Ответы:

4

05AB1E , 15 12 байт

Сохранено 3 байта благодаря Эрику Аутгольферу

ÝsKèIêRS¢2ôÆ

Попробуйте онлайн! или как тестовый набор

объяснение

Ý                 # push range [0 ... input_int]
 sK               # remove all elements in input_list from this range
   è              # cyclically index into the moves-list with the remaining elements
    Iê            # push the unique chars of the move-list, sorted
      R           # reverse
       S¢         # count the occurrences of each char in "RLHB"
         2ô       # split into 2 parts
           Æ      # reduce each part by subtraction
Emigna
источник
1
Хороший ответ! Даже не знал о Æ. Умный способ просто сосчитать все хода и использовать Æдля вычисления разницы для RLи BHпара.
Кевин Круйссен
Æсуществовал вечно, не так ли? Я предположил бы так, видя, поскольку я не знал об этом. Похоже, команды, которые я считаю «новыми», существуют с самого начала, но я никогда не знал, как их использовать. О, +1
Волшебная Урна Осьминога
@MagicOctopusUrn: Он действительно существовал вечно;)
Emigna
7

Рубин , 98 ... 58 55 байт

->a{([*0..a[-1]]-a).sum{|c|-1i**(m[c%55].ord%19)}.rect}

Попробуйте онлайн!

Объяснение:

Основной трюк заключается в использовании комплексных чисел для представления ходов: «B» - это -i, «H» - + i, «L» - -1 и «R» - +1. Если мы преобразуем все ходы в комплексные числа, то с одной суммой мы получим правильный результат.

Я пробовал разные способы, но потом нашел магическое число 19: нам не нужно возиться с соответствием регулярному выражению, потому что:

B  is ASCII 66; 66%19=9  and i^9  = i
H  is ASCII 72; 72%19=15 and i^15 =-i
L  is ASCII 76; 72%19=0  and i^0  = 1
R  is ASCII 82; 82%19=6  and i^6  =-1

Итак, сложите все вместе, суммируйте, переверните знак, и все готово.

Спасибо Якобу за -3 байта

гигабайт
источник
Умное использование комплексных чисел! Поскольку строка перемещения фиксирована, вы можете заменить (m*c+m)[c]на m[c%55].
Якоб
4

JavaScript (ES6), 85 байт

Согласно правилам вызова, этот код ожидает, что строка глобальной области m будет содержать список ходов. (Сохранение 3 байтов, как предложено @KevinCruijssen.)

Принимает входные данные в виде списка на основе 0 индексов, упорядоченных по убыванию.

a=>a.map(g=i=>j++<i&&g(i,p=m.search(m[~-j%55])*3%5,x+=--p%2,y-=--p%2),j=x=y=0)&&[x,y]

Попробуйте онлайн!

Как?

Каждый символ движения преобразуется в свою позицию в строке перемещения "LBHR...". Мы умножаем результат на 3 и применяем по модулю 5 , что дает р . Затем мы имеем:

  • дх = ((р-1) мод 2)
  • dy = - ((p-2) mod 2)

Где знак мода б это знак а .

 character | position | * 3 | mod 5 | dx | dy
-----------+----------+-----+-------+----+----
    'L'    |     0    |  0  |   0   | -1 |  0
    'B'    |     1    |  3  |   3   |  0 | -1
    'H'    |     2    |  6  |   1   |  0 | +1
    'R'    |     3    |  9  |   4   | +1 |  0
Arnauld
источник
3

Желе , 14 байт

Rḟị⁵ċⱮ⁵QṢṚ¤_2/

Попробуйте онлайн!

Аргумент 1 / Левый аргумент: максимальный индекс на основе 1.
Аргумент 2 / Правильный аргумент: индексы на основе 1.
Аргумент 3: список перемещений в виде строки. Функция все еще может использоваться повторно, если для этой цели используется третий аргумент командной строки.

Эрик Outgolfer
источник
3

Java 10, 129 119 112 107 100 86 байт

a->m->{var r=new int[2];for(;m-->0;)r[s[m%55]/73]-=a.add(m)?s[m%55]*3%5-2:0;return r;}

Принимает максимум в качестве дополнительного ввода; Move-List - это массив символов на уровне класса.

Вдохновлен ответом @Emigna 05AB1E .
-7 байт благодаря @Jakob .
-14 байт благодаря @ Geobits .

Попробуйте онлайн.

Объяснение:

a->m->{              // Method with Integer-Set & int parameters and int-array return
  var c=new int[2];  //  [x,y] result-array, starting at {0,0}
  for(;m-->0;)       //  Use the `m` input as index, and loop in the range (`m`, 0]
    r[s[m%55]/73]-=  //   Subtract from either x or y based on the character:
     a.add(m)?       //    If the input-set doesn't contain the current index `m`:
      s[m%55]*3%5-2  //     Modify the x or y coordinate based on the character
     :               //    Else:
      0;             //     Leave the x or y coordinate unchanged
  return r;}         //  Return count(R)-count(L) and count(H)-count(B) as result

s[m%55]/73отображается на координату x или y в зависимости от символа ( попробуйте онлайн ):

Letter    Unicode value    /73

B         66               0
H         72               0
L         76               1
R         82               1

s[m%55]*3%5-2соответствует правильному +1или -1зависимому персонажу ( попробуйте онлайн ):

Letter    Unicode value    *3     %5    -2

B         66               198    3     1
H         72               216    1     -1
L         76               228    3     1
R         82               246    1     -1
Кевин Круйссен
источник
1
Если вы берете список индексов как изменяемый набор, вы можете использовать его a.add(m)как ifусловие.
Якоб
А int c[]может быть int[]c.
Якоб
1
@Jakob Ах, я int c[]был из предыдущей версии, где я все еще использовал индекс iвместо использования m. И умно использовать набор addвместо !contains, спасибо!
Кевин Круйссен
1
Вы можете избежать вычитания байтов в конце, используя 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.
Geobits
@ Geobits Спасибо! И -12 байт больше, просто возвращая int[]вместо строки. :)
Кевин Круйссен
2

Python 3, 85 байт

bявляется индексным списком (a set) и lявляется конечным индексом. Список перемещения (список строк или символов) отображается как s. Это порт ответа Ruby от GB , и объяснение подхода можно найти там.

def f(b,l):r=sum(-1j**(ord(s[i%55])%19)for i in set(range(l))-b);print(r.real,r.imag)

Попробуйте онлайн

Ungolfed

def f(b, l):
    r = sum(
        -1j ** (ord(s[i % 55]) % 19)
        for i in set(range(l)) - b
    );
    print(r.real, r.imag)
Jakob
источник
2

MATL , 16 байт

:wX-)Jw19\^s_&Zj

Попробуйте онлайн!

Принимает 3 входа, такие как ответ Jelly, самый большой индекс, список пропускаемых индексов и массив из 55 символов.

sundar - Восстановить Монику
источник
1

Чисто , 148 ... 130 байт

import StdEnv
$i=foldr(\a(x,y)|any((==)a)i=(x,y)=case m.[a rem 55]of'H'=(x,y+1);'B'=(x,y-1);'L'=(x-1,y);_=(x+1,y))(0,0)[0..last i]

Попробуйте онлайн!

Определяет функцию $ :: [Int] -> (Int, Int), беря список (отсортированных от наименьшего к наибольшему) индексов, которые будут удалены из ходов перед foldrвыполнением применимых операций (0,0).

Οurous
источник