Ustawić
Rozważ dziwnie ukształtowane pudełko zawierające 29 ponumerowanych komórek, jak pokazano na ryc. 1 poniżej.
Wewnątrz tego pudełka 2D znajdują się dwa gatunki zwierząt w kształcie kwadratu: szubienice i smole. Ryc. 1 (a) pokazuje niektóre strzępki na niebiesko, a niektóre smole na czerwono. Każde stworzenie zajmuje dokładnie jedną komórkę siatki. Pudełko może zawierać od 0 do 26 shubble, ale zawsze będzie zawierało dokładnie dwa smole.
Pod wpływem siły grawitacji shubble i smole siedzą na dnie pudełka, układając się na wierzchu wszystkiego pod nimi. Oba gatunki są wyjątkowo leniwe i pozostają wiecznie nieruchome.
W pudełku znajduje się również stot, przedstawiony jako czarny kwadrat, który zajmuje dokładnie jedną komórkę siatki. Kieł nie podlega grawitacji.
Pudełko ma jeden otwór umieszczony na dole komórki 28, jak pokazano na rysunku.
Aby tekstowo przedstawić konfigurację shubble, smoles i stot w polu, używamy 29-znakowego łańcucha, po jednym znaku na komórkę siatki, w wyliczonej kolejności, z .
reprezentowaniem pustej komórki, o
reprezentującej shubble, x
reprezentującą smole , i @
reprezentujący stot. Na przykład konfiguracja z rys. 1 (a) jest reprezentowana przez ciąg znaków .........@...o....ooo..xox...
.
Manipulacje
Skrzynkę można obrócić o dowolną wielokrotność 90 °. Podczas obracania pudełka shubble i smole pozostają nieruchome w obrębie komórek siatki. Po zakończeniu obrotu spadają bezpośrednio w dół, aż albo i ) zostaną zablokowane przez ścianę poniżej, ii ) zostaną zablokowane przez szew, smole lub stot poniżej, lub iii ) wpadną przez otwór w komórce 28 i wyjdź z pudełka. Stot nie spada; pozostaje ustalony w bieżącej komórce, nawet jeśli stworzenia spoczywają na nim.
Skrzyni nie można obrócić ponownie, dopóki stworzenia nie upadną i nie osiągną nowej stabilnej konfiguracji.
Tekstowo, obroty skrzynek są oznaczone jako +
dla obrotu o 90 ° zgodnie z ruchem wskazówek zegara, |
dla obrotu 180 ° i -
dla obrotu 90 ° przeciwnie do ruchu wskazówek zegara.
Dodatkowo, stot można przesuwać w czterech kierunkach kompasu w przyrostach jednej komórki siatki. Ruch nie może: i ) spowodować kolizji między kikutem a stworzeniem (tj. Docelowa komórka siatki musi być pusta), ii ) spowodować kolizję między kikutem a ścianą ani iii ) spowodować, aby kikut wyszedł z pudełka przez dziura w komórce 28.
Stot nie może się również poruszać, jeśli na nim spoczywają stworzenia (w odniesieniu do aktualnej grawitacji).
Tekstowo ruchy stot są oznaczane przez <
dla lewej, >
dla prawej, ^
dla góry i v
dla dołu. Ruchy Stot są zawsze określane w odniesieniu do „standardowej” (nieobróconej) ramy przedstawionej na rysunkach. To znaczy, jeśli kikut znajduje się w komórce 10, ruch ^
zawsze przenosi go do komórki 5, a ruch >
zawsze przenosi go do komórki 11. Orientacja pudełka nie wpływa na kierunek ruchu.
Sekwencje manipulacji są kodowane przy użyciu ciągów znaków od lewej do prawej. Na przykład sznurek +<<^-
wskazuje, że pudełko jest obrócone o 90 ° w kierunku zgodnym z ruchem wskazówek zegara, następnie stot przesuwa się dwukrotnie w lewo i raz w górę (w stosunku do standardowej ramy), a następnie pudełko jest obracane o 90 ° w kierunku przeciwnym do ruchu wskazówek zegara z powrotem do pierwotnej orientacji.
Wyzwanie
Z absolutnie dobrych powodów (których nie mogę ujawnić), chcemy wyodrębnić wszystkie shubble z pudełka bez wydobywania jednego smole. Aby to osiągnąć, możemy użyć manipulacji opisanych powyżej.
Przed rozwiązaniem tego problemu należy symulować wpływ różnych manipulacji na zawartość pudełka, na którym skupia się to wyzwanie.
Musisz napisać program, który akceptuje dwa argumenty z stdin
(lub równoważne):
- ciąg opisujący początkowy stan skrzynki
- sekwencja manipulacji
Możesz założyć, że oba argumenty są poprawne pod względem składniowym, że pudełko zaczyna się w standardowej orientacji, a początkowy stan pudełka jest stabilny i legalny.
Program musi generować dane wyjściowe stdout
(lub równoważne):
( przypadek 1 ) końcowy stan skrzynki, wyrażony jako ciąg znaków, jeśli sekwencja ruchów jest legalna (nie narusza zasad ruchu stot) i nie powoduje wychodzenia żadnych smolów z pudełka. Ostateczna orientacja pudełka nie jest ważna.
( przypadek 2 ) pojedynczy wykrzyknik
!
, jeśli sekwencja ruchów jest nielegalna lub powoduje opuszczenie skrzynki przez smole
Punktacja
Zwycięski program jest najkrótszym programem pod względem liczby bajtów , z zastrzeżeniem bardzo lukratywnych mnożników premii:
twierdzić, że mnożnik wynosi 0,65, jeśli zamiast wydrukować zakodowane wyjście dla przypadku 1, program wyprowadza obraz ASCII ramki w jej ostatecznym stanie i orientacji, używając znaków spec dla shubble, smoles, stots i pustych komórek i umieszczając
*
w komórce tuż za otworem w komórce 28. Wiodące i końcowe białe znaki są ignorowane.Na przykład, jeśli ryc. 1 (a) zostanie obrócony o 90 °, moc wyjściowa wyniesie
. . ..... .o... xo.@. *ooo.. x .
twierdzą, że mnożnik wynosi 0,22, jeśli zamiast drukowania zakodowanego wyjścia dla przypadku 1, program wysyła plik obrazu lub wyświetla okno GUI z obrazem pudełka w jego ostatecznym stanie i orientacji. Zdjęcie powinno być w stylu pokazanym na ryc. 1 (a), pokazując komórki siatki, ściany i stworzenia / stoty za pomocą kolorowych pól.
twierdzą, że mnożnik wynosi 0,15, jeśli zamiast drukowania zakodowanego wyjścia dla przypadku 1, program wyświetla animowane okno .gif lub animowane okno GUI pokazujące wszystkie stany pośrednie w symulacji w odstępach 1 sek. Obowiązują te same zasady, jak w przypadku mnożnika 0,22. Pierwsza klatka animacji powinna przedstawiać stan początkowy symulacji. Dodatkowo animacja powinna pokazywać „ukryte” stany pośrednie
shubble / smoles spada do stabilnej konfiguracji o jedną komórkę na klatkę animacji po obrocie
pośredni obrót skrzynki o 90 ° przy obrocie o 180 °
zgłosić mnożnik 0.12, jeśli program tworzy animowane okno .gif lub animowane okno GUI powyższego stylu, ale działa przy 20 fps i pokazuje
płynne, ciągłe animacje obracającego się pudełka
płynne, ciągłe animacje poruszania się kału i rozpadania się / smolli w stabilną konfigurację
Pęcherzyki spadające przez otwór w komórce 28 powinny być pokazane wychodzące z pudełka i powinny zniknąć, gdy całkowicie znikną na zewnątrz. Możesz wybrać własny czas animacji, o ile nie zostanie wykonana więcej niż 1 manipulacja / s.
Całkowity wynik to floor( base score * multiplier )
. Można domagać się tylko jednego mnożnika.
W końcu to świat smole. ;)