Code Golf: Kendi yatay evcil hayvanınız olan ASCII yılanı


29

Bu meydan okumadan çok etkilendik Code Golf: Kendi hayvanınız ASCII yılanı - Yatay yapmanın fazladan bir karmaşıklık katmanı getireceğini düşündüm.

Örnek bir yatay yılan:

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

Ve kurallar:

  1. Tam olarak 5 satır karakter yazdırılıyor
  2. Her satır tam olarak 30 karakter uzunluğunda olup, bir boşluk kombinasyonundan ve yılanınızı çizmek için seçtiğiniz karakterden oluşur.
  3. Yılan 3. hatta başlıyor.
  4. Yılanınızı çizmek için kullanılacak bir sonraki satır rastgele satırınızdan, bir satır üstünden (zaten 1. satırda değilseniz) veya bir satır (rastgele 5. satırda değilseniz) seçilmelidir.
    • Bu seçimler eşit olarak ağırlıklandırılmalıdır. Eğer 1. hattaysanız, 1. hatta kalmanız için% 50, 2. hatta kalmanız için% 50 şansınız var, 2. hattaysanız, 1. hatta geçmek için% 33 şansınız var. 2. hatta% 33 oranında kalma şansı ya da 3. hatta 3.% geçiş yapma şansı
  5. Sizin yılan değil her satırı ziyaret etmek gerekir.

5
PPCG'ye Hoşgeldiniz! Bu iyi bir ilk meydan okumadır.
Giuseppe

Netleştirmek için, eğer biz kenardaysak, aynı şekilde (aynı çizgide kalmalıyız) ve (farklı bir çizgiye gidelim) düzgünce mi toplanmalıyız yoksa düzgün olmayan ağırlıkları alabilir miyiz?
Giuseppe

Ve kenarlardan, düzgün bir şekilde aşağı / yukarı / aynı çizgiyi almak zorunda mıyız?
Giuseppe

2
Mmm ... en azından 5 hatlı sınırlama, insanların diğerinden gelen cevapları bir devrik eklenmiş olarak çalmalarını engelliyor.
Magic Octopus Urn,

9
Monitörü fiziksel olarak 90 ° döndürmek bayt olarak sayılıyor mu? : D
Eric Duminil,

Yanıtlar:


11

JavaScript (ES6), 98 bayt

@KevinCruijssen sayesinde 7 bayt kaydedildi

5 diziden oluşan bir dizi döndürür.

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

Çevrimiçi deneyin!

Yorumlananlar

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

Bırakabilir dve ((y%4?3:2)|0)-(y>0)-6 bayt için kullanabilirsiniz . Çevrimiçi deneyin.
Kevin Cruijssen

Düzeltme: -7 bayt. 1İçinde new Random(...)elbette varsayılan olarak örtülü olduğu .. çevrimiçi deneyin.
Kevin Cruijssen

@KevinCruijssen Teşekkürler! ( !!yyerine (y>0)2 bayt daha tasarruf eder.)
Arnauld,

7

Kömür , 28 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

P|   

5 satırlık çıkış zorlamak için biraz dolgu yazdırın.

F³⁰«

30 kez tekrarlayın.

0

Sıfır yazdırın (ve yatay hareket edin).

≡ⅉ²M‽²↑

Y koordinatı 2 ise, rasgele 0 veya 1 oranında yukarı hareket edin.

±²M‽²↓

Eğer -2 ise, rastgele 0 veya 1 ile aşağı hareket ettirin.

M⊖‽³↓

Aksi takdirde -1, 0 veya 1 ile rasgele aşağı hareket ettirin.


6

Perl, 68 bayt

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

Bu hiç de optimal gelmiyor.


5

Jöle , 24 bayt

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

Çevrimiçi deneyin!

açıklama

3µ'o1r '«5 ¥ $ Xµ30СṬ € o⁶z⁶Y || Niladik tam program.
                         ||
