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


34

Bu yüzden, kendimi konsolda bir yılan basan bir liner yazdım. Bu biraz eğlenceli ve kodumu nasıl sıkılaştıracağımı merak ettim ...

İşte bir (kısa) örnek çıktı:

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

İşte özellikler:

  • Her satırda, tek bir boşluk olmayan karakter (hangisini isterseniz) konsola yazdırılır, başlangıçta soldan itibaren 29 - 31 boşluk bırakarak konsola yazdırılır.
  • Her yineleme, bu üç eylem arasında rastgele bir karar verilir.
    • Dolgu miktarı 1 azalır
    • Dolgu miktarı aynı kalır
    • Dolgu miktarı 1 artar

Konsola 30 segment uzunluğunda bir yılan yazdırmak için bunu 30 kez yapın.

Bayt cinsinden en kısa cevap kazanır.


Bir dizi satır döndürebilir miyiz? Öndeki / sondaki boşluklara veya yeni satırlara izin veriliyor mu?
Shaggy

1
Her satırda sondaki boşluklara izin verildiğini varsayıyorum, değil mi?
Luis Mendo

1
"Rastgele" ne demek? Tekdüze rastgele? Üç sonucun her birine olumlu destek veren herhangi bir dağıtımdan rastgele? Herhangi bir dağıtımdan rastgele hangisi? Programın her çalışması için sonuçların farklı olması gerekiyor mu?
Nathaniel,

1
Unutmayın ki, varsayılan olarak, rastgele aynı anlama gelmez . Mesela beynimdeki cevabımın ikinci kısmı, çoğu zaman düz bir çizgi oluşturmasına rağmen (şu an itibariyle) tamamen geçerli.
Jo King,

