Rzucanie kostką
Więc rzuciłem kostką jakiś czas temu i pomyślałem o wyzwaniu.
Biorąc pod uwagę sześcian z siatką pobraną z danych wejściowych i listą ruchów, znajdź kwadrat na dole na końcu.
Użyję tego obrazu do przykładów tutaj.
Wejście
Bierzesz ciąg z listą ruchów. Ciąg zawiera tylko duże litery ASCII N, S, W i E. Odpowiadają one zwinięciu kostki o jeden krok w tym kierunku.
Na zdjęciu jedna litera N sprawiłaby, że dolna ściana ma wartość 6. Na tym zdjęciu północ jest z dala od kamery, południe jest w kierunku, wschód jest w prawo, a zachód jest w lewo.
Możesz również wziąć ciąg w następującym formacie: 1P 2P 3P 4P 5P 6P, gdzie każdy P jest pozycją z N, S, W, E, T i B. T & B są na dole i na górze.
Liczby są twarzą z tym numerem, a litera oznacza pozycję, w której znajduje się twarz. W przypadku, gdy nie jest jasne, sieć zawsze będzie uporządkowana według numeru, więc 1P 2P 3P 4P 5P 6P, nigdy 2B 1T 3N 4S 5W 6E.
Pozycja na zdjęciu to 1S 2B 3E 4W 5T 6N.
Wynik
Twój program powinien wypisać liczbę reprezentującą dolną stronę.
Przypadki testowe
(nothing), 1S 2B 3E 4W 5T 6N -> 2
N, 1S 2B 3E 4W 5T 6N -> 6
NS, 1S 2B 3E 4W 5T 6N -> 2
NWS, 1S 2B 3E 4W 5T 6N -> 2
NWSNWS, 1S 2B 3E 4W 5T 6N -> 2
NWSS, 1S 2B 3E 4W 5T 6N -> 3
NNNNNN, 1S 2B 3E 4W 5T 6N -> 5
SNWEEWS, 1N 2T 3E 4W 5B 6S, 6
SNEEWS, 1N 2T 3W 4S 5B 6E, 4
Inne zasady
Możesz również założyć, że sześcian znajduje się na nieskończonej płaskiej płaszczyźnie, prawdopodobnie z pewnym rodzajem tarcia.
Standardowe luki zabronione, chociaż nie mogę ich znaleźć.
W przypadku nieprawidłowych danych wejściowych kod może zrobić wszystko oprócz rozpoczęcia apokalipsy.
Ponieważ ten program powinien pasować na moje kości, powinien być jak najmniejszy. Liczę w bajtach, z pewnymi wyjątkami dla języków takich jak Foldery .
(nothing) -> 2
oznacza, że nie ma siatki, czy może gdzieś tam jest siatka?Odpowiedzi:
CJam,
43403734 bajtówDzięki Dennis za pomoc w oszczędzeniu 6 bajtów.
Sprawdź to tutaj.
Wyjaśnienie
Jeśli chodzi o sposób odwzorowywania znaków instrukcji na permutacje, oto przydatna tabela:
Uwzględniłem
5%
kolumnę, ponieważ to właśnie robi niejawne indeksowanie cykliczne w ciągu. W przypadku czterech permutacji widzimy, że każda z nich pozostawia dwie (przeciwne) strony nietknięte i cyklicznie permutuje pozostałe cztery.źródło
Ĕ
to276
.6e!
daje listę wszystkich 720 permutacji[0 1 2 3 4 5]
. I276
okazuje się być indeksem[2 1 4 0 3 5]
na tej liście.Perl,
166158154144139135134132116 116 bajtówzawiera +1 dla
-p
Z komentarzami:
Plik wejściowy:
Biegnij z
Wynik:
262223564
aktualizacja 158 Używanie
$N, $S, $E, $W
zmiennych globalnych zamiast%t = {N=>, S=>, E=>, $W=>}
zapisywania 8 bajtów.Aktualizacja 154 Od wymogiem jest to, że wyjście programu liczbą, nie drukując przełamane
print "$h{B}\n"
oszczędza 4 bajty:print $h{B}
.aktualizacja 144 Zaoszczędź 10 bajtów
zamiast
aktualizacja 139 Przenieś regex polecenia do końca, aby wyeliminować zmienną, oszczędzając 6 bajtów.
aktualizacja 135 Zapisz 4 bajty
@l[0..3,0]
zamiast@l[1..3],$l[0]
.aktualizacja 134 Zapisz 1 bajt, używając przypisania
@l=split//,$$_
jako wartości.aktualizacja 132 Zapisz 2 bajty, wykonując
/^\w+/ && $&
zamiast/^(\w+)/ && $1
.aktualizacja 129 Zaoszczędź 3 bajty, używając
-p
zamiast-n
i przypisując $ _ do drukowania.aktualizacja 116 Zapisz 13 bajtów, przepisując
split//, /^\w+/ && $&
do/^\w+/g
.źródło
Python 2, 204 bajty
Myślałem, że nadszedł czas, aby odpowiedzieć na moje własne pytanie.
Niezbyt krótki, ale działa.
Uruchom jako:
Edycja : Niepoprawne zliczanie bajtów. Teraz dłużej. :(
źródło