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
,B
iH
choć (może być ciągiem znaków lub lista-/ tablica), więc nie można zapisać porusza liście jako1
s i-1
s 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,x
zamiast tego wysyłać dane wyjściowex,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 golf golfowy , 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}
źródło
Odpowiedzi:
05AB1E ,
1512 bajtówZaoszczędzono 3 bajty dzięki Erikowi Outgolfer
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
Æ
. Inteligentny sposób, aby policzyć wszystkie ruchy i użyćÆ
do obliczenia różnicy dla parRL
iBH
.Æ
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, +1Ruby ,
98 ... 5855 bajtówWypró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ż:
Więc zbierz to wszystko razem, podsumuj, odwróć znak i gotowe.
Dzięki Jakob za -3 bajty
źródło
(m*c+m)[c]
zm[c%55]
.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.
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:Gdzie znakiem mod b jest znak a .
źródło
Galaretka , 14 bajtów
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ń.
źródło
Java 10,
12911911210710086 bajtówPrzyjmuje 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:
s[m%55]/73
odwzorowuje na współrzędną x lub y w zależności od postaci ( Wypróbuj online ):s[m%55]*3%5-2
odwzorowuje prawidłowy+1
lub-1
zależny od postaci ( Wypróbuj online ):źródło
a.add(m)
jakoif
warunku.int c[]
może byćint[]c
.int c[]
był z poprzedniej wersji, w której nadal używałem indeksui
zamiast go używaćm
. I sprytny w użyciu zestawuadd
zamiast!contains
, dzięki!c[2]
osi (zs[m%55]/73
) i idąc nią czymś w rodzaju3*s[m%55]%5-2
(chciałbym zobaczyć sposób na skrócenie tego, ale ...). Wraz z trójskładnikiem jesta->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.int[]
zamiast łańcucha. :)Python 3, 85 bajtów
b
jest listą indeksów (aset
) il
jest indeksem końcowym. Lista ruchów (lista ciągów lub znaków) wydaje się wolna jakos
. Jest to część odpowiedzi Ruby GB i można tam znaleźć wyjaśnienie tego podejścia.Wypróbuj online
Nie golfił
źródło
MATL , 16 bajtów
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.
źródło
Czysty ,
148... 130 bajtówWypró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 przedfoldr
zakończeniem odpowiednich operacji(0,0)
.źródło