Kode Golf: Ular ASCII hewan peliharaan horizontal Anda sendiri

29

Sangat terinspirasi oleh tantangan ini Code Golf: Ular ASCII peliharaan Anda sendiri - Saya pikir membuatnya horizontal akan menambah lapisan kompleksitas tambahan.

Contoh ular horizontal:

            0 0               
  0        0 0 000            
00 0     00       000 0      0
    000 0            0 0   00 
       0                000   

Dan aturannya adalah:

  1. Tepat 5 baris karakter dicetak
  2. Setiap baris persis 30 karakter panjangnya, terdiri dari kombinasi spasi dan karakter yang Anda pilih untuk menggambar ular Anda
  3. Ular Anda mulai pada baris 3
  4. Baris berikutnya yang akan digunakan untuk menggambar ular Anda harus dipilih secara acak dari garis Anda saat ini, satu baris di atas (jika Anda belum berada di baris 1) atau satu baris di bawah (jika Anda belum berada di baris 5).
    • Pilihan-pilihan ini harus memiliki bobot yang sama. Jadi, jika Anda berada di jalur 1, Anda memiliki peluang 50% untuk tetap di jalur 1 dan 50% peluang untuk pindah ke jalur 2. Jika Anda berada di jalur 2, Anda memiliki peluang 33% untuk pindah ke jalur 1, sebuah 33% peluang untuk tetap di jalur 2 atau 33% peluang untuk pindah ke jalur 3
  5. Ular Anda tidak perlu mengunjungi setiap baris.
Bergeser
sumber
5
Selamat datang di PPCG! Ini adalah tantangan pertama yang bagus.
Giuseppe
Untuk klarifikasi, jika kita berada di tepi, apakah kita harus memilih secara seragam (tetap di jalur yang sama) dan (pergi ke jalur yang berbeda) atau dapatkah kita memiliki bobot yang tidak seragam?
Giuseppe
Dan dari tepi, apakah kita harus secara seragam mengambil / turun / baris yang sama?
Giuseppe
2
Mmm ... setidaknya batasan 5 baris menghentikan orang mencuri jawaban dari yang lain dengan transpos ditambahkan.
Magic Octopus Mm
9
Apakah memutar monitor secara fisik hingga 90 ° dihitung sebagai byte? : D
Eric Duminil

Jawaban:

11

JavaScript (ES6), 98 byte

Disimpan 7 byte berkat @KevinCruijssen

Mengembalikan array 5 string.

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&&' '))

Cobalah online!

Berkomentar

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
sumber
Anda dapat menjatuhkan ddan menggunakan ((y%4?3:2)|0)-(y>0)-6 byte. Cobalah online.
Kevin Cruijssen
Koreksi: -7 byte. The 1di new Random(...)implisit secara default tentu saja .. Cobalah secara online.
Kevin Cruijssen
@KevinCruijssen Terima kasih! ( !!yAlih-alih (y>0)menghemat 2 byte lagi.)
Arnauld
7

Arang , 28 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

P|   

Cetak beberapa pelapis untuk memaksa 5 garis output.

F³⁰«

Ulangi 30 kali.

0

Cetak nol (dan gerakkan secara horizontal).

≡ⅉ²M‽²↑

Jika koordinat Y adalah 2, naik secara acak dengan 0 atau 1.

±²M‽²↓

Jika -2, pindah ke bawah secara acak dengan 0 atau 1.

M⊖‽³↓

Kalau tidak, turun secara acak dengan -1, 0 atau 1.

Neil
sumber
6

Perl, 68 byte

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

Ini tidak terasa optimal sama sekali.

Ton Hospel
sumber
5

Jelly , 24 byte

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

Cobalah online!

Penjelasan

3μ'o1r '«5 ¥ $ Xµ30СṬ € o⁶z⁶Y || Program lengkap Niladic.
                         ||
3 || Mulai dari 3 ...
 μ μ30 || ... Jalankan 30 kali ...
               С || ... Dan kumpulkan hasilnya dalam daftar.
  'o1r' «5 ¥ $ X || - | Fungsi "Helper" yang monadik.
  'o1 || - | Bilangan bulat saat ini, dikurangi ATAU 1.
     r X || - | Ambil item acak dari rentang ^ hingga ...
      '«5 || - | ... Jumlahnya bertambah, dibatasi hingga 5 (menggunakan maksimum).
         ¥ $ || - | Elemen sintaksis. Digunakan untuk mengelompokkan tautan.
                 Ṭ € || Tidak benar masing-masing.
                   o⁶ || Logis ATAU dengan ruang tunggal.
                     z⁶ || Transposisi dengan ruang pengisi.
                       Y || Bergabunglah dengan baris baru.
