Kode Golf: Ular ASCII peliharaan Anda sendiri


34

Jadi, saya menulis sendiri satu garis yang mencetak ular di konsol. Ini sedikit menyenangkan, dan saya bertanya-tanya bagaimana saya bisa menyingkat kode saya ...

Berikut ini adalah contoh output (pendek):

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

Berikut spesifikasinya:

  • Di setiap baris, satu karakter non-spasi putih (mana pun yang Anda suka) dicetak ke konsol, awalnya dengan 29 hingga 31 spasi padding di sebelah kiri itu.
  • Setiap iterasi, keputusan acak dibuat antara tiga tindakan ini
    • Jumlah padding berkurang sebesar 1
    • Jumlah padding tetap sama
    • Jumlah bantalan meningkat sebesar 1

Lakukan ini 30 kali, untuk mencetak 30 segmen ular panjang ke konsol.

Jawaban terpendek dalam byte menang.


Bisakah kita mengembalikan array garis? Apakah memimpin / mengikuti ruang atau baris baru diperbolehkan?
Shaggy

1
Saya berasumsi spasi tambahan di setiap baris diperbolehkan, bukan?
Luis Mendo

1
Apa yang dimaksud dengan "acak"? Seragam acak? Acak dari distribusi mana pun dengan dukungan positif pada masing-masing dari ketiga hasil? Acak dari distribusi apa pun? Apakah hasilnya harus berbeda pada setiap menjalankan program?
Nathaniel

1
Perhatikan bahwa, secara default, acak tidak berarti secara seragam . Sebagai contoh, bagian kedua dari jawaban brainfuck saya adalah (seperti yang sekarang) benar-benar valid, meskipun itu menghasilkan garis lurus sebagian besar waktu.
Jo King

1
Saat ini, ada dua poin yang tidak jelas: 1) Apakah acak berarti seragam acak? (mempengaruhi jawaban ini ) dan 2) Apakah output harus berbeda setiap waktu? (yaitu, dapatkah pembuat bilangan acak tidak diunggulkan? Mempengaruhi jawaban ini )
DJMcMayhem

Jawaban:


14

05AB1E , 15 14 byte

30DF2Ý<+ΩD0sú,

Cobalah online!

Penggunaan 0.

Penjelasan

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

39
05AB1E: 0-byte, Cobalah online! ... tunggu, tidak, hampir saja.
Magic Gurita Guci

14

Random Brainfuck , 123 122 121 byte

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

Cobalah online!

Random Brainfuck adalah perpanjangan dari brainfuck, dengan tambahan ?perintah yang membantu, yang mengatur sel saat ini menjadi byte acak. Ini mencetak ular yang terbuat dari !s, yang lebih mirip langkah kaki daripada seekor ular yang lucu.

Bagaimana itu bekerja:

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

Solusi lain yang melekat pada surat pertanyaan, daripada semangat.

87 byte

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

Cobalah online!

Yang ini sangat bias menuju meninggalkan padding sendirian, tetapi menambah atau mengurangi padding keduanya sama-sama mungkin. Masing-masing memiliki sedikit kurang dari 1 dalam 256 kesempatan untuk terjadi.


Sangat bagus! Saya tidak mengetahui ?perintah itu. +1
Grant Miller

@GrantMiller ?hanya tersedia dalam Random Brainfuck , bukan brainfuck klasik
Jo King

8

C (gcc) , 61 58 56 byte

Jawaban diedit untuk mencerminkan perubahan aturan ...

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

Cobalah online!


simpan byte dengan berpindah s+=1-rand()%3ke fungsi printf. i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Vaelus

@Vaelus Itu membuat baris pertama memiliki jumlah spasi yang bervariasi, bukan 30 yang ditentukan dalam pertanyaan.
Steadybox

@Steadybox Yang diizinkan dalam komentar rupanya ..
Kevin Cruijssen

7

Retina , 24 byte


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

Cobalah online!

Penjelasan


