Mrówka na kostce

33

Mrówka chodzi wzdłuż krawędzi (nie ścian) sześcianu szkieletowego. Każdy napotkany wierzchołek przedstawia widelec, z którego rozgałęziają się dwie nowe krawędzie. Mrówka wybiera, w którą stronę skręcić - leftlub right. Kierunki te odnoszą się do mrówki, która jest zwrócona do wierzchołka i znajduje się poza sześcianem. Twoim celem jest ustalenie, na podstawie sekwencji left/ rightwyborów, które wybrał mrówka, czy kończy się w tej samej pozycji, w której się zaczął.

Na przykład, jeśli mrówka skręci w lewo cztery razy ( left left left left), przejdzie kwadrat o kierunku przeciwnym do ruchu wskazówek zegara i skończy w tym samym miejscu, w którym zaczął. Ale jeśli przejdzie left left left left right, skończy się w innym miejscu na kostce. Ponadto, jeśli przejdzie left right right right left, kończy się na krawędzi początkowej, ale jest skierowany w stronę przeciwnego wierzchołka, co nie jest liczone jako ta sama pozycja.

Ścieżka mrówki może powtarzać krawędzie, w tym krawędź, od której zaczyna, ale ważne jest, gdzie kończy się po całej sekwencji.

Napisz nazwaną funkcję, która pobiera sekwencję zwojów mrówki i podaje, czy mrówka powraca do pozycji początkowej po sekwencji. Przypisanie funkcji bez nazwy do zmiennej wystarczy, aby uczynić ją funkcją o nazwie.

(Edycja: jeśli Twój język nie może utworzyć nazwanej funkcji, może zamiast tego zaimplementować funkcję z wejściami i wyjściami poprzez STDIN / drukowanie lub stos. Jeśli nie jest to możliwe, uczyń z niego fragment kodu, w którym dane wejściowe i wyjściowe są zapisywane w zmienne).

Wkład

Sekwencja left/ rightdecyzji długości 0do 31włączenia, reprezentowana w wybranym formacie. Może to być ciąg liter R/ L, lista cyfr 1/ -1lub tablica boolean. Nic tak tandetnego jak to, że są to nazwy metod lub ciągi znaków przydatne w kodzie.

Prześlij przypadki testowe w swoim formacie, jeśli różnią się one od poniższych przypadków testowych.

Wydajność

True/ False, 0/ 1lub analogi w twoim języku.

Kryteria wygranej

Wygrywa najmniej bajtów. Pamiętaj, że musisz podać nazwaną funkcję. Możesz mieć kod poza funkcją, ale te bajty też się liczą. Twoja funkcja powinna działać poprawnie, jeśli zostanie wywołana wiele razy.

Przypadki testowe

True przypadki (jedna na linię, druga to pusta lista):

1 1 1 1

-1 -1 -1 -1
1 -1 1 -1 1 -1
1 1 -1 -1 1 1 -1 -1
-1 1 1 -1 -1 1 1 -1
1 1 1 -1 -1 -1 -1 1
1 -1 -1 1 -1 -1
1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
-1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

False etui (jeden na linię):

1
1 1
1 1 1
-1 1
1 -1 -1 -1 1
1 -1 -1 1 1
-1 1 -1 1
1 1 1 1 -1
-1 -1 1 -1 1 -1 -1 1
1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1

Oto te same przypadki testowe z L's R' i 's.

True przypadki:

RRRR

LLLL
RLRLRL
RRLLRRLL
LRRLLRRL
RRRLLLLR
RLLRLL
RRRRLLLLRLLRLL
LLLRLLRRLRLRRRRRRRRRRRRRRRRR

False przypadki:

R
RR
RRR
LR
RLLLR
RLLRR
LRLR
RRRRL
LLRLRLLR
RLRRRRLLLRRLLL

Dodatkowe wyzwanie kredytowe

To samo, ale z dwunastościanem zamiast sześcianu. Zobacz pomysły Hunt the Wumpus .

xnor
źródło
Czy to wyklucza użycie języków bez nazwanych funkcji?
Mike Precup
@MikePrecup Czy możesz podać mi przykłady takich języków? Zajmę się alternatywami.
xnor
Robię wszystkie moje zgłoszenia do gry w golfa w > <> , dlatego pytam. Ma stos, na którym można załadować argumenty na wierzch, a następnie pozostawić wynik na stosie, ale nie jest to dokładnie nazwana funkcja.
Mike Precup
@MikePrecup OK, zasiłek na to. Jeśli nadal występuje problem z jakimś językiem, proszę mi powiedzieć, że nie chcę wykluczać żadnych języków.
xnor
Mogę myśleć o befunge i> <> i tego rodzaju językach
dumny haskeller

