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


34

ดังนั้นฉันจึงเขียนหนึ่งสายการบินซึ่งพิมพ์งูบนคอนโซล มันสนุกนิดหน่อยและฉันสงสัยว่าฉันจะย่อรหัสของฉันได้อย่างไร ...

นี่คือตัวอย่างเอาต์พุต (สั้น):

                +
                 +
                  +
                   +
                   +
                   +
                  +
                   +
                    +
                    +
                    +
                     +
                     +
                      +
                      +
                       +
                      +
                     +
                     +
                    +

นี่คือรายละเอียด:

  • ในแต่ละบรรทัดจะมีการพิมพ์อักขระที่ไม่ใช่ whitespace เดียว (แล้วแต่จำนวนใดก็ได้ที่คุณต้องการ) ลงในคอนโซลโดยเริ่มจากการเว้นระยะห่างระหว่าง 29 ถึง 31 ช่องว่างทางด้านซ้าย
  • การวนซ้ำแต่ละครั้งจะทำการตัดสินใจแบบสุ่มระหว่างการกระทำทั้งสามนี้
    • จำนวนของช่องว่างภายในลดลง 1
    • ปริมาณของช่องว่างภายในยังคงเหมือนเดิม
    • ปริมาณของช่องว่างภายในเพิ่มขึ้น 1

ทำสิ่งนี้ 30 ครั้งเพื่อพิมพ์งูยาว 30 เซ็กเมนต์ให้คอนโซล

คำตอบที่สั้นที่สุดเป็นไบต์ชนะ


เราสามารถคืนค่าอาร์เรย์ของเส้นได้หรือไม่? ช่องว่างนำหน้า / ต่อท้ายหรือขึ้นบรรทัดใหม่ได้รับอนุญาตหรือไม่
Shaggy

1
ฉันคิดว่าอนุญาตให้เว้นวรรคต่อท้ายในแต่ละบรรทัดใช่ไหม
Luis Mendo

1
"สุ่ม" หมายถึงอะไร สุ่มอย่างสม่ำเสมอ? สุ่มจากการแจกแจงใด ๆ ที่มีการสนับสนุนเชิงบวกต่อผลลัพธ์ทั้งสามรายการ สุ่มจากการแจกแจงใด ๆ ผลลัพธ์จะต้องแตกต่างกันในการรันแต่ละครั้งของโปรแกรมหรือไม่
นาธาเนียล

1
โปรดทราบว่าโดยค่าเริ่มต้นสุ่มไม่ได้หมายความว่าอย่างสม่ำเสมอเพื่อให้ ตัวอย่างเช่นส่วนที่สองของคำตอบ brainfuckของฉันคือ (ณ ตอนนี้) ใช้ได้อย่างสมบูรณ์แบบแม้ว่ามันจะสร้างเส้นตรงเป็นส่วนใหญ่
Jo King เมื่อ

1
ตอนนี้มีสองจุดที่ไม่ชัดเจน: 1) การสุ่มหมายถึงการสุ่มอย่างสม่ำเสมอหรือไม่? (มีผลต่อคำตอบนี้ ) และ 2) เอาต์พุตจะต้องแตกต่างกันทุกครั้งหรือไม่ (กล่าวคือตัวสร้างตัวเลขสุ่มสามารถถูกยกเลิกหรือไม่ส่งผลต่อคำตอบนี้ )
DJMcMayhem

คำตอบ:


14

05AB1E , 15 14 ไบต์

30DF2Ý<+ΩD0sú,

ลองออนไลน์!

0การใช้ประโยชน์

คำอธิบาย

30DF2Ý<+ΩD0sú,
30D            # Push 30 to the stack (One for the amount of iterations we are going to perform and one for the initial padding)
   F           # Pop one of the 30s and perform the following that many times...
    2Ý          # Push [0,1,2] ...
      <         # and create [-1,0,1] from that
       +        # Add the last padding to every entry (e.g. 30 in the beginning resulting in [29,30,31]
        Ω       # Pick one of the results at random ...
         D      # and push it to the stack twice
          0     # Push 0 (Any character will work fine here) ...
           sú   # and pad it with the randomly chosen amount of spaces in the front
             ,  # Finally print the result with a trailing newline

38
05AB1E: 0 ไบต์ลองออนไลน์! ... รอไม่เลย
Magic Octopus Urn

14

สุ่ม brainfuck , 123 122 121 ไบต์

+[--[<]>>+<-]>+[->+>+>+<<<]++++++++++>>++<[>>[->+<<.>]>[-<+>]>?>+++<[>->+<[>]>[<+>-]<<[<]>-]>-->,<[-<<<+>>>]<<<<+.-<<.>-]

ลองออนไลน์!

Random Brainfuck เป็นส่วนขยายของ brainfuck ด้วยการเพิ่ม?คำสั่งที่เป็นประโยชน์ซึ่งกำหนดเซลล์ปัจจุบันเป็นไบต์แบบสุ่ม ภาพนี้พิมพ์งูที่ทำจาก!s ซึ่งดูเหมือนว่าเสียงฝีเท้ามากกว่างูอย่างสนุกพอ

มันทำงานอย่างไร:

+[--[<]>>+<-]>+ Create the value 30
[->+>+>+<<<]    Copy it three times
++++++++++      Create a newline cell
>>++<            Adds 2 to the second copy to make it a space and move to the counter
[ While counter
  >>[->+<<.>]>[-<+>] Print out the padding cell number of spaces
  ?>+++<[>->+<[>]>[<+>-]<<[<]>-] Get 3-(random byte%3)
  >-->,<[-<<<+>>>]   Add (result-2) to the padding cell
  <<<<+.-<           Print an exclamation mark
  <<.                Print a newline
  >-                 Decrement counter
] end loop

วิธีแก้ปัญหาอื่นที่ยึดติดกับตัวอักษรของคำถามแทนที่จะเป็นวิญญาณ

87 ไบต์

