Code Golf: งู ASCII สัตว์เลี้ยงแนวนอนของคุณเอง


29

แรงบันดาลใจอย่างมากจากความท้าทายนี้Code Golf: งู ASCII สัตว์เลี้ยงของคุณเอง - ฉันคิดว่าการทำให้เป็นแนวนอนจะเพิ่มความซับซ้อนเป็นพิเศษ

ตัวอย่างงูแนวนอน:

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

และกฎคือ:

  1. พิมพ์ตัวอักษร 5 บรรทัดอย่างแน่นอน
  2. แต่ละบรรทัดมีความยาว 30 ตัวอักษรประกอบด้วยช่องว่างและอักขระที่คุณเลือกเพื่อวาดงูของคุณ
  3. งูของคุณเริ่มที่บรรทัดที่ 3
  4. บรรทัดถัดไปที่จะใช้ในการวาดงูของคุณจะต้องเลือกแบบสุ่มจากบรรทัดปัจจุบันของคุณหนึ่งบรรทัดด้านบน (ถ้าคุณยังไม่ได้อยู่ในบรรทัดที่ 1) หรือหนึ่งบรรทัดด้านล่าง (ถ้าคุณยังไม่ได้อยู่ในบรรทัดที่ 5)
    • ตัวเลือกเหล่านี้จะต้องมีน้ำหนักเท่ากัน ดังนั้นถ้าคุณอยู่บนบรรทัดที่ 1 คุณมีโอกาส 50% ที่จะอยู่ในบรรทัดที่ 1 และโอกาส 50% ที่จะย้ายไปที่บรรทัดที่ 2 หากคุณอยู่บนบรรทัดที่ 2 คุณมีโอกาส 33% ที่จะย้ายไปที่บรรทัดที่ 1 โอกาส 33% ที่จะอยู่ในบรรทัดที่ 2 หรือโอกาส 33% ที่จะย้ายไปที่บรรทัดที่ 3
  5. งูของคุณไม่จำเป็นต้องไปทุกบรรทัด

5
ยินดีต้อนรับสู่ PPCG! นี่เป็นความท้าทายครั้งแรกที่ดี
Giuseppe

เพื่อความกระจ่างถ้าเราอยู่บนขอบเราต้องเลือกอย่างสม่ำเสมอ (อยู่ในบรรทัดเดียวกัน) และ (ไปที่เส้นอื่น) หรือเรามีน้ำหนักไม่สม่ำเสมอหรือไม่?
Giuseppe

และจากขอบเราต้องมีการยกขึ้น / ลง / เส้นเดียวกันอย่างสม่ำเสมอหรือไม่?
Giuseppe

2
อืม ... อย่างน้อยข้อ จำกัด 5 บรรทัดจะห้ามไม่ให้ผู้อื่นขโมยคำตอบจากอีกข้อหนึ่งด้วยการเพิ่มทรานสโพส
Magic Octopus Urn

9
การหมุนจอภาพโดยทางกายภาพนับเป็น 90 °หรือไม่? : D
Eric Duminil

คำตอบ:


11

JavaScript (ES6), 98 ไบต์

บันทึกแล้ว 7 ไบต์ขอบคุณ @KevinCruijssen

ส่งคืนอาร์เรย์ 5 สตริง

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

ลองออนไลน์!

ความคิดเห็น

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

คุณสามารถปล่อยdและใช้((y%4?3:2)|0)-(y>0)สำหรับ -6 ไบต์ ลองออนไลน์
Kevin Cruijssen

การแก้ไข: -7 ไบต์ 1ในnew Random(...)เป็นนัยโดยค่าเริ่มต้นของหลักสูตร .. ลองออนไลน์
Kevin Cruijssen

@KevinCruijssen ขอบคุณ! ( !!yแทนที่จะ(y>0)บันทึกเพิ่มอีก 2 ไบต์)
Arnauld

7

ถ่าน 28 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

P|   

พิมพ์การขยายบางส่วนเพื่อบังคับเอาต์พุต 5 บรรทัด

F³⁰«

ทำซ้ำ 30 ครั้ง

0

พิมพ์ศูนย์ (และเลื่อนในแนวนอน)

≡ⅉ²M‽²↑