Odpowiedzi:

21

GolfScript, 24 znaki (19 tylko dla treści funkcji)

Matematyka FTW!

{3,.@{[+~@\{@}*~]}/=}:f;

Przetestuj to rozwiązanie online.

Ta funkcja przyjmuje jako dane wejściowe tablicę binarną (0 dla lewej, 1 dla prawej) i zwraca 1 dla wartości true i 0 dla wartości false.

Koncepcyjnie działa on poprzez obracanie sześcianu, tak aby mrówka zawsze zachowywała tę samą pozycję i orientację oraz sprawdzanie, czy kostka ostatecznie kończy się w tej samej orientacji, w jakiej się rozpoczęła.

W szczególności możemy przedstawić skręt w lewo i w prawo jako dwie mapy liniowe w trzech wymiarach, przy czym skręt w lewo odpowiada obrotowi o 90 ° wokół osi x , tj. Mapie ( x , y , z ) → ( x , z , - y ), a zwrot w prawo odpowiada obrotowi o 90 ° wokół osi y , tj. Mapa ( x , y , z ) → ( z , y , - x ).

Na początku funkcji po prostu ustawiamy trzyelementowy wektor zawierający wyraźne wartości dodatnie (1, 2, 3), stosujemy do niego sekwencję map obrotu i sprawdzamy, czy wektor wynikowy jest równy wektorowi początkowemu.

(W rzeczywistości, aby zapisać kilka znaków, faktycznie transformuję współrzędne, aby wektor początkowy to (0, 1, 2), a mapy to ( x , y , z ) → ( x , z , −1− y ) i ( x , y , z ) → ( z , y , −1− x ), ale wynik końcowy jest taki sam.)

Ps. Dzięki dumnemu haskellerowi za wykrycie błędu w oryginalnej wersji tego rozwiązania.


Perl, 58 znaków

Zgodnie z żądaniem w komentarzach, oto to samo rozwiązanie przeniesione do Perla. (Ta wersja faktycznie używa nietransformowanych współrzędnych, ponieważ transformacja nie zapisuje znaków w Perlu).

sub f{@a=@b=1..3;@a[$_,2]=($a[2],-$a[$_])for@_;"@a"eq"@b"}

Przetestuj to rozwiązanie online.


Bonus: Mrówka na dwunastościanie (GolfScript, 26 znaków)

