Bardzo mocno zainspirowany tym wyzwaniem Code Golf: Twój własny wąż ASCII - myślałem, że ustawienie go w poziomie doda dodatkową warstwę złożoności.
Przykładowy wąż poziomy:
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
Zasady są następujące:
- Drukowanych jest dokładnie 5 wierszy znaków
- Każda linia ma długość dokładnie 30 znaków, składającą się z kombinacji spacji i postaci, którą wybierzesz do rysowania węża
- Twój wąż zaczyna się na linii 3
- Następną linię do narysowania węża należy wybrać losowo z bieżącej linii, o jedną linię powyżej (jeśli nie jesteś jeszcze na linii 1) lub o jedną linię poniżej (jeśli nie jesteś jeszcze na linii 5).
- Wybory te muszą być jednakowo ważone. Więc jeśli jesteś na linii 1, masz 50% szans na pozostanie na linii 1 i 50% szans na przejście do linii 2. Jeśli jesteś na linii 2, masz 33% szansy na przejście do linii 1, a 33% szansy na pozostanie na linii 2 lub 33% szansy na przejście do linii 3
- Twój wąż nie musi odwiedzać każdej linii.
Odpowiedzi:
JavaScript (ES6), 98 bajtów
Zaoszczędź 7 bajtów dzięki @KevinCruijssen
Zwraca tablicę 5 ciągów znaków.
Wypróbuj online!
Skomentował
źródło
d
i użyć((y%4?3:2)|0)-(y>0)
dla -6 bajtów. Wypróbuj online.1
Wnew Random(...)
to ukryte domyślnie oczywiście .. Spróbuj go online.!!y
zamiast(y>0)
oszczędza 2 kolejne bajty.)Węgiel drzewny , 28 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wydrukuj trochę wypełnienia, aby wymusić 5 wierszy wydruku.
Powtórz 30 razy.
Wydrukuj zero (i przesuń w poziomie).
Jeśli współrzędna Y wynosi 2, przesuń losowo w górę o 0 lub 1.
Jeśli jest -2, przesuń losowo w dół o 0 lub 1.
W przeciwnym razie przesuń losowo w dół o -1, 0 lub 1.
źródło
Perl, 68 bajtów
To wcale nie wydaje się optymalne.
źródło
Galaretka , 24 bajty
Wypróbuj online!
Wyjaśnienie
źródło
R , 138 bajtów
Wypróbuj online!
Łatwo wyhodowany przez plannapa
źródło
Python 3, 144 bajty
@Ruts, @Turksarama i @mypetlion były bardzo pomocne w redukcji bajtów
Spróbuję to poprawić. Zabawne wyzwanie!
źródło
l+=random.randint(-1,1) l=0 if l<0 else l l=4 if l>4 else l
abyl+=random.randint(~-(l<1),l<4)
zapisać 31 bajtów.m=[[' 'for x in R(w)]for y in R(h)]
abym=[list(' '*w)for y in R(h)]
zapisać 7 bajtów.boolean
podklasaint
. WięcFalse
może być używany zamiast0
iTrue
może zastąpić1
.~
Jest jednoskładnikowa operator bitowegonot
i-
operator odwraca znak (mnożenie przez-1
). Więc~-(False)
ocenia-1
i~-(True)
ocenia na 0.m[2][0]=0
zniknęła) i 2 bajty w pętli for (for i in R(1,30):
staje sięfor i in R(30):
). Będziesz także musiał ponownie obliczyć l po ustawieniu 0. To powinno zabrać cię do 144 bajtów.R ,
120114 bajtówDzięki @Giuseppe za dodatkowe 6 bajtów!
Korzysta z tabeli prawdopodobieństw w następujący sposób:
gdzie każda kolumna odpowiada przypadkowi, tj. kolumna 1 jest wybierana, jeśli wąż znajduje się w rzędzie 1, co daje prawdopodobieństwo 0, 1/2 i 1/2, aby wybrać odpowiednio -1 [zejść], 0 [pozostać w miejscu] i 1 [ idź w górę] (
sample
automatycznie znormalizuj prawdopodobieństwa do 1), kolumna 2 dla wiersza 2 podaje prawdopodobieństwa 1/3, 1/3 i 1/3 itd.Wypróbuj online!
źródło
SOGL V0.12 ,
2221 bajtówWypróbuj tutaj!
Wyjaśnienie:
źródło
Japt,
3129 bajtówZwraca tablicę wierszy.
Sprawdź to
źródło
Japt , 26 bajtów
Przetestuj online!
źródło
Python 2 , 127 bajtów
Wypróbuj online!
źródło
Oktawa z pakietem statystycznym, 99 bajtów
Działa również w MATLAB z zestawem statystyk.
Wypróbuj online!
źródło
Japt , 28 bajtów
Oszczędność 9 bajtów dzięki produktom ETH
Wypróbuj online!
źródło
SmileBASIC,
10710510389 bajtówTa odpowiedź jest bardziej interesująca niż odpowiedź pionowa ze względu na (dosłowne) przypadki krawędzi.
64 bajty, bez spacji:
Znalazłem również kilka wariantów linii 2 o tej samej długości:
Podział liczb całkowitych Y / 3 służy do sprawdzenia, czy Y jest poza prawidłowym zakresem, a także do uzyskania znaku.
źródło
Java 8,
177170 bajtów-7 bajtów dzięki @ OlivierGrégoire .
Wyjaśnienie:
Wypróbuj online.
źródło
r+=Math.random()*(r%4>0?3:2)-(r>0?1:0)
aby zaoszczędzić kilka bajtów.C (gcc) ,
134130 bajtówWypróbuj online!
źródło
Python 3 , 123 bajty
Wypróbuj online!
Wygeneruj tablicę liczb całkowitych, a następnie przekonwertuj ją do każdego wiersza.
Python 2 , 120 bajtów
Wypróbuj online!
W przypadku Py2 redundantne parens dla
exec
iprint
można je usunąć, ale składnia w drugim wierszu jest nieprawidłowa.Prześciganie zarówno składania Py2 przez Rod, jak i Py3 przez linemade .
źródło
Rubin ,
9877 bajtówWypróbuj online!
Lambda zwraca tablicę ciągów.
Moim początkowym impulsem było wygenerowanie kolumn i ich transpozycja, ale o wiele łatwiej jest po prostu uniknąć tego kroku.
Chciałbym, aby zainicjować
a
z[" "*30]*5
, ale która stałaby płytkich kopii strun, co skutkuje bardzo gruby, nie slithery węża.Mógłbym użyć stałej takiejD
jak przyrost (dla tej samej liczby bajtów), ale Ruby narzekałaby za każdym razem, gdy ją przypisałem. Zdecydowałem, że wolę zmniejszać czytelność poprzez ponowne użyciei
pętli środkowej niż ostrzeżenie Debug, które należy zignorować.Chciałbym też zaoszczędzić kilka bajtówloop{x+=rand(3)-1;(0..4)===x&&break}
, ale spowodowałoby to stronniczość na krawędziach: 1/3 szansy na powrót do wewnątrz, 1/3 szansy na pozostanie i 1/3 szansy na wyjście poza granice jakiś czas przed tym, jak ostatecznie wróci losowo (to znaczy „zostań”).-20 bajtów: Użyj Ruby
Integer#[]
do tworzenia małych warunkowych, zapewniających prawidłowe ważenie ruchu dla wszystkich 5 pozycji. Zastępuje to wzór przerwania pętli (z niezerową szansą na niezatrzymanie się) dla ogromnych oszczędności. Dzięki, Eric Duminil !-1 bajt: Inicjalizacja
a
z(0..4).map
zamiast5.times
, dzięki ponownie Eric Duminil .źródło
loop
. Możesz obliczyć przyrost za pomocąrand(2+14[x])-30[x]
lubrand -(30[x])..15[x]
. Prawdopodobnie jest krótsza wersja. Mimo to, -20 bajtów nie jest złe! Wypróbuj online!x,a=2,(0..4).map{" "*30}
. Wypróbuj online!30[x]
to świetna sztuczka! Dzięki!Perl 6 , 85 bajtów
Wypróbuj online!
Długie wyrażenie w nawiasach to leniwa sekwencja generowana z elementu początkowego
(' ', ' ', 0, ' ', ' ')
, pierwszego pionowego paska wyniku. Każdy kolejny pasek / lista jest generowany z poprzedniego przez wywołanie jegorotate
metody, z przesunięciem losowo wybranym ze zbioru zawierającego0
,1
(jeśli pierwszy element jest niezerowy) i-1
(jeśli piąty element jest niezerowy).Matryca poziomych pasków jest transponowana z
[Z]
operatorem, przekształcając ją w listę pionowych pasków, z których każdy jest następniejoin
edytowany w pojedynczy ciąg i wysyłany za pomocąsay
.źródło
Scala, 207 bajtów
próba:
degolfed:
Moim unikalnym wynalazkiem - cóż, do tej pory nie czytałem innych rozwiązań, jest wygenerowanie Losowej (6), która jest domyślnie dwoma Losowymi (2 * 3). Jeśli jestem poza granicą, używam wartości r / 2 (0,1,2) i → (-1,0,1) każ mi iść w górę lub w dół. Jeśli jestem na granicy, mogę uniknąć kosztownego wywołania innej losowej postaci i po prostu wziąć moduł (2), aby zdecydować, czy mam zostać, czy powinienem iść.
Zobaczmy inne rozwiązania. :)
źródło
java
?try it
link? Kevin Cruijssen nie zawierał niektórych dodatków, potrzebnych do skompilowania tego kodu lub uruchomienia go w JShell, ale myślę, że jest to zgodne z wytycznymi - może być meta dyskusja. Jeśli chcesz, możesz spróbować zmniejszyć ten kod, używając również tablicy dwumieniowej. Drugim pomysłem jest ograniczenie przesuwanego kodu na końcu. Jakaś metoda mapy? Println jest ukryty przez Kevina. - Tak, Array daje poprawę o 8.Perl,
83101 bajtówNowość: bez problemu na granicach:
Nie golfowany:
źródło
PowerShell , 133 bajty
Wypróbuj online!
Tworzy tablicę 2D o szerokości 30 pól i wysokości 5 linii. (Uwaga - jeśli ktoś może wymyślić lepszy sposób na zainicjowanie tej tablicy, na zawsze <3 ciebie.) Ustawia zmienną pomocniczą
$l
na2
(jest używana dla linii, w której znajdował się poprzedni segment węża). Następnie pętle od0
do29
.W każdej iteracji ustawiamy nasz element węża na
0
. Następnie indeksujemy do skomplikowanej tablicy,Get-Random
która decyduje, czy pójdziemy w górę, czy w dół, czy pozostaniemy bez zmian. To dodaje się z powrotem do$l
.Na koniec zapętlamy pięć elementów
$a
i-join
ich elementy wewnętrzne w jednym łańcuchu. Te pięć ciągów pozostaje w przygotowaniu, a domniemaneWrite-Output
daje nam nowe linie za darmo.źródło
Clojure, 123 bajty
Nadchodzą pareny:
Wersja bez golfa:
Tworzy listę różnych wysokości ciała węża, a następnie iteruje od 0 do 4. Ilekroć wysokość odpowiada bieżącemu rzędowi, wypisuje 0, w przeciwnym razie puste. Niedopuszczenie do przekroczenia granicy naprawdę kosztuje bajty. Również rozpoznawanie, kiedy nowa linia jest w porządku, wymaga więcej bajtów. Można łatwo napisać jeden
doseq
, tworząc iloczyn kartezjański x i y, ale wtedy nie wiadomo, kiedy wydrukować nowy wiersz.źródło
Python3 + numpy,
137132 bajtyNie najkrótsze przesłanie pytona, nie najdłuższe i zdecydowanie nie najszybsze.
aktualizacja Za pomocą
numpy
polecenia diff zapisano 5 bajtów na sprawdzenie, czy wąż jest prawidłowym wzorcem, w porównaniu do ręcznego obliczania różnicy za pomocąj[1:]-j[:-1]
.źródło
C (gcc),
80767271 bajtówWypróbuj online!
źródło
f(r)
zamiastr;f()
R , 95 bajtów
Następna linia
x
jest zawsze wybierana z linii, które są nie dalej niż 1 od bieżącej linii (l[abs(x-l)<2]
). Użyciereplicate
zamiastfor
cyklu pozwala zaoszczędzić niektóre bajty potrzebne do inicjalizacji macierzy i manipulacji oraz wymaga użycia<<-
operatora podczas przypisywania do zmiennej globalnejx
.Wypróbuj online!
źródło
05AB1E , 25 bajtów
Wypróbuj online!
Wyjaśnienie
źródło