หากพิกัด Y เป็น 2 ให้เลื่อนขึ้นแบบสุ่มด้วย 0 หรือ 1

±²M‽²↓

ถ้าเป็น -2 ให้เลื่อนลงแบบสุ่มด้วย 0 หรือ 1

M⊖‽³↓

มิฉะนั้นเลื่อนลงแบบสุ่มด้วย -1, 0 หรือ 1



5

เยลลี่ 24 ไบต์

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

ลองออนไลน์!

คำอธิบาย

3µ'o1r '« 5 ¥ $ Xµ30СṬ €o⁶z⁶Y || โปรแกรม Niladic เต็มรูปแบบ
                         ||
3 | | เริ่มต้นจาก 3 ...
 µ µ30 || ... ดำเนินการ 30 ครั้ง ...
               С || ... และรวบรวมผลลัพธ์ในรายการ
  'o1r' « 5 ¥ $ X || - | ฟังก์ชัน "ตัวช่วยเหลือ" แบบ monadic
  'o1 || - | จำนวนเต็มปัจจุบันลดลงหรือ 1
     r X || - | หยิบไอเท็มสุ่มจากช่วงจาก ^ ถึง ...
      '« 5 || - | ... จำนวนที่เพิ่มขึ้นถูก จำกัด ไว้ที่ 5 (ใช้สูงสุด)
         ¥ $ || - | องค์ประกอบของไวยากรณ์ ใช้สำหรับจัดกลุ่มลิงก์
                 Ṭ€ || ไม่จริงแต่ละคน
                   o⁶ || ตรรกะหรือมีช่องว่างเดียว
                     z⁶ || ขนย้ายด้วยช่องว่างฟิลเลอร์
                       Y || เข้าร่วมโดยการขึ้นบรรทัดใหม่


5

Python 3, 144 ไบต์

@Ruts, @Turksarama และ @mypetlion มีประโยชน์อย่างมากในการลดจำนวนไบต์

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)

จะลองและปรับปรุงในเรื่องนี้ สนุกท้าทาย!


3
เปลี่ยนl+=random.randint(-1,1) l=0 if l<0 else l l=4 if l>4 else lเป็นl+=random.randint(~-(l<1),l<4)บันทึก 31 ไบต์
mypetlion

1
คุณควรลบช่องว่างและบรรทัดใหม่ได้มาก
Mr. Xcoder

1
เปลี่ยนm=[[' 'for x in R(w)]for y in R(h)]เป็นm=[list(' '*w)for y in R(h)]บันทึก 7 ไบต์
mypetlion

2
ในหลามbooleansubclass intของ ดังนั้นFalseสามารถนำมาใช้ในสถานที่ของ0และสามารถแทนที่True เป็นผู้ประกอบการเอกสำหรับบิตและผู้ประกอบการพลิกเข้าสู่ระบบ (คูณด้วย) ดังนั้นประเมินและประเมินเป็น 01~not--1~-(False)-1~-(True)
mypetlion

1
กำหนดค่าเริ่มต้น 0 ของคุณภายในลูปของคุณและตั้งค่า l หลังจากการกำหนด สิ่งนี้ช่วยให้คุณประหยัดทั้งบรรทัดเดียว ( m[2][0]=0หายไป) และ 2 ไบต์บน for loop ( for i in R(1,30):กลายเป็นfor i in R(30):) คุณจะต้องคำนวณใหม่หลังจากที่คุณตั้งค่า 0 ซึ่งจะนำคุณไปยัง 144 ไบต์
Turksarama

4

R , 120 114 ไบต์

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

ขอบคุณ@Giuseppeสำหรับอีก 6 ไบต์!

ใช้ตารางความน่าจะเป็นดังนี้:

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

