Code Golf: Twój własny poziomy wąż ASCII

29

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:

  1. Drukowanych jest dokładnie 5 wierszy znaków
  2. 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
  3. Twój wąż zaczyna się na linii 3
  4. 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
  5. Twój wąż nie musi odwiedzać każdej linii.
Scoots
źródło
5
Witamy w PPCG! To dobre pierwsze wyzwanie.
Giuseppe
Dla wyjaśnienia, jeśli jesteśmy na krawędzi, czy musimy jednolicie wybierać (pozostać na tej samej linii) i (przejść do innej linii), czy też możemy mieć nierównomierne ciężary?
Giuseppe
A poza krawędziami, czy musimy równomiernie podnosić / opuszczać / tę samą linię?
Giuseppe
2
Mmm ... przynajmniej ograniczenie 5 linii powstrzymuje ludzi przed kradzieżą odpowiedzi od drugiej z dołączoną transpozycją.
Magic Octopus Urn
9
Czy fizyczne obrócenie monitora o 90 ° liczy się jako bajt? : D
Eric Duminil

Odpowiedzi:

11

JavaScript (ES6), 98 bajtów

Zaoszczędź 7 bajtów dzięki @KevinCruijssen

Zwraca tablicę 5 ciągów znaków.

f=(y=2,a=[...'  0  '])=>a[0][29]?a:f(y+=(Math.random()*(y%4?3:2)|0)-!!y,a.map((v,i)=>v+=i-y&&' '))

Wypróbuj online!

Skomentował

f = (                       // given:
  y = 2,                    //   y = current line (0-indexed)
  a = [...'  0  ']          //   a[] = array of 5 lines
) =>                        //
  a[0][29] ?                // if all columns have been processed:
    a                       //   stop recursion and return a[]
  :                         // else:
    f(                      //   do a recursive call with:
      y += (                //     the updated value of y, to which we add -1, 0 or 1:
        Math.random() *     //       pick a random value in [0,1)
        (y % 4 ?            //         if y is neither 0 or 4:
          3                 //             multiply it by 3
        :                   //           else:
          2                 //             multiply it by 2
        ) | 0               //       force an integer value
      ) - !!y,              //     subtract either 0 or 1
      a.map((v, i) =>       //     for each value v at position i in a[]:
        v += i - y && ' '   //       append either '0' if i = y or a space otherwise
      )                     //     end of map()
    )                       //   end of recursive call
Arnauld
źródło
Możesz upuścić di użyć ((y%4?3:2)|0)-(y>0)dla -6 bajtów. Wypróbuj online.
Kevin Cruijssen
Korekta: -7 bajtów. 1W new Random(...)to ukryte domyślnie oczywiście .. Spróbuj go online.
Kevin Cruijssen
@KevinCruijssen Thanks! ( !!yzamiast (y>0)oszczędza 2 kolejne bajty.)
Arnauld
7

Węgiel drzewny , 28 bajtów

P|   F³⁰«0≡ⅉ²M‽²↑±²M‽²↓M⊖‽³↓

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

P|   

Wydrukuj trochę wypełnienia, aby wymusić 5 wierszy wydruku.

F³⁰«

Powtórz 30 razy.

0

Wydrukuj zero (i przesuń w poziomie).

≡ⅉ²M‽²↑

Jeśli współrzędna Y wynosi 2, przesuń losowo w górę o 0 lub 1.

±²M‽²↓

Jeśli jest -2, przesuń losowo w dół o 0 lub 1.

M⊖‽³↓

W przeciwnym razie przesuń losowo w dół o -1, 0 lub 1.

Neil
źródło
6

Perl, 68 bajtów

perl -E '$%=2;s:$:$n++%5-$%&&$":emg,$%-=!!$%+rand!($%%4)-3for($_=$/x4)x30;say'

To wcale nie wydaje się optymalne.

Ton Hospel
źródło
5

Galaretka , 24 bajty

3µ’o1r‘«5¥$Xµ30СṬ€o⁶z⁶Y

Wypróbuj online!

Wyjaśnienie

3µ'o1r '«5 ¥ $ Xµ30СṬ € o⁶z⁶Y || Pełny program Niladic.
                         ||