30* +

Inisialisasi string yang berfungsi ke baris pertama, yaitu 30 spasi dan a +.

-29{¶<`^
 

Ada ruang di baris kedua. -29{membungkus sisa program dalam satu lingkaran, yang dijalankan 29 kali. ¶<mencetak string yang bekerja di awal setiap iterasi loop dengan linefeed baris tambahan. Tahap atom itu sendiri menyisipkan spasi di awal string (ide dasarnya adalah menyisipkan satu spasi, dan kemudian secara acak menghapus 0-2 ruang, karena itu satu byte lebih pendek daripada secara acak memilih antara penghapusan, menyisipkan, dan tidak ada op).

S,2@1`

Ini cocok dengan regex kosong terhadap input, yang memberi kami setiap posisi di antara karakter (dan awal dan akhir string). Kemudian ,2simpan hanya tiga pertandingan pertama, yaitu pertandingan setelah nol, satu dan dua spasi. @memilih satu dari tiga pertandingan yang acak. Kemudian tahap pemisahan ( S) membagi input di sekitar kecocokan itu. Dan 1mengatakan itu untuk menjaga hanya bagian kedua dari perpecahan. Dengan kata lain, kami membuang semuanya hingga pertandingan acak kami.

Baris ke-30, yang merupakan hasil dari iterasi loop terakhir, dicetak secara implisit di akhir program.


Anda tahu apa yang lebih pendek daripada menghapus 0-2 spasi? Mengacak-acak ruang di sekitar! . Ngomong-ngomong, Retina baru hebat: D
Leo

7

VBA, 60 59 49 Bytes

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

Rekatkan di jendela Segera dan tekan enter. (Pastikan deklarasi eksplisit dimatikan!)

Jauh lebih mungkin untuk bergerak daripada tetap di garis (yaitu tindakan tidak sama-sama berbobot) tetapi itu bukan persyaratan yang ditentukan (Untungnya!)

{EDIT} Disimpan 1 byte dengan menghapus spasi antara =1danTo

{EDIT2} Disimpan 10 byte berkat komentar remoel

Versi lama:

'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
Selamat datang di PPCG!
Martin Ender

2
Anda dapat menyimpan beberapa byte dengan mengganti String(i," ")ke Spc(30+i)menghapus kemudian i=30:. Atau -1 byte dengan menghapus &. :)
remoel

7

C # (.NET Core), 112 110 106 100 99 98 byte

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

-1 byte terima kasih kepada @raznagul .
-1 byte terima kasih kepada @auhmaan .

Penjelasan:

Cobalah online.

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

Satu hal yang aneh: Jika saya menelepon new Random().Next()beberapa kali secara lokal (.net Framework Version 4.6.1) saya selalu mendapatkan hasil yang sama. Saya perlu menambahkan Thread.Sleep(10)antara panggilan untuk secara andal mendapatkan hasil yang berbeda. Dengan waktu tidur kurang dari 10ms saya terkadang masih mendapatkan hasil yang sama. Jadi .net-Framework dan TIO (.net-Core) memiliki PRNG yang berbeda atau setidaknya menggunakan benih yang berbeda. Jika saya mengganti program Anda di TIO ke C # -mono saya mendapatkan perilaku yang sama seperti yang saya dapatkan secara lokal di .net-Framework.
raznagul

@raznagul Hmm, output dengan C # (Mono C # compiler) memang aneh ..
Kevin Cruijssen

3
@raznagul new Random()menggunakan waktu sebagai seed sehingga dalam loop yang ketat waktunya sama dan hasilnya sama.
TheLethalCoder

@TheLethalCoder: Ya, itulah yang saya (kurang lebih) harapkan. Hal-hal aneh adalah bahwa 1) .net-Core (setidaknya pada TIO) berperilaku berbeda. 2) Bahwa saya perlu Thread.Sleep(10)andal mendapatkan hasil yang berbeda dan Thread.Sleep(1)atau bahkan 9ms tidak cukup.
raznagul