โดยที่แต่ละคอลัมน์สอดคล้องกับกรณีคือคอลัมน์ 1 ถูกเลือกถ้างูอยู่ในแถวที่ 1 ให้ความน่าจะเป็น 0, 1/2 และ 1/2 เพื่อเลือกตามลำดับ -1 [ลงล่าง], 0 [อยู่นิ่ง] และ 1 [ ขึ้นไป ( sampleปรับความน่าจะเป็นปกติให้เป็น 1 โดยอัตโนมัติ) คอลัมน์ 2 สำหรับแถว 2 ให้ความน่าจะเป็น 1/3, 1/3 และ 1/3 ฯลฯ ...

ลองออนไลน์!



@iuseppe ขอบคุณ! ไม่มีเหตุผลอะไรที่จะเป็นนามแฝงและฉันลืมที่จะใช้การรีไซเคิลแบบเวกเตอร์สำหรับสิ่งพิเศษ 0
plannapus

3

SOGL V0.12 , 22 21 ไบต์

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

ลองที่นี่!

คำอธิบาย:

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

SmileBASIC, 107 105 103 89 ไบต์

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

คำตอบนี้น่าสนใจยิ่งกว่าคำตอบแนวตั้งเนื่องจากตัวพิมพ์ขอบ (ตัวอักษร)

64 ไบต์โดยไม่ต้องเว้นวรรค:

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

ฉันยังพบความแตกต่างของบรรทัดที่ 2 ที่มีความยาวเท่ากัน

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 ใช้เพื่อตรวจสอบว่า Y อยู่นอกช่วงที่ถูกต้องเช่นเดียวกับการรับสัญญาณ


2

Java 8, 177 170 ไบต์

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 ไบต์ขอบคุณ @ OlivierGrégoire

คำอธิบาย:

ลองออนไลน์

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)เพื่อบันทึกไม่กี่ไบต์
Olivier Grégoire

@ OlivierGrégoireฉันคิดว่าฉันได้ทำไปแล้ว แต่ดูเหมือนจะไม่ บางทีฉันอาจทำมันในคำตอบอื่นเมื่อเร็ว ๆ นี้ .. : ขอบคุณ
Kevin Cruijssen


1

Python 3 , 123 ไบต์

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

ลองออนไลน์!

สร้างอาร์เรย์จำนวนเต็มจากนั้นแปลงเป็นแต่ละแถว

Python 2 , 120 ไบต์

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)

ลองออนไลน์!

สำหรับ Py2 parens ที่ซ้ำซ้อนexecและprintสามารถลบออกได้ แต่ไวยากรณ์ในบรรทัดที่ 2 ไม่ถูกต้อง

Outgolfing ทั้งส่ง Py2 โดย RodและPy3 ส่งโดย linemade


1

Ruby , 98 77 ไบต์

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

ลองออนไลน์!

แลมบ์ดาส่งคืนอาร์เรย์ของสตริง

แรงกระตุ้นเริ่มต้นของฉันคือการสร้างคอลัมน์และย้ายพวกมัน แต่มันง่ายกว่ามากที่จะหลีกเลี่ยงขั้นตอนนั้น

ฉันชอบที่จะเริ่มต้นaด้วย[" "*30]*5แต่นั่นจะทำให้สำเนาของสายตื้นส่งผลให้งูที่อ้วนและไม่ลื่น

ฉันสามารถใช้ค่าคงที่เหมือนกับDการเพิ่ม (สำหรับจำนวนไบต์เดียวกัน) แต่ Ruby จะบ่นทุกครั้งที่ฉันมอบหมาย ฉันตัดสินใจว่าฉันต้องการลดความสามารถในการอ่านได้โดยการนำimid-loop กลับมาใช้อีกครั้งเพื่อให้มีคำเตือนจาก Debug ให้ละเว้น

ฉันก็อยากจะประหยัดสองสามไบต์ด้วยloop{x+=rand(3)-1;(0..4)===x&&break}แต่นั่นจะทำให้มีอคติบนขอบ: 1/3 โอกาสที่จะหันกลับมาด้านใน, 1/3 โอกาสที่จะอยู่และ 1/3 โอกาสที่จะออกจากขอบเขตสำหรับ ครู่หนึ่งก่อนที่จะสุ่มเดินเข้ามาอีกครั้ง (นั่นคือ "อยู่")

-20 ไบต์:ใช้รูบี้Integer#[]เพื่อสร้างเงื่อนไขขนาดเล็กเพื่อให้แน่ใจว่าน้ำหนักการเคลื่อนไหวที่ถูกต้องสำหรับทั้ง 5 ตำแหน่ง สิ่งนี้แทนที่รูปแบบวนซ้ำ (ด้วยโอกาสที่ไม่ใช่ศูนย์ของความล้มเหลวในการหยุด) เพื่อการประหยัดอย่างมาก ขอบคุณEric Duminil !

