Najbardziej rozpoznawalną przesuwaną łamigłówką jest piętnaście łamigłówek . Ma siatkę 4 na 4, 15 płytek i jedno puste miejsce na siatce. Płytki mogą się poruszać tylko w pustej przestrzeni i zawsze muszą znajdować się w jednej linii z siatką.
Zdefiniujmy uogólnioną układankę przesuwną jako dwuwymiarową szerokość W o szerokości H ( W , H obie liczby całkowite dodatnie), która zawiera pewną liczbę identycznych nieoznaczonych płytek (od 0 do W × H z nich) przyciągniętych do siatki, ułożonych w w jakikolwiek sposób (bez nakładania się), z pustymi polami siatki wypełniającymi resztę obszaru.
Na przykład, jeśli W i H wynoszą 3, a płytka jest, T
a pusta przestrzeń jest E
jednym z wielu możliwych układów układania bocznego
TTT
TET
EET
W przypadku tych łamigłówek możliwe są 4 ruchy: wepchnij wszystko w górę , wepchnij wszystko w dół , wepchnij wszystko w lewo lub wepchnij wszystko w prawo . „Przesunięcie” w jakimś kierunku powoduje, że wszystkie płytki przesuwają się w tym kierunku tak daleko, jak to możliwe, aż uderzą w inną płytkę lub granicę siatki. Czasami pchanie nie zmieni układu siatki,
Jeśli przykładowa siatka jest przesunięta w prawo, wynikiem jest
TTT
ETT
EET
Przesunięty w lewo wynik to
TTT
TTE
TEE
Odepchnięty wynik to
EET
TET
TTT
(zwróć uwagę, że zarówno skrajnie lewy się T
poruszył)
W tym przypadku przesunięcie nie zmienia układu siatki.
Zwróć uwagę, że ponieważ kafelki są nierozróżnialne, łamigłówki nie mają stanów „rozwiązanych”. Pamiętaj również, że układanka może rozpocząć się w układzie, do którego nie można wrócić po wykonaniu pchnięcia (np. Jedna płytka na środku siatki 3 na 3).
Wyzwanie
Używając tylko drukowalnego ASCII, napisz dwa prostokątne bloki kodu, zarówno M znaków o szerokości, jak i N znaków o wysokości (dla dowolnych liczb całkowitych M , N ). Jeden blok kodu reprezentuje kafelek przesuwanej układanki, drugi blok kodu reprezentuje pustą przestrzeń siatki.
Umieszczenie tych dwóch bloków kodu w siatce W przez H stworzy przesuwaną łamigłówkę reprezentowaną przez kod, którą można zapisać jako plik tekstowy i uruchomić jako normalny program. Po uruchomieniu tego rodzaju programy powinny pytać użytkownika poprzez stdin o liczbę od 1 do 4; 1 jest w górę, 2 w dół, 3 w lewo, 4 w prawo . Gdy użytkownik wpisze swoją liczbę i wejdzie liczba trafień, program oblicza, jak przesunąć kafelki kodu źródłowego w tym kierunku i zapisuje nowy układ puzzli w pliku (nowym pliku lub w tym samym pliku), a następnie kończy działanie.
Proces ten można powtarzać w nieskończoność za pomocą nowego przesuwanego pliku kodu łamigłówki generowanego po każdym pchnięciu.
Przykład
Załóżmy, że mój blok kodu kafelka wygląda tak
// my
// tile
i mój pusty blok kodu przestrzeni siatki wygląda tak
//empty
//space
( M = 7, N = 2, to oczywiście nie jest rzeczywisty kod)
Każde prawidłowe układanie przesuwanych puzzli tych dwóch bloków powinno stworzyć program w języku, którego używam, który można uruchomić, aby użytkownik mógł popchnąć się w określonym kierunku.
Reprezentacja kodu przykładowej siatki to:
// my// my// my
// tile// tile// tile
// my//empty// my
// tile//space// tile
//empty//empty// my
//space//space// tile
Uruchomienie tego i naciśnięcie 2 (w dół), a następnie Enter spowoduje zapisanie tego w innym pliku (lub tym samym pliku):
//empty//empty// my
//space//space// tile
// my//empty// my
// tile//space// tile
// my// my// my
// tile// tile// tile
Plik ten można następnie uruchomić i wcisnąć w ten sam dokładny sposób.
Notatki
Każda reprezentacja kodu przesuwanej łamigłówki W przez H powinna być możliwa do uruchomienia i być w stanie poprawnie się pchać. Dotyczy to wszystkich rozmiarów siatki od 1 do 1 do pewnego rozsądnego maksimum (2 16 x 2 16 lub więcej).
Program może odczytać własny kod źródłowy. Nie ma ograniczeń opartych na quinach. Wszelkie komentarze są również w porządku.
Program musi poprosić o podanie kierunku, w którym należy przesunąć, nawet jeśli nie ma żadnych płytek do przesunięcia lub płytek nie można wcisnąć. Pytanie to po prostu miejsce do wpisania numeru, nie jest wymagana żadna wiadomość.
Możesz założyć, że dane wejściowe są zawsze prawidłowe (1, 2, 3 lub 4).
Wypełnianie bloków kodu spacjami jest w porządku. Pamiętaj, że mogą one być drukowane tylko w formacie ASCII, co oznacza brak zakładek i znaków nowej linii (poza nowymi liniami, które pomagają tworzyć bloki kodu).
Jeśli twój język nie obsługuje standardowego wejścia, użyj dowolnej metody wprowadzania, która wydaje się najbliższa.
Możesz wymagać, aby nowa linia znajdowała się na końcu plików z łamigłówkami. (Lub wymagać, aby go nie było.)
Jak nazwać nowe pliki, nie jest ważne.
f.txt
lub po prostuf
jest w porządku.Dwa bloki kodu mogą nie być identyczne.
Punktacja
Celem jest zrobienie tego przy najmniejszym rozmiarze kodu (dlatego jest to oznaczone kodem golfowym). Zgłoszenie z najmniejszym obszarem bloku kodu ( M × N ) jest zwycięzcą. Tie-breaker otrzymuje najwyższą głosowaną odpowiedź.
Powiązane: Kod, który sam uruchamia Game of Life
źródło
f.txt
? Tak.Odpowiedzi:
TECO , 153
Pusty blok:
Blok kafelkowy:
Program, który sam się modyfikuje, musi zostać zapisany w pliku o nazwie
x
. Można go uruchomić za pomocą poleceniatecoc mung x.
. Kropka jest ważna; bez niego TECO próbowało znaleźć plik o nazwiex.tec
. Końcowy znak nowej linii musi być obecny.Ograniczenie ASCII do wydruku było trochę uciążliwe, ponieważ język używa wielu znaków niedrukowalnych. Większość z nich można zastąpić dwubajtową sekwencją rozpoczynającą się od znaku karetki, ale „Escape” (ASCII 27) to jedyny znak, którego „nie da się uniknąć”, więc aby go uzyskać, musiałem umieścić jego wartość ASCII w ciągu i wykonaj to. Tak więc 4-bajt
EBx<Esc>
eksplodował@^Ux#EBx#27@:^UX##Mx
.Można to znacznie zmniejszyć, szczególnie poprzez podzielenie programu na dwie części, przechowywanie ich jako ciągów znaków i uruchamianie tylko wtedy, gdy obie są obecne.
źródło