@raznagul Tidur nyenyak selama 1, 9, atau 10 ms semuanya harus tidur untuk waktu yang sama tergantung pada proses lain yang berjalan ... memang aneh.
TheLethalCoder

7

C, 56 byte

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

Cobalah online!

Penjelasan:

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 byte

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

Bergantung pada f "mengembalikan" nilai yang ditetapkan ke n dalam fungsi, yang merupakan perilaku tidak terdefinisi, tetapi bekerja secara konsisten dengan gcc ketika tidak ada optimasi yang diaktifkan.

Cobalah online!


6

JavaScript (ES8), 63 62 60 byte

Termasuk baris baru yang tertinggal. *2-1dapat diganti dengan -.5untuk penghematan 1 byte tetapi kemungkinan setiap baris sama panjangnya dengan baris sebelumnya akan sangat meningkat. Tentu saja, karena "acak" tidak didefinisikan dalam tantangan, RNG dapat diganti dengan new Date%3-1jumlah byte total 55 .

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

Menyimpan satu byte, terima kasih kepada seseorang yang menghapus komentar mereka sebelum saya dapat menangkap namanya. Saya benar-benar mencobanya dengan cara ini repeatdan padStarttetapi tidak berpikir untuk mencoba padEnd- tidak tahu mengapa!


Bonus

Untuk jumlah byte yang sama, inilah versi yang menggunakan jumlah spasi awal & iterasi sebagai input.

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):``lebih pendek satu byte. (Catatan: Karena SO tidak mengizinkan jeda baris dalam komentar, saya harus mengetik \ n daripada benar-benar menggunakan jeda baris.)
Stefnotch

Terima kasih, @Stefnotch. Sayangnya, bahkan dengan nilai awal y=31, akan ada kemungkinan baris pertama terlalu pendek. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…
Shaggy

1
Perbaiki saya jika saya salah, tetapi bukankah solusi Anda saat ini juga mengalami masalah itu?
Stefnotch

1
Baris pertama harus memiliki tepat 30 ruang, sesuai tantangan.
Nit

1
@Nit, OP telah mengkonfirmasi bahwa baris pertama mungkin berisi 29-31 ruang tetapi belum mengedit fakta itu ke dalam tantangan, meskipun ada permintaan berulang untuk melakukannya.
Shaggy

6

Java 8, 89 87 byte

Golf pertama, saya yakin itu bisa menjadi jauh lebih baik ..

Sunting: Memperbaiki saluran pertama berkat Steadybox .

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

Cobalah online!

 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
Selamat datang di PPCG! :)
Shaggy


6

Python 2 , 83 65 64 byte

Pendekatan langsung:

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

Cobalah online!

Terima kasih kepada @Rod karena telah menghemat beberapa byte! Terima kasih kepada @ovs untuk -1 byte!

Edit: mengubah nama variabel dan string keluaran menjadi huruf 's'

Lebih banyak output seperti ular untuk 88 byte:

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

1
Saya suka ini. Solusi yang sangat rapi.
linemade


5

Arang , 14 byte

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

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

× ³⁰            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

Akan hanya 10 byte jika tidak ada persyaratan indentasi awal.


@KevinCruijssen Hmm, itu aneh, karena Charcoal suka memotong secara default.
Neil

5

PHP, 61 byte

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

Cobalah online!


8
$i<30;$i++bisa $i++<30;untuk menghemat 2 byte.
Kevin Cruijssen

2
55 byte: for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');( \ndihitung sebagai 1 char, dan harus diganti dengan baris baru yang sebenarnya)
Ismael Miguel

2
Alternatif panjang 55 byte, tanpa peringatan:for($i=$p=30;$i--;$p+=rand(-1,1))printf("%{$p}s\n",'+');
Ismael Miguel

5

Java 8, 131 129 127 127 126 119 108 101 byte

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

Penjelasan:

Cobalah online.

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

Jawaban lama 119 byte:

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