-1 ไบต์: เริ่มต้นaด้วย(0..4).mapแทนการ5.timesขอบคุณอีกครั้งเพื่อเอริค 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
}

เป็นการเริ่มต้นที่ดี loopไม่มีความจำเป็นในการภายใน คุณสามารถคำนวณเพิ่มขึ้นด้วยหรือrand(2+14[x])-30[x] rand -(30[x])..15[x]อาจมีรุ่นที่สั้นกว่านี้ ถึงกระนั้น -20 ไบต์ก็ไม่เลว! ลองออนไลน์!
Eric Duminil

1 x,a=2,(0..4).map{" "*30}ไบต์น้อยลงด้วย ลองออนไลน์!
Eric Duminil

1
ว้าว30[x]เป็นเคล็ดลับที่ยอดเยี่ยม! ขอบคุณ!
benj2240

1

Perl 6 , 85 ไบต์

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

ลองออนไลน์!

นิพจน์วงเล็บแบบยาวคือลำดับที่ขี้เกียจที่สร้างจากองค์ประกอบเริ่มต้น(' ', ' ', 0, ' ', ' ')แถบแนวตั้งแรกของเอาต์พุต แต่ละแถบเนื่อง / รายการถูกสร้างขึ้นจากหนึ่งก่อนหน้านี้โดยการโทรของrotateวิธีการชดเชยด้วยการสุ่มเลือกจากชุดที่มี0, 1(ถ้าองค์ประกอบแรกจะไม่ใช่ศูนย์) และ-1 (ถ้ามีองค์ประกอบที่ห้าคือไม่ใช่ศูนย์)

เมทริกซ์ของแถบแนวนอนขนย้ายกับ[Z]ผู้ประกอบการเปลี่ยนมันเป็นรายการของแถบแนวตั้งซึ่งแต่ละถูกแล้วjoined sayเป็นสายเดียวกับการส่งออกและ


1

สกาลา, 207 ไบต์

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)

ตัวอย่าง:

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

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)

สิ่งประดิษฐ์ที่เป็นเอกลักษณ์ของฉัน - ดีฉันยังไม่ได้อ่านวิธีแก้ปัญหาอื่น ๆ จนถึงตอนนี้ก็คือการสร้าง Random (6) ซึ่งเป็น Randoms สองอันโดยนัย (2 * 3) หากอยู่ห่างจากเส้นขอบฉันจะใช้ค่า r / 2 (0,1,2) และ→ (-1,0,1) บอกฉันเพื่อขึ้นหรือลง ถ้าอยู่ที่ชายแดนฉันสามารถหลีกเลี่ยงตัวละครที่มีค่าใช้จ่ายในการสุ่มอีกครั้งและใช้โมดูโล่ (2) ในการตัดสินใจว่าฉันควรจะอยู่หรือควรจะไป

เรามาดูวิธีแก้ปัญหาอื่น ๆ :)


ใช่ภาพตัวอย่างไม่ถูกต้อง มันทำ :)
ผู้ใช้ที่ไม่รู้จัก

หินสกาล่า! โอ้ .. รหัสกอล์ฟ .. กรณีการใช้งานผิดปกติปรากฏขึ้น .. มันเกิดความผิดพลาดได้javaอย่างไร?
javadba

@javadba: คุณคลิกtry itลิงก์หรือไม่ Kevin Cruijssen ไม่ได้รวมสำเร็จรูปบางส่วนจำเป็นต้องรวบรวมรหัสนี้หรือเรียกใช้ใน JShell แต่ฉันเดาว่าเป็นไปตามแนวทาง - อาจมีการอภิปรายเมตาดาต้า หากคุณต้องการคุณสามารถลองลดรหัสนี้โดยใช้อาเรย์สองมิติเช่นกัน แนวคิดที่สองคือการลดการเลื่อนรหัสในที่สุดวิธีการแผนที่บาง? Kevin println ถูกซ่อนไว้ - ใช่ Array ให้การปรับปรุงโดย 8
ไม่ทราบผู้ใช้

