Narysuj ścieżkę mrówki Langtona .
Opis
Kwadraty na płaszczyźnie mają różne kolory, albo czarny, albo biały. Dowolnie identyfikujemy jeden kwadrat jako „mrówkę”. Mrówka może podróżować w dowolnym z czterech głównych kierunków na każdym kroku. Mrówka porusza się zgodnie z poniższymi zasadami:
- Na białym kwadracie obróć o 90 ° w prawo, odwróć kolor kwadratu, idź o jedną jednostkę do przodu
- Na czarnym kwadracie obróć o 90 ° w lewo, odwróć kolor kwadratu, przejdź o jedną jednostkę do przodu
Dane techniczne
- Dane wejściowe: liczba całkowita N od 0 do 725 (włącznie).
- Wyjście: siatka 17 na 17 reprezentująca „ścieżkę” mrówki z kroku N.
Zasady
- Mrówka zaczyna być skierowana w prawo (godzina 3).
- Mrówka zaczyna się na środku siatki.
- Użyj odpowiednio
_#@
do białych kwadratów, czarnych kwadratów i mrówek. - Siatka jest początkowo całkowicie biała.
- Możesz stworzyć kompletny program lub funkcję w interpretowanym języku.
- Wprowadzanie przez stdin lub argument.
Przykłady
Aktualizacja: wynik N = 450 sprawy był niepoprawny.
N = 0
_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
________@________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
N = 1
_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
________#________
________@________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
N = 450
_________________
_________________
___________##____
____##______##___
___#__##___##_#__
__###_#@#__#__#__
__#_#_#_#__#_#___
_____###___#_____
_____#___________
_____#__###______
___#_#_#__#_#_#__
__#__#_#____###__
__#_##__##___#___
___##______##____
____##___________
_________________
_________________
Odpowiedzi:
GolfScript - 67 znaków
Rozwiązanie hallvabo w języku Python jest najbardziej podobne do tego, dlatego opiszę tylko główne różnice.
Tablica jest przechowywana jako ciąg zamiast tablicy. Dzięki temu możemy zaktualizować wartość na tablicy o mniej znaków (ponieważ ciągi są zawsze płaskie), a więc przejście do pożądanego formatu wyjściowego jest łatwe.
Pozycja mrówki jest zwiększana przez wzór
((d&1)*17+1)*((d&2)-1)
(tj..1&17*)\2&(*
), Gdzie d jest kierunkiem. Używamy zmiennej6
, abyśmy mogli pominąć inicjalizację.źródło
:6
- tak bardzo hipster. Nienawidzę debugowania twojego kodu :-)Ruby 1.9, 104 znaki
Wprowadź za pomocą argumentu funkcji.
m
r*r>1
zamiastr.abs>1
String#scan
do generowania wyniku. Zmieniono==
na>
String#tr
na warunkowyźródło
Python, 123
Wystarczy drobna przeróbka mojego rozwiązania Python z http://golf.shinh.org/p.rb?Langtons+Ant .
źródło
GolfScript
969489Mój ulubiony język nienawiści powrócił z kolejną wiązką częściowo czytelnego sortowania kodu bajtowego.
Wersja 89, w końcu udało mi się zintegrować @ z pętlą wyjściową.
94 wersja:
Skomentowano:
Edytuj, równie dobrze mógłbym stworzyć dużą wersję, tutaj jest 59 * 59 i 10500 iteracji:
.
źródło
Windows PowerShell,
119118źródło
PHP,
350309307312174161166159151149147144143Nie golfił
350 -> 309: Różne techniki kompresji za pomocą pętli for (), również zaktualizowane, aby wyświetlały prawidłowe dane wyjściowe.
309 -> 307: Przekształcona główna pętla for () w pętlę while ().
307 -> 312: Zapomniałem go zmienić, aby użyć argv.
312 -> 174: Przekodowany na podstawie innej odpowiedzi.
174 -> 161: Nie ma już domyślnej wartości całej tablicy.
161 -> 166: Argv wygrywa ponownie.
166 -> 159: Nie ma potrzeby redefiniowania argumentu [1].
159 -> 151: Nic już nie domyślnie, PHP robi to automatycznie.
151 -> 149: Usunięto zestaw nawiasów, kolejność operacji eliminuje potrzebę.
149 -> 147: Skrócono ostatnią pętlę for (), nawiasy klamrowe nie są potrzebne.
147 -> 144:Pętla Last for () jest teraz pętlą while ().
144 -> 143: Użyto zmiennej tymczasowej do zapisania znaku.
źródło
C,
166162Oto tłumaczenie mojego podejścia Delphi do C, pokazujące, jak kompaktowe może być C. Pożyczyłem warunkową sztuczkę nowego wiersza od fR0DDY (dzięki kolego!):
Wersja z wciętymi komentarzami wygląda następująco:
źródło
"_@#"[g[i]]
ia+=(1-(d&2))*(1+(16*(d&1)))
(1+d%2*16)
oszczędza kilka znaków.Delphi, 217
Wcięty i skomentowany kod brzmi następująco:
Wkład:
Wyjście:
źródło
C 195 znaków
http://www.ideone.com/Dw3xW
Dostaję to za 725.
źródło
p+=t+4;x+=a[p%4];
zamiastp=(p+t+4)%4;x+=a[p];
zapisuje trzy znaki.sed, 481 znaków
Można zmniejszyć do 478 znaków, usuwając pierwszą linię i uruchamiając z
-n
Wymaga N linii wejściowych, np. gdy działa jako
wyjścia:
źródło
Perl, 110 znaków
Numer jest odczytywany z pierwszego wiersza STDIN. Reszta danych wejściowych jest ignorowana.
Nieco bardziej czytelny:
Edycje
(112 → 111) Nie trzeba aktualizować
$d
z wartością modulo-4.(111 → 110) Można teraz wstawić
$d
przyrostDodatek (109 znaków)
Możemy mieć go o jedną postać krótszą, jeśli będziesz szczęśliwy, że wystąpi szczególny przypadek
N=0
niepowodzenia (nie wyświetla@
postaci dla mrówki). Wszystkie pozostałe dane wejściowe działają poprawnie:Różnice polegają na tym, że teraz używamy
%f
zamiast@f
, abyśmy mogli używać ujemnych wskaźników i powtarzamy-144..144
zamiast0..288
. Oszczędza to konieczności inicjalizacji$p
.źródło
Mathematica, 94 znaki
źródło
> <>, 122 bajty
Ryzykując małą nekromancję wątków, pomyślałem, że napisanie odpowiedzi w> <> będzie ciekawym wyzwaniem ...
Ten program oczekuje, że liczba kroków do obliczenia będzie obecna na stosie przed wykonaniem.
źródło