cinpush
main:
gte Hans 1s Leopold
jnz Leopold done
mov 1s Hans
gte Gertrude Hans Leopold
jnz Leopold done
mov Gertrude ShabbySam
mov Hans Gertrude
mov ShabbySam Hans
gte Alberto Gertrude Leopold
jnz Leopold done
mov Alberto ShabbySam
mov Gertrude Alberto
mov ShabbySam Gertrude
done:
mov 10 ShabbySam
gte 1s ShabbySam Leopold
jz Leopold undo_u
mov 30 ShabbySam
gte 1s ShabbySam Leopold
jz Leopold undo_d
undo_r:
POP!! 1
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
"shuffle" l
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
jmp end
undo_u:
POP!! 1
"shuffle" f
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
"shuffle" b
"shuffle" l
"shuffle" l
"shuffle" l
"shuffle" f
"shuffle" b
jmp end
undo_d:
POP!! 1
"shuffle" f
"shuffle" b
"shuffle" l
"shuffle" f
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
"shuffle" b
end:
jnz 1s main
print Hans
done!
To była naprawdę świetna zabawa, dziękuję Liam! :)
Dzięki Sp3000 za delikatny, ale konieczny ruch we właściwym kierunku.
W jaki sposób?
Dwa słowa: Pocket Cube .
Okazuje się, że stosy odpowiadają powierzchniom sześcianu Rubika 2x2x2 w następujący sposób:
____ ____
| | |
| 19 | 17 |
|____U____|
| | |
| 20 | 18 |
_________|____|____|____ ____ ____ ____
| | | | | | | | |
| 13 | 14 | 1 | 2 | 9 | 10 | 6 | 5 |
|____L____|____F____|____R____|____B____|
| | | | | | | | |
| 15 | 16 | 3 | 4 | 11 | 12 | 8 | 7 |
|____|____|____|____|____|____|____|____|
| | |
| 22 | 24 |
|____D____|
| | |
| 21 | 23 |
|____|____|
Gdzie ULFRBD
wskazać, która twarz odpowiada w górę, w lewo, z przodu, z prawej, z tyłu, w dół, gdy sześcian jest prawidłowo złożony.
Permutacje odpowiadają obróceniu dowolnej strony o 90 stopni (gdzie nazwy na szczęście się pokrywają). Okazuje się, że f
, r
i d
są prawoskrętne obrotów (podczas oglądania twarzy) i r
, l
i u
to w lewo o obroty (podczas oglądania twarzy).
Teraz cinpush
komenda działa w taki sposób, że dotyczy on jednej z obrotów u
, d
lub r
(w zależności od danej wartości), a następnie wypycha wartość wejściową na stosie w pozycji 1
. (A potem powtarza to, robiąc to dla każdego elementu na wejściu.) Oznacza to, że możemy odwrócić ten proces (aby upewnić się, że otrzymamy prawidłową kolejność stosów bez konieczności rozwiązywania dowolnej kostki Rubika) poprzez wielokrotne przeglądanie stosu w pozycję 1
, cofając odpowiednią permutację i wstawiając wartość tego stosu (aby następnym razem, gdy zobaczymy stos, otrzymamy wartość poniżej).
Jak cofamy rotacje? Na szczęście mamy zarówno do dyspozycji, jak f
i b
do naszej dyspozycji. Jeśli zastosujemy oba z nich, obrócimy cały sześcian o 90 stopni. W ten sposób można się przesuwać chorym ( U
, R
i D
), aby L
poluzować obrotów z jednego lub trzy l
s (w zależności od względnego kierunku l
, a ruch obrotowy wykonywany podczas wprowadzania), a następnie obraca się w tył kostka poprzedniej orientacji użyciu f
i b
jeszcze raz.
W szczególności każde z obrotów wykonanych podczas wprowadzania można cofnąć w następujący sposób:
u --> fffbbblllfb
r --> ffbblffbb
d --> fblfffbbb
Zobaczę, czy mogę wymyślić jakieś animacje, aby pokazać, że to działa.
Teraz daje nam to sposób na jednorazowe powtórzenie całego wejścia. Ale przy 5 rejestrach wystarczy nam:
Alberto
to maksymalna napotkana do tej pory wartość.
Gertrude
jest drugą co do wielkości wartością napotkaną do tej pory.
Hans
to 3. największa jak dotąd napotkana wartość.
Kiedy napotykamy nową wartość, zwiększamy ją w razie potrzeby o trzy, gdzie możemy użyć jej ShabbySam
jako tymczasowego rejestru dla swapów. To wciąż pozostawia warunki, Leopold
które możemy zastosować, aby spełnić warunek, dokonując niezbędnych porównań.
Pod koniec procesu po prostu drukujemy zawartość Hans
, która będzie już zawierać 3. największą wartość.
TKDYNS autorstwa Sama Capplemana-Lynesa
Prawdopodobnie nie jest to optymalne, ale myślę, że to działa ...
Może to być zaskoczeniem, ale nie napisałem tego ręcznie ... kod został wygenerowany przez następujący program Mathematica:
Wszystkie te
safetyCheck
wiersze napisałem ręcznie. Ale pierwszy wiersz tego kodu Mathematica ma w rzeczywistości około 28 000 znaków i sam został wygenerowany przez następujący kod CJam:(Który przyjmuje jako dane wejściowe 10 układów zakodowanych na stałe w interpretatorze. Możesz uruchomić kod online. )
Recepcja generowania kodu!
Wyjaśnienie
Na początek spójrz na ten skrypt CJam, aby zobaczyć, jak wyglądają labirynty.
Moje rozwiązanie opiera się na jednej ważnej obserwacji: dopóki podnosimy przedmioty wzdłuż jednej kolumny, nie będziemy zmieniać między układami, niezależnie od tego, czy komórki są wypełnione, czy nie. W szczególności, dopóki będziemy poruszać się wzdłuż lewej kolumny, pozostaniemy w układzie
0
. Dopóki przejdziemy do następnej kolumny, będziemy zachowywać układ1
.Problem polega na tym, jak zapewnić zmianę między układami, ponieważ nie wiemy, które komórki w kolumnie
1
mają na sobie elementy (jeśli w ogóle!).Oto algorytm (zaczynający się na komórce
0
w układzie0
):Teraz dla każdej komórki po prawej stronie bieżącej kolumny (wypróbuj je w kolejności według kolumny), spróbuj przenieść się tam w bieżącym układzie, podnieś element, a następnie przejdź do górnego rzędu w tej nowej kolumnie, używając nowego układu.
Jeśli próbowana komórka zawierała element, układ ulegnie zmianie i pomyślnie przejdziemy do nowej kolumny i układu. Ponieważ nowa (bezpieczna) pozycja znajduje się w górnym rzędzie, ale wszystkie próby znalezienia następnej kolumny obejmują 10 ruchów w górę netto, wszystkie inne próby zakończą się niepowodzeniem, więc możemy je zignorować.
Jeśli próbowana komórka nie zawierała przedmiotu, w większości przypadków stwór umrze podczas próby dotarcia do górnego rzędu przy użyciu złego układu, dlatego odrzuca tę próbę. Jednak nie zawsze tak jest. Na przykład próbowana komórka może już znajdować się w górnym rzędzie, więc w nowym układzie nie wykonano żadnych ruchów. Podobnie, w niektórych przypadkach ścieżka od próbowanej komórki do górnego rzędu jest wystarczająco krótka, aby była poprawna w obu układach. Zebrałem wszystkie przypadki, w których jest to problem ręcznie, i określiłem zestaw ruchów, który jest poprawny tylko w nowym układzie (ale który przenosi stwora z powrotem do komórki docelowej, więc w rzeczywistości jest to brak możliwości Nowy układ). Po każdej próbie, w której może to stanowić problem, wykonuję ten zestaw ruchów, aby zabić stwory, które nie „
Teraz pomyślnie przeszliśmy na górę następnej kolumny, która zawiera co najmniej jeden element. Wróć do kroku 1.
Możesz zauważyć, że struktura rozwiązania jest następująca:
Jeśli chodzi o kod Mathematica,
safetyCheck
ciągi to te ręcznie wybierane ruchy, które zapewniają, że osiągnęliśmy nowy układ. Pierwszy parametr wyszukiwania to układ, od którego zaczynamy, a drugi to komórka, którą próbowaliśmy. Wszelkie kombinacje, które nie zostały wyraźnie wymienione, dają jedynie pustą kontrolę bezpieczeństwa (ponieważ żadna nie jest konieczna).Oprócz tego po prostu ustawiam 10 labiryntów jako
Graph
obiekty, w których są dwie skierowane krawędzie między dowolnymi sąsiednimi (i połączonymi) komórkami, gdzie każda krawędź jest opatrzona adnotacjami o ruchu wymaganym do przejścia przez krawędź. Dzięki temu mogę po prostu znaleźć ścieżki za pomocą,FindShortestPath
a następnie wyodrębnić odpowiednie etykiety krawędziPropertyValue[..., EdgeLabels]
.Reszta kodu korzysta z tego, aby zaimplementować powyższy algorytm dość bezpośrednio.
Rzeczywiste dane wykresu są przechowywane
layouts
i zostały wygenerowane za pomocą skryptu CJam, który dekoduje liczby zgodnie z opisem w poście gliniarza i przekształca je w listę Mathematica, którą można łatwo przekształcić w wykres.źródło
HPR, autor: Zgarb
Kod:
Przede wszystkim ... kod został wygenerowany, a nie ręcznie pisany (lub wpisywany).
Fakty o języku:
Program wykorzystuje następujący kod psuedocode:
Środowisko prawie zawsze zawiera tylko 1 listę i 1 liczbę całkowitą.
Aby rozwiązać ten problem, stworzyłem mały silnik makr dla tego języka. Pozwala także na komentarze. Oto silnik makr:
Po zbudowaniu silnika makr powoli budowałem przydatne funkcje dla tego języka. Oto kod przetworzony przez silnik w celu utworzenia programu:
źródło
Brian & Chuck autorstwa Martina Büttnera
Poniższy program Python 2.7 generuje mój program Brian & Chuck, tłumacząc program pieprzenia mózgu na Brian & Chuck (z wyjątkiem, że
.
zawsze drukuje1
, ponieważ jest to jedyny znak, który musimy wypisać).Kontrola przepływu działa
magicznie,gdy Brian wypisuje polecenia Chucka na taśmie, aby wysłać Briana do właściwej pozycji w kodzie.Zwróć uwagę, że białe znaki
[]
dodane do programu B&C mają jedynie charakter dekoracyjny.źródło
Firetype, autor: kirbyfan64sos
Działający, skomentowany kod:
Zależy to od tłumacza, jak podano obecnie w odpowiedzi policjanta, co jest nieco sprzeczne z dokumentacją dotyczącą
%
i!
.Głównym wyzwaniem było tutaj przeanalizowanie danych wejściowych, ponieważ
\
znalezienie trzeciej trzeciej wartości jest dość proste.źródło
Acc !, DLosc
Ten język ma straszne wsparcie porównania.
W
count [varname] while 0
wypowiedzi na początku mają zadeklarować zmienną posiadających największą liczbę, drugi największy numer, trzecią co do wielkości liczbę, i tak dalej. Porównania dokonuje się odejmując dwie liczby, a następnie sprawdzając, czy wynik jest ujemny, sprawdzając, czy liczba jest mniejsza10^6
.źródło
Cynk, autor: kirbyfan64sos
To nie było takie trudne, kiedy zrozumiałem, jak działa ten język. Trudną częścią było wyłapanie błędów parsera, ale wydawało się, że dodanie zbędnych nawiasów to rozwiązało. Oto rozwiązanie:
Wyjaśnienie
W pierwszym i drugim rzędzie określam,
+
że jest tocut
operacja. Reszta to zrozumienie. Weźmy dane wejściowe101011101100
jako przykład i zacznijmy od najbardziej wewnętrznego:Pobiera te elementy
a
z zestawu danych wejściowych,S = {1,0,1,0,1,1,1,0,1,1,0,0}
których indeks nie jestlen(S)-1
, więc wszystkie oprócz ostatniego. Zauważyłem, że to również odwraca zestaw, więc wynik jest takiA = {0,1,1,0,1,1,1,0,1,0,1}
. Następnie zrozumieniewykonuje wszystkie elementy
A
z wyjątkiem pierwszego i odwraca go ponownie, w wynikuB = {1,0,1,0,1,1,1,0,1,1}
. Następnie dzielimy sięB
na0
s (powoduje to{1,1,{1,1,1},{1,1}}
lub jego odwrócenie, nie sprawdziłem, który z nich) i sortujemy wynik według długości. Zestawy singletonów są spłaszczone, ale wszystkie są1
s, więc ich długość wynosi wciąż 1. Oto kod:Wynikiem tego jest
C = {{1,1,1},{1,1},1,1}
. Na koniec odfiltrowujemy wszystko oprócz elementu o indeksie 2 wedługTo skutkuje zestawem
D = {1}
w naszym przypadku. Ogólnie może mieć formę{{1,1,..,1}}
, ale nie ma to znaczenia, ponieważ1
drukowane są tylko litery s.źródło
Zupa Kompasowa, BMac
To było fajne.
Edycja: ten program musi być poprzedzony nową linią, aby pracować z interpreterem BMac. Nie mogę sprawić, by nowa linia pojawiła się w bloku kodu.
Program podzielony jest na 4 sekcje wykonawcze.
Pierwszy z nich, w wierszu 1, dołącza do niego
#
do końca wejściowego poprzez znalezienie00
i zastępując 2-gi0
z#
. Zmienia również wszystkie1
s naA
s, ponieważ chciałem mieć jak najmniej1
s kodu źródłowego.Druga sekcja, w wierszu 5, pobiera drugą liczbę na wejściu i umieszcza ją poniżej pierwszej liczby jako ciąg
+
s. Na przykład, jeśli dane wejściowe są11011101100
, to spowoduje to:Trzecia sekcja, w wierszu 12, łączy ciąg
+
s z pierwszą liczbą: każda0
powyżej a+
staje sięA
,A
staje sięB
,B
staje sięC
iC
pozostaje niezmieniona. Następnie wracamy do drugiej sekcji, aby pobrać następny numer.Po połączeniu wszystkich liczb w ten sposób, dochodzimy do ostatniej sekcji w linii 18. Liczba
C
s jest naszym pożądanym wyjściem, więc zmieniamy je na1
s, pomijając pierwszą,C
ponieważ1
w kodzie źródłowym znajduje się pojedynczy, który jest drukowany wzdłuż z wyjściem.źródło