+[--[<]>>+<-]>+[->+>+>+<<<]++++++++++>++>[>[->+<<<.>>]>[-<+>]?[,<+>]?[,<->]<<<+.-<.>>-]

ลองออนไลน์!

อันนี้มีอคติอย่างมากต่อการออกจาก padding เพียงอย่างเดียว แต่การเพิ่มหรือลด padding นั้นมีความเป็นไปได้เท่าเทียมกัน แต่ละคนมีโอกาสน้อยกว่า 1 ใน 256 ที่จะเกิดขึ้นเล็กน้อย


ดีมาก! ฉันไม่รู้?คำสั่ง +1
Grant Miller

@GrantMiller ?มีเฉพาะในRandom Brainfuckเท่านั้นไม่ใช่ brainfuck แบบคลาสสิก
Jo King

8

C (gcc) , 61 58 56 ไบต์

ตอบแก้ไขเพื่อสะท้อนการเปลี่ยนแปลงกฎ ...

i;f(s){for(s=i=31;--i;printf("%*d\n",s+=1-rand()%3,8));}

ลองออนไลน์!


บันทึกไบต์โดยเลื่อนs+=1-rand()%3ไปที่ฟังก์ชัน printf i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Vaelus

@Vaelus นั่นทำให้บรรทัดแรกมีจำนวนช่องว่างที่แตกต่างกันแทนที่จะเป็น 30 ที่ระบุในคำถาม
Steadybox

@Steadybox ซึ่งได้รับอนุญาตในความคิดเห็นที่เห็นได้ชัด ..
เควิน Cruijssen

7

เรติน่า 24 ไบต์


30* +
-29{¶<`^
 
S,2@1`

ลองออนไลน์!

คำอธิบาย


30* +

initialise สตริงทำงานเพื่อบรรทัดแรกคือวันที่ 30 +และช่องว่าง

-29{¶<`^
 

มีช่องว่างในบรรทัดที่สอง -29{ล้อมรอบส่วนที่เหลือของโปรแกรมในลูปซึ่งทำงาน 29 ครั้ง ¶<พิมพ์สตริงการทำงานที่จุดเริ่มต้นของการวนซ้ำแต่ละครั้งด้วยการป้อนบรรทัดต่อท้าย ขั้นตอนของอะตอมเองจะแทรกช่องว่างที่จุดเริ่มต้นของสตริง (ความคิดพื้นฐานคือการแทรกหนึ่งช่องว่างแล้วสุ่มลบช่องว่าง 0-2 เนื่องจากเป็นไบต์ที่สั้นกว่าการสุ่มเลือกระหว่างการลบแทรกและไม่มีตัวเลือก)

S,2@1`

สิ่งนี้ตรงกับ regex ที่ว่างเปล่ากับอินพุตซึ่งทำให้เราทุกตำแหน่งระหว่างอักขระ (และจุดเริ่มต้นและจุดสิ้นสุดของสตริง) จากนั้น,2เก็บเฉพาะการแข่งขันสามครั้งแรกเท่านั้นเช่นการแข่งขันหลังจากศูนย์หนึ่งและสองช่องว่าง @เลือกสุ่มหนึ่งในสามแมตช์นั้น จากนั้นเวทีแยก ( S) จะแยกอินพุตรอบ ๆ การแข่งขันนั้น และ1บอกให้เก็บเฉพาะส่วนที่สองของการแยก กล่าวอีกนัยหนึ่งเราทิ้งทุกอย่างจนถึงการแข่งขันแบบสุ่ม

บรรทัดที่ 30 ซึ่งเป็นผลลัพธ์ของการวนซ้ำขั้นสุดท้ายถูกพิมพ์โดยปริยายในตอนท้ายของโปรแกรม


คุณรู้ว่ามีอะไรสั้นไปกว่าการลบช่องว่าง 0--2? สับช่องว่างรอบ ๆ ! . จอประสาทตาใหม่นั้นยอดเยี่ยม: D
Leo

7

VBA, 60 59 49 ไบต์

For l=1To 30:?Spc(30+i)"+":i=i+Sgn(Rnd()-.5):Next

วางลงในหน้าต่างทันทีและกด Enter (ตรวจสอบให้แน่ใจว่าได้ปิดประกาศอย่างชัดเจนแล้ว!)

ห่างไกลมีแนวโน้มที่จะย้ายไปกว่าการเข้าพักในสาย (เช่นการกระทำไม่ได้ถ่วงน้ำหนักเท่า ๆ กัน) แต่นั่นก็ไม่ได้เป็นความต้องการที่กำหนด (โชคดี!)

{EDIT} บันทึก 1 ไบต์โดยลบช่องว่างระหว่าง=1และTo

{EDIT2} บันทึก10ไบต์ขอบคุณสำหรับความคิดเห็นของ remoel

เวอร์ชั่นเก่า:

'V1
i=30:For l=1 To 30:?String(i," ")&"+":i=i+Sgn(Rnd()-.5):Next
'V2
i=30:For l=1To 30:?String(i," ")&"+":i=i+Sgn(Rnd()-.5):Next

5
ยินดีต้อนรับสู่ PPCG!
Martin Ender

2
คุณสามารถบันทึกไม่กี่ไบต์โดยการเปลี่ยนString(i," ")ไปแล้วลบSpc(30+i) i=30:หรือ -1 &ไบต์โดยการเอา :)
remoel

7

C # (.NET Core), 112 110 106 100 99 98 ไบต์

v=>{var r="";for(int t=30,i=t;i-->0;r+="+\n".PadLeft(t+=new System.Random().Next(3)-1));return r;}

-1 ไบต์ขอบคุณที่@raznagul
-1 ไบต์ขอบคุณที่@auhmaan

คำอธิบาย:

ลองออนไลน์

v=>{                      // Method with empty unused parameter and no return-type
  var r="";               //  Result-string, starting empty
  for(int t=30,           //  Temp-integer, starting at 30
      i=t;i-->0;          //  Loop 30 times
    r+=                   //   Append the result-String with:
       "+\n"              //    The character and a new-line,
            .PadLeft(     //    left-padded with `t` spaces,
                     t+=new System.Random().Next(3)-1));
                          //    after `t` first has been changed with -1, 0, or 1 randomly
  return r;}              //  Return the result-string

สิ่งหนึ่งที่น่าแปลกใจ: ถ้าฉันเรียกnew Random().Next()หลายครั้งในเครื่อง (.net Framework เวอร์ชัน 4.6.1) ฉันจะได้รับผลลัพธ์เดียวกันเสมอ ฉันต้องเพิ่มThread.Sleep(10)ระหว่างการโทรเพื่อให้ได้ผลลัพธ์ที่แตกต่างอย่างน่าเชื่อถือ ด้วยเวลานอนน้อยกว่า 10ms บางครั้งฉันก็ยังได้ผลเหมือนเดิม ดังนั้น. net-Framework และ TIO (.net-Core) มี PRNG ที่แตกต่างกันหรืออย่างน้อยก็ใช้เมล็ดที่แตกต่างกัน ถ้าฉันสลับโปรแกรมของคุณใน TIO เป็น C # -mono ฉันจะได้รับพฤติกรรมเช่นเดียวกับที่ฉันได้รับในท้องถิ่นใน. net-Framework
raznagul

@raznagul อืมเอาท์พุทที่มีC # (คอมไพเลอร์ Mono C #)เป็นเรื่องที่แปลกมาก ..
Kevin Cruijssen

3
@raznagul new Random()ใช้เวลาเป็นเมล็ดดังนั้นในการวนรอบที่แน่นเวลาจะเหมือนกันและผลลัพธ์ก็เหมือนกัน
TheLethalCoder

@TheLethalCoder: ใช่นั่นคือสิ่งที่ฉันคาดหวังไว้ (มากหรือน้อย) สิ่งที่แปลกคือ 1). net-Core (อย่างน้อยใน TIO) จะทำงานต่างกัน 2) ฉันต้องThread.Sleep(10)ได้ผลลัพธ์ที่ต่างกันอย่างน่าเชื่อถือและThread.Sleep(1)หรือแม้แต่ 9ms ก็ยังไม่เพียงพอ
raznagul

