tło
Mam drabinę opartą na ścianie i zdalnie sterowanego robota, który może się po niej wspinać. Mogę wysłać robotowi trzy różne polecenia:
UP
: robot robi jeden krok w górę. Jeśli był na najwyższym stopniu, potyka się, spada i eksploduje.DOWN
: robot robi jeden krok w dół. Jeśli był na najniższym stopniu, nic się nie dzieje.RESET
: robot powraca do najniższego stopnia.
Mogę również wysłać serię poleceń, a robot wykona je kolejno. Twoim zadaniem jest przewidzieć jego ruchy.
Wkład
Twoje wejścia są liczbą całkowitą dodatnią N
, reprezentujący liczbę kroków na drabinie i niepusty ciąg C
nad UDR
reprezentujących komendy Wysłałem do robota. Możesz to założyć N < 1000
. Robot jest inicjowany na najniższym stopniu drabiny.
Wydajność
Gwarantowane jest, że w pewnym momencie robot wejdzie na najwyższy stopień i wybuchnie. Dane wyjściowe to liczba poleceń, które wykonuje, zanim to nastąpi.
Przykład
Rozważ dane wejściowe N = 4
i C = "UDDUURUUUUUUUDDDD"
robot, oznaczony jako @
, porusza się wzdłuż 4-stopniowej drabiny w następujący sposób:
|-| |-| |-| |-| |-| |-| |-| |-| |-| |@| |-||
|-| |-| |-| |-| |-| |@| |-| |-| |@| |-| |-||
|-| |@| |-| |-| |@| |-| |-| |@| |-| |-| |-|v
|@| U |-| D |@| D |@| U |-| U |-| R |@| U |-| U |-| U |-| U |-|# Boom!
Pozostałe polecenia nie są wykonywane, ponieważ robot wybuchł. Eksplozja miała miejsce po 10 poleceniach, więc prawidłowy wynik to 10
.
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
1 U -> 1
1 DDRUDUU -> 4
4 UDDUUUUURUUUUDDDD -> 7
4 UDDUURUUUUUUUDDDD -> 10
6 UUUUUDRUDDDDRDUUUUUUDRUUUUUUUDR -> 20
10 UUUUUURUUUUUUURUUUUUUUURUUUUUUUUUUUUUU -> 34
6 UUUDUUUUDDDDDDDDDDDDDDRRRRRRRRRRRUUUUUU -> 8
6 UUUDUUUDURUDDDUUUUUDDRUUUUDDUUUUURRUUDDUUUUUUUU -> 32
20 UUDDUDUUUDDUUDUDUUUDUDDUUUUUDUDUUDUUUUUUDUUDUDUDUUUUUDUUUDUDUUUUUUDUDUDUDUDUUUUUUUUUDUDUUDUDUUUUU -> 56
354 UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU -> 872
Odpowiedzi:
CJam,
262522 bajtówFormat wejściowy to instrukcje w pierwszym wierszu i wysokość drabiny w drugim.
Sprawdź to tutaj.
Wyjaśnienie
źródło
C,
8371 + 4 = 75 bajtówDzięki @Josh za pokazanie mi stylu K&S , który pozwolił na wyłączenie 8 bajtów !!
Wyjaśniając:
Przykładowe wywołanie:
Test na żywo na ideone
źródło
z
ia
nie są kasowane.JavaScript (ES6),
5453 bajtówWyjaśnienie
Używa wewnętrznie funkcji rekurencyjnej.
źródło
Perl, 47 + 2 = 49 bajtów
Wymaga
-p
flagi,-i$N
dla drugiej wysokości i listy ruchów oddzielonej nową linią:Jak to działa:
Wydzielono:
źródło
JavaScript (SpiderMonkey 30+),
6564 bajtówJak to działa
Najpierw ustawiamy zmienną
i
na 0. To będzie śledzić, ile kroków wspiął się robot. Następnie dla każdego znakuc
w ciągu wejściowym uruchamiamy następującą logikę:i
jest większy lub równyn
, nie rób nic.c
jest"D"
:i
wynosi 0, pozostaw to bez zmian.c
tak"U"
, zwiększi
o 1.i
na 0.Odcinając, jeśli
i>=n
, unikamy dodawania kolejnych elementów do tablicy po osiągnięciu przez robota szczytu. W ten sposób możemy po prostu zwrócić długość wynikowej tablicy.źródło
Haskell, 65 bajtów
Przykład użycia:
f 4 "UDDUURUUUUUUUDDDD"
->10
.%
dostosowuje bieżącą pozycję na drabinie,scanl
sporządza listę wszystkich pozycji,fst.span(<n)
bierze udział przed wybuchem ilength
liczy kroki.źródło
JavaScript (ES6), 65 bajtów
źródło
0,i=0
można zmienić nai=0
MATL ,
3734 bajtówWypróbuj online!
Wyjaśnienie
Pozycja jest oparta na 0. Każda nowa pozycja jest wypychana na stos, zachowując starsze pozycje. Zatem rozmiar stosu reprezentuje liczbę dotychczasowych ruchów plus 1.
Do przetworzenia każdego polecenia używana jest pętla. Pętla
jest opuszczana, gdy pozycja osiąga wysokość drabiny,przetwarza wszystkie polecenia, nawet po wybuchu (pomysł wzięty z odpowiedzi Martina ). Ostateczny wynik podaje indeks pierwszej pozycji równy wysokości drabiny.źródło
Python 2,
6362 bajtyNa przykład
f(4, 'UDDUURUUUUUUUDDDD')
jest10
.xnor znalazł jeszcze krótsze wyrażenie:
2%~h
jest naprawdę fajne :)źródło
%4
. Jeśli się nie mylę, możesz uratować postać, robiąc to-[2%~h,~h,0][ord(s[0])%4]
.PowerShell,
8679 bajtówNieznaczne zmiany mojego Kiedy Święty Mikołaj wchodzi do piwnicy? odpowiedź.
Pobiera dane wejściowe
$a
i$b
jawnie rzutuje$b
jako tablica znaków . Następnie zapętlamy|%{...}
wszystkie$b
. Każdą iterację zwiększamy nasz licznik$d
.Następnie
if
oświadczenie, aby sprawdzić, czy osiągnęliśmy szczyt-ge$a
. Jeśli tak, wysyłamy$d
iexit
.if
Stwierdzenie jest wykonana z pseudo-trójskładnikowego utworzonego przez przypisanie$c
minus równa wynikowi kilku wskaźników język tablicy.Mamy sprawę, że wartości ASCII
D
,R
iU
odpowiadają0
,2
oraz1
gdy podjęte modulo-4, więc$_%4
służy jako naszego pierwszego indeksu. Jeśli takR
, to ustawia się$c
na$c-$c
robienie resetu. JeśliU
to oznacza, że musimy iść w górę, więc$c-(-1)
wynik. W przeciwnym razie jest toD
, więc musimy sprawdzić, czy już jesteśmy na dole (to jest!$c
- w PowerShell, „niezerowe” jest „prawdziwe” lub1
) i ustawione odpowiednio$c
na$c-0
lub$c-1
.Edycja - Zapisano 7 bajtów, używając przypisania równości minus zamiast przypisania bezpośredniego
źródło
Perl 5, 61 bajtów
Obejmuje dwa bajty dla
-F -i
. (-M5.01
jest bezpłatny.)Wprowadzanie liczby całkowitej (np. 10) jest takie
perl -M5.01 -F -i10 robot.pl
; dane wejściowe poleceń drabinkowych są takie jak STDIN.źródło
-anF
zanim cokolwiek by to dla mnie wydrukowało. ale wydaje się, że jest domyślnie włączony dopiero-F
w 5.20.3. czy możesz to zweryfikować?-F
wystarczyło mi (5,20 lub 5,22 lub więcej). Iirc obecnego perldoc perlrun mówi, że implikuje-a
i-a
implikuje-n
.-i
? Widzę, że liczysz to jako 1, ale sądzę, że powinno się to liczyć jako 3? :-)-i
i bez 3perl -i10 -pe';'
vsperl -pe';'
więcej znaków, a następnie liczby wejściowej - co, jak sądzę, nie powinniśmy liczyć. Mogę się jednak mylić, jeśli chodzi o dzisiejszy poranek :-)Vitsy, 44 bajty
Prawdopodobnie mogą wystąpić pewne obniżki - jeśli to możliwe, wymyślę jeszcze kilka rzeczy.
Objaśnienie (w toku):
Wypróbuj online! (duży przypadek testowy)
źródło
PHP, 88 bajtów
To generuje niektóre (3 + 2n, gdzie n to liczba uruchomionych poleceń) powiadomienia, ale to nie ma znaczenia dla gry w golfa, prawda?
bez golfa:
źródło
Python, 121 bajtów
źródło
## Python, <N> bytes
aby pokazać innym swój wynik.0 if x==0 else x-1
zx and x-1
JavaScript,
131106 bajtów-Wiem, że to nie wygra zawodów Code Golf, ale było to zabawne i głupie rozwiązanie do wdrożenia:
W pewnym sensie poszedłem przeciwnie do „funkcjonalnej” trasy, tworząc dynamicznie generowane rozwiązanie imperatywne, każdy przypadek instrukcji jest zastępowany przyrostem lub zmniejszeniem oraz przyrostem przeciwnym.
Dzięki Cycoce za uratowanie mnie 29 bajtów!
źródło
l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})return c`,D:"--"}[x]};`))()
Python 3, 90
Zaoszczędź 6 bajtów dzięki DSM.
W tej chwili całkiem proste.
Przypadki testowe:
źródło
PHP, 129 bajtów
Nie wygrywam, ale fajnie się tworzy. PHP wydaje się nie lubić pustych części operatora trójskładnikowego (generuje błąd składniowy), więc musiałem umieścić
0
.Wersja bez golfa:
źródło
PHP, 113 bajtów
Mniejsza wersja https://codegolf.stackexchange.com/a/74575/13216
Nie golfowany:
źródło
Pyth, 19 bajtów
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie:
źródło
Java, 250 bajtów
źródło
# <language_name>, XX bytes
. Możesz także zredukować nazwy zmiennych do jednego znaku i usunąć dodatkowe białe znaki, w ten sposób liczba bajtów zmniejszy się (co jest tutaj celem) ... Ach, i witaj w PPCG!int steps=1; int count=0;
możesz użyćint s=1,c=0;
- patrz, zmieniłem nazwę zmiennej - i tak dalej). Nadal możesz pokazać swoją wersję bez golfa poniżej wersji z golfem z wyjaśnieniem (w ten sposób ktoś może ci pomóc w grze w więcej bajtów).C, 91 bajtów
Brak ostrzeżeń z
gcc -Wall
. Wyrażenia rekurencyjne i rozdzielane przecinkami.r.c
zawiera nagą funkcję:Skomentował,
Na przykład,
roboladder.c
obwoluta,Makefile
dla testów,źródło
Mathematica,
114120 bajtówFunkcja anonimowa, która przyjmuje dwa argumenty (C, N). Ostrożnie korzystaj z tego, ponieważ nie zamyka on strumienia, który otwiera. Przypisuje także wszystkie swoje zmienne globalnie.
Edytowany zastąpić
d=#-1&
zd=#~Max~1-1&
, tak że robie nie wykracza kopanie.źródło
Mathematica, 112 bajtów
źródło
Clojure,
9284 bajtówLiczy
n
do zera zamiast zera don
, można wykorzystaćtake-while pos?
.Oryginalny:
Odwzorowuje drugi argument
U
na+
,D
do-
i innych nanil
. Funkcja redukcji działa(operand position 1)
z wartością inną niż nulloperand
i0
inaczej. Pobiera wartości, dopóki nie przekroczymy pierwszego argumentu wejściowego i zlicza, ile mamy.źródło
Mathematica, 67 bajtów
Nienazwane funkcje dwóch argumentów, dodatniej liczby całkowitej i listy znaków, która zwraca dodatnią liczbę całkowitą. Prostsza
While
implementacja niż w przypadku innych pozycji Mathematica, która zapewnia większą konkurencję.źródło