Indeksowanie slajdów Cha-Cha

12

Wprowadzenie:

Chociaż pierwotnie miałem w głowie holenderską piosenkę, której teksty brzmią : „ Doe 'n stapje naar voren, en' n stapje terug ” (co przetłumaczone na „ Zrób krok do przodu i mały krok do tyłu ”), kiedy Szukałem pełnych tekstów, zdałem sobie sprawę, że poruszają się tylko tam iz powrotem, a nigdy na boki.

Zamiast tego używam teraz słów Mr C The Slide Man, czyli DJ Casper - Cha-Cha Slide .

Jeśli zignorujemy wszystko inne i spojrzymy tylko na słowa „lewo”, „prawo”, „wstecz” i „przeskoczyć” (liczyłem „przeskok” jak do przodu), w tym wspomniane kwoty, pełna piosenka będzie miała następującą listę ( Używam tutaj skrótów LRBH):

LBHRLLBHRLBHHRRLLLRLBHHHHRRLLLBHHHHHRLRLRLHRLLBHHLRLBHH

Tutaj pełne teksty piosenek w chowanym fragmencie kodu JavaScript (aby zaoszczędzić miejsce), gdzie ruchy i kwoty są otoczone blokowanymi nawiasami:

Wyzwanie:

Teraz przejdź do samego wyzwania. Przyjmujemy jeden, dwa lub trzy wejścia . Jedną z nich jest lista liczb całkowitych indeksu (więc albo nieujemna dla 0-indeksowanych, albo dodatnia dla 1-indeksowanych). (Pozostałe dane wejściowe są opcjonalne i wyjaśnione w zasadach wyzwania).

Każdy przypadek testowy rozpocznie się od pozycji {x=0, y=0}.
Teraz użyj listy tekstów ruchów i usuń wszystkie ruchy przy podanych indeksach listy wejściowej. Następnie „chodź” po ruchach (aż do największego indeksu tablicy wejściowej) i wypisz pozycję, na której się skończysz.

Przesunięcia zmienią współrzędne w następujący sposób:
- R: x+1
- L: x-1
- H: y+1
- B:y-1

Zasady konkursu:

  • Dostęp do listy ruchów można uzyskać w dowolny sposób. †: Może być dodatkowym wejściem; może znajdować się w oddzielnym pliku na dysku, z którego będziesz czytać; może znajdować się w zmiennej klasy, do której masz dostęp. Będzie musiał być w formie L, R, Bi Hchoć (może być ciągiem znaków lub lista-/ tablica), więc nie można zapisać porusza liście jako 1s i -1s lub liczb.
  • Podana powyżej lista ruchów jest zakodowana na stałe i zawsze będzie taka sama. (Dlatego też dobrze jest umieścić je jako pole na poziomie klasy zamiast brać je jako dane wejściowe, jeśli pomaga to w liczeniu bajtów odpowiedzi).
  • Lista wejściowa może być zarówno indeksowana 0, jak i indeksowana 1 (do ciebie)
  • „Spacerujemy” tylko do największego indeksu na liście i wyłączając go.
    • †: Możesz również traktować ten ostatni element jako oddzielne wejście całkowite zamiast ostatniego elementu tablicy wejściowej.
  • Dane wyjściowe współrzędnych xiy, na których się znajdujemy, mogą być w dowolnym rozsądnym formacie (tablica liczb całkowitych zawierająca dwa elementy, łańcuch rozdzielany, drukowany do STDOUT na dwóch oddzielnych liniach itp.)
  • Możesz założyć, że lista wejściowa jest posortowana od najniższej do najwyższej (lub od najwyższej do najniższej, jeśli tak wolisz, w którym to przypadku pierwszy element jest początkowym rozmiarem listy ruchów - jeśli nie zostanie potraktowany jako osobne wejście). I również nie będzie zawierał żadnych zduplikowanych indeksów.
  • Jeśli największy indeks listy wejściowej jest większy niż powyższa lista ruchów (55 ruchów znajduje się na powyższej liście ruchów), ponownie zawijamy na początek listy (tyle razy, ile to konieczne, w zależności od największego indeksu wejścia).
  • Możesz y,xzamiast tego wysyłać dane wyjściowe x,y, ale jeśli tak, określ to w swojej odpowiedzi.

Przykład:

Wejście: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]

Tutaj ruchy i (indeksowane 0) indeksy jeden nad drugim:

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

Po usunięciu indeksów listy wejściowej pozostanie nam następująca lista ruchów:

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

Teraz, jeśli {0, 0}przejdziemy z pozycji nad pozostałymi ruchami, będziemy mieli następujące nowe współrzędne po każdym ruchu:

{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}

Tak więc końcowy wynik będzie: {-6, 10}

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe:

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}
Kevin Cruijssen
źródło
Czy możemy wyprowadzić współrzędne w odwrotnej kolejności?
Shaggy
3
@ Shaggy Umm, jasne, czemu nie. Tak długo, jak wyraźnie określisz to w swojej odpowiedzi.
Kevin Cruijssen
@Arnauld Tak, ruchy są wyświetlane i nigdy się nie zmienią. Być może wyjaśnię to dokładniej, jeśli jeszcze nie było to jasne. (Dlatego też możesz mieć to jako zakodowane pole na poziomie klasy, jeśli byłoby to korzystne dla twojej liczby bajtów.)
Kevin Cruijssen
Czy wyjściem może być para liczb zmiennoprzecinkowych?
Jakob,
1
Bardzo późno na wyzwanie, ale dwa z twoich przypadków testowych wydają się mieć niewłaściwe dane wejściowe dla przypadku 1-indeksowanego: dodatkowe 82 w szóstym i 29 zamiast 39 w trzecim przypadku testowym (sortowanie wskazuje, że mogłeś to zrobić faktycznie wynosi 28/29, ale pokazane oczekiwane wyjście to użycie 38/39 tam).
sundar - Przywróć Monikę