Penjelasan:

Cobalah online.

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 byte

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

Terima kasih kepada Zahiro Mor untuk 2 byte tambahan!

Cobalah online!


Beralih dari sample(3,29,T)-2ke runif(29,-1,1)akan mengurangi jumlah byte sebesar 2 tetapi bergerak tidak lagi sama mungkin. Dan bisakah Anda juga beralih ke atau paste("%"bukannya paste0("% "saya melewatkan sesuatu di sini?
Rift

@ Cepat jika saya menggunakan tempel string yang dihasilkan akan berupa % 30 sbukan % 30s. Seperti yang Anda katakan runifakan mengacaukan kemungkinan.
plannapus

Secara lokal sprintf("%30s"), sprintf("% 30s")dan sprintf("% 30 s")kembalikan hasil yang sama untuk saya. Tetapi pada TIO hanya dua yang pertama memiliki hasil yang identik, jadi paste0("%"harus menyimpan byte. Dan tidak ada persyaratan bahwa setiap gerakan memiliki probabilitas yang sama.
Rift

4

Japt , 13 byte

Mengembalikan array garis.

30ÆQù1nH±1n3ö

Menguji


Penjelasan

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

Bonus

Untuk kurang dari 2 byte , inilah versi yang menggunakan jumlah spasi awal & iterasi sebagai input.

U°ÆQùU±1n3ö

Cobalah


RNG alternatif

4 byte terakhir dapat diganti dengan yang berikut ini:

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
Wow, tidak percaya kita menang saat ini! Saya pikir Anda dapat menyimpan byte dengan ini (di ponsel jadi saya tidak bisa memverifikasi)
ETHproduksi

@ ETProduksi: Ha! Itu identik dengan apa yang saya mulai dengan. Masalahnya adalah, meskipun, jika -1dikembalikan oleh RNG pada iterasi pertama, kita akan berakhir dengan panjang garis total 29kapan seharusnya 30, 31atau 32.
Shaggy

Hmm, saya bingung tentang bagaimana versi Anda menyiasatinya kalau begitu ... Juga, saya percaya OP telah mengklarifikasi dalam komentar bahwa mereka tidak peduli jika ada ruang ekstra yang dihapus atau ditambahkan dalam iterasi awal.
ETHproduksi

Sebenarnya saya bingung dengan "kapan seharusnya 30, 31, atau 32" —dimana itu diperlukan?
ETHproduksi

@ ETHproductions: Kita mulai dengan 30dan kemudian menambahkan -1, 0atau 1memberi kita 29, 30 atau 31- menambahkan "dan yang memberi kita total panjang 30, 31atau 32untuk baris pertama.
Shaggy

4

Swift , 101 byte

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

Penjelasan

Program lengkap. Ini menggunakan trik yang agak aneh: arc4random()adalah anggota Darwinmodul, tetapi UIKitjuga dilengkapi dengan fungsi ini diinstal, sehingga menghemat satu byte :) Juga menggunakan salah satu tips bermain golf Swift saya untuk mengulangi string beberapa kali secara acak.

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

Tidak for _ in 0 ... gmenjalankan blok kode 29 kali sekarang, bukan 30 (loop dari 0 ke 29 (eksklusif))?
Kevin Cruijssen

@KevinCruijssen Tidak, 0...gmenghasilkan semua bilangan bulat di [0; g] . Buruk saya, tetap penjelasan. 0..<gakan menghasilkan bilangan bulat di [0; g) : P
Mr. Xcoder

Ah, yang [0; g)Anda edit [0; g]memang membingungkan saya. :) Hmm, tetapi apakah tidak mungkin untuk memulai pada g=30dan loop [1; g]dalam kasus itu?
Kevin Cruijssen

@KevinCruijssen Melompati salah satu [0; g)atau [1; g]pasti akan mungkin jika saya memilih g=30sebagai gantinya, tetapi kemudian print(...,0)perlu diubah print(...+"0"), karena ruang tambahan (asing) akan ditambahkan sebelum 0 jika tidak. Either way, jumlah byte tetap sama.
Tn. Xcoder

4

Perl, 36 byte

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

Sangat baik. Saya selalu lupa Anda dapat mengatur panjang array seperti itu ... dan menggunakan sayuntuk pengurangan. Apakah saya benar dalam berpikir itu tidak mengubah jumlah berjalan ketika $#abertambah karena itu bukan referensi?
Dom Hastings

@DomHastings: Itu karena saya menggunakan mapyang pertama kali meletakkan elemen pada stack. fortidak dan akan memiliki panjang loop yang tidak dapat diprediksi
Ton Hospel

Itu sangat berguna untuk diketahui. Terima kasih!
Dom Hastings

Golf yang bagus. Saya mencoba untuk memotong byte lain dengan perl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30', tetapi kadang-kadang (tidak setiap waktu) mengakibatkan kesalahan segmentasi. Mungkinkah itu bug di perl v5.22.1 dan v5.16.3?
Kjetil S.

@ Kjetil Ya, itu adalah masalah terkenal yang mungkin tidak akan pernah diperbaiki. Saat mengulang array, entri tidak mendapatkan refcount tambahan, jadi jika Anda menghapusnya, mereka dibebaskan pada saat loop mencapai mereka dan Anda menekan memori yang dibebaskan. Untungnya Anda tidak pernah melakukan ini dalam program nyata.
Ton Hospel

4

R, 54 53 byte

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

Ide yang sama seperti di atas , tetapi dengan sprintfkode yang lebih pendek dan karakter string string yang lebih pendek. Alih-alih \n(dua byte) saya menggunakan istirahat garis literal (satu byte).

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. Saya telah menggunakan sprintfselama bertahun-tahun dan entah bagaimana selalu melewatkan bagian itu ... Terima kasih atas pengingatnya!
plannapus

1
Baris kedua kadang-kadang menjorok dua spasi bukannya satu.
Scott Milner

@ScottMilner Menemukan waktu untuk memperbaikinya.
Konrad Rudolph

4

Ruby , 45 39 byte

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

Cobalah online!

Memodifikasi xselama loop tidak mempengaruhi penghitung loop. Saya memilih S sebagai karakter keluaran seperti ular.

-6 byte: Gunakan rand(3)-1sebagai ganti [-1,0,1].sample. Terima kasih, Eric Duminil !


Anda dapat menyimpan dua byte dengan x.mapalih - alih x.times(setara karena Anda tidak menggunakan nilai pengembalian)
RJHunter

1
Ups, Anda benar, abaikan saya!
RJHunter

1
OK saya punya yang lebih baik: rand -1..1lima byte lebih pendek dari[-1,0,1].sample
RJHunter

1
@ RJHunter: Atau rand(3)-1kurang dari 6 byte.
Eric Duminil

1
(x=30).times{puts' '*x+?+;x+=rand(3)-1}(ukuran yang sama) akan mencetak tepat 30 ruang untuk kepala ular seperti yang diminta oleh tantangan
Asone Tuhid

4

SenseTalk , 237 198 Bytes

Ini adalah bahasa yang saya kenal dan sukai sekitar satu dekade yang lalu. Ini adalah bahasa scripting yang menggerakkan alat pengujian otomatis Eggplant Functional . Saya adalah pengguna berat alat ini selama bertahun-tahun sebelum bergabung dengan perusahaan untuk sementara waktu. Ini bukan bahasa yang paling mampu golf, tapi saya merasa sangat menyenangkan untuk menulis. Golf di dalamnya sebenarnya cukup menantang karena bahasa itu dimaksudkan untuk menjadi kata kerja dan seperti bahasa Inggris ... butuh waktu cukup lama untuk menyelesaikannya hingga 237 byte.

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

Tidak Terikat / Penjelasan

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

Sunting: Disimpan 36 byte berkat @mustachemoses


1
Apakah spasi diperlukan?
MoustacheMoses

Saya sangat menghormati ini. Terutama dengan latar belakang 'bahasa golf' yang tampaknya ada benar-benar tidak dapat dibaca, tetapi singkat. Sangat menyenangkan memiliki contoh yang hanya menunjukkan apa yang dapat Anda lakukan dengan bahasa Anda.
AJFaraday

1
Panggilan bagus @MustacheMoses! Diperbarui.
Allen Fisher

Saya menghitung 198 byte (well, jumlah
script

@AllenFisher Apakah Anda memiliki juru bahasa mandiri atau kompiler untuk bahasa ini yang dapat saya gunakan tanpa mendapatkan demo terong?
MoustacheMoses


3

PowerShell , 42 byte

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

Cobalah online!

Loop dari 1ke $l=30. Setiap iterasi kita menempatkan $lspasi ditambah xke pipa sebagai string, maka +=salah satu dari -1, 0, 1berdasarkan Get-Randomke $luntuk loop berikutnya. String-string itu dikumpulkan dari pipeline dan sebuah implisit Write-Outputmemberi kita daftar yang dipisahkan baris baru secara gratis.



3

Jeli , 18 byte

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

Cobalah online!

Karakter yang dipilih adalah 0 . Jika mengembalikan daftar daftar karakter diperbolehkan, maka Ydapat dijatuhkan dan pengiriman dapat diubah menjadi rantai niladic selama 17 byte . Alternatif .

Bagaimana itu bekerja

30Ç'С⁶ẋ; € 0Y | Tautan utama niladic.
30 | Mulai dari 30 ...
  Ç'С | ... Ulangi tautan helper 29 kali dan kumpulkan hasilnya dalam daftar.
             | (Daftar ini termasuk 30 pertama, jadi sebenarnya ada 30 angka).
      ⁶ẋ | Ulangi spasi yang berkali-kali, untuk setiap item dalam daftar.
        ; € 0 | Tambahkan 0 untuk masing-masing.
           Y | Dan bergabunglah dengan baris baru.
------------- +
1ŒRX + | Tautan pembantu monadik. Atau, Anda dapat menggunakan μ1ŒRX + µ sebagai ganti Ç.
1 | Yang harfiah.
 ŒR | Kisaran simetris dari –1 hingga 1.
   X + | Pilih nomor acak di dalamnya dan tambahkan ke argumen.

Jelly , 16 byte

Menggabungkan solusi saya, solusi Erik dan Jonathan, kita dapat melakukan ini hingga 16 byte. Karakter yang dipilih adalah 1 .

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

Cobalah online!

Terima kasih kepada Jonathan Allan untuk up-on (on Ṭ€o⁶).


Anda dapat menggunakannya Ṭ€o⁶sebagai pengganti ⁶ẋ;€0byter 18 saya dan turun ke 17.
Jonathan Allan

@JonathanAllan Terima kasih! Menggabungkan tiga jawaban Jelly, saya benar-benar memiliki 16 byte. Tetapi saya mempostingnya sebagai solusi sekunder karena itu bukan sepenuhnya milik saya. :-)
Mr. Xcoder

3

Oktaf , 53 51 50 49 byte

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

Cobalah online!

Disimpan 1 byte dengan tidak lagi melakukan pengulangan. Disimpan lain seperti Oktaf printfjuga fprintf.

Kode baru ini menciptakan array 30 bilangan bulat acak dalam rentang -1:1. Kemudian secara kumulatif menjumlahkan array dan menambahkan 30, yang memberikan urutan yang diinginkan.

Hasilnya dicetak menggunakan fprintfformat yang mengatakan "Angka desimal, diisi dengan lebar yang ditentukan, diikuti oleh baris baru. Lebar akan menjadi input nilai pertama, dan angka desimal akan menjadi input nilai kedua. Jika nomor tersebut dari nilai input lebih dari ini, Oktaf akan terus mengulangi cetakan secara otomatis untuk mendapatkan hasil yang diinginkan.

Untuk mencapai looping, kita hanya perlu interleave nol antara array urutan sehingga fprintffungsi menggunakan setiap nilai dalam urutan sebagai lebar, dan masing-masing nol sebagai digit yang akan dicetak.

Mencetak keluaran seperti:

                              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

Kode di atas tidak selalu mencetak tepat 30 spasi di baris pertama. Pilihannya adalah 29, 30, atau 31. Untuk memperbaikinya, Anda akan menggunakan versi 53 byte ini:

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

Anda dapat menyimpan dua byte:x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Kevin Cruijssen

@KevinCruijssen Saya memikirkan hal itu, tetapi tidak bekerja sama. Itu akan menghasilkan baris pertama dimulai dengan 29, 30, atau 31 spasi.
Tom Carpenter

1
@KevinCruijssen sebenarnya, sudahlah. Saya baru saja memperhatikan komentar OP yang mengatakan itu diperbolehkan.
Tom Carpenter

Ya. Agak mengganggu aturan dalam komentar (terutama karena bertentangan dengan deskripsi tantangan saat ini ..). Saya telah meminta OP untuk mengedit tantangan agar Anda dapat mulai dengan 29, 30 atau 31, karena ia tampaknya mengizinkannya dalam komentar.
Kevin Cruijssen

3

Lua, 81 75 byte

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

Di for i=1,n ...dalam to_exp n dievaluasi hanya sekali sebelum memasuki loop, menyimpan satu byte.

-6 terima kasih kepada @ user202729

Cobalah online!


1
Selamat datang di PPCG! Anda mungkin ingin menambahkan tautan TIO ke posting Anda sehingga orang dapat menguji program Anda dengan lebih mudah.
user202729

Anda dapat menurunkan jawaban Anda hingga 76 byte . Selain itu halaman Tips untuk bermain golf di Lua mungkin bermanfaat.
user202729


3

Python 3.6 , 84 73 69 byte

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

Berkat @WheatWizard untuk -11 byte. Berkat @ JoKing untuk -4 byte.


Karena Anda tidak menggunakan akhirnya iAnda dapat menggunakannya for i in[1]*30untuk menghemat byte.
Wheat Wizard

Anda juga bisa from random import*sehingga Anda tidak membutuhkannya random.nanti. Dan Anda dapat menghapus ruang baris baru setelah Anda :.
Wheat Wizard

Dan jika Anda mengubah 30ke 29yang "+".rjust(x)bisa diganti dengan " "*x+"+".
Wheat Wizard

Sebenarnya mengenai komentar terakhir saya seharusnya 30 spasi bukan 29. Jawaban Anda saat ini hanya menempatkan 29 spasi dan dengan demikian gagal memenuhi spesifikasi. Ini dapat diperbaiki dengan mengubah 30 ke 31.
Wheat Wizard

1
@WheatWizard Terima kasih! Saya telah menambahkan perubahan Anda dan mengkredit Anda juga. Saya berubah [1]*30menjadi [1]*xkarena satu byte lebih pendek.
MoustacheMoses

3

ES5, 97 95 81 byte

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

ES5, 11298 byte jika format fungsi diperlukan:

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
Selamat datang di PPCG! Saya pikir variabel Anda harus dideklarasikan di dalam suatu fungsi -_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
Oliver

Itu akan membunuh byte, aku akan memberitahumu itu. ES5 tidak termasuk fungsi panah secara default. Saya akan memperbarui
Kyle Fairns

@Oliver, format fungsi ditambahkan :)
Kyle Fairns

Bagus! Saya tidak yakin kapan diperkenalkan, tapi saya pikir Anda bisa mengganti join(" ")denganjoin` `
Oliver

@Liver Saya tidak yakin Anda bisa melakukannya di ES5, bukan? Saya pikir itu adalah templat literal yang ditambahkan dalam ES6?
Kyle Fairns

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.