3 || 3'ten başlayarak ...
 µ30 ... 30 kez çalıştır ...
               С || ... Ve sonuçları bir listede toplayın.
  'o1r' «5 ¥ $ X || - | Monadic "Yardımcı" işlevi.
  'o1 || - | Geçerli tam sayı, OR 1 değerini düşürdü.
     r X || - | ^ İle ... aralığından rastgele bir öğe al
      '«5 || - | ... Artan sayı, 5 ile sınırlıdır (maksimum kullanır).
         ¥ $ || - | Sözdizimi elemanları Bağlantıları gruplamak için kullanılır.
                 Ṭ € || Her birine isabet et.
                   o⁶ || Mantıksal VEYA tek boşlukla.
                     z⁶ || Doldurma boşluklarıyla devrik yapın.
                       Y || Yeni hatlara katıl.

5

R , 138 bayt

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

Çevrimiçi deneyin!

Handily plannapus tarafından aşıldı


5

Python 3, 144 bayt

@Ruts, @Turksarama ve @ mypetlion baytları azaltmada çok yardımcı oldular

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)

Bunu dener ve geliştirir. Eğlenceli meydan okuma!


3
31 bayt kaydetmek l+=random.randint(-1,1) l=0 if l<0 else l l=4 if l>4 else liçin değiştirin l+=random.randint(~-(l<1),l<4).
Mypetlion

1
Birçok alanı ve yeni çizgiyi kaldırabilmelisiniz.
Bay Xcoder

1
7 bayt kaydetmek m=[[' 'for x in R(w)]for y in R(h)]için değiştirin m=[list(' '*w)for y in R(h)].
Mypetlion

2
Python'da, booleanbir alt sınıf int. Böylece Falseyerine kullanılabilir 0ve Trueyerini alabilir 1. ~Bitwise için tekli bir operatördür notve -operatör işaretini (çarpma ile çevirir -1). Öyleyse ~-(False)değerlendirir -1ve ~-(True)0 olarak değerlendirir.
18

1
İlk 0'nızı döngünüzün içine atayın ve atamadan sonra l olarak ayarlayın. Bu size bir bütün satırı ( m[2][0]=0gitti) ve for döngüsüne 2 bayt kazandırır ( for i in R(1,30):olur for i in R(30):). Ayrıca 0 değerini ayarladıktan sonra l değerini yeniden hesaplamanız gerekir. Bu işlem sizi 144 bayta götürmelidir.
Turksarama

4

R , 120 114 bayt

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

Ek 6 byte için @Giuseppe'e teşekkürler !

Aşağıdaki gibi olasılık tablosunu kullanır:

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

burada her sütun bir duruma karşılık gelir, yani yılan sıra 1'de ise sütun 1 toplanır, sırasıyla -1 [aşağı in], 0 [sabit kal] ve 1 [toplamı] seçmek için olasılık 0, 1/2 ve 1/2 verilir. yukarı git] ( sampleolasılıkları otomatik olarak 1'e göre normalleştir), satır 2 için sütun 2, 1/3, 1/3 ve 1/3 gibi olasılıkları verir ...

Çevrimiçi deneyin!



@Giuseppe Teşekkürler! Takma isim için gerçekten hiçbir neden yoktu ve bu ekstra 0 için vektör geri dönüşümünü kullanmayı unuttum.
plannapus

3

SOGL V0.12 , 22 21 bayt

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

Burada dene!

Açıklama:

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




2

Octave İstatistik Paketi, 99 bayt

Ayrıca MATLAB'da İstatistik Araç Kutusu ile çalışır.

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

Çevrimiçi deneyin!



2

SmileBASIC, 107 105 103 89 bayt

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

Bu cevap (değişmez) uç davalardan dolayı dikey cevaptan daha ilginçtir.

64 bayt, yazdırma alanı olmadan:

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

Ayrıca, aynı uzunlukta olan 2. satırda birkaç varyasyon buldum:

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

Y / 3 tamsayı bölümü, Y'nin geçerli aralığın dışında olup olmadığını kontrol etmek ve işaretini almak için kullanılır.


2

Java 8, 177 170 bayt

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

@ OlivierGrégoire sayesinde -7 bayt .

Açıklama:

Çevrimiçi deneyin.

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)birkaç bayt kaydetmek için.
Olivier Grégoire

@ OlivierGrégoire Bunu zaten yaptığımı sanıyordum, ama görünüşe göre değil. Belki de son zamanlarda başka bir cevapta yaptım ..: S Teşekkürler!
Kevin Cruijssen