1
Şu anda, belirsiz olan iki nokta var: 1) Rasgele , rasgele , rasgele demek mi? ( bu cevabı etkiler ) ve 2) Çıktı her seferinde farklı mı olmalı? (yani, rasgele sayı üreteci
tohumsuz

Yanıtlar:


14

05AB1E , 15 14 bayt

30DF2Ý<+ΩD0sú,

Çevrimiçi deneyin!

Kullanır 0.

açıklama

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 bayt, Çevrimiçi deneyin! ... bekle, hayır, neredeyse.
Magic Octopus Urn,

14

Rastgele Brainfuck , 123 122 121 bayt

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

Çevrimiçi deneyin!

Rastgele Brainfuck, ?mevcut hücreyi rastgele bir bayta ayarlayan komutun yararlı eklenmesiyle beyin fırtınasının bir uzantısıdır . Bu !, yeterince eğlenceli bir yılandan çok ayak sesi gibi görünen , s'den yapılmış bir yılanı basar .

Nasıl çalışır:

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

Ruhun değil, sorunun mektubuna yapışan bir başka çözüm .

87 bayt

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

Çevrimiçi deneyin!

Bu, dolguyu tek başına bırakma yönünde ağır bir şekilde eğimlidir, ancak dolguyu artırmak veya azaltmak her ikisi de aynı şekilde mümkündür. Her biri, 256 şansta 1'den biraz daha azdır.


Çok hoş! Komuttan haberi yoktu ?. +1
Grant Miller

@GrantMiller klasik Brainfuck'ta değil ?, sadece Random Brainfuck'ta mevcuttur
Jo King

8

C (gcc) , 61 58 56 bayt

Kural değişikliklerini yansıtacak şekilde düzenlenmiş cevap ...

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

Çevrimiçi deneyin!


s+=1-rand()%3printf işlevine taşıyarak bir bayt kaydedin . i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Vaelus

@Vaelus Bu, ilk satırda, soruda belirtilen 30 yerine değişken miktarda boşluk olmasını sağlar.
Steadybox

@Steadybox Görünüşe göre yorumlarda izin verilir ..
Kevin Cruijssen

7

Retina , 24 bayt


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

Çevrimiçi deneyin!

açıklama


30* +

Çalışma dizesini ilk satıra sıfırlayın, yani 30 boşluk ve a +.

-29{¶<`^
 

İkinci satırda boşluk var. -29{Programın kalanını, 29 kez çalıştırılan bir döngüde sarar. ¶<Çalışan dize her döngü yinelemenin başında izleyen satır besleme ile yazdırır. Atom aşamasının kendisi dizginin başlangıcına bir boşluk ekler (temel fikir bir boşluk eklemek ve ardından rastgele 0–2 boşlukları kaldırmaktır, çünkü bu, silme, ekleme ve işlem dışı arasında rastgele seçim yapmaktan daha kısa bir bayttır).

S,2@1`

Bu, boş regex ile girişe eşleşir; bu da karakterlerin (ve dizenin başlangıcı ve bitişi) arasındaki her konumu bize verir. Sonra ,2sadece ilk üç eşleşmeyi, yani sıfır, bir ve iki boşluktan sonraki eşleşmeleri tutar. @bu üç maçtan rastgele birini seçer. Ardından split stage ( S) girişi o eşleşmenin etrafına böler. Ve 1bölünmenin sadece ikinci kısmını korumasını söyler. Başka bir deyişle, rastgele eşleşmemize kadar her şeyi atarız.

Son döngü yinelemesinin sonucu olan 30. satır, program sonunda örtük olarak basılmıştır.


0--2 boşluk kaldırmaktan daha kısa ne var biliyor musun? Çevresindeki karıştırma alanları! . Bu arada, yeni Retina harika: D
Leo,

7

VBA, 60 59 49 Bayt

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

Hemen penceresine yapıştırın ve enter tuşuna basın. (Açık bildirimin kapalı olduğundan emin olun!)

Bir çizgide kalmaya göre hareket etme olasılığı çok daha yüksektir (yani, eylemler eşit ağırlıkta değildir), ancak bu belirtilen bir gereklilik değildi (Neyse ki!)

{EDIT} ve arasındaki boşluğu kaldırarak 1 bayt kaydedildi=1To

{EDIT2} remoel'in yorumu sayesinde 10 bayt kaydedildi

Eski versiyonlar:

'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'ye Hoşgeldiniz!
Martin Ender

2
Sen değiştirerek birkaç byte kaydedebilirsiniz String(i," ")için Spc(30+i)daha sonra kaldır i=30:. Veya -1 byte kaldırarak &. :)
18'de remoel

7

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

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

@Raznagul sayesinde -1 bayt . @Auhmaan
sayesinde -1 bayt .

Açıklama:

Çevrimiçi deneyin.

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

Tuhaf bir şey: new Random().Next()Yerel olarak birden çok kez ararsam (.net Framework Sürüm 4.6.1) her zaman aynı sonucu alırım. Thread.Sleep(10)Güvenilir bir şekilde farklı sonuçlar elde etmek için arama arasına bir ekleme eklemem gerekiyor . 10ms'den daha az bir uyku süresinde bazen aynı sonucu elde ediyorum. Bu yüzden .net-Framework ve TIO (.net-Core) farklı PRNG'lere sahiptir veya en azından farklı tohumlar kullanır. Programınızı TIO'da C # -mono olarak değiştirirsem, yerel olarak .net-Framework ile aynı davranışı alıyorum.
raznagul

@raznagul Hmm, C # (Mono C # compiler) ile çıkış gerçekten çok garip ..
Kevin Cruijssen

3
@raznagul new Random(), zamanı tohum olarak kullanır, böylece sıkı bir döngüde, zaman aynıdır ve sonuç aynı olur.
TheLethalCoder

@TheLethalCoder: Evet, beklediğim budur (az çok). Tuhaf şeyler şu ki 1) .net-Core (en azından TIO'da) farklı davranıyor. 2) Thread.Sleep(10)Güvenilir bir şekilde farklı sonuçlar elde etmem gerekiyor ve Thread.Sleep(1)hatta 9ms bile yeterli değil.
raznagul

@raznagul 1, 9 ya da 10ms için iyi uyumak, gerçekten çalışan garip işlemlere bağlı olarak aynı saatte uyumalıdır.
TheLethalCoder

7

C, 56 bayt

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

Çevrimiçi deneyin!

Açıklama:

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 bayt

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

Bağlıdır f atanan değer "dönen" n tanımsız davranıştır, ancak hiçbir optimizasyonlar etkin olduğunda gcc ile tutarlı çalışır işlevi, içinde.

Çevrimiçi deneyin!


6

JavaScript (ES8), 63 62 60 bayt

Takip eden bir yeni hat içerir. *2-1ile ikame edilebilir -.5, bir 1 bayt tasarrufu için ancak önceki hattı da aynı uzunlukta olan her bir hattın şansı büyük ölçüde artacaktır. "Rastgele" meydan okuma tanımlanmamış gibi Elbette, RNG olabilir değiştirilir new Date%3-1toplam bayt sayısı için 55 .

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

Adı yakalayabilmemden önce yorumlarını silen biri sayesinde bir bayt kaydedildi. Aslında bu şekilde denedim repeatve padStartdenemeyi düşünmedim padEnd- nedenini bilmiyorum!


Bonus

Aynı sayıda bayt için, başlangıçtaki boşlukların & yinelemelerin girişini alan bir sürüm.

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):``bir bayt daha kısa. (Not: SO yorumlarda satır sonlarına izin vermediğinden, aslında satır sonu kullanmak yerine \ n
yazmam gerekti

Teşekkürler, @Stefnotch. Ne yazık ki, başlangıç ​​değeri olsa bile y=31, ilk satırın çok kısa olması ihtimali vardır. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…
Shaggy

1
Yanılıyorsam düzelt beni, ancak şu andaki çözümünüz de bu sorundan muzdarip değil mi?
Stefnotch

1
İlk satır , mücadeleye göre tam olarak 30 boşluk bırakmalı .
Nit

1
@Nit, OP ilk satırı onaylamıştır olabilir bunu tekrarlanan taleplerine rağmen, 29-31 boşluk içermemelidir ama zorluk içine düzenlemek için henüz gerçeğini vardır.
Shaggy

6

Java 8, 89 87 bayt

İlk golf, daha iyi olacağından eminim ..

Düzenleme: Steadybox sayesinde ilk satır düzeltildi .

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

Çevrimiçi deneyin!

 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'ye Hoşgeldiniz! :)
Shaggy


6

Python 2 , 83 65 64 bayt

Basit yaklaşım:

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

Çevrimiçi deneyin!

Bazı baytları kaydettiğiniz için @Rod'a teşekkürler! -1ov için @ovs'a teşekkürler!

Düzenleme: değişken adı ve çıkış dizgisini 's' harfine çevirdi

88 byte için daha fazla yılana benzer çıktı:

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

1
Bunu severim. Gerçekten temiz bir çözüm.
linemade


5

Kömür , 14 bayt

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

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

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

İlk girinti gereksinimi olmasaydı sadece 10 bayt olurdu.


@KevinCruijssen Hmm, bu garip, çünkü Kömür varsayılan olarak kırpmayı seviyor.
Neil

5

PHP, 61 bayt

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

Çevrimiçi deneyin!


8
$i<30;$i++$i++<30;2 bayt kaydetmek olabilir .
Kevin Cruijssen

2
55 bayt: for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');( \n1 karakter sayılır ve gerçek bir satırsonu ile değiştirilmelidir)
Ismael Miguel

2
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 bayt

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

Açıklama:

Çevrimiçi deneyin.

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

Eski 119 baytlık cevap:

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

Açıklama:

Çevrimiçi deneyin.

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 bayt

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

2 ekstra bayt için Zahiro Mor'a teşekkürler !

Çevrimiçi deneyin!


'Dan' sample(3,29,T)-2ya geçmek, runif(29,-1,1)bayt sayısını 2 azaltacaktır, ancak hamleler artık eşit derecede muhtemel değildir. Siz de paste("%"bunun yerine geçebilir misiniz paste0("% "yoksa burada bir şeyleri özlüyor muyum?
Rift

Yapıştırıyor olsaydım @Rift sonuç dizeleri % 30 syerine formda olurdu % 30s. Söylediğin gibi runifolasılıkları bozardı.
plannapus

Yerel olarak sprintf("%30s"), sprintf("% 30s")ve sprintf("% 30 s")benim için aynı sonuçları döndürür. Ancak TIO'da sadece ilk ikisi aynı sonuçlara sahip, bu yüzden paste0("%"bir bayt kurtarmalı. Her hareketin aynı olasılıkta olması şartı yoktur.
Rift

4

Japt , 13 bayt

Satır dizisini döndürür.

30ÆQù1nH±1n3ö

Dene


açıklama

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

2 bayt daha az , işte başlangıç ​​alanı ve yineleme sayısını girdi olarak alan bir sürüm.

U°ÆQùU±1n3ö

Dene


Alternatif RNG'ler

Son 4 bayt aşağıdakilerden biriyle değiştirilebilir:

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
Vay, şu anda kazandığımıza inanamıyorum! Sana bir bayt kurtarabilir miyiz bu (mobil üzerine yüzden gerçekten doğrulayamadığı)
ETHproductions

@ETHproductions: Ha! Başladığım şeyin aynısı. Eğer sorun olsa da, bir -1birinci tekrar RNG tarafından döndürülen, biz toplam hat uzunluğu ile bitireceğiz 29olması gerektiği zaman 30, 31ya da 32.
Shaggy

Hmm, sürümünüzün bundan nasıl geçtiği konusunda kafam karıştı ... Ayrıca, OP'nin ilk yinelemede fazladan bir boşluk kaldırılması veya eklenmesi durumunda umursamadıklarını açıklığa kavuşturduğunu düşünüyorum.
ETHProductions

Aslında “ne zaman 30, 31 veya 32 olmalı” diye kafam karıştı. Bu nerede gerekli?
ETHProductions

@ETHproductions: Biz başlamak 30ve daha sonra ekleyebilir -1, 0veya 1bize vererek 29, 30 ya da 31- ekleyebilir "ve bu bize toplam uzunluğu verir 30, 31ya da 32ilk çizgi için.
Shaggy

4

Swift , 101 bayt

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

açıklama

Tam bir program. Bu oldukça garip bir numara kullanır: modülün arc4random()bir üyesidir Darwin, ancak UIKitbu fonksiyon yüklü de gelir, bu yüzden bir bayt kazandırır :) Ayrıca, hızlı bir şekilde ipleri rastgele tekrarlamak için Swift golf ipuçlarımdan birini kullanır .

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 ... gKod bloğunu 30 yerine 29 kez şimdi çalıştırmıyor mu (0 - 29 arasında döngü (özel))?
Kevin Cruijssen

@KevinCruijssen Resim, 0...gtüm tam sayıları üretir [0; g] . Kötü, açıklamayı düzeltti. 0..<gtam sayıları [0; g) : P
Bay Xcoder

Ah, [0; g)sen [0; g]beni gerçekten kafam karıştıracak şekilde düzenledin . :) Hmm, ama bu durumda başlamak g=30ve döngü mümkün değil [1; g]mi?
Kevin Cruijssen

@KevinCruijssen Eğer seçersem ikisini de döngüde kullanmak ya [0; g)da [1; g]kesinlikle yapmak mümkün olacak g=30, ancak daha sonra print(...,0)değiştirilmem gerekiyor print(...+"0"), çünkü aksi takdirde 0'dan önce ek (yabancı) bir boşluk hazırlanacaktı. Her iki durumda da, bayt sayısı aynı kalır.
Bay Xcoder

4

Perl, 36 bayt

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

Çok iyi. Bunun gibi bir dizi uzunluğu ayarlayabildiğini ve sayçıkartmak için kullanabileceğini her zaman unuturum . $#aBir referans olmadığı için artırıldığında çalıştırma sayısını değiştirmeyeceğini düşünmekte haklı mıyım ?
Dom Hastings

@DomHastings: mapYığındaki elemanları ilk önce ortaya koyan gibi kullandığım için. foryok ve öngörülemeyen bir döngü uzunluğu olurdu
Ton Hospel

Bunu bilmek gerçekten yararlı. Teşekkürler!
Dom Hastings

Güzel golf. Başka bir baytı tıraş etmeye çalıştım perl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30', ancak bu bazen (her seferinde değil) segmentasyon hatasıyla sonuçlandı. Per v5.22.1 ve v5.16.3'te bir hata olabilir mi?
Kjetil S.

@Kjetil Evet, muhtemelen hiç çözülmeyeceği bilinen bir problemdir. Bir dizi döngüleme yaparken girişler fazladan bir geri sayım almaz, bu yüzden eğer onları silerseniz, döngü onlara ulaştığında serbest bırakılır ve boş hafızaya vurursunuz. Neyse ki bunu gerçek programlarda asla yapmazsınız.
Ton Hospel,

4

R ', 54 53 bayt

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

Yukarıdakiyle benzer bir fikir , ancak kısaltılmış sprintfkod ve daha kısa bir karakter dizgisi değişmezi ile. \n(İki bayt) yerine değişmez satır sonu (bir bayt) kullanıyorum.

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. Ben yıllardır kullanıyorum sprintfve bir şekilde her zaman bu kısmı özledim ... Hatırlatma için teşekkürler!
plannapus

1
İkinci satır bazen bir yerine iki boşlukla girintilidir.
Scott Milner

@ScottMilner Düzeltmek için biraz zaman bulundu.
Konrad Rudolph

4

Ruby , 45 39 bayt

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

Çevrimiçi deneyin!

Değiştirme xdöngü sırasında döngü sayacını etkilemez. S'yi özellikle yılan gibi bir çıkış karakteri olarak seçtim.

-6 bayt: rand(3)-1yerine kullanın [-1,0,1].sample. Teşekkürler Eric Duminil !


Bunun x.mapyerine iki bayt kaydedebilirsiniz x.times(dönüş değerini kullanmadığınızdan eşdeğerdir)
RJHunter

1
Oops, haklısın, beni görmezden gel!
RJHunter

1
Tamam daha iyi bir tane var: rand -1..1beş byte daha kısa[-1,0,1].sample
RJHunter

1
@RJHunter: Veya rand(3)-16 bayt daha az.
Eric Duminil

1
(x=30).times{puts' '*x+?+;x+=rand(3)-1}(aynı boyutta) mücadelenin istediği gibi yılanın başı için tam olarak 30 boşluk
basacak

4

SenseTalk , 237 198 Bayt

Bu, on yıl önce tanıdığım ve sevdiğim bir dil. Otomatik test aracı olan Eggplant Functional'ı çalıştıran kodlama dilidir . Uzun süredir şirkete katılmadan önce aracın hevesli bir kullanıcısıydım. Bu en yetenekli dil değil, ama yazmayı çok zevkli buluyorum. Dilin ayrıntılı ve İngilizce benzeri olması gerektiği için golf oynamak oldukça zordur. 237 bayt.

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 / Açıklama

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

Düzenle: @mustachemoses sayesinde 36 bayt kaydedildi


1
Boşluk gerekli mi?
BıyıkMoses

Buna çok saygı duyuyorum. Özellikle, tamamen okunamayan ancak kısa olduğu anlaşılan “golf dilleri” nin arka planına karşı. Sadece kendi dilinizde neler yapabileceğinizi gösteren bir örneğe sahip olmak güzel.
AJFaraday

1
İyi çağrı @ MustacheMoses! Güncellenmiş.
Allen Fisher

198 byte sayıyorum (iyi, usercript çoktur)
HyperNeutrino

@AllenFisher Patlıcan demosu kullanmadan kullanabileceğim bu dil için bağımsız bir tercüman veya derleyiciniz var mı?
MoustacheMeses


3

PowerShell , 42 bayt

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

Çevrimiçi deneyin!

Dan Döngüler 1için $l=30. Her yineleme biz koymak $lboşluk artı bir xdize olarak boru hattı üzerine, sonra da +=ya -1, 0, 1dayanan Get-Randomiçine $lsonraki döngü için. Bu dizgiler boru hattından toplanır ve üstü kapalı bir Write-Outputşekilde bize ücretsiz yeni satır ayrılmış bir liste verir.



3

Jöle , 18 bayt

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

Çevrimiçi deneyin!

Seçilen karakter 0'dır . Bir karakter listesi Ydöndürülmesine izin verilirse, bırakılabilir ve gönderim 17 baytlık bir niladik zincire dönüştürülebilir . Alternatif .

Nasıl çalışır

30Ç'С⁶ẋ; 0Y € | Niladik ana bağlantı.
30 | 30'dan başlayarak ...
  Ç'С | ... Yardımcı bağlantıyı 29 kez tekrarlayın ve sonuçları bir listede toplayın.
             | (Bu liste ilk 30’u içerir, bu yüzden aslında 30 rakam vardır).
      ⁶ẋ | Listedeki her öğe için o kadar çok boşluk bırakın.
        ; 0 € | Her birine 0 ekleyin.
           Y | Ve yeni hatlara katılın.
------------- +
1ŒRX + | Monadic yardımcı bağlantı. Alternatif olarak, Ç yerine Œ1RX + use kullanabilirsiniz.
1 | Kelimenin tam anlamıyla.
 |R | Simetrik aralık –1 ila 1 arasındadır.
   X + | Orada rastgele bir sayı seçin ve argümana ekleyin.

Jöle , 16 bayt

Benimki, Erik'in ve Jonathan'ın çözümlerini birleştirerek, bunu 16 bayta kadar indirebiliriz. Seçilen karakter 1 .

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

Çevrimiçi deneyin!

Headsal up için Jonathan Allan'a teşekkür ederiz (açık Ṭ€o⁶).


Sen kullanabilirsiniz Ṭ€o⁶yerine ⁶ẋ;€0benim 18 Byter yaptığı gibi ve 17. bölümlerine aşağı olsun
Jonathan Allan

@JonathanAllan Teşekkürler! Üç Jelly cevabını birleştirdiğimde, aslında 16 byte'a sahip oldum. Ancak bunu ikincil bir çözüm olarak gönderdim, çünkü bu tamamen benim değil. :-)
Bay Xcoder

3

Octave , 53 51 50 49 bayt

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

Çevrimiçi deneyin!

Artık herhangi bir döngü yapmadan 1 bayt kurtarıldı. Octave'ın sahip printfolduğu gibi bir başkasını kurtardı fprintf.

Bu yeni kod, aralıkta 30 rasgele tam sayı dizisi oluşturur -1:1. Sonra kümülatif olarak diziyi toplar ve istenen diziyi veren 30 ekler.

Sonuç, fprintf"Belirtilen genişliğe kadar doldurulmuş bir ondalık sayı, ardından yeni bir satır izleyen bir biçim kullanılarak basılır . Genişlik ilk değer girişi olur ve ondalık sayı ikinci değer girişi olur. Sayı girilen değerlerden daha fazlası, Octave istenen çıktıyı elde etmek için baskıyı otomatik olarak tekrarlamaya devam edecektir.

Döngüyü elde etmek için, sıra dizisi arasında sadece sıfırlara ihtiyaç duyarız, böylece fprintfişlev dizideki her bir değeri genişlik olarak ve her sıfırın basılacak sayı olarak kullanmasını sağlar.

Şunun gibi bir çıktı yazdırır:

                              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

Yukarıdaki kod her zaman ilk satırda tam olarak 30 boşluk basmaz. 29, 30 veya 31 olacaktır. Bunu düzeltmek için, bu 53 bayt sürümü kullanacaksınız:

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

İki byte tasarruf edebilirsiniz:x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Kevin Cruijssen

@KevinCruijssen Bunun hakkında düşündüm, ama aynı şekilde çalışmıyor. İlk satırda 29, 30 veya 31 boşlukla başlar.
Tom Carpenter

1
@KevinCruijssen, aslında boşver. OP’lerin yorumlarını söylediğini gördüm.
Tom Carpenter

Evet. Bir kuralın yorumunda biraz can sıkıcı bir durum var (özellikle mevcut meydan okuma tanımına aykırı olduğu için ..). OP’dan 29, 30 ya da 31’de başlayabileceğinizi düşünmek için mücadeleyi düzenlemesini istedim.
Kevin Cruijssen,

3

Lua, 81 75 bayt

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

Gelen to_exp bir bayt tasarruf sadece döngü girmeden önce bir kez değerlendirilir.for i=1,n ... n

-6 @ user202729 sayesinde

Çevrimiçi deneyin!


1
PPCG'ye Hoşgeldiniz! Kişilerinizin programınızı daha kolay test edebilmesi için gönderinize bir TIO bağlantısı eklemek isteyebilirsiniz.
user202729

Cevabınızı 76 bayta indirebilirsiniz . Sayfanın yanı sıra Lua'da golf ile ilgili ipuçları faydalı olabilir.
user202729


3

Python 3.6 , 84 73 69 bayt

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

-11 baytlık @WheatWizard için teşekkürler. -4 baytlık @JoKing'e teşekkürler.


Son ikullanmadığınızdan for i in[1]*30baytları kaydetmek için kullanabilirsiniz .
Buğday Sihirbazı

Ayrıca daha sonra from random import*ihtiyacınız olmayacak şekilde yapabilirsiniz random.. Ve sizden sonra yeni satır alanını kaldırabilirsiniz :.
Buğday Sihirbazı

Değiştirmek Ve eğer 30üzere değiştirilebilir . 29"+".rjust(x)" "*x+"+"
Buğday Sihirbazı

Aslında son yorumuma göre 29 değil 30 boşluk olmalı. Şu anki cevabınız sadece 29 boşluk bırakıyor ve bu nedenle belirtimi yerine getirmiyor. Bu 30 ila 31 arasında değişerek düzeltilebilir.
Buğday Sihirbazı

1
@WheatWizard Teşekkürler! Değişikliklerinizi ekledim ve size de kredi verdim. Değiştim [1]*30için [1]*xonu bir byte daha kısa olduğu için.
MoustacheMeses

3

ES5, 97 95 81 bayt

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

ES5, 112İşlev formatı gerekiyorsa 98 bayt :

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'ye Hoşgeldiniz! Değişkenlerinizin bir işlev içinde bildirilmesi gerektiğini düşünüyorum -_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
Oliver

Bu baytları öldürecek, size söyleyeceğim. ES5, varsayılan olarak ok işlevlerini içermez. Güncelleyeceğim
Kyle Fairns

@Oliver, işlev biçimi eklendi :)
Kyle Fairns

Güzel! Piyasaya sürüldüğünde zaman emin değilim, ama yerini alabilir mi join(" ")ilejoin` `
Oliver

@Oliver ES5'te bunu yapabileceğinden emin değilim, değil mi? Bunun ES6'da eklenmiş bir şablon olduğunu sanıyordum?
Kyle Fairns

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.