W Twitch Plays Pokémon jedną z najbardziej irytujących przeszkód, z którymi można się zmierzyć, jest łamigłówka lodowa, w której musisz podróżować z jednego miejsca do drugiego, przesuwając się całkowicie w jednym kierunku, aż uderzysz w ścianę lub głaz.
Twoim zadaniem jest zbudowanie programu, który wygeneruje losową trudną łamigłówkę lodową.
Program będzie akceptować trzy numery, M
, N
, i P
, jako wejście (z 10 <= M <= 30
, 15 <= N <= 40
i 0 <= P < 65536
):
12 18
i wyświetli:
M
PrzezN
siatkę składającą się z.
aO
, co stanowi lód i głaz odpowiednio.- Znacznik pozycji reprezentujący miejsce, w którym układanka jest wprowadzana. Ten znacznik pozycja składa się z małej litery
L
,R
,T
, lubB
, reprezentujący w lewo, w prawo, do góry i na dole, a następnie przez szereg odpowiadające pozycji (z lewej strony lub z góry) na tej stronie, aby wprowadzić z. - Podobny znacznik pozycji reprezentujący miejsce wyjścia z układanki.
- Najkrótsze rozwiązanie puzzli, składający się z sekwencji
L
,R
,U
iD
, odpowiednio.
Przykładowe dane wyjściowe:
..O...O...........
............O.....
..O...............
.......O..........
..................
...........O......
O..O...........O..
..........O.......
..O..........O....
........O.........
O....O.........O..
............O.....
R 4
B 5
LDLDRULD
(Note that this output is actually invalid because it is not actually long enough.)
W przypadku wkładu M
i N
rozwiązanie układanki musi mieć co najmniej min(M, N)
kroki i przesunąć co najmniej 2 (M + N)
całkowitą liczbę pól. (Dla porównania powyższy logiczna przenosi w sumie 12 stopni, 69 obowiązuje w ruchu). Generatora logiczna musi wytwarzać inny M
przez N
puzzle z inną ścieżkę roztworu (tj inna kolejność etapów każdego roztworu) na każde nasiono P
.
- Zauważ, że wymogiem innej ścieżki rozwiązania jest unikanie rozwiązań, które próbują systematycznie generować ścieżki skalne, jak tutaj rozwiązanie Claudiu . Jeśli istnieją dwie lub trzy pary identycznych rozwiązań z powodu dziwactw losowych, będzie to w porządku, o ile program celowo nie próbuje systematycznie generować zagadek o tej samej sekwencji ruchów.
Najkrótszy kod do wykonania powyższych wygrywa.
>
i<
(lub dowolnego znaku) dla wejścia i wyjścia? Zagadki będą łatwiejsze do odczytania.LDLDRULD
która ma tylko 8 kroków długościOdpowiedzi:
Python,
672548znaków, ciekawsze łamigłówkiChociaż ściśle przestrzegając zasad, mój inny program w Pythonie bije ten, postanowiłem napisać taki, który i tak wygeneruje bardziej interesujące łamigłówki. Oto on:
Poziomy wcięć to spacja, tab, tab + spacja.
Próbki :
Wykorzystuje się go
P
jako ziarno, więc każda zP
nich wygeneruje tę samą łamigłówkę, a każda innaP
może być inna:Działa dość szybko do rozmiarów,
M=25,N=40
ale przeszłość robi się naprawdę wolna. Teoretycznie powinien działać,M=30, N=40
jeśli pozwolisz mu działać wystarczająco długo. Napisałem tutaj ręcznie na szlaku, ponieważ jest trudny do naśladowania - program po prostu wyświetla układankę.Objaśnienie :
Program zapętla się, generując losową pozycję początkową na górze, losową pozycję końcową na dole i losową siatkę z
12.5%
szansą na głaz w dowolnym miejscu. Następnie rozwiązuje zagadkę za pomocą pierwszego wyszukiwania i jeśli rozwiązanie istnieje i jest większe niżmin(H,W)
, drukuje i wychodzi.źródło
Java - 2632
Podziwiając techniczną czystość odpowiedzi Claudiu , postanowiłem spróbować swoich sił w tworzeniu nieco trudniejszych zagadek;)
Podstawowe kroki (dość proste):
Zaznaczam też każde miejsce jako „nogo”, gdy się przesuwam. Jeśli skończę w miejscu nogo (lub tuż przed jednym, co oznaczałoby, że tam idzie kamień), to jest to niewłaściwy krok.
Zasadniczo chodzi o to, aby losowo wygenerować wiele map i zachować pierwszą, która jest ważna. Planuję uczynić to mądrzejszym (cofanie, itp.), Ale teraz działa dobrze. Zobaczymy, że może to również ograniczyć zbędny kod.
W tej chwili generuje małe mapy (15 x 10) niemal natychmiast, średnie (30 x 20) mapy w kilka sekund, a duże (40 x 30) w losowej ilości czasu od 20 sekund do 20 minut, w zależności od nasion. Testuje między 300k-500k map / sekundę na mojej maszynie, w zależności od rozmiaru.
Uwaga dodatkowa: Czasami mapy nie są zbyt trudne, po prostu dlatego, że jest tylko tyle kamieni, ile kroków, i chyba że krok prowadzi do ściany, w większości przypadków jest tylko jedna opcja, jeśli chcesz uderzyć w prawdziwą skałę. Naprawię to później, umieszczając „losowe” skały w bezpiecznych miejscach po narysowaniu wszystkich kroków. Ponieważ miejsca nogo są już zaznaczone, powinno to być dość proste. Na razie skorzystaj z poniższych przykładów:
Dane wyjściowe pokazujące różne rozmiary / nasiona:
Maksymalny rozmiar 40x30:
Gra w golfa:
Z podziałami linii:
źródło
while(o<3){...;o=...;}
byćfor(;o<3;o=...){...;}
, oszczędzając jeden bajt?if(w%2<1)return new Point(f.x,f.y+i*d);else return new Point(f.x+i*d,f.y);
->return new Point(f.x+(w%2<1?0:i*d),f.y+(w%2<1?f.y:0));
.Python,
235206185176 znakówZastosowanie :
Dane wejściowe są poprzez standardowe wejście formularza
[M, N, P]
.Powiedziałeś, że mapy muszą być różne dla każdego ziarna
P
... i są to:I przykład z innym rozmiarem:
Spełnia wszystkie podane kryteria obiektywne:
P
prowadzi do innej układankiN + N%2
co najmniej krokówN
2 (M + N)
całkowitą ilość miejscaObjaśnienie :
Każdy rząd jest konstruowany przez powtarzanie pewnych elementów ciągu znaków
W
i ograniczenie długości doW
(używamH
iW
zamiastM
iN
).Pierwsze dwa rzędy zależą od
P
tego, czy każda łamigłówka będzie unikalna. Zasadniczo należy pamiętać, żeP
pasuje do 16-bitowej liczby całkowitej bez znaku. KonwertujęP
na binarny, używając.
dla 0 iO
dla 1:Pierwszy element rząd to ostatnie 15 bitów
t[1:]
, podczas gdy drugi element rząd jest 1 bitt[0]
. Nie mogłem umieścić tego wszystkiego w jednym rzędzie, ponieważ minimalna szerokość wynosi 15, co nie pasowałoby do wszystkich 16 bitów, jeśliP
> 32767. Zatem pierwsze dwa rzędy jednoznacznie reprezentują każdą z możliwych wartościP
.Trzeci rząd to pełna ściana, więc wartość
P
nie wpływa na rozwiązanie.Następnie podążaj za elementami labiryntu. Ta linia drukuje je wszystkie, powtarzając je aż do czapki. Wynik jest taki, jak widać powyżej:
Reszta zastanawiała się, jak rozwiązać dynamicznie generowany labirynt. To zależy tylko od szerokości labiryntu. Zauważyłem, że rozwiązaniem dla danej szerokości były:
itd. Stąd to tylko
URDR
powtórzyć i odcięte na właściwym miejscuW+W%2
.źródło