@raznagul การนอนหลับที่ดีสำหรับ 1, 9 หรือ 10 มิลลิวินาทีควรจะนอนในเวลาเดียวกันทั้งหมดขึ้นอยู่กับกระบวนการอื่น ๆ ที่ทำงาน ... แปลกแน่นอน
TheLethalCoder

7

C, 56 ไบต์

n;f(p){n>29?n=0:f(printf("%*d\n",n++?p-rand()%3:31,0));}

ลองออนไลน์!

คำอธิบาย:

n; // As a global variable, n is initialized to zero.
f(p)
{
    // Call the function recursively until n > 29.
    n > 29

        // At the end, set n back to zero.
        ? n=0

        // On the first iteration, n == 0 and p has an indeterminate value.
        // 'n++ ? p-rand()%3 : 31' returns 31 (without reading p), and thus
        // 30 spaces get printed. printf() returns the number of characters
        // printed, 32 (30 spaces + '0' + '\n').
        //    On subsequent iterations, p has the value the previous printf
        // call returned, which is the padding on last iteration + 2. Also,
        // n > 0, so the same expression now returns p-rand()%3, and thus
        // the padding changes either by -1, 0, or 1 spaces. The function
        // is again called with the value of the current line's padding + 2.
        : f(printf("%*d\n", n++ ? p-rand()%3 : 31, 0));
}

C (gcc) , 55 ไบต์

n;f(p){n=n<30&&f(printf("%*d\n",n++?p-rand()%3:31,0));}

ขึ้นอยู่กับf "return" ค่าที่กำหนดให้กับnในฟังก์ชันซึ่งเป็นลักษณะการทำงานที่ไม่ได้กำหนด แต่ทำงานได้อย่างต่อเนื่องกับ gcc เมื่อไม่มีการเปิดใช้งานการปรับให้เหมาะสม

ลองออนไลน์!


6

JavaScript (ES8), 63 62 60 ไบต์

รวมถึงการขึ้นบรรทัดใหม่ *2-1สามารถแทนที่ด้วย-.5การบันทึก 1 ไบต์ แต่โอกาสของแต่ละบรรทัดมีความยาวเท่ากันกับบรรทัดก่อนหน้าจะเพิ่มขึ้นอย่างมาก แน่นอนขณะที่ "สุ่ม" ไม่ได้กำหนดในความท้าทายที่ RNG อาจถูกแทนที่ด้วยnew Date%3-1สำหรับการนับไบต์รวมของ55

f=(x=y=30)=>x?``.padEnd(y+=Math.random()*2-1)+`+
`+f(--x):``

บันทึกไบต์ด้วยใครบางคนที่ลบความคิดเห็นของพวกเขาก่อนที่ฉันจะสามารถจับชื่อได้ ฉันพยายามที่จริงมันเป็นอย่างนี้กับrepeatและpadStartแต่ไม่ได้คิดที่จะลองpadEnd- ไม่ทราบว่าทำไม!


โบนัส

สำหรับจำนวนไบต์เดียวกันนี่คือเวอร์ชันที่ใช้จำนวนช่องว่างเริ่มต้น & การวนซ้ำเป็นอินพุต

f=(x,y=x)=>x?``.padEnd(y)+`+
`+f(--x,y+Math.random()*2-1):``


f=(x=y=30)=>x?`+\n`.padStart(y+=Math.random()*2-1)+f(--x):``สั้นลงหนึ่งไบต์ (หมายเหตุ: เนื่องจาก SO ไม่อนุญาตให้มีการขึ้นบรรทัดใหม่ในความคิดเห็นฉันจึงต้องพิมพ์ \ n แทนที่จะใช้การขึ้นบรรทัดใหม่จริง ๆ )
Stefnotch