3 || Począwszy od 3 ...
 µ µ30 || ... Wykonaj 30 razy ...
               С || ... i zbierz wyniki na liście.
  „o1r” «5 ¥ $ X || - | Monadyczna funkcja „pomocnika”.
  „o1 || - | Bieżąca liczba całkowita, zmniejszona OR 1.
     r X || - | Chwyć losowy przedmiot z zakresu od ^ do ...
      „« 5 || - | ... Zwiększona liczba, ograniczona do 5 (wykorzystuje maksimum).
         || $ || - | Elementy składniowe. Służy do grupowania łączy.
                 || EUR || Każda nieprawda.
                   o⁶ || Logiczne OR z pojedynczą spacją.
                     z⁶ || Transponuj ze spacjami wypełniającymi.
                       Y || Dołącz przez nowe linie.
Pan Xcoder
źródło
5

R , 138 bajtów

m=matrix(" ",30,5)
m[1,3]=0
x=3
s=sample
for(i in 2:30)m[i,x<-x+(-1)^(x==5)*s(0:1,1)*x%in%c(1,5)+(s(3,1)-2)*x%in%2:4]=0
write(m,"",30,,"")

Wypróbuj online!

Łatwo wyhodowany przez plannapa

Giuseppe
źródło
5

Python 3, 144 bajty

@Ruts, @Turksarama i @mypetlion były bardzo pomocne w redukcji bajtów

import random
m=[list(' '*30)for y in range(5)]
l=2
for i in range(1,30):
 m[l][i]=0
 l+=random.randint(~-(l<1),l<4)
for j in m:
  print(*j)

Spróbuję to poprawić. Zabawne wyzwanie!

Linemade
źródło
3
Zmień, l+=random.randint(-1,1) l=0 if l<0 else l l=4 if l>4 else laby l+=random.randint(~-(l<1),l<4)zapisać 31 bajtów.
mypetlion
1
Powinieneś być w stanie usunąć wiele spacji i znaków nowej linii.
Pan Xcoder
1
Zmień, m=[[' 'for x in R(w)]for y in R(h)]aby m=[list(' '*w)for y in R(h)]zapisać 7 bajtów.
mypetlion
2
W pythonie booleanpodklasa int. Więc Falsemoże być używany zamiast 0i Truemoże zastąpić 1. ~Jest jednoskładnikowa operator bitowego noti -operator odwraca znak (mnożenie przez -1). Więc ~-(False)ocenia -1i ~-(True)ocenia na 0.
mypetlion
1
Przypisz początkowe 0 do pętli i ustaw l po przypisaniu. To oszczędza ci jedną całą linię ( m[2][0]=0zniknęł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.
Turksarama,
4

R , 120 114 bajtów

m=matrix
r=m(" ",30,5)
x=3
for(i in 1:30){r[i,x]=0;x=x+sample(-1:1,1,,m(c(0,rep(1,13)),3)[,x])}
write(r,"",30,,"")

Dzięki @Giuseppe za dodatkowe 6 bajtów!

Korzysta z tabeli prawdopodobieństw w następujący sposób:

> matrix(c(0,rep(1,13)),3)
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    1    1    1    1
[2,]    1    1    1    1    1
[3,]    1    1    1    1    0
Warning message:
In m(c(0, rep(1, 13)), 3) :
  data length [14] is not a sub-multiple or multiple of the number of rows [3]

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ę] ( sampleautomatycznie znormalizuj prawdopodobieństwa do 1), kolumna 2 dla wiersza 2 podaje prawdopodobieństwa 1/3, 1/3 i 1/3 itd.

Wypróbuj online!

plannapus
źródło
114 bajtów
Giuseppe
@Giuseppe Thanks! Naprawdę nie było powodu, aby to pseudonim, i zapomniałem użyć recyklingu wektorowego dla tych dodatkowych 0.
plannapus
3

SOGL V0.12 , 22 21 bajtów

3ā'∑∫⁵╗ž⁴H1ΧGI5χ⁴-ψ+;

Wypróbuj tutaj!

Wyjaśnienie:

3                      push 3
 ā                     push an empty array - the canvas
  '∑∫                  30 times do, pushing counter            | stack = 3, [], 1
     ⁵                   duplicate the Y coordinate            | stack = 3, [], 1, 3
      ╗ž                 at those coordinates insert "+"       | stack = 3, ["","","+"]
        ⁴                duplicate from below                  | stack = 3, ["","","+"], 3
         H               decrease                              | stack = 3, [...], 2
          1Χ             maximum of that and 1                 | stack = 3, [...], 2
            G            get the item 3rd from top             | stack = [...], 2, 3
             I           increase it                           | stack = [...], 2, 4
              5χ         minimum of that and 5                 | stack = [...], 2, 4
                ⁴-       subtract from the larger a copy of the smaller value | stack = [...], 2, 2
                  ψ      random number from 0 to pop inclusive | stack = [...], 2, 2
                   +     add those                             | stack = [...], 4
                    ;    and get the array back ontop          | stack = 4, ["","","+"]

                         implicitly output the top item - the array, joined on newlines
