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.

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

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.


6

Perl, 68 byte

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

Ini tidak terasa optimal sama sekali.


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.

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


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!


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!



@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

3

Japt, 31 29 byte

Mengembalikan array garis.

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

Menguji




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!



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.


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

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!


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 .


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
}

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.


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


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

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.


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.


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



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!


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.