{5,.@{{2*2%[~\]}*(+}/=}:f;

Przetestuj to rozwiązanie online.

Podobnie jak powyższa funkcja ant-on-a-cube, ta funkcja przyjmuje jako dane wejściowe tablicę binarną (0 dla lewej, 1 dla prawej) i zwraca 1, jeśli mrówka znajdzie się w tej samej pozycji i orientacji, w jakiej się rozpoczęła, lub 0 Inaczej.

To rozwiązanie wykorzystuje nieco bardziej abstrakcyjną reprezentację niż rozwiązanie kostki powyżej. W szczególności, wykorzystuje się fakt, że obrotowa grupa symetrii dwunastościanu jest izomorficzny z grupy zmiennego A 5 , czyli grupa nawet permutacji pięciu elementów. Zatem każdy możliwy obrót dwunastościanu (który odwzorowuje krawędzie na krawędzie, a wierzchołki na wierzchołki) można jednoznacznie przedstawić jako permutację tablicy pięcioelementowej, z kolejnymi obrotami odpowiadającymi stosowaniu odpowiednich permutacji w sekwencji.

Zatem wszystko, co musimy zrobić, to znaleźć dwie kombinacje L i R, które mogą reprezentować lewy i prawy obrót. W szczególności permutacje te muszą mieć 5 cykli (tak, aby ich zastosowanie pięć razy powróciło do stanu pierwotnego), nie mogą być wzajemnymi potęgami (tj. RL n dla dowolnego n ) i muszą spełniać relację ( LR ) 5 = (1), gdzie (1) oznacza permutację tożsamości. (W efekcie to kryterium stwierdza, że ​​ścieżka LRLRLRLRLRmusi wrócić do pierwotnej pozycji).

Ustalenie, że permutacja L jest prostym przesunięciem lufy w lewo, tj. Mapowaniem ( a , b , c , d , e ) → ( b , c , d , e , a ), ponieważ można ją zaimplementować w GolfScript w zaledwie dwóch chars ( (+), okazuje się, że istnieje pięć możliwych wyborów dla permutacji R. Spośród nich wybrałem mapowanie ( a , b , c , d , e ) → ( c , e , d ,b , a ), ponieważ ma również stosunkowo kompaktową implementację GolfScript. (W rzeczywistości implementuję go, najpierw przeplatając elementy w 2*2%celu uzyskania ( a , c , e , b , d ), a następnie zamieniając ostatnie dwa elementy za pomocą [~\], a na koniec bezwarunkowo stosując permutację L, aby przesunąć a na koniec.)

Powyższy link demonstracyjny online zawiera niektóre przypadki testowe prawidłowych ścieżek na dwunastościanie, które powracają do źródła, takie jak:

           # empty path
1 1 1 1 1  # clockwise loop
0 0 0 0 0  # counterclockwise loop
1 0 0 0 0 1 1 0 0 0 0 1  # figure of 8
1 0 1 0 1 0 1 0 1 0      # grand circle
1 0 0 0 1 0 0 0          # loop around two faces 
1 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0  # Hamilton cycle
Ilmari Karonen
źródło
Fajne rozwiązanie! Czy to wyklucza przypadek, w którym mrówka wraca do tego samego wierzchołka z innego kierunku?
xnor
Nie rozumiem - w zasadzie to, co tu robisz, reprezentuje pozycję mrówki za pomocą 3 bitów, ale są 24 możliwe pozycje. W jaki sposób?
dumny haskeller
1
@proudhaskeller: Dzięki za wykrycie błędu. Naprawiłem to i dodałem twój kontrprzykład do mojego zestawu testów.
Ilmari Karonen,
1
@xnor: Dodano również rozwiązanie dla dwunastościanu.
Ilmari Karonen,
1
Ładna para permutacji dla dwunastościanu. Te, których użyłem do polowania na Wumpusa, byłyby o jeden char dłuższe: {[~@]-1%}*[~@]lub ){[~@]-1%}*-1%zastąpienie twojego{2*2%[~\]}*(+
Peter Taylor
7

Python, 68

Pobiera listę 1 i -1. Na podstawie obrotów 3D: sprawdza, czy punkt (3,2,1) kończy się w tej samej pozycji po zastosowaniu serii obrotów. Możliwe są dwa obroty, odpowiadające 1 i -1. Każda z nich odbywa się poprzez permutację dwóch współrzędnych i zmianę znaku jednej z nich. Dokładne współrzędne, które należy zmienić, i który znak do permutacji nie jest ważny.

def f(l):
 p=[3,2,1]
 for d in l:p[d],p[0]=-p[0],p[d]
 return[3,2]<p

EDYCJA: w rzeczywistości jest to w większości to samo rozwiązanie, co „Perl, 58”.

Armin Rigo
źródło
Masz rację, to prawda.
dumny haskeller
+1, wciąż jest krótszy niż moja próba rozwiązania w języku Python. Patrząc na to, co mam, myślę, że możesz zapisać jeszcze kilka znaków, przyjmując dane wejściowe jako 0 i 1 i dzieląc ostatni element pna osobną zmienną.
Ilmari Karonen,
3
Wow, napisałem dokładnie to samo rozwiązanie , znak dla postaci, z wyjątkiem nazw zmiennych, podczas testowania rozwiązania tego problemu!
xnor
5

Matematyka

Zainspirowany rozwiązaniem Ilmari Karonen. Grupa symetrii rotacyjnej sześcianu jest izomorficzna do S 4 .

Kostka, 51 bajtów

Fold[Part,r=Range@4,{{2,3,4,1},{3,4,2,1}}[[#]]]==r&

Pobiera listę 1s i -1s jako dane wejściowe.

Wypróbuj online!

Dwunastościan, 55 bajtów

Fold[Part,r=Range@5,{{2,3,4,5,1},{3,5,4,2,1}}[[#]]]==r&

Pobiera listę 1s i -1s jako dane wejściowe.

Wypróbuj online!

alephalpha
źródło
Szukałem, jak można stwierdzić, że jest izomorficzny w stosunku do S3?
dumny haskeller
Ups,
miałem na
@proudhaskeller Można go znaleźć tutaj: en.wikipedia.org/wiki/Octahedral_symmetry
alephalpha
5

C (gcc) , 118 116 107 105 bajtów

-2 bajty dzięki pułapkowi cat

f(char*s){char*p,n[]="@ABCDEFG",y;for(;*s;s++)for(p=n;*p;*p++^=*s^82?y%2+1:4-(y&2))y=*p/2^*p;y=n[2]==66;}

Wypróbuj online!

Załóżmy, że podaliśmy sześcianowi następujące współrzędne:

            (1,1,1)       (1,1,0)
          G +--------------+ C
           /|             /|
          / |            / |
         /  |    (0,1,0)/  |
(0,1,1) +--------------+ D |
      H |   |          |   |
        |   |          |   |
        | F +----------|---+ (1,0,0)
        |  /(1,0,1)    |  / B           x
        | /            | /           y / 
        |/             |/            |/  
      E +--------------+ A      z ---*   
        (0,0,1)       (0,0,0)

Jeśli zaczniemy od rogu D, wówczas przejście do C lub H można uznać za obracanie wokół nas sześcianu. Przesunięcie w prawo oznaczałoby obrót w lewo wokół osi Z, a przesunięcie w lewo oznaczałoby obrót w kierunku wokół osi X. To jedyne dwie rotacje, o które musimy dbać. Ponieważ każdy obrót wynosi dokładnie 90 stopni, możemy sobie wyobrazić, że rogi „ślizgają się” wzdłuż krawędzi. Przesunięcie w prawo oznacza A -> B, B -> C, C -> D, D -> A z drugą stroną wykonującą E -> F itp. Za przesunięcie w lewo otrzymujemy A -> E, E - > H itp.

Ponieważ każdy narożnik przesuwa się tylko wzdłuż krawędzi, oznacza to, że tylko jeden z wymiarów każdego punktu zmienia się dla każdego obrotu. Kiedy B przesuwa się do C, zmienia się tylko jego składnik y, a gdy H przechodzi do D, zmienia się tylko jego składnik z i tak dalej. Ponadto, ponieważ współrzędne są ograniczone do 0 i 1, możemy myśleć o każdym punkcie jako liczbie binarnej, z odpowiednim bitem odwracanym podczas ruchu.

Widzimy, że dla ruchu w prawo A i C odwracają swoje x, podczas gdy D i B odwracają swoje y. Jeśli zmienimy perspektywę, aby spojrzeć na tę stronę głowicy sześcianu i zignorujemy komponent Z (który i tak nie zmienia się dla tego obrotu), otrzymujemy:

D (0,1)         C (1,1)
 +-------------+
 |             |
 |             |
 |             |
 |             |
 |             |
 |             |
 +-------------+
A (0,0)         B (1,0)

Pojawia się wzorzec: dla punktów, które odwracają swoje x, x == y, podczas gdy odwrotnie jest w przypadku punktów odwracających ich y. Dotyczy to innego rodzaju obrotu, ale z z zamiast x.

Innymi słowy:

Right
    if (x == y) x = !x
    if (x != y) y = !y

Left
    if (z == y) z = !z
    if (z != y) y = !y

Teraz możemy łatwo przejść przez wszystkie obroty, a na końcu sprawdzić, czy końcowe D pasuje do naszego początkowego D.

Przechowywanie każdego punktu jako pojedynczej liczby jest dane, ale w C przypisywanie tablicy znaków jest o wiele bardziej zwarte niż tablicy int. Staramy się wybierać znaki, których trzy niższe bity pasują do 000..111, dzięki czemu można po prostu zignorować resztę bitów. Odwracanie współrzędnych jest po prostu kwestią XOR'ingu z odpowiednią maską bitową.

gastropner
źródło
1
Bardzo dziękuję za długie wyjaśnienie, inne odpowiedzi nie kliknęły mi do głowy, ale ta natychmiast nabrała sensu.
Nit
4

Python - 110, 150

Pobiera listę liczb całkowitych z -1dla skrętu w lewo, 1dla skrętu w prawo.

Kostka, 110:

def f(l):
    c,p='07'
    for d in l:a="100134462634671073525275"[int(c)::8];c,p=a[(a.index(p)+d)%3],c
    return'1'>c

Test:

l=map(int,'1 1 1 1'.split())
print f(l)

Dwunastościan, 150:

def f(l):
    c,p='0J'
    for d in l:a="I5H76E8BBA8F76543100JI0J21D3A5C7E9CJI2132H4GF94C6D98AHGBEDGF"[int(c,36)::20];c,p=a[(a.index(p)+d)%3],c
    return'1'>c
Vectorized
źródło
1
To dość imponujące, jak napisałeś to w trzy minuty :-P
xnor
6
Czekałem sporo czasu na odrodzenie się tego pytania szefa. ;-)
Vectorized
Otrzymuję komunikat „TypeError: oczekiwany obiekt z interfejsem bufora”, gdy uruchamiam go w Pythonie 3.2.
xnor
@xnor Edytowane, teraz w python 2. Mam nadzieję, że to działa.
Vectorized
4

Cudowny 188

Bezwstydna kradzież algorytmu Ilmari Karonen w celu pokazania nowego języka.

Ten skrypt oczekuje ciągu 0x00 dla lewego i 0x01 dla prawego na standardowym wejściu, a po nim 0x0A (nowa linia). Zwraca „0” w przypadku niepowodzenia i „1” w przypadku powodzenia.

......@5@3FF
@0@1@2\\]]@5
010203@4=A@4
&0&0&0&0/\
MVMVMVMV..
@0@1@2@3..!!
:MV
}2}2}1}0}1}0}3
&0&1&0&1~~~~<A@P
{0{1{1{0&1&0=0&1
}0}1}2@P{2{2&030
=1=2=3&2FF}3..//
&2&2&231&2{3
\/\/\/&2!!..//

przykładowy bieg:

# echo -e "\x0\x0\x0\x1\x0\x0\x1\x1\x0\x1\x0\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1" | marbelous.py ant-on-a-cube.mbl
1
Sparr
źródło
1
Nie zdawałem sobie sprawy, jak szalona jest ta odpowiedź, dopóki nie przeczytam opisu języka. To naprawdę fajna koncepcja dla języka golfowego!
xnor
@xnor jest mało prawdopodobne, aby kiedykolwiek był poważnym konkurentem na arenie golfowej, ale nadal jest trochę zabawny :)
Sparr
4

Python 2 , 57 bajtów

f=lambda l:reduce(lambda n,x:n%4*64+n/4*16**x%63,l,27)<28

Wypróbuj online!

Używa reprezentacji permutacji

0: abcd -> dabc
1: abcd -> dcab

gdzie lewa i prawa (0 i 1) odpowiadają długości 4 cykli na 4 elementach. Iterujemy nad wejściem stosując wskazaną permutację i sprawdzamy, czy wynik jest równy wartości początkowej.

Zaczynamy a,b,c,djako lista czterech elementów 0,1,2,3. Kompresujemy je do pojedynczej liczby base-4 n=abcd, z wartością początkową n=27odpowiadającą 0123podstawie base 4. Instytujemy każdą kombinację na arytmetycznie n.

Ponieważ oba wyniki zaczynają się od d, możemy zrobić, n%4aby wyodrębnić d, a następnie n%4*64przenieść go do właściwej pozycji d___. Pozostałe cyfry są abcwyodrębniane jako n/4. Musimy wstawić je do trzech niższych wartości miejsca.

Dla kierunku x=0wstawiamy abcjak jest, a dla x=1obracamy je jak cab. Ruch obrotowy może zostać osiągnięta *16%63, co odbywa abcsię abc00na cab. (Mogłoby %63to pójść nie tak a==b==c==3, ale te wartości nie są możliwe.) Ponieważ samo działanie %63jest zabronione, wyrażenie zależne od kierunku *16**x%63daje abclub cabjest wymagane.


Python 2 , 55 bajtów

f=lambda l:reduce(lambda n,x:n^(n*8%63|7*8**x),l,10)<11

Wypróbuj online!

xnor
źródło
3

Haskell, 104 103 99 97 96/ 67 64 znaków

Wydaje mi się, że odpowiednikiem prawej / lewej strony byłby typ danych Kierunek taki:

Direction = R | L

więc w mojej odpowiedzi założyłem, że były one dostępne.
edycja: faktycznie zdałem sobie sprawę, że booleany doprowadziłyby do skrócenia kodu. Prawda reprezentuje zwrot w lewo, a False reprezentuje zwrot w prawo (chociaż technicznie kod działałby tak samo, gdyby został odwrócony; jest symetryczny)

96 znaków:

m[p,l,r]b|b=[p%l,7-r-l,r]|0<1=[p%r,l,7-r-l]
p%x|odd$div p x=p-x|0<1=p+x
g l=foldl m[0..2]l<[0,2]

g to funkcja, która po podaniu listy Kierunków zwraca pogodę, w której mrówka nie wróciła na swoje miejsce.

wyjaśnienie reprezentacji pozycji: pozycja mrówki jest kodowana jako trzy krotki liczb całkowitych. pierwsza liczba całkowita reprezentuje wierzchołek, do którego zmierza mrówka. pierwszy bit oznacza, czy wierzchołek znajduje się w połowie góra / dół, drugi - lewa / prawa połowa, a trzeci - tylna / przednia połowa. Odbywa się to tak, że przejście od wierzchołka do sąsiedniego wierzchołka można wykonać, odwracając jeden bit.

druga liczba całkowita to kwota, którą zmieniłby wierzchołek mrówki, gdyby poszedł w lewo. na przykład, jeśli mrówka znajdowała się na wierzchołku 3, a druga liczba całkowita wynosiła 4, to po skręceniu w lewo wierzchołek wynosiłby 7. zauważ, że zawsze będzie to potęga 2, ponieważ dokładnie jeden bit jest odwracany przez przesunięcie jednego wierzchołka.

trzecia liczba całkowita jest taka sama, ale dla poprawności; wiem, że można to obliczyć na podstawie pierwszych dwóch, ale nie wiem, jak to zrobić. jeśli masz pomysł, proszę powiedz mi.

należy zauważyć, że przy skręcie w lewo trzecia liczba całkowita pozostanie taka sama, a druga stanie się liczbą między 1 2 a 4, która nie będzie ani drugą liczbą całkowitą, ani trzecią, co może być takie samo jak 7 - druga liczba całkowita - trzecia liczba całkowita.

Wybrałem ten sposób reprezentowania pozycji, ponieważ (jak właśnie stwierdzono w poprzednim akapicie) obliczenie następnej pozycji było banalne.

objaśnienie funkcji:

funkcja (%) to funkcja, która pobiera bieżący wierzchołek i kwotę, aby go zmienić, i zmienia go. dochodzi do bitu, który ma się zmienić i odwraca go (w sposób bardzo liczbowy).

funkcja m jest funkcją, która przyjmuje pozycję mrówki i kierunek oraz zwraca nową pozycję za pomocą nuty, którą zanotowaliśmy wcześniej.

następnie funkcja m jest łączona za pomocą foldl (co jest trochę jak reducew javascript, ale nieco bardziej wyraziste), aby utworzyć funkcję g, odpowiedź na to pytanie.


Haskell, 64 znaków

zainspirowany odpowiedzią @ alphaalpha, oto jej wersja przeniesiona do haskell:

m[a,b,c,d]p|p=[b,c,d,a]|0<1=[b,d,a,c]
g l=foldl m[0..3]l<[0,1,3]



edytuj: Czuję się teraz niesamowicie głupio z powodu odpowiedzi Lari Karonena. może prześlę jego odpowiedź do haskell. kolejna edycja: nie czuć się tak głupio, jak jego odpowiedź jest błędna
edycja: zmieniłem się z używania krotek na używanie list jako ich Ordinstancji, a [ ... ]cukier składniowy skraca to

dumny haskeller
źródło
1
Wygląda to tak elegancko, szczególnie na fałdę. Czy może zapisać jeszcze więcej znaków do przypisania [0,1,2,3]do zmiennej i użyć jej zarówno jako danych wejściowych do wyrażenia, jak i do sprawdzania wyniku?
xnor
@ xnor, ponieważ twój komentarz postanowił wymyślić grę w golfa, aby [0..3]... Nie wiem, dlaczego wcześniej tego nie zauważyłem. dzięki. ale teraz twoja sztuczka nie działa. No cóż.
dumny haskeller
3

APL (Dyalog Unicode) , 22 bajty ( Adám's SBCS )

f←{x∊(-@3∘⌽⌽)/⍵,x←⊂⍳3}

Wypróbuj online!

H.PWiz zasugerował, że odwrócenie kroków nie robi różnicy, a to spowodowało -2 bajty.

Cóż, jest to zawstydzające, ponieważ miało być znacznie krótsze niż GolfScript. Przynajmniej próbowałem.

Funkcja ma nazwę f, aw przypadkach testowych 1reprezentuje zwrot w lewo (boolean true) i 0reprezentuje zwrot w prawo (boolean false). reprezentuje pustą listę.

Erik the Outgolfer
źródło
3

Bash , 71 65 bajtów

f()(a=1234;for i;{ a=`tr 1-4 4$[$i?123:312]<<<$a`;};((a==1234));)

Wypróbuj online!

Podobnie jak wiele poprzednich odpowiedzi, wykorzystuje reprezentację grupy obrotów sześcianu wygenerowanych przez 1234-> 4123 i 1234-> 4312. Używa liczb zamiast liter, dzięki czemu mogę użyć operatora trójskładnikowego z rozszerzeniem arytmetycznym. Oczekuje, że dane wejściowe będą składać się z zer i jedynek oddzielonych spacjami, a dane wyjściowe za pomocą kodu wyjścia.

6 bajtów zapisanych dzięki komentarzowi @ manatwork!

Sophia Lechner
źródło
1
Zobacz Dennis „s Bash wskazówka odnośnie pętli na liście parametrów.
manatwork
3

pieprzenie mózgu , 119 bajtów, 137 bajtów

S4

Kostka, 119 bajtów

++++>+++>++>+>,[+++[->+++<]<<<<[->>>>+<<<<]>[>]<+[[-]<[->+<]<<<[->>>+<<<]>[>]],]<[[<]>[->]<[>>]<]<[>>-<]-[----->+<]>--.

Wypróbuj online!

++++>+++>++>+    Initialize tape as 4 3 2 1

>,[              For each input byte:

  +++[->+++<]       Add 3 and multiply by 3; if input is R, this will be 255

  <<<<[->>>>+<<<<]  Move first number to end (BCDA)

  >[>]<+[           If input wasn't R:

    [-]                Zero input cell (which is now negative 18)

    <[->+<]            Move previously moved number one slot further (BCD_A)

    <<<[->>>+<<<]      Move first number into vacated slot (CDBA)

  >[>]]

,]

<[[<]>[->]<[>>]<]     Determine whether tape is still 4 3 2 1

<[>>-<]               If not: subtract 1 from output cell

-[----->+<]>--.       Create "1" in output cell and output

Dwunastościan, 137 bajtów

+++++>++++>+++>++>+>,[+++[->+++<]<<<<<[>>>>>+[<]>-]>[>]<+[[-]<<[[->>+<<]<<]>[>>>>>>+[<]<-]>>[>]],]<[[<]>[->]<[>>]<]<[>>-<]-[----->+<]>--.

Wypróbuj online!

Jedyne różnice między tymi dwoma programami to konfiguracja i permutacje. Zastosowano tutaj lewą permutację DCAEB, która wydawała się być najbardziej dostępnym sprzężeniem golfowym.

Nitrodon
źródło
1

Galaretka , 14 bajtów

3RðW;ṙN1¦ṚƊ/⁼⁸

Wypróbuj online!

1= skręt w lewo, 0= skręt w prawo. Na podstawie mojego rozwiązania Dyalog.

Niestety, Jelly nie ma nazwanych funkcji. Jeśli nie mogę użyć niejawnego wejścia i muszę założyć, że jest to zmienna, ta wersja tej samej długości wykona:

3RµW;®ṙN1¦ṚƊ/⁼

Zakłada, że ​​wejście znajduje się w rejestrze (© / ®).

Erik the Outgolfer
źródło
0

Perl - 120, 214

Pobiera tablicę (listę) wartości logicznych.

Kostka (120):

sub e{$a=$b=0;for$c(@_){$_=(13,62,53,40,57,26,17,'04')[$b];$d=s/$a/($b-1)%8/e;($a,$b)=($b,substr($_,$c^$d,1))}return!$b}

Dwunastościan (214):

sub e{$a=$b='00';for$c(@_){$_=('01041102090307040500061807160308091502101114121019131714151016081706131819051200'=~/\d{4}/g)[$b];$d=s/$a/sprintf'%02d',($b-1)%20/e;($a,$b)=($b,substr($_,($c^$d)*2,2));}return!($b+0)}
faubi
źródło
2
Jakie są kodowane magiczne liczby?
xnor