Tuan Xcoder
sumber
5

R , 138 byte

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,,"")

Cobalah online!

Dengan mudah dikalahkan oleh plannapus

Giuseppe
sumber
5

Python 3, 144 byte

@Ruts, @Turksarama, dan @mypetlion sangat membantu dalam mengurangi byte

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)

Akan mencoba dan memperbaiki ini. Tantangan yang menyenangkan!

linemade
sumber
3
Ubah l+=random.randint(-1,1) l=0 if l<0 else l l=4 if l>4 else luntuk l+=random.randint(~-(l<1),l<4)menyimpan 31 byte.
mypetlion
1
Anda harus dapat menghapus banyak ruang dan baris baru.
Tn. Xcoder
1
Ubah m=[[' 'for x in R(w)]for y in R(h)]ke m=[list(' '*w)for y in R(h)]untuk menyimpan 7 byte.
mypetlion
2
Dalam python, booleansubkelas dari int. Jadi Falsebisa digunakan sebagai pengganti 0dan Truebisa diganti 1. The ~adalah operator unary untuk bitwise notdan -operator yang membalik tanda (kalikan dengan -1). Jadi ~-(False)mengevaluasi ke -1dan ~-(True)mengevaluasi ke 0.
mypetlion
1
Tetapkan 0 awal Anda di dalam loop Anda dan atur l setelah penugasan. Ini menghemat satu baris penuh ( m[2][0]=0hilang) dan 2 byte pada for loop ( for i in R(1,30):menjadi for i in R(30):). Anda juga perlu menghitung ulang l setelah Anda menetapkan angka 0. Ini akan membawa Anda ke 144 byte.
Turksarama
4

R , 120 114 byte

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,,"")

Terima kasih kepada @Giuseppe untuk 6 byte tambahan!

Menggunakan tabel probabilitas sebagai berikut:

> 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]

di mana setiap kolom sesuai dengan sebuah kasus, yaitu kolom 1 dipilih jika ular berada di baris 1, memberikan probabilitas 0, 1/2 dan 1/2 untuk memilih masing-masing -1 [turun], 0 [diam] dan 1 [ naik] ( sampleotomatis menormalkan probabilitas ke 1), kolom 2 untuk baris 2 memberikan probabilitas 1/3, 1/3 dan 1/3, dll ...

Cobalah online!

plannapus
sumber
114 bytes
Giuseppe
@Giuseppe Terima kasih! Memang tidak ada alasan untuk menyebutnya, dan saya lupa menggunakan daur ulang vektor untuk 0. ekstra itu.
plannapus
3

SOGL V0.12 , 22 21 byte

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

Coba Di Sini!

Penjelasan:

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
sumber
3

Japt, 31 29 byte

Mengembalikan array garis.

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

Menguji

Shaggy
sumber
3

Japt , 26 byte

30ÆQùU=U?5õ f_aU <2Ãö :3Ãy

Uji secara online!

Produksi ETH
sumber
2

Python 2 , 127 byte

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)

Cobalah online!

tongkat
sumber
2

Paket Oktaf dengan Statistik, 99 byte

Ini juga berfungsi di MATLAB dengan Kotak Alat Statistik.

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])

Cobalah online!

Luis Mendo
sumber
2

SmileBASIC, 107 105 103 89 byte

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

Jawaban ini lebih menarik daripada jawaban vertikal karena case edge (literal).

64 byte, tanpa ruang cetak:

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

Saya juga menemukan beberapa variasi baris 2 dengan panjang yang sama:

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

Divisi integer Y / 3 digunakan untuk memeriksa apakah Y berada di luar rentang yang valid, serta mendapatkan tanda.

12Me21
sumber
2

Java 8, 177 170 byte

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 byte terima kasih kepada @ OlivierGrégoire .

Penjelasan:

Cobalah 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
sumber
1
r+=Math.random()*(r%4>0?3:2)-(r>0?1:0)untuk menyimpan beberapa byte.
Olivier Grégoire
@ OlivierGrégoire Saya pikir saya sudah melakukan itu, tetapi ternyata tidak. Mungkin saya melakukannya dalam jawaban lain baru-baru ini ..: S Terima kasih!
Kevin Cruijssen
2

C (gcc) , 134 130 byte

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();}

Cobalah online!

MaSi
sumber
Selamat datang di PPCG!
Martin Ender
Terima kasih! Menggunakan putchar sebagai ganti printf menghemat 4 byte.
MaSi
1

Python 3 , 123 byte

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

Cobalah online!

Buat array bilangan bulat, lalu konversikan ke setiap baris.

Python 2 , 120 byte

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)

Cobalah online!

Untuk Py2, parens redundan untuk execdan printdapat dihapus, tetapi sintaks pada baris ke-2 tidak valid.

Mengungguli kedua pengiriman Py2 oleh Rod dan pengiriman Py3 oleh linemade .

Bubbler
sumber
1

Ruby , 98 77 byte

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

Cobalah online!

Seorang lambda mengembalikan deretan string.

Impuls awal saya adalah membuat kolom dan memindahkannya, tetapi jauh lebih mudah untuk menghindari langkah itu.

Saya akan menyukai untuk menginisialisasi adengan [" "*30]*5, tapi itu akan membuat salinan dangkal string, menghasilkan sangat gemuk, non-licin ular.

Saya bisa menggunakan konstanta seperti Dkenaikan (untuk jumlah byte yang sama), tetapi Ruby akan mengeluh setiap kali saya menugaskannya. Saya memutuskan saya lebih suka mengurangi keterbacaan dengan menggunakan kembali iloop ke tengah untuk memiliki sekelompok peringatan Debug untuk diabaikan.

Saya juga ingin menyimpan beberapa byte dengan loop{x+=rand(3)-1;(0..4)===x&&break}, tetapi itu akan menyebabkan bias di tepi: 1/3 kesempatan untuk kembali ke dalam, 1/3 kesempatan untuk tetap, dan 1/3 kesempatan untuk keluar batas untuk beberapa saat sebelum akhirnya berjalan secara acak kembali (yaitu, "tetap").

-20 byte: Gunakan Ruby Integer#[]untuk membuat conditional kecil, memastikan bobot gerakan yang benar untuk semua 5 posisi. Ini menggantikan pola loop-break (dengan peluang nol untuk gagal berhenti) untuk penghematan besar. Terima kasih, Eric Duminil !

-1 byte: Inisialisasi adengan (0..4).mapbukan 5.times, terima kasih lagi kepada 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
sumber
Awal yang bagus. Tidak perlu batin loop. Anda dapat menghitung kenaikan dengan rand(2+14[x])-30[x]atau rand -(30[x])..15[x]. Mungkin ada versi yang lebih pendek. Namun, -20 byte tidak buruk! Cobalah online!
Eric Duminil
1 byte lebih sedikit dengan x,a=2,(0..4).map{" "*30}. Cobalah online!
Eric Duminil
1
Wow, 30[x]trik yang bagus! Terima kasih!
benj2240
1

Perl 6 , 85 byte

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

Cobalah online!

Ekspresi kurung panjang adalah urutan malas yang dihasilkan dari elemen awal (' ', ' ', 0, ' ', ' '), strip vertikal pertama dari output. Setiap strip / daftar berturut-turut dihasilkan dari yang sebelumnya dengan memanggil rotatemetodenya, dengan offset dipilih secara acak dari set yang berisi 0, 1(jika elemen pertama adalah nol), dan -1(jika elemen kelima adalah nol).

Matriks strip horizontal ditransposisikan dengan [Z]operator, mengubahnya menjadi daftar strip vertikal, yang masing-masing kemudian joindiedarkan menjadi string tunggal dan output dengan say.

Sean
sumber
1

Scala, 207 Bytes

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)

mencicipi:

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

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)

Penemuan unik saya - yah, saya belum membaca solusi lain sejauh ini, adalah, untuk menghasilkan Random (6) yang secara implisit adalah dua Randoms, (2 * 3). Jika jauh dari perbatasan, saya menggunakan nilai r / 2 (0,1,2) dan → (-1,0,1) katakan padaku, untuk naik atau turun. Jika di perbatasan, saya dapat menghindari panggilan mahal karakter acak, dan hanya mengambil modulo (2), untuk memutuskan, haruskah saya tetap atau harus saya pergi.