Odpowiedzi:

4

05AB1E , 15 12 bajtów

Zaoszczędzono 3 bajty dzięki Erikowi Outgolfer

ÝsKèIêRS¢2ôÆ

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

Ý                 # 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
źródło
1
Niezła odpowiedź! Nawet o tym nie wiedziałem Æ. Inteligentny sposób, aby policzyć wszystkie ruchy i użyć Ædo obliczenia różnicy dla par RLi BH.
Kevin Cruijssen
Æistniał wiecznie, prawda? Zakładam, że tak, ponieważ nie wiedziałem o tym. Wydaje się, że polecenia, które moim zdaniem są „nowe”, istniały od samego początku, ale nigdy nie wiedziałem, jak ich używać, lol. Och, +1
Magic Octopus Urn
@MagicOctopusUrn: Rzeczywiście istniał wiecznie;)
Emigna,
7

Ruby , 98 ... 58 55 bajtów

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

Wypróbuj online!

Wyjaśnienie:

Główną sztuczką jest używanie liczb zespolonych do reprezentowania ruchów: „B” to -i, „H” to + i, „L” to -1, a „R” to +1. Jeśli przekonwertujemy wszystkie ruchy na liczby zespolone, to za pomocą jednej sumy otrzymamy właściwy wynik.

Próbowałem na różne sposoby, ale potem znalazłem magiczną liczbę 19: nie musimy majstrować przy dopasowywaniu wyrażeń regularnych, ponieważ:

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

Więc zbierz to wszystko razem, podsumuj, odwróć znak i gotowe.

Dzięki Jakob za -3 bajty

GB
źródło
Sprytne użycie liczb zespolonych! Ponieważ ciąg ruch jest rozwiązany, można wymienić (m*c+m)[c]z m[c%55].
Jakob
4

JavaScript (ES6), 85 bajtów

Zgodnie z regułami wyzwania, ten kod oczekuje, że ciąg o zasięgu globalnym m utrzyma listę ruchów. (Oszczędność 3 bajtów, zgodnie z sugestią @KevinCruijssen.)

Pobiera dane wejściowe jako listę indeksów opartych na 0, uporządkowanych od najniższej do najwyższej.

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]

Wypróbuj online!

W jaki sposób?

Każdy znak ruchu jest konwertowany na swoją pozycję w ciągu ruchu "LBHR...". Mnożymy wynik przez 3 i stosujemy modulo 5 , co daje p . Następnie mamy:

  • dx = ((p-1) mod 2)
  • dy = - ((p-2) mod 2)

Gdzie znakiem mod b jest znak a .

 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
źródło
3

Galaretka , 14 bajtów

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

Wypróbuj online!

Argument 1 / lewy argument: Maksymalnie indeks oparty na 1.
Argument 2 / Właściwy argument: indeksy oparte na 1.
Argument 3: Przesuwa listę jako ciąg znaków. Funkcja może być ponownie użyta, jeśli do tego celu zostanie użyty trzeci argument wiersza poleceń.

Erik the Outgolfer
źródło
3

Java 10, 129 119 112 107 100 86 bajtów

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;}

Przyjmuje maksimum jako dodatkowy wkład; move-list to tablica znaków na poziomie klasy.

Zainspirowany odpowiedzią @Emigna 05AB1E .
-7 bajtów dzięki @Jakob .
-14 bajtów dzięki @Geobits .

Wypróbuj online.

Wyjaśnienie:

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]/73odwzorowuje na współrzędną x lub y w zależności od postaci ( Wypróbuj online ):

Letter    Unicode value    /73

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

s[m%55]*3%5-2odwzorowuje prawidłowy +1lub -1zależny od postaci ( Wypróbuj online ):

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
Kevin Cruijssen
źródło
1
Jeśli weźmiesz listę indeksów za zbiór zmienny, możesz użyć jej a.add(m)jako ifwarunku.
Jakob
I int c[]może być int[]c.
Jakob
1
@Jakob Ah, int c[]był z poprzedniej wersji, w której nadal używałem indeksu izamiast go używać m. I sprytny w użyciu zestawu addzamiast !contains, dzięki!
Kevin Cruijssen
1
Możesz uniknąć odejmowania zapętlania bajtów na końcu, używając c[2]osi (z s[m%55]/73) i idąc nią czymś w rodzaju 3*s[m%55]%5-2(chciałbym zobaczyć sposób na skrócenie tego, ale ...). Wraz z trójskładnikiem jest 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];}za 98.
Geobits
@Geobits Thanks! I -12 bajtów więcej, po prostu zwracając int[]zamiast łańcucha. :)
Kevin Cruijssen
2

Python 3, 85 bajtów

bjest listą indeksów (a set) i ljest indeksem końcowym. Lista ruchów (lista ciągów lub znaków) wydaje się wolna jako s. Jest to część odpowiedzi Ruby GB i można tam znaleźć wyjaśnienie tego podejścia.

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

Wypróbuj online

Nie golfił

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
źródło
2

MATL , 16 bajtów

:wX-)Jw19\^s_&Zj

Wypróbuj online!

Przyjmuje 3 dane wejściowe, takie jak odpowiedź Jelly, największy indeks, lista indeksów do pominięcia i tablica 55 znaków.

sundar - Przywróć Monikę
źródło
1

Czysty , 148 ... 130 bajtów

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]

Wypróbuj online!

Definiuje funkcję $ :: [Int] -> (Int, Int), biorąc listę (posortowanych od najmniejszych do największych) indeksów, które należy usunąć z ruchów przed foldrzakończeniem odpowiednich operacji (0,0).

Obrzydliwe
źródło