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
f.txt
? Tak.