Napisz funkcję, która przyjmuje dwa parametry: dodatnią liczbę całkowitą n i listę słów.
Biorąc pod uwagę sześcian n -przez- n -przez- n jednostek, przypisz losową literę (AZ) do każdej jednostki powierzchni. (W przypadku kostki 3x3x3 na każdej powierzchni będzie 9 jednostek powierzchni).
Następnie ustal, czy mrówka idąca po powierzchni (z możliwością krzyżowania twarzy) może przeliterować każde z podanych słów. Załóżmy, że aby przeliterować słowo, litery muszą znajdować się obok siebie w górę / w dół lub w lewo / w prawo, ale niekoniecznie na tej samej twarzy. [ Edytuj, dla jasności: Mrówka może odwrócić swoją ścieżkę i używać liter więcej niż jeden raz. Każda jednostka powierzchni liczy się jako jeden znak, więc aby przeliterować słowo powtarzającymi się literami (np. „Patrz”), mrówka musiałaby odwiedzić trzy sąsiednie jednostki.]
Funkcja powinna generować dwie rzeczy:
1) Każda z liter na każdej twarzy, w taki sposób, aby można było wywnioskować topologię. Na przykład dla kostki 2x2x2 akceptowalny wynik wygląda następująco:
QW
ER
TY OP UI
DF JK XC
AS
GH
LZ
VB
2) Każde ze słów wraz z logiczną logiką określającą, czy mrówka może przeliterować słowo, idąc po powierzchni sześcianu. Na przykład:
1 ask
0 practical
1 pure
0 full
Bonusowe wyzwanie (nie będzie brane pod uwagę w ocenie, tylko dla zabawy): Zamiast n reprezentującego tylko rozmiar sześcianu, niech n reprezentuje również wymiar kształtu. Zatem n 2 będzie dawać kwadrat 2x2; an n 3 dałoby sześcian 3x3x3; a n n 4 dałoby wynik działania 4x4x4x4.
qwq
lubqq
w przykładowej kostce?Odpowiedzi:
Rubinowy, 272 bajtów
Dwie niepotrzebne nowe znaki są dodawane do kodu po obu stronach funkcji zagnieżdżonej,
g
aby poprawić czytelność. Są one wyłączone z wyniku. Znakif=
przypisujące funkcję anonimową do zmiennej są również wykluczone.Format wyjściowy to
0
lub1
na pytanie zamiast natywnegotrue
i Rubyfalse
. Nowa linia (zamiast spacji) służy do oddzielenia wartości logicznej i słowa. Rozumiem, że jest to akceptowalna interpretacja wymagań wyjściowych, ale jeśli nie, wpływ na liczbę bajtów byłby niewielki.Wynik
Po około 50 takich połączeniach:
W końcu otrzymałem następujący wynik z 2 trafieniami.
ANT
jest w prawym dolnym rogu i idzie w górę, iAN
jest udostępniany przezCAN
, zC
rundy owijania do góry po lewej stronie.Wyjaśnienie
Konkretne rozwinięcie wybranego sześcianu zostało wybrane częściowo ze względu na łatwość rysowania, ale głównie ze względu na łatwość wyszukiwania.
Znaki inne niż alfabet (kropki plus znak nowej linii na końcu każdej linii) są ważną częścią pola, na którym mrówka może chodzić.
Wyszukiwanie jest wykonywane przez funkcję rekurencyjną
g
, która jest zagnieżdżona w funkcjif
. Jeśli przekazane słowo jest pustym ciągiem, wyszukiwanie jest zakończone i$r
ustawione na 1. Jeśli mrówka znajduje się na kwadracie, który odpowiada pierwszej literze słowa, wyszukiwanie jest kontynuowane we wszystkich czterech kierunkach: funkcja jest wywoływana ponownie ze słowem skróconym przez usunięcie pierwszej litery. W takim przypadku parametr kierunku jest ignorowany. Przenoszenie odbywa się poprzez rekurencyjne wywoływanie z indeksem komórki zmienionym o wartości wx.
Wynik dodawania jest brany modulo do wielkości siatki plus dodatkowa połowa linii. Oznacza to, że dolna linia zawija się do góry i odwrotnie, z prawidłowym przesunięciem w poziomie.Jeśli mrówka znajduje się na kwadracie innym niż litera, musi poruszać się zygzakiem po schodach, aż znajdzie kwadrat z literą. Będzie zygzakiem w kierunku południowo-wschodnim lub północno-zachodnim. Jest to symulowane przez wywołania rekurencyjne z
d
parametrem XORed z 1 za każdym razem, aby śledzić jej ruch. Dopóki nie dojdzie do kwadratu z następną literą, słowo wejściowe nie ulega skróceniu. Dogodnie można tego dokonać za pomocą tej samej rekurencji, co w przypadku wyszukiwania w obszarze z literami. Różnica polega na tym, że rekursja ma tylko jedną gałąź, gdy mrówka znajduje się w obszarze białych znaków, a nie 4 w obszarze litery.Skomentowany kod
źródło