2

C (gcc) , 134 130 bayt

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

Çevrimiçi deneyin!


PPCG'ye Hoşgeldiniz!
Martin Ender

Teşekkürler! Printf yerine putchar kullanmak 4 byte kazandırır.
MaSi

1

Python 3 , 123 bayt

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

Çevrimiçi deneyin!

Bir tamsayı dizisi oluşturun, ardından her satıra dönüştürün.

Python 2 , 120 bayt

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)

Çevrimiçi deneyin!

Py2 için, gereksiz parens için execve printkaldırılabilir, ancak 2. satırdaki sözdizimi geçersiz.

Her iki Outgolfing Rod tarafından Py2 gönderme ve linemade tarafından PY3 sunulması .


1

Ruby , 98 77 bayt

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

Çevrimiçi deneyin!

Bir dizi dizge döndüren bir lambda.

İlk dürtüm, sütunları oluşturmak ve bunları dönüştürmek oldu, ancak bu adımı önlemek çok daha kolaydı.

Ben başlatmak isterdi aile [" "*30]*5, ama bu çok şişman olmayan kaygan yılan sonuçlanan dizeleri sığ kopyalarını yapar.

DArtım gibi bir sabit kullanabilirdim (aynı bayt sayısı için), ancak Ruby her atadığımda şikayet ederdi. Ortadaki idöngüyü tekrar görmezden gelmek için bir sürü Debug uyarısına sahip olmakla yeniden okunabilirliği azaltmaya karar verdim .

Ben de birkaç baytı kurtarmayı çok isterdim loop{x+=rand(3)-1;(0..4)===x&&break}, ama bu kenarlarda bir önyargıya neden olurdu: 1/3 içe dönme şansı, 1/3 kalma şansı ve 1/3 sınır dışına çıkma şansı Bir süre önce rasgele geri yürümeden önce (yani, "kal").

-20 bayt: Ruby'nin Integer#[], 5 durumun tümü için doğru hareket ağırlıklarını sağlayarak küçük şartlamalar oluşturmak için kullanın . Bu, büyük bir tasarruf için loop-break paterni (sıfırdan durma şansı olmayan) ile değiştirir. Teşekkürler Eric Duminil !

-1 bayt: başlatma aile (0..4).mapyerine 5.times, tekrar teşekkürler 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
}

İyi bir başlangıç. Bir iç için gerek yok loop. Artışı rand(2+14[x])-30[x]veya ile hesaplayabilirsiniz rand -(30[x])..15[x]. Muhtemelen daha kısa bir versiyon var. Yine de, -20 bayt fena değil! Çevrimiçi deneyin!
Eric Duminil

1 bayt daha az x,a=2,(0..4).map{" "*30}. Çevrimiçi deneyin!
Eric Duminil,

1
Vay, 30[x]harika bir numara! Teşekkürler!
benj2240

1

Perl 6 , 85 bayt

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

Çevrimiçi deneyin!

Uzun parantez içine alınmış ifade, (' ', ' ', 0, ' ', ' ')çıktının ilk dikey şeridi olan ilk elemandan üretilen tembel bir sekanstır . Ardışık her bir şerit / liste, bir önceki rotateyöntemden, yöntemini çağırarak 0, 1(birinci eleman sıfır -1değilse ) ve (beşinci eleman sıfır değilse ) rastgele seçilmiş bir ofset ile oluşturulur .

Yatay şeritlerin matrisi [Z]operatörle birlikte geçirilir, her biri daha sonra jointek bir dizgeye girip çıktıyla birlikte dikey şeritlerin listesine dönüştürülür say.


1

Scala, 207 Bayt

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)

Numune:

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

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)

Benim benzersiz buluşum - şu ana kadar diğer çözümleri okumadım, dolaylı olarak iki Rastgele olan bir Rastgele (6) üretmek, (2 x 3). Sınırdan uzaksa, yukarı / aşağı gitmek için r / 2 (0,1,2) ve → (-1,0,1) değerlerini söyleyeyim. Sınırda, başka bir rastgele karakterin çağrısından kaçınabilirim ve kalmam mı yoksa kalmam mı gerektiğine karar vermek için sadece modulo (2) alabilirim.