ขอบคุณ @Stefnotch น่าเสียดายที่ถึงแม้จะมีค่าเริ่มต้นy=31แล้วก็อาจมีความเป็นไปได้ที่บรรทัดแรกจะสั้นเกินไป tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/ …
Shaggy

1
แก้ไขให้ถูกต้องหากฉันผิด แต่วิธีการแก้ปัญหาในปัจจุบันของคุณก็ไม่ประสบกับปัญหานั้นเช่นกัน
Stefnotch

1
บรรทัดแรกควรมีตรง 30 ช่องว่างตามความท้าทาย
นิด

1
@Nit ผู้ปฏิบัติการได้ยืนยันว่าบรรทัดแรกอาจมีช่องว่าง 29-31 ช่อง แต่ยังไม่สามารถแก้ไขความจริงนั้นได้แม้ว่าจะมีการร้องขอซ้ำ ๆ
ขนด

6

Java 8, 89 87 ไบต์

กอล์ฟครั้งแรกฉันแน่ใจว่ามันจะดีขึ้นมาก ..

แก้ไข: คงต้องขอบคุณสายแรกที่จะSteadybox

l->{for(int a=31,b=a;--a>0;){System.out.printf("%"+b+"c\n",'+');b+=2-Math.random()*3;}}

ลองออนไลน์!

 l->{                                           //Begin lambda
    for(int a=31,b=a;--a>0;)                  //Initialise vars, loop through 30 lines
    {
        System.out.printf("%"+b+"c\n",'+');     //Print result
        b+=2-Math.random()*3;                   //Change padding by -1, 0, or 1
    }

5
ยินดีต้อนรับสู่ PPCG! :)
Shaggy


6

Python 2 , 83 65 64 ไบต์

วิธีการตรงไปตรงมา:

import os
k=30
exec"print' '*k+'+';k+=ord(os.urandom(1))%3-1;"*k

ลองออนไลน์!

ขอบคุณ @Rod สำหรับบันทึกไบต์! ขอบคุณ @ovs สำหรับ -1 ไบต์!

แก้ไข: เปลี่ยนชื่อตัวแปรและสายอักขระออกเป็นตัวอักษร '

เอาต์พุตเหมือนงูมากขึ้นสำหรับ 88 ไบต์:

from random import*
s=[30,0]
exec"print' '*sum(s)+'(S)'[s[-1]+1];s+=[randint(-1,1)];"*30

1
ฉันชอบสิ่งนี้. ทางออกที่เรียบร้อยจริงๆ
linemade


5

ถ่าน 14 ไบต์

× ³⁰F³⁰«↙+M‽³→

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

× ³⁰            Print 30 spaces (forces the desired indentation)
    F³⁰«        Repeat 30 times
        ↙+      Print a `+` and move down and left one square
          M‽³→  Move right a random number of squares from 0 to 2

จะเป็นเพียง 10 ไบต์หากไม่มีข้อกำหนดการเยื้องเริ่มต้น


@KevinCruijssen อืมมันไม่น่าเชื่อเพราะ Charcoal ชอบที่จะตกแต่งตามค่าเริ่มต้น
Neil

5

PHP, 61 ไบต์