Mari kita lihat solusi lain. :)

Pengguna tidak diketahui
sumber
Ya, gambar sampel salah. Itu benar. :)
pengguna tidak diketahui
batu scala! oh .. kode golf .. salah gunakan case itu muncul .. Bagaimana sih bisa disadap java?
javadba
@javadba: Sudahkah Anda mengklik try ittautannya? Kevin Cruijssen tidak menyertakan beberapa boilerplate, diperlukan untuk mengkompilasi kode ini atau menjalankannya di JShell, tapi saya kira itu sesuai dengan pedoman - mungkin ada diskusi meta. Jika suka, Anda dapat mencoba mengurangi kode ini, dengan menggunakan array dua-redup juga. Gagasan kedua adalah, untuk mengurangi kode geser pada akhirnya. Beberapa metode peta? Println disembunyikan oleh Kevin. - Ya, Array memberikan peningkatan sebesar 8.
pengguna tidak diketahui
Biarkan scala menyimpulkan tipe pengembalian int: Disimpan 4 karakter lagi.
pengguna tidak dikenal
jadi itu masuk ke stadion baseball untuk java sekarang
javadba
1

Perl, 83 101 byte

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'

Baru: Tanpa masalah probabilitas di perbatasan:

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'

Tidak Terkumpul:

$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.
sumber
2
Patroli perbatasan Anda tidak memberikan probabilitas tepat 50% untuk tetap berada di tepi.
Ton Hospel
0

PowerShell , 133 byte

$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$_}

Cobalah online!

Membangun array 2D seluas 30 spasi dengan tinggi 5 garis. (NB - jika seseorang dapat menemukan cara efektif yang lebih baik untuk menginisialisasi array ini, saya akan <3 selamanya). Menetapkan variabel helper $lmenjadi 2(ini digunakan untuk baris apa yang digunakan segmen ular sebelumnya). Kemudian loop dari 0ke 29.

Setiap iterasi, kami mengatur elemen ular kami 0. Kemudian kita indeks ke dalam array yang rumit dengan Get-Randomyang memilih apakah kita naik atau turun atau tetap sama. Itu ditambahkan kembali ke $l.

Akhirnya, kita loop melalui lima elemen $adan -joinelemen-elemen dalamnya masing-masing menjadi string tunggal. Kelima dawai tersebut dibiarkan di jalur pipa, dan yang tersirat Write-Outputmemberi kami baris baru secara gratis.

AdmBorkBork
sumber
0

Clojure, 123 byte

Inilah orangtua:

(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)))

Versi tidak disatukan:

(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)))

Buat daftar ketinggian berbeda dari tubuh ular, lalu iterate dari 0 hingga 4. Setiap kali ketinggian cocok dengan baris saat ini ia mencetak 0, jika tidak, kosong. Tidak membiarkan ketinggian melebihi batas benar-benar biaya byte. Juga mengenali kapan baris baru dalam urutan lebih intensif dari yang seharusnya. Orang bisa dengan mudah menulis satu doseq, membuat produk cartesian dari x dan y tetapi kemudian orang tidak tahu kapan harus mencetak baris baru.

Joshua
sumber
0

Python3 + numpy, 137 132 byte

Bukan pengiriman python terpendek, bukan yang terpanjang, dan jelas bukan yang tercepat.

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

Perbarui menggunakan numpyperintah diff disimpan 5 byte untuk menguji apakah ular adalah pola yang valid, dibandingkan dengan menghitung perbedaan secara manual dengan j[1:]-j[:-1].

pengguna2699
sumber
0

C (gcc), 80 76 72 71 byte

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;}

Cobalah online!

ay
sumber
Sarankan f(r)daripadar;f()
ceilingcat
0

R , 95 byte

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

Baris berikutnya xselalu dipilih dari baris yang tidak lebih dari 1 dari baris saat ini ( l[abs(x-l)<2]). Menggunakan replicatealih-alih forsiklus menghemat beberapa byte yang diperlukan untuk inisialisasi dan manipulasi matriks dan membutuhkan penggunaan <<-operator saat menetapkan ke variabel global x.

Cobalah online!

Robert Hacken
sumber
0

05AB1E , 25 byte

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

Cobalah online!

Penjelasan

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
sumber