ให้สกาล่าสรุปประเภทการกลับ int: บันทึกตัวละครอีก 4 ตัว
ผู้ใช้ที่ไม่รู้จัก

ดังนั้นจึงเข้าสู่ ballpark สำหรับ java ตอนนี้
javadba

1

Perl, 83 101 ไบต์

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'

ใหม่: ไม่มีปัญหาความน่าจะเป็นที่พรมแดน:

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
การตระเวนชายแดนของคุณไม่ได้ให้โอกาสที่ถูกต้อง 50% สำหรับการอยู่บนขอบ
Ton Hospel

0

PowerShell , 133 ไบต์

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

ลองออนไลน์!

สร้างอาร์เรย์ 2 มิติกว้าง 30 ช่องโดยสูง 5 บรรทัด (หมายเหตุ - หากมีใครสามารถหาวิธีที่มีประสิทธิภาพดีกว่าในการเริ่มต้นอาร์เรย์นี้ฉันจะ <3 ตลอดไป)ตั้งค่าตัวแปรผู้ช่วย$lเป็น2(ใช้สำหรับสิ่งที่บรรทัดเซ็กเมนต์งูก่อนหน้านี้เปิดอยู่) จากนั้นลูปจาก0ไป29ไป

0แต่ละซ้ำเราตั้งองค์ประกอบงูของเราที่จะ จากนั้นเราจัดทำดัชนีเป็นอาร์เรย์ที่ซับซ้อนโดยGet-Randomเลือกว่าเราจะขึ้นหรือลงหรือยังคงเหมือนเดิม ที่เพิ่มเข้ามา$lมา

ในที่สุดเราวนรอบห้าองค์ประกอบของ$aและ-joinองค์ประกอบภายในของพวกเขาเป็นสตริงเดียวแต่ละ ห้าสายเหล่านั้นจะถูกทิ้งไว้บนไปป์ไลน์และโดยนัยWrite-Outputทำให้เรามีการขึ้นบรรทัดใหม่ได้ฟรี


0

Clojure 123 ไบต์

มาที่นี่ parens:

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

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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

สร้างรายการความสูงที่แตกต่างกันของร่างกายงูจากนั้นทำซ้ำตั้งแต่ 0 ถึง 4 เมื่อใดก็ตามที่ความสูงตรงกับแถวปัจจุบันมันจะพิมพ์ 0 หรือว่างเปล่า การไม่ปล่อยให้ความสูงเกินขอบเขตนั้นต้องใช้ต้นทุนเป็นไบต์จริงๆ การรับรู้ด้วยเช่นกันเมื่อมีการขึ้นบรรทัดใหม่เพื่อให้มีจำนวนไบต์มากขึ้นตามที่ควรจะเป็น เราสามารถเขียนเดี่ยวได้อย่างง่ายดายdoseqสร้างผลิตภัณฑ์คาร์ทีเซียนของ x และ y แต่แล้วก็ไม่รู้ว่าจะพิมพ์บรรทัดใหม่เมื่อใด


0

Python3 + จำนวนมาก 137 132 ไบต์

ไม่ใช่การส่งหลามที่สั้นที่สุดไม่ใช่ที่ยาวที่สุดและไม่เร็วที่สุด

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

อัปเดตการใช้numpy's คำสั่ง diff บันทึก 5 j[1:]-j[:-1]ไบต์สำหรับการทดสอบถ้างูเป็นรูปแบบที่ถูกต้องเมื่อเทียบกับการคำนวณความแตกต่างด้วยตนเอง



0

R , 95 ไบต์

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

บรรทัดถัดไปxจะถูกเลือกจากบรรทัดที่อยู่ไม่เกิน 1 ห่างจากบรรทัดปัจจุบัน ( l[abs(x-l)<2]) ใช้replicateแทนforวงจรช่วยประหยัดไบต์บางส่วนที่จำเป็นสำหรับการเริ่มต้นเมทริกซ์และการจัดการและต้องใช้ของผู้ประกอบการเมื่อกำหนดให้กับตัวแปรโลก<<-x

ลองออนไลน์!


0

05AB1E , 25 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.