for($p=32;$i<30;$i++)echo str_pad("+
",$p+=rand(-1,1),' ',0);

ลองออนไลน์!


8
$i<30;$i++สามารถ$i++<30;บันทึก 2 ไบต์
Kevin Cruijssen

2
55 ไบต์: for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');( \nนับเป็น 1 ถ่านและควรถูกแทนที่ด้วย newline จริง)
Ismael Miguel

2
ทางเลือกยาว 55 ไบต์โดยไม่มีคำเตือน:for($i=$p=30;$i--;$p+=rand(-1,1))printf("%{$p}s\n",'+');
Ismael Miguel

5

Java 8, 131 129 127 126 119 108 101 ไบต์

v->{String r="";for(int i=30,j,t=i;i-->0;r+="+\n")for(j=t+=Math.random()*3-1;j-->0;r+=" ");return r;}

คำอธิบาย:

ลองออนไลน์

v->{                     // Method with empty unused parameter and String return-type
  String r="";           //  Result-String, starting empty
  for(int i=30,j,t=i;    //  Two index integers, and a temp integer (starting at 30)
      i-->0;             //  Loop 30 times:
      r+="+\n")          //    After every iteration: Append the character and a new-line
    for(j=t+=Math.random()*3-1;
                         //   Change `t` with -1, 0, or 1 randomly
        j-->0;r+=" ");   //    And append that many spaces to the result-String
  return r;}             //  Return the result-String

คำตอบเก่า 119 ไบต์:

v->{String s="",r=s;int i=90,t=30;for(;i-->t;s+=" ");for(;i-->0;t+=Math.random()*3-1)r+=s.substring(t)+"+\n";return r;}

คำอธิบาย:

ลองออนไลน์

v->{                      // Method with empty unused parameter and String return-type
  String s="",            //  Temp-String, starting empty
         r=s;             //  Result-String, starting empty
  int i=90,t=30;          //  Temp integer, starting at 30
  for(;i-->t;s+=" ");     //  Fill the temp String with 60 spaces
  for(;i-->0;             //  Loop 30 times:
      t+=Math.random()*3-1//    After every iteration: Change `t` with -1, 0, or 1 randomly
    r+=s.substring(t)     //   Append the result with `60-t` amount of spaces
       +"+\n";            //   + the character and a new-line
  return r;}              //  Return the result-String

4

R , 72 69 67 ไบต์

cat(sprintf(paste0("% ",cumsum(c(30,sample(3,29,T)-2)),"s"),"+\n"))

ขอบคุณZahiro Morสำหรับ 2 ไบต์พิเศษ!

ลองออนไลน์!


การเปลี่ยนจากsample(3,29,T)-2เป็นrunif(29,-1,1)จะลดจำนวนไบต์เป็น 2 แต่การเคลื่อนไหวนั้นไม่น่าจะเท่ากันอีกต่อไป และคุณสามารถเปลี่ยนไปpaste("%"ใช้แทนpaste0("% "หรือฉันกำลังทำบางสิ่งที่นี่ได้หรือไม่
ระแหง

@Rift ถ้าผมใช้วางสายที่เกิดขึ้นจะอยู่ในรูปแบบแทน% 30 s % 30sดังที่คุณพูดrunifไปแล้ว
plannapus

ในประเทศsprintf("%30s"), sprintf("% 30s")และsprintf("% 30 s")ส่งกลับผลลัพธ์เดียวกันสำหรับฉัน แต่ใน TIO มีเพียงสองรายการแรกเท่านั้นที่มีผลลัพธ์เหมือนกันดังนั้นpaste0("%"ควรบันทึกไบต์ และไม่มีข้อกำหนดว่าทุกการเคลื่อนไหวมีความน่าจะเป็นเหมือนกัน
ระแหง

4

Japt , 13 ไบต์

ส่งคืนอาร์เรย์ของบรรทัด

30ÆQù1nH±1n3ö

ทดสอบมัน


คำอธิบาย

30Æ               :Create the range [0,30) and pass each through a function
   Q              :  The " character
    ù             :  Pad start to length...
           3ö     :    Random element from the range [0,3)
         1n       :    Subtract 1
       H±         :    Add the result of that to H (inititally 32)
     1n           :    Subtract 1 to avoid the possibility of the first line being 33 characters long in total

โบนัส

สำหรับ 2 ไบต์น้อยกว่านี่คือรุ่นที่ใช้จำนวนช่องว่างเริ่มต้น & การวนซ้ำเป็นอินพุต

U°ÆQùU±1n3ö

ลองมัน


ทางเลือก RNG

4 ไบต์สุดท้ายสามารถแทนที่ด้วยสิ่งต่อไปนี้:

MrJ1     :A random float between -1 and 1
Jõ ö     :Generate the range [-1,1] and return a random element
3ö É     :An alternative way of writing the method used above
½nMr     :0.5 subtracted from a random float between 0 and 1

1
ไม่น่าเชื่อว่าเราจะเป็นผู้ชนะในขณะนี้! ฉันคิดว่าคุณสามารถบันทึกไบต์ด้วยนี้ (บนมือถือเพื่อฉันไม่สามารถจริงๆยืนยัน)
ETHproductions

@ETHproductions: ฮ่า! นั่นเหมือนกับสิ่งที่ฉันเริ่ม ปัญหาที่เกิดขึ้น แต่ถ้า-1ถูกส่งกลับโดย RNG บนซ้ำแรกเราจะจบลงด้วยความยาวสายรวมของ29เมื่อมันควรจะเป็น30, หรือ31 32
ขนปุย

อืมฉันสับสนว่าเวอร์ชั่นของคุณไปถึงจุดนั้นได้อย่างไร ... นอกจากนี้ฉันเชื่อว่า OP ได้ชี้แจงในความคิดเห็นว่าพวกเขาไม่สนใจว่ามีการลบหรือเพิ่มพื้นที่เพิ่มเติมในการทำซ้ำครั้งแรก
ETHproductions

ที่จริงแล้วฉันสับสนด้วย "เมื่อมันควรจะเป็น 30, 31, หรือ 32" จำเป็นต้องมีที่ไหนบ้าง?
ETHproductions

@ETHproductions: เราเริ่มต้นด้วย30แล้วเพิ่ม-1, 0หรือ1ให้เรา29, 30 หรือ 31- เพิ่ม"และช่วยให้เรามีความยาวรวมของ30, 31หรือ32สำหรับบรรทัดแรก
Shaggy

4

สวิฟท์ 101 ไบต์

import UIKit
var g=29;for _ in 0...g{print((0..<g).map{_ in" "}.joined(),0);g+=Int(arc4random()%3)-1}

คำอธิบาย

โปรแกรมเต็มรูปแบบ นี้ใช้เคล็ดลับค่อนข้างแปลก: arc4random()เป็นสมาชิกของDarwinโมดูล แต่UIKitยังมาพร้อมกับฟังก์ชั่นที่ติดตั้งดังนั้นจึงบันทึกไบต์ :) นอกจากนี้ยังใช้หนึ่งในเคล็ดลับการเล่นกอล์ฟ Swiftของฉันสำหรับการทำซ้ำสตริงจำนวนครั้งโดยพลการ

import UIKit        // Imports the UIKit module, necessary for the RNG.
var g=29;           // Declares an integer variable g by assigning it to 30.
for _ in 0 ... g {  // Execute the code block 30 times (for each integer in [0; g]):
 print(             // Output the following:
  (0..<g).map       // For each integer in [0; g)...
   {_ in" "}        // ... return a literal space character. 
    .joined()       // ... And join the result to a single string.
             ,0     // Also print a "0" preceded by a single space (g starts from 29).
 );
g+=                 // Increment the variable g by...
   arc4random()%3   // ... A random integer, modulo 3...
   Int(...)-1       // ... Casted to an integer (yes, this is needed!) and decremented.
}

ไม่ได้for _ in 0 ... gใช้งานการบล็อกรหัส 29 ครั้งในขณะนี้แทนที่จะเป็น 30 (วนซ้ำจาก 0 ถึง 29 (พิเศษ))?
Kevin Cruijssen

@KevinCruijssen ไม่0...gสร้างจำนวนเต็มทั้งหมดใน[0; g] ไม่ดีของฉันแก้ไขคำอธิบาย 0..<gจะสร้างจำนวนเต็มใน[0; g) : P
Mr. Xcoder

อ่า[0; g)คุณได้แก้ไขให้[0; g]ฉันสับสนจริงๆ :) อืม แต่มันเป็นไปไม่ได้ที่จะเริ่มg=30และวนรอบ[1; g]ในกรณีนี้
Kevin Cruijssen

@KevinCruijssen Looping มากกว่า[0; g)หรือ[1; g]จะเป็นไปได้อย่างแน่นอนถ้าฉันเลือกg=30แทน แต่print(...,0)ต้องเปลี่ยนเป็นprint(...+"0")เพราะพื้นที่เพิ่มเติม (ภายนอก) จะถูกเตรียมไว้ก่อน 0 มิฉะนั้น ทั้งสองวิธีนับไบต์ยังคงเหมือนเดิม
Mr. Xcoder

4

Perl, 36 ไบต์

perl -E '$#a=29;map{$#a+=rand(3)-say"@a -"}@a'

ดีมาก. ฉันลืมเสมอว่าคุณสามารถตั้งค่าความยาวของอาร์เรย์เช่นนั้น ... และใช้sayสำหรับการลบ ฉันคิดถูกแล้วว่าจะไม่เปลี่ยนจำนวนการรันเมื่อ$#aมีการเพิ่มขึ้นเนื่องจากไม่ใช่การอ้างอิง?
Dom Hastings

@ DomHastings: เป็นเพราะฉันใช้mapซึ่งดูเหมือนว่าจะจัดองค์ประกอบในกอง forทำไม่ได้และจะมีความยาวของลูปที่คาดเดาไม่ได้
Ton Hospel

มันมีประโยชน์จริง ๆ ที่จะรู้ ขอบคุณ!
Dom Hastings

การเล่นกอล์ฟที่ดี ฉันพยายามโกนไบต์อื่นด้วยperl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30'แต่บางครั้ง (ไม่ใช่ทุกครั้ง) ทำให้เกิดการแบ่งส่วนผิดพลาด มันอาจเป็นข้อผิดพลาดใน perl v5.22.1 และ v5.16.3?
Kjetil S.

@ Kjetil ใช่ว่าเป็นปัญหาที่รู้จักกันดีซึ่งอาจจะไม่ได้รับการแก้ไข เมื่อวนลูปอาร์เรย์รายการไม่ได้รับ refcount พิเศษดังนั้นถ้าคุณลบพวกเขาพวกเขาจะถูกปลดปล่อยตามเวลาที่วงมาถึงพวกเขาและคุณกดหน่วยความจำที่เป็นอิสระ โชคดีที่คุณไม่เคยทำสิ่งนี้ในโปรแกรมจริง
Ton Hospel

4

R, 54 53 ไบต์

cat(sprintf('
%*s',cumsum(c(30,sample(3,29,T)-2)),0))

แนวคิดที่คล้ายกันข้างต้นแต่ด้วยsprintfรหัสที่สั้นลงและสตริงตัวอักษรที่สั้นกว่า แทนที่จะเป็น\n(สองไบต์) ฉันใช้ตัวแบ่งบรรทัดตามตัวอักษร (หนึ่งไบต์)

Try it online!


A field width or precision (but not both) may be indicated by an asterisk *: in this case an argument specifies the desired number. ฉันใช้sprintfมาหลายปีแล้วและพลาดส่วนนั้นไปเสมอ ... ขอบคุณสำหรับคำเตือน!
plannapus

1
บางครั้งบรรทัดที่สองเยื้องสองช่องว่างแทนหนึ่ง
Scott Milner

@ScottMilner พบบางเวลาในการแก้ไข
Konrad Rudolph

4

Ruby , 45 39 ไบต์

x=30
x.times{puts' '*(x+=rand(3)-1)+?S}

ลองออนไลน์!

การแก้ไขxระหว่างลูปไม่มีผลกับตัวนับลูป ฉันเลือก S เป็นตัวละครที่ออกแนวงูอย่างยิ่ง

-6 ไบต์: ใช้แทนrand(3)-1 ขอบคุณEric Duminil ![-1,0,1].sample


คุณสามารถบันทึกสองไบต์ด้วยx.mapแทนx.times(เทียบเท่าได้เนื่องจากคุณไม่ได้ใช้ค่าส่งคืน)
RJHunter

1
โอ๊ะคุณพูดถูกไม่สนใจฉัน!
RJHunter

1
ตกลงฉันมีดีกว่า: rand -1..1สั้นกว่าห้าไบต์[-1,0,1].sample
RJHunter

1
@RJHunter: หรือrand(3)-1น้อยกว่า 6 ไบต์
Eric Duminil

1
(x=30).times{puts' '*x+?+;x+=rand(3)-1}(ขนาดเดียวกัน) จะพิมพ์ 30 ช่องสำหรับหัวงูตามที่ร้องขอโดยการท้าทาย
Asone Tuhid

4

SenseTalk , 237 198 Bytes

นี่คือภาษาที่ฉันรู้จักและชื่นชอบเมื่อสิบปีก่อน มันเป็นภาษาสคริปต์ที่ไดรฟ์อัตโนมัติทดสอบเครื่องมือมะเขือฟังก์ชั่น ฉันเป็นผู้ใช้เครื่องมือตัวยงมาหลายปีก่อนที่จะเข้าร่วม บริษัท สักพัก มันไม่ใช่ภาษาที่มีความสามารถในการเล่นกอล์ฟมากที่สุด แต่ฉันคิดว่ามันสนุกมากที่จะเขียนมันจริง ๆ แล้วการเล่นกอล์ฟในนั้นค่อนข้างท้าทายเพราะภาษามีความหมายมากและเหมือนภาษาอังกฤษ ... ถึง 237 ไบต์

set s to "                              +"&lf
set p to s
repeat 30
set a to random(0,2)
if a equals 0
delete first char of p
else if a equals 1
put " " before p
end if
put p after s
end repeat
put s

Ungolfed / คำอธิบาย

set the_snake to "                              +"&lf #assign the first line of the snake
set previous_line to the_snake                        #set up for the loop

repeat 30 times                                       #loop 30x
    set action to random(0,2)                         #random add/subtract/stay the same

    if action equals 0
        delete the first character of previous_line   #SenseTalk really shines at string manipulation
    else if action equals 1
        put " " before previous_line                  #insert a character at the beginning
    end if

    put previous_line after the_snake                 #plop the new segment into the string
end repeat                                            #close the loop

put the_snake                                         #print to standard out

แก้ไข: บันทึกแล้ว 36 ไบต์ขอบคุณ @mustachemoses


1
ช่องว่างจำเป็นหรือไม่?
MoustacheMoses

ฉันเคารพสิ่งนี้มาก โดยเฉพาะอย่างยิ่งกับพื้นหลังของ 'ภาษาการเล่นกอล์ฟ' ซึ่งดูเหมือนว่าจะมีอยู่ไม่สามารถอ่านได้อย่างเต็มที่ แต่สั้น ดีใจที่มีตัวอย่างที่แสดงสิ่งที่คุณสามารถทำได้กับภาษาของคุณ
AJFaraday

1
โทรดี @MustacheMoses! Updated
อัลเลนฟิชเชอร์

ฉันนับ 198 ไบต์ (ผู้ใช้หลายคนนับว่ามาก)
HyperNeutrino

@AllenFisher คุณมีล่ามหรือคอมไพเลอร์แบบสแตนด์อโลนสำหรับภาษานี้ที่ฉันสามารถใช้ได้โดยไม่ได้รับการสาธิต Eggplant หรือไม่?
MoustacheMoses


3

PowerShellขนาด 42 ไบต์

1..($l=30)|%{" "*$l+"x";$l+=-1,0,1|Random}

ลองออนไลน์!

ลูปจากไป1 $l=30แต่ละซ้ำเราใส่$lช่องว่างบวกxลงในท่อเป็นสตริงแล้ว+=อย่างใดอย่างหนึ่ง-1, 0, 1ขึ้นอยู่กับการGet-Randomเข้าสู่$lห่วงถัดไป สตริงเหล่านั้นถูกรวบรวมจากไปป์ไลน์และนัยWrite-Outputทำให้เรามีรายการที่คั่นด้วยบรรทัดใหม่ให้ฟรี



3

เยลลี่ขนาด 18 ไบต์

1ŒRX+
30ǒС⁶ẋ;€0Y

ลองออนไลน์!

เป็นตัวละครที่ได้รับการแต่งตั้งเป็น0 ถ้ากลับรายการรายชื่อของตัวละครที่ได้รับอนุญาตแล้วYสามารถลดลงและส่งสามารถจะกลายเป็นห่วงโซ่ niladic สำหรับ17 ไบต์ ทางเลือกใหม่

มันทำงานอย่างไร

30Ç'С⁶ẋ; € 0Y | ลิงก์หลัก Niladic
30 | เริ่มต้นจาก 30 ...
  Ç'С | ... ทำซ้ำลิงก์ผู้ช่วยเหลือ 29 ครั้งและรวบรวมผลลัพธ์ในรายการ
             | (รายการนี้ประกอบด้วย 30 รายการแรกดังนั้นจึงมี 30 หมายเลขจริง)
      ⁶ẋ | ทำซ้ำช่องว่างหลายครั้งสำหรับแต่ละรายการในรายการ
        ; € 0 | เพิ่ม 0 ต่อท้าย
           Y | และเข้าร่วมโดยการขึ้นบรรทัดใหม่
------------- +
1ŒRX + | ลิงก์ผู้ช่วยเหลือแบบ monadic หรือคุณสามารถใช้ µ1ŒRX + µ แทนÇ
1 | ตัวอักษรตัวหนึ่ง
 ŒR | ช่วงสมมาตรตั้งแต่ –1 ถึง 1
   X + | เลือกตัวเลขสุ่มในนั้นและเพิ่มไปยังอาร์กิวเมนต์

เยลลี่ขนาด 16 ไบต์

เมื่อรวมการแก้ปัญหาของ Erik และ Jonathan เข้าด้วยกันเราสามารถตีกอล์ฟให้ได้ถึง 16 ไบต์ เป็นตัวละครที่ได้รับการคัดเลือกเป็น1

’r‘X
30ǒСṬ€o⁶Y

ลองออนไลน์!

ขอบคุณ Jonathan Allan สำหรับการเฮด (บนṬ€o⁶)


คุณสามารถใช้Ṭ€o⁶แทน⁶ẋ;€018 byter ของฉันทำและลงไปที่ 17
Jonathan Allan

@JonathanAllan ขอขอบคุณ! เมื่อรวมคำตอบของเยลลี่ทั้งสามเข้าด้วยกันฉันก็ลงเอยด้วยการมี 16 ไบต์ แต่ฉันโพสต์ว่าเป็นทางออกรองเพราะไม่ใช่ของฉัน :-)
Mr. Xcoder

3

อ็อกเทฟ , 53 51 50 49 ไบต์

printf('%*d\n',[a=31+cumsum(randi(3,1,30)-2);~a])

ลองออนไลน์!

บันทึก 1 ไบต์โดยไม่วนซ้ำอีกต่อไป ที่บันทึกไว้อีกคู่มีเช่นเดียวกับprintffprintf

รหัสใหม่นี้จะสร้างอาร์เรย์ของจำนวนเต็ม 30 -1:1สุ่มในช่วงที่ จากนั้นจึงรวบรวมอาเรย์และบวก 30 ซึ่งให้ลำดับที่ต้องการ

ผลลัพธ์จะถูกพิมพ์โดยใช้fprintfรูปแบบที่ระบุว่า "ตัวเลขทศนิยม, ความกว้างที่ระบุตามด้วยบรรทัดใหม่ความกว้างจะเป็นค่าแรกที่ป้อนเข้าและตัวเลขทศนิยมจะเป็นค่าที่สองหากตัวเลขนั้น ค่าที่ป้อนเข้ามีค่ามากกว่านี้ Octave จะทำการพิมพ์ซ้ำโดยอัตโนมัติเพื่อให้ได้ผลลัพธ์ที่ต้องการ

เพื่อให้เกิดการวนซ้ำเราต้องใช้ศูนย์ interleave ระหว่างอาร์เรย์ลำดับเท่านั้นดังนั้นfprintfฟังก์ชันจึงใช้ค่าแต่ละค่าในลำดับเป็นความกว้างและแต่ละศูนย์เป็นตัวเลขที่จะพิมพ์

พิมพ์ผลลัพธ์เช่น:

                              0
                             0
                              0
                             0
                              0
                               0
                              0
                               0
                              0
                              0
                             0
                            0
                           0
                           0
                           0
                          0
                           0
                            0
                             0
                              0
                              0
                             0
                             0
                              0
                               0
                              0
                              0
                               0
                               0
                                0

รหัสด้านบนไม่ได้พิมพ์ออกเป็น 30 ช่องเสมอในบรรทัดแรก มันอาจเป็น 29, 30, หรือ 31 หากต้องการแก้ไขคุณจะต้องใช้รุ่น 53 ไบต์นี้:

x=31;for i=2:x;fprintf('%*d\n',x,0);x+=randi(3)-2;end

คุณสามารถบันทึกสองไบต์:x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Kevin Cruijssen

@KevinCruijssen ฉันคิดเกี่ยวกับเรื่องนี้ แต่มันไม่ทำงานเหมือนกัน มันจะส่งผลในบรรทัดแรกเริ่มต้นด้วยทั้ง 29, 30 หรือ 31 ช่องว่าง
Tom Carpenter

1
@KevinCruijssen อันที่จริงไม่เป็นไร ฉันเพิ่งสังเกตเห็นความคิดเห็น OPs ว่าได้รับอนุญาต
Tom Carpenter

อ๋อ มันเป็นกฎที่น่ารำคาญอยู่ในความคิดเห็น (โดยเฉพาะอย่างยิ่งเมื่อมันขัดแย้งกับคำอธิบายการท้าทายในปัจจุบัน .. ) ฉันได้ขอให้ OP แก้ไขความท้าทายเพื่อให้สะท้อนถึงคุณสามารถเริ่มด้วย 29, 30 หรือ 31 เพราะดูเหมือนว่าเขาจะอนุญาตในความคิดเห็น
Kevin Cruijssen

3

ลัวะ 81 75 ไบต์

n=30;for i=1,n do print(("%-"..n.."s+"):format(" "))n=n-2+math.random(3)end

ในto_expการประเมินเพียงครั้งเดียวก่อนที่จะเข้าวงประหยัดหนึ่งไบต์for i=1,n ... n

-6 ขอบคุณ @ @ user202729

ลองออนไลน์!


1
ยินดีต้อนรับสู่ PPCG! คุณอาจต้องการเพิ่มลิงค์ TIO ในโพสต์ของคุณเพื่อให้ผู้คนสามารถทดสอบโปรแกรมของคุณได้ง่ายขึ้น
user202729

คุณสามารถกอล์ฟลงคำตอบของคุณ76 ไบต์ นอกจากหน้าเคล็ดลับสำหรับการเล่นกอล์ฟใน Luaอาจมีประโยชน์
user202729

75 ไบต์
user202729

3

Python 3.6 , 84 73 69 ไบต์

from random import*
x=30
exec("print(' '*x+'+');x+=randint(-1,1);"*x)

ขอบคุณ @WheatWizard สำหรับ -11 ไบต์ ขอบคุณ @JoKing สำหรับ -4 ไบต์


เนื่องจากคุณไม่ได้ใช้งานiคุณสามารถใช้for i in[1]*30แทนการบันทึกไบต์
ข้าวสาลีตัวช่วยสร้าง

คุณสามารถทำเช่นนี้from random import*เพื่อที่คุณจะได้ไม่ต้องใช้ในrandom.ภายหลัง :และคุณสามารถเอาพื้นที่การขึ้นบรรทัดใหม่หลังจากที่คุณ
ข้าวสาลีตัวช่วยสร้าง

และถ้าคุณเปลี่ยน30ไปสามารถถูกแทนที่ด้วย 29"+".rjust(x)" "*x+"+"
ข้าวสาลีตัวช่วยสร้าง

ที่จริงแล้วเกี่ยวกับความคิดเห็นสุดท้ายของฉันมันควรจะเป็น 30 ช่องว่างไม่ใช่ 29 คำตอบปัจจุบันของคุณทำให้มีเพียง 29 ช่องว่างและทำให้ไม่ผ่านข้อกำหนด สามารถแก้ไขได้โดยเปลี่ยน 30 เป็น 31
Wheat Wizard

1
@WheatWizard ขอบคุณ! ฉันได้เพิ่มการเปลี่ยนแปลงของคุณและให้เครดิตคุณเช่นกัน ฉันเปลี่ยน[1]*30เป็น[1]*xเพราะสั้นกว่าหนึ่งไบต์
MoustacheMoses

3

ES5, 97 95 81 ไบต์

for(p=i=30;i--;)console.log(Array(p).join(" ",r=Math.random()*3|0,p+=r>1?-1:r)+0)

ES5, 11298 ไบต์หากจำเป็นต้องใช้รูปแบบฟังก์ชัน:

function a(){for(p=i=30;i--;)console.log(Array(p).join(" ",r=Math.random()*3|0,p+=r>1?-1:r)+0)}a()


2
ยินดีต้อนรับสู่ PPCG! ฉันคิดว่าคุณต้องประกาศตัวแปรของคุณภายในฟังก์ชั่น_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
โอลิเวอร์

ที่จะฆ่าไบต์ฉันจะบอกคุณว่า ES5 ไม่รวมฟังก์ชั่นลูกศรตามค่าเริ่มต้น ฉันจะอัปเดต
Kyle Fairns

@Oliver เพิ่มรูปแบบฟังก์ชั่นแล้ว :)
Kyle Fairns

ดี! ฉันไม่แน่ใจว่าจะเปิดตัวเมื่อไหร่ แต่ฉันคิดว่าคุณสามารถแทนที่join(" ")ด้วยjoin` `
Oliver

@Oliver ฉันไม่แน่ใจว่าคุณสามารถทำได้ใน ES5 ได้ไหม ฉันคิดว่ามีการเพิ่มเทมเพลตตามตัวอักษรใน ES6 หรือไม่
Kyle Fairns

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