dzaima
źródło
3

Japt, 31 29 bajtów

Zwraca tablicę wierszy.

30ÆQùU±[2V=Jõ VVJò]mö i3 gUÃy

Sprawdź to

Kudłaty
źródło
2

Python 2 , 127 bajtów

from random import*
s=['']*5
n=3
r=range(5)
exec"for i in r:s[i]+=' 0'[i==n]\nn=choice(r[n and~-n:n+2])\n"*30
print'\n'.join(s)

Wypróbuj online!

Pręt
źródło
2

Oktawa z pakietem statystycznym, 99 bajtów

Działa również w MATLAB z zestawem statystyk.

p=3;for k=1:29
p=[p;p(k)+fix(randsample(setdiff([1 pi 5],p(k)),1)-3)/2];end
disp(['' (p==1:5)'+32])

Wypróbuj online!

Luis Mendo
źródło
2

SmileBASIC, 107 105 103 89 bajtów

FOR I=0TO 29FOR J=0TO 5LOCATE I,J?" 0"[Y+2==J]NEXT
Y=Y+RND(3)-1D=Y/3>>0Y=Y-D-D*RND(2)NEXT
NEXT

Ta odpowiedź jest bardziej interesująca niż odpowiedź pionowa ze względu na (dosłowne) przypadki krawędzi.

64 bajty, bez spacji:

FOR I=0TO 29LOCATE,Y+2?0;
Y=Y+RND(3)-1D=Y/3>>0Y=Y-D-D*RND(2)NEXT

Znalazłem również kilka wariantów linii 2 o tej samej długości:

Y=Y+RND(3)-1D=Y/3>>0Y=Y-D-D*RND(2)NEXT
Y=Y+RND(3)-1D%=Y/3Y=Y-D%-D%*RND(2)NEXT
Y=Y+RND(3)-1Y=Y-Y DIV 3*(RND(2)+1)NEXT
Y=Y+RND(3)-1Y=Y/3OR.Y=Y-D-D*RND(2)NEXT

Podział liczb całkowitych Y / 3 służy do sprawdzenia, czy Y jest poza prawidłowym zakresem, a także do uzyskania znaku.

12Me21
źródło
2

Java 8, 177 170 bajtów

v->{int a[][]=new int[5][30],c=0,r=2;for(;c<30;r+=Math.random()*(r%4>0?3:2)-(r>0?1:0))a[r][c++]=1;String R="";for(int[]y:a){for(int x:y)R+=x<1?" ":"~";R+="\n";}return R;}

-7 bajtów dzięki @ OlivierGrégoire .

Wyjaśnienie:

Wypróbuj online.

v->{                // Method with empty unused parameter and String return-type
  int a[][]=new int[5][30],
                    //  Integer-matrix of size 5x30
      c=0,          //  Column, starting at index 0
      r=2;          //  Row, starting at index 2
  for(;c<30;        //  Loop `c` 30 times
      r+=Math.random()*(r%4>0?3:2)-(r>0?1:0))
                    //    After every iteration: change `r` with -1,0,1 randomly
                    //     If `r` is 0: random [0;2)-0 → 0,1
                    //     If `r` is 4: random [0;2)-1 → -1,0
                    //     If `r` is 1,2,3: random [0:3)-1 → -1,0,1
    a[r][c++]=1;    //   Fill the cell at indices `r,c` from 0 to 1
  String R="";      //  Result-String, starting empty
  for(int[]y:a){    //  Loop over the rows of the matrix
    for(int x:y)    //   Inner loop over the individual column-cells of the matrix
      R+=x<1?       //    If the value of the cell is still 0:
          " "       //     Append a space
         :          //    Else (it's 1):
          "~";      //     Append the character
    R+="\n";}       //   After every row, Append a new-line
  return R;}        //  Return the result-String
Kevin Cruijssen
źródło
1
r+=Math.random()*(r%4>0?3:2)-(r>0?1:0)aby zaoszczędzić kilka bajtów.
Olivier Grégoire
@ OlivierGrégoire Myślałem, że już to zrobiłem, ale najwyraźniej nie. Może zrobiłem to ostatnio w innej odpowiedzi ..: S Dzięki!
Kevin Cruijssen
2

C (gcc) , 134 130 bajtów

r,x,y=3,a[31],m;f(){for(x=0;x<31;x++){m?putchar(x==30?10:a[x]-m?32:48):(a[x]=y);r=rand();y+=y==1?r%2:y==5?-r%2:1-r%3;}++m<6&&f();}

Wypróbuj online!

MaSi
źródło
Witamy w PPCG!
Martin Ender
Dzięki! Użycie putchar zamiast printf pozwala zaoszczędzić 4 bajty.
MaSi
1

Python 3 , 123 bajty

from random import*
i,*a=2,
exec("a+=i,;i+=randint(-(i>0),i<4);"*30)
for x in range(5):print(''.join(' 0'[x==i]for i in a))

Wypróbuj online!

Wygeneruj tablicę liczb całkowitych, a następnie przekonwertuj ją do każdego wiersza.

Python 2 , 120 bajtów

from random import*
i=2;a=[]
exec"a+=i,;i+=randint(-(i>0),i<4);"*30
for x in range(5):print''.join(' 0'[x==i]for i in a)

Wypróbuj online!

W przypadku Py2 redundantne parens dla execi printmoż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 .

Bubbler
źródło
1

Rubin , 98 77 bajtów

->{a=(0..4).map{" "*30}
x=2
30.times{|i|a[x][i]=?@
x+=rand(3-17[x])-30[x]}
a}

Wypró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ć az [" "*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 takiej Djak 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życie ipętli środkowej niż ostrzeżenie Debug, które należy zignorować.

Chciałbym też zaoszczędzić kilka bajtów loop{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 az (0..4).mapzamiast 5.times, dzięki ponownie Eric Duminil .

->{
  a = (0..4).map{ " " * 30 }      # a is the return array: 5 strings of 30 spaces
  x = 2                           # x is the snake position
  30.times{ |i|                   # For i from 0 to 29
    a[x][i] = ?@                  #   The ith position of the xth row is modified
    x += rand(3 - 17[x]) - 30[x]  #   Using bit logic, add rand(2 or 3) - (0 or 1)
  }
  a                               # Return the array of strings
}
benj2240
źródło
Dobry początek. Nie potrzeba wewnętrznego loop. Możesz obliczyć przyrost za pomocą rand(2+14[x])-30[x]lub rand -(30[x])..15[x]. Prawdopodobnie jest krótsza wersja. Mimo to, -20 bajtów nie jest złe! Wypróbuj online!
Eric Duminil
1 bajt mniej z x,a=2,(0..4).map{" "*30}. Wypróbuj online!
Eric Duminil
1
Wow, 30[x]to świetna sztuczka! Dzięki!
benj2240
1

Perl 6 , 85 bajtów

.join.say for [Z] ((' ',' ',0,' ',' '),{.rotate(set(0,+?.[0],-?.[4]).pick)}...*)[^30]

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 jego rotatemetody, z przesunięciem losowo wybranym ze zbioru zawierającego 0, 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ępnie joinedytowany w pojedynczy ciąg i wysyłany za pomocą say.

Sean
źródło
1

Scala, 207 bajtów

val b=Array.fill(150)('.')
def s(y:Int,x:Int)={val r=Random.nextInt(6)
val z=y+(if(y>3)-r%2
else if(y<1)r%2
else r/2-1)
b(z*30+x)='$'
z}
(3/:(0 to 28))(s(_,_))
b.mkString("").sliding(30,30).foreach(println)

próba:

...................$$$...$.$$.
.$$$..............$...$.$.$...
$...$$$..$...$$.$$.....$......
.......$$.$.$..$..............
...........$..................

degolfed:

val buf = List.fill(150)('.').toBuffer
def setRowCol (y:Int, x:Int): Int = {
  val r = Random.nextInt(6)
  val z = y + (
    if (y>3) 
        -(r%2)
    else if (y<1) 
        (r%2)
    else 
        r/2-1
  )
  buf (z * 30 + x) = '$'
  z
}
(3 /: (0 to 28)(setRowCol (_, _))
println 
buf.mkString ("").sliding(30,30).foreach(println)

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. :)

nieznany użytkownik
źródło
Tak, zły przykładowy obraz. To robi. :)
użytkownik nieznany
skały Scala! och ... kod golfa ... pojawia się niepoprawny przypadek użycia ... Jak, u licha, udało się go ominąć java?
javadba
@javadba: Czy kliknąłeś try itlink? 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.
użytkownik nieznany
Niech scala wyprowadzi typ zwrotu int: Zapisano 4 dodatkowe znaki.
użytkownik nieznany
więc teraz dostaje się do gry w piłkę dla javy
javadba
1

Perl, 83 101 bajtów

perl -E '$l=3;map{map$s[$_-1].=/$l/?0:" ",1..5;$l-=1-int 3*rand;$l=~y/60/51/}1..30;say for@s'

Nowość: bez problemu na granicach:

perl -E '$l=3;map{map$s[$_-1].=/$l/?0:" ",1..5;$l=int($l<2?1+2*rand:$l>4?6-2*rand:$l-1+3*rand)}1..30;say for@s'

Nie golfowany:

$l=3;                             #start line
map{
  map $s[$_-1].=/$l/?0:" ",1..5;  #0 at current char and line, space elsewhere
  $l-=1-int 3*rand;               #up, down or stay
  $l=int( $l<2 ? 1+2*rand
        : $l>4 ? 6-2*rand
        :        $l-1+3*rand )    #border patrol
}
1..30;                            #position
say for@s                         #output result strings/lines in @s
Kjetil S.
źródło
2
Twój patrol graniczny nie daje odpowiedniego prawdopodobieństwa 50% pozostania na krawędzi.
Ton Hospel
0

PowerShell , 133 bajty

$a=(,' '*30),(,' '*30),(,' '*30),(,' '*30),(,' '*30);$l=2;0..29|%{$a[$l][$_]=0;$l+=0,(1,($x=1,-1),$x,$x,-1)[$l]|Random};$a|%{-join$_}

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ą $lna 2(jest używana dla linii, w której znajdował się poprzedni segment węża). Następnie pętle od 0do 29.

W każdej iteracji ustawiamy nasz element węża na 0. Następnie indeksujemy do skomplikowanej tablicy, Get-Randomktó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 $ai -joinich elementy wewnętrzne w jednym łańcuchu. Te pięć ciągów pozostaje w przygotowaniu, a domniemane Write-Outputdaje nam nowe linie za darmo.

AdmBorkBork
źródło
0

Clojure, 123 bajty

Nadchodzą pareny:

(let[l(take 30(iterate #(max(min(+(-(rand-int 3)1)%)4)0)3))](doseq[y(range 5)](doseq[x l](print(if(= y x)0" ")))(println)))

Wersja bez golfa:

(let [l (take
       30
       (iterate
        #(max
          (min
           (+ (- (rand-int 3) 1) %)
           4)
          0)
        3))]
(doseq [y (range 5)]
  (doseq [x l]
    (print (if (= y x) 0 " ")))
  (println)))

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.

Jozuego
źródło
0

Python3 + numpy, 137 132 bajty

Nie najkrótsze przesłanie pytona, nie najdłuższe i zdecydowanie nie najszybsze.

from pylab import*
j=r_[2,:29]
while any(abs(diff(j))>1):j[1:]=randint(0,5,29)
for i in r_[:5]:print(''.join(' #'[c] for c in j==i))

aktualizacja Za pomocą numpypolecenia 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].

użytkownik2699
źródło
0

C (gcc), 80 76 72 71 bajtów

a[5][30],i,r;f(){for(r=2;i<30;r+=rand()%3-1)a[r=r>4?4:r<0?0:r][i++]=1;}

Wypróbuj online!

Vazt
źródło
Zaproponuj f(r)zamiastr;f()
ceilingcat
0

R , 95 bajtów

x=3;l=1:5
write(t(replicate(30,{y=ifelse(x-l,' ',0);x<<-sample(l[abs(x-l)<2],1);y})),'',30,,'')

Następna linia xjest zawsze wybierana z linii, które są nie dalej niż 1 od bieżącej linii ( l[abs(x-l)<2]). Użycie replicatezamiast forcyklu pozwala zaoszczędzić niektóre bajty potrzebne do inicjalizacji macierzy i manipulacji oraz wymaga użycia <<-operatora podczas przypisywania do zmiennej globalnej x.

Wypróbuj online!

Robert Hacken
źródło
0

05AB1E , 25 bajtów

Y30F©ð5×0®ǝs<DÌŸ4ÝÃΩ}\)ζ»

Wypróbuj online!

Wyjaśnienie

Y                           # push the initial value 2
 30F                        # 30 times do
    ©                       # store a copy of the current value in register
     ð5×                    # push 5 spaces: "     "
        0®ǝ                 # insert 0 at the position of the current value
           s<DÌŸ            # push the range [current-1 ... current-1+2]
                4ÝÃ         # keep only numbers in [0 ... 4]
                    Ω       # pick one at random
                     }\     # end loop and discard the final value
                       )ζ   # transpose the list
                         »  # join by newlines
Emigna
źródło