Kod Code Slidey Puzzle!

12

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, Ta pusta przestrzeń jest Ejednym 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ę Tporuszył)

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.txtlub po prostu fjest 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

Hobby Calvina
źródło
Więc program musi działać, gdy są tylko puste przestrzenie i nie ma bloków kafelków (i odwrotnie)?
grc
@grc Tak na twoje pierwsze pytanie i pamiętaj, że wciąż musi prosić o podanie wartości wypychania, nawet jeśli jest całkowicie pusta lub pełna. Nie, bloki nie mogą być identyczne. Sądzę, że gdyby tak było, można twierdzić, że masz dość trywialną odpowiedź. Więc wspomnę o tym.
Calvin's Hobbies
Czy mogę podać nazwę oryginalnego pliku źródłowego?
feersum
@feersum Jak możesz założyć, że tak jest zawsze f.txt? Tak.
Calvin's Hobbies
Czy blokady kodu nie zawsze będą mieć 1 linię? Wieloliniowe blokady kodu wydają mi się bardzo skomplikowane, a esolanguages ​​2D prawdopodobnie nie obsługują zapisu plików.
Def

Odpowiedzi:

5

TECO , 153

Pusty blok:

0T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Blok kafelkowy:

1T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Program, który sam się modyfikuje, musi zostać zapisany w pliku o nazwie x. Można go uruchomić za pomocą polecenia tecoc mung x.. Kropka jest ważna; bez niego TECO próbowało znaleźć plik o nazwie x.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.

feersum
źródło