Diğer çözümleri görelim. :)


Evet, yanlış örnek resim. Öyle. :)
kullanıcı bilinmeyen

scala kayalar! oh .. kod golf .. yanlış kullanım durumunda görünür .. nasıl hallediyordu java?
javadba

@javadba: try itBağlantıyı tıkladınız mı ? Kevin Cruijssen, bu kodu derlemek ya da JShell'de çalıştırmak için gerekli olan bir kazan plakası içermiyordu, ama sanırım bu kurallara göre - bir meta tartışma olabilir. İsterseniz, iki boyutlu bir dizi de kullanarak bu kodu azaltmayı deneyebilirsiniz. İkinci bir fikir, sonunda kayan kodu azaltmaktır. Bazı harita metodu? Matbaa Kevin tarafından gizlendi. - Evet, Array 8
kullanıcı bilinmiyor

Scala dönüş tipini çıkarsın. İnt: Kaydedilen 4 karakter daha.
kullanıcı bilinmeyen

Bu yüzden şimdi java için basketbol sahası içine alıyor
javadba

1

Perl, 83 101 bayt

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'

Yeni: Sınırlarda olasılık sorunu olmadan:

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'

Ungolfed:

$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
Sınır devriyeniz sınırda kalmak için% 50 doğru olasılık vermiyor.
Ton Hospel

0

PowerShell , 133 bayt

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

Çevrimiçi deneyin!

5 satır uzunluğunda, 30 boşluktan oluşan 2B bir dizi oluşturur. (NB -. Birisi sonsuza ben olacak bu dizi <3 başlatmak için daha iyi etkili bir şekilde elde edebilirsiniz varsa) yardımcı değişken Setleri $liçin 2(önceki yılan segmenti oldu hattı bunun ne için kullanılır). Daha sonra döngüler 0için 29.

Her yinelemede, yılan elementimizi ayarladık 0. Daha sonra Get-Randomaşağı mı yukarı mı yoksa aynı mı kalacağımızı seçen karmaşık bir diziye endeksleriz . Bu geri eklendi $l.

Son olarak, beş elemanları aracılığıyla döngü biz $ave -jointek bir dize her birine kendi iç elemanları. Bu beş tel boru hattında Write-Outputkalıyor ve üstü kapalı olarak bize ücretsiz yeni çizgiler veriyor.


0

Clojure, 123 bayt

İşte parenler geliyor:

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

Ungolfed versiyonu:

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

Yılan gövdesinin farklı yüksekliklerinin bir listesini oluşturur, daha sonra 0 ile 4 arasında bir değer alır. Yükseklik mevcut satırla eşleştiğinde 0, başka bir boşlukla yazdırılır. Yüksekliklerin sınırı aşmasına izin vermemek gerçekten bayt tutar. Ayrıca, yeni bir satırın ne zaman sıralı olduğunu, olması gerektiği gibi daha yoğun bayt olarak kabul etmek. Kişi kolayca tek bir yazı yazabilir ve doseqx'lerin ve y'lerin kartezyen bir ürünü olur, ancak daha sonra ne zaman yeni bir satır yazdırılacağını bilemez.


0

Python3 + numpy, 137 132 bayt

En kısa python teslimi değil, en uzun ve kesinlikle en hızlı değil.

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

güncellemenumpy 's diff komutunu kullanarak , yılanın geçerli bir desen olup olmadığını test etmek için 5 bayt kaydedildi, farkın elle hesaplanması ile karşılaştırıldı j[1:]-j[:-1].



0

R , 95 bayt

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

Bir sonraki satır xdaima mevcut satırdan ( l[abs(x-l)<2]) en fazla 1 uzakta olmayan satırlardan seçilir . replicateBir fordöngü yerine kullanmak , matris başlatma ve manipülasyon için gerekli bazı baytları kaydeder <<-ve genel değişkene atanırken operatörün kullanılmasını gerektirir x.

Çevrimiçi deneyin!


0

05AB1E , 25 bayt

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

Çevrimiçi deneyin!

açıklama

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.