コードゴルフ:あなた自身のペットASCIIヘビ


34

それで、私は自分でコンソールに蛇を印刷するワンライナーを書きました。ちょっと面白くて、どうすればコードを圧縮できるのだろうと思いました...

以下に(短い)出力例を示します。

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

仕様は次のとおりです。

  • 各行では、単一の非空白文字(好きな方)がコンソールに出力されます。最初は、その左側に29〜31個のスペースが埋め込まれます。
  • 各反復で、これら3つのアクション間でランダムな決定が行われます
    • パディングの量は1ずつ減少します
    • パディングの量は同じままです
    • パディングの量は1ずつ増加します

これを30回実行して、30セグメント長の蛇をコンソールに出力します。

バイト単位の最短回答が優先されます。


行の配列を返すことはできますか?先頭/末尾のスペースまたは改行は許可されていますか?
シャギー

1
各行の末尾のスペースが許可されていると思いますか?
ルイスメンドー

1
「ランダム」とはどういう意味ですか?一様にランダム?3つの結果のそれぞれに肯定的なサポートがある分布からランダムですか?どんな分布からでもランダムですか?プログラムの実行ごとに結果が異なる必要がありますか?
ナサニエル

1
デフォルトでは、randomは一様ではないことに注意してください。たとえば、私の頭脳の答えの 2番目の部分は、ほとんどの場合直線を生成しますが、(現時点では)完全に有効です。
ジョーキング

1
現在、不明確な2つのポイントがあります。1)ランダムは一様にランダムを意味しますか?(この回答に影響します)および2)出力は毎回異なる必要がありますか?(つまり、乱数ジェネレーターの
シードを解除

回答:


14

05AB1E15 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バイト、オンライン試してください!...待って、いや、ほとんど。
魔法のタコ

14

ランダムBrainfuck123の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バイト

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

オンラインでお試しください!

これは、パディングをそのままにする方向に大きく偏っていますが、パディングの増減はどちらも等しく可能です。それぞれに、発生する可能性は256分の1未満です。


非常に素晴らしい!私は?コマンドを知らなかった。+1
グラントミラー

@GrantMiller ?は、ランダムなBrainfuckでのみ利用でき、クラシックなBrainfuckでは利用できません
ジョーキング

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()%3printf関数に移動してバイトを保存します。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* +

作業文字列を最初の行、つまり30個のスペースとaに初期化します+

-29{¶<`^
 

2行目にスペースがあります。-29{プログラムの残りの部分をループでラップし、29回実行します。¶<各ループの繰り返しの先頭に作業文字列を末尾の改行とともに出力します。アトミックステージ自体は、文字列の先頭にスペースを挿入します(基本的な考え方は、スペースを1つ挿入し、0〜2個のスペースをランダムに削除することです。

S,2@1`

これにより、空の正規表現が入力と照合され、文字間のすべての位置(および文字列の開始と終了)が得られます。次に,2、最初の3つの一致、つまりゼロ、1、2つのスペースの後の一致のみを保持します。@これら3つの一致からランダムに1つを選択します。次に、分割ステージ(S)がその一致の周りで入力を分割します。そして、1分割の2番目の部分のみを保持するように指示します。つまり、ランダムマッチまですべてを破棄します。

最終ループ反復の結果である30行目は、プログラムの最後に暗黙的に出力されます。


0〜2個のスペースを削除するよりも短いものを知っていますか?スペースをシャッフルします!。ちなみに、新しいRetinaは素晴らしいです:D
レオ

7

VBA、60 59 49バイト

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

イミディエイトウィンドウに貼り付けて、Enterキーを押します。(明示的な宣言がオフになっていることを確認してください!)

行にとどまるよりも移動する可能性がはるかに高い(つまり、アクションの重みが等しくない)が、それは指定された要件ではありませんでした(幸いなことに!)

{編集} との間のスペースを削除して1バイトを保存=1しましたTo

{ EDIT2 } Remoelのコメントのおかげで10バイト節約

古いバージョン:

'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へようこそ!
マーティンエンダー

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

@raznagulのおかげで-1バイト。@auhmaanの
おかげで-1バイト。

説明:

オンラインでお試しください。

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)呼び出しの間にを追加して、異なる結果を確実に取得する必要があります。スリープ時間が10ミリ秒未満の場合でも、同じ結果が得られることがあります。したがって、.net-FrameworkとTIO(.net-Core)は異なるPRNGを持つか、少なくとも異なるシードを使用します。TIOのプログラムをC#-monoに切り替えると、.net-Frameworkでローカルに取得するのと同じ動作になります。
raznagul

うーん@raznagulとその出力C#(モノC#コンパイラは)実際に奇妙である..
ケビン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));}

関数のnに割り当てられた値を「返す」fに依存します。これは未定義の動作ですが、最適化が有効になっていない場合はgccと一貫して動作します。

オンラインでお試しください!


6

JavaScript(ES8)、63 62 60バイト

末尾の改行が含まれます。1バイトの節約のため*2-1に置き換えることができます-.5が、各行が前の行と同じ長さである可能性は大幅に増加します。もちろん、チャレンジで「ランダム」が定義されていないため、合計バイト数が55のRNG に置き換えることできます。new Date%3-1

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):``1バイト短くなります。(注:SOはコメント内で改行を許可しないため、実際に改行を使用する代わりに\ nと入力する必要がありました。)
Stefnotch

ありがとう、@ Stefnotch。残念ながら、初期値がy=31であっても、最初の行が短すぎる可能性があります。tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/...
シャギー

1
私が間違っている場合は修正しますが、現在のソリューションもその問題に悩まされていませんか?
-Stefnotch

1
課題に応じて、最初の行には正確に 30個のスペースが必要です。
NIT

1
@ Nit、OPは、最初の行に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へようこそ!:)
シャギー


6

Python 2 83の 65、64バイト

簡単なアプローチ:

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

オンラインでお試しください!

いくつかのバイトを保存してくれた@Rodに感謝します!-1バイトの@ovsに感謝します!

編集:変数名と出力文字列を文字「s」に変更

88バイトのヘビのような出力:

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

1
私はこれが好き。本当にすてきなソリューション。
ラインメイド


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うーん、それは厄介です。なぜなら、炭はデフォルトでトリムするのが好きだからです。
ニール

5

PHP、61バイト

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

オンラインでお試しください!


8
$i<30;$i++$i++<30;2バイトを節約することができます。
ケビンクルーイッセン

2
55バイト:for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');\n1文字としてカウントされ、実際の改行で置き換える必要があります)
イスマエルミゲル

2
警告なしの長さ55バイトの代替:for($i=$p=30;$i--;$p+=rand(-1,1))printf("%{$p}s\n",'+');
Ismael Miguel

5

ジャワ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

R72 69 67バイト

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

モーザロに感謝に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では最初の2つだけが同じ結果になる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から返された場合、最終的な行の長さ293031またはになるはず32です。
シャギー

うーん、あなたのバージョンがどうやってそれを回避するのか混乱しています...また、OPはコメントで、最初の繰り返しで余分なスペースが削除されたり追加されても気にしないことを明確にしたと思います。
ETHproductions

実際、「30、31、または32の場合」に混乱しています。どこでそれが必要ですか?
ETHproductions

@ETHproductions:私たちはで始まり30、その後、追加-10または1私達を与える2930 または 31-を追加"し、それが私たちの全体の長さを与える3031または32最初の行のために。
シャギー

4

Swift、101バイト

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

説明

完全なプログラム。これはかなり奇妙なトリックを使用しています:モジュールのarc4random()メンバーですが、この関数がインストールされているため、バイトを節約できます:)また、Swiftゴルフのヒントの 1つを使用して、任意の回数文字列を繰り返します。DarwinUIKit

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コードブロックを30回ではなく29回実行しませんか(0から29までのループ(排他的))?
ケビンCruijssen

@KevinCruijssenいいえ、[0;の0...gすべての整数を生成します。g]。私の悪い、説明を修正しました。[00..<gの整数を生成します。g):P
Mr. Xcoder

ああ、[0; g)あなたは[0; g]私を混乱させるために編集しました。:)うーん、しかし、その場合g=30、ループを開始することはできません[1; g]か?
ケビンクルーッセン

@KevinCruijssenどちら[0; g)[1; g]をループするか、g=30代わりに選択した場合は間違いなく可能ですが、それ以外の場合は追加の(余分な)スペースが0の前に追加されるため、にprint(...,0)変更する必要がありprint(...+"0")ます。いずれにしても、バイト数は同じままです。
ミスターXcoder

4

Perl、36バイト

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

とても良い。配列の長さをそのように設定しsay、減算に使用できることを常に忘れています。それは参照ではないので、$#aインクリメントされたときに実行回数を変更しないと思うのは正しいですか?
ドムヘイスティングス

@DomHastings:mapスタック上の要素を最初にレイアウトするように使用するためです。for予測不可能なループ長はありませんでした
Ton Hospel

知っておくと本当に便利です。ありがとう!
ドムヘイスティングス

素敵なゴルフ。で別のバイトを削り取ろうとしましたperl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30'が、時々(毎回ではなく)セグメンテーションエラーが発生しました。perl v5.22.1およびv5.16.3のバグでしょうか?
Kjetil S.

@Kjetilはい、これはよく知られている問題で、おそらく修正されることはありません。配列をループするとき、エントリは余分なrefcountを取得しません。したがって、それらを削除すると、ループに到達するまでに解放され、解放されたメモリにヒットします。幸いなことに、実際のプログラムでこれを行うことはありません。
トンホスペル

4

R、 54 53バイト

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

上記と同様のアイデアですが、sprintfコードが短く、文字列リテラルが短くなっています。\n(2バイト)の代わりに、リテラルの改行(1バイト)を使用しています。

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何年も使用しており、どういうわけか常にその部分を見逃していた...リマインダーをありがとう!
プランナパス

1
2行目は、1つではなく2つのスペースでインデントされる場合があります。
スコットミルナー

@ScottMilnerはそれを修正する時間を見つけました。
コンラッドルドルフ

4

ルビー45 39バイト

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

オンラインでお試しください!

xループ中に変更しても、ループカウンターには影響しません。私は特にヘビのような出力キャラクターとしてSを選びました。

-6バイト:のrand(3)-1代わりに使用します[-1,0,1].sampleありがとう、エリック・ダミニル


x.map代わりにx.times(戻り値を使用しないため同等)2バイトを保存できます
-RJHunter

1
おっと、あなたは正しい、私を無視してください!
-RJHunter

1
良いものがあります:rand -1..1[-1,0,1].sample
RJHunter

1
@RJHunter:またはrand(3)-16バイト以下。
エリックドゥミニル

1
(x=30).times{puts' '*x+?+;x+=rand(3)-1}挑戦によって要求されるように(同じサイズ)蛇の頭のために正確に30のスペースを出力します
Asone Tuhid

4

SenseTalk237 198バイト

これは、約10年前に私が知って愛するようになった言語です。自動テストツールEggplant Functionalを駆動するのはスクリプト言語です。しばらく入社する前、私は長年ツールの熱心なユーザーでした。それは最もゴルフに対応した言語ではありませんが、書くのはとても楽しいと思います。言語は冗長で英語に似ていることを意図しているので、実際にゴルフをするのは非常に難しいです... 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

非ゴルフ/説明

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

編集:@mustachemosesのおかげで36バイトを保存しました


1
空白は必要ですか?
口ひげ

私はこれをとても尊敬しています。特に、完全に読めないと思われる「ゴルフ言語」の背景に対して、短い。あなたの言語で何ができるかを示しているだけの例があると便利です。
-AJFaraday

1
@MustacheMosesにお電話ください!更新しました。
アレンフィッシャー

私は198バイトをカウントします(ユーザースクリプトはその数をカウントします)
-HyperNeutrino

@AllenFisher Eggplantデモを取得せずに使用できる、この言語用のスタンドアロンインタープリターまたはコンパイラはありますか?
口ひげ


3

PowerShell、42バイト

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

オンラインでお試しください!

から1にループし$l=30ます。各反復では、$lスペースとxパイプラインを文字列としてパイプライン上に配置し、次に次のループのイント+=-1, 0, 1基づいています。これらの文字列はパイプラインから収集され、暗黙的に改行で区切られたリストが無料で提供されます。Get-Random$lWrite-Output



3

ゼリー、18バイト

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

オンラインでお試しください!

選択された文字は0です。文字のリストのリストを返すことが許可されている場合、そのリストをYドロップして、提出物を17バイトのニラディックチェーンに変えることができます。代替

使い方

30Ç'С⁶ẋ;€0Y | Niladicメインリンク。
30 | 30から始まる...
  Ç'С| ...ヘルパーリンクを29回繰り返し、結果をリストに収集します。
             | (このリストには最初の30個が含まれているため、実際には30個の数字があります)。
      ⁶ẋ| リスト内のアイテムごとに、スペースを何度も繰り返します。
        ;€0 | それぞれに0を追加します。
           Y | そして、改行で参加します。
------------- +
1ŒRX+ | モナドヘルパーリンク。または、Çの代わりにµ1ŒRX + µを使用できます。
1 | 文字通り。
 ŒR| -1〜1の対称範囲。
   X + | その中の乱数を選択し、引数に追加します。

ゼリー、16バイト

私とErikのソリューションとJonathanのソリューションを組み合わせることで、これを16バイトまでゴルフできます。選択された文字は1です。

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

オンラインでお試しください!

ヘッズアップをしてくれたJonathan Allanに感謝します(上Ṭ€o⁶)。


あなたは使用することができますṬ€o⁶の代わりに⁶ẋ;€0私の18 byterが行うようおよび17にダウンを取得
ジョナサン・アラン

@JonathanAllanありがとうございます!3つのJellyの回答を組み合わせると、実際には16バイトになりました。しかし、それが完全に私のものではないので、私はそれを二次解決策として投稿しました。:-)
Mr. Xcoder

3

オクターブ53 51 50 49バイト

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

オンラインでお試しください!

ループを行わないことで1バイトを節約しました。Octave printfと同様に別のものを保存しましたfprintf

この新しいコードは、範囲内に30個のランダムな整数の配列を作成します-1:1。次に、配列を累積的に合計し、30を加算して、目的のシーケンスを提供します。

結果はfprintf、「10進数、指定された幅にパディングされ、その後に改行が続く」という形式で出力されます。幅は最初の値入力、10進数は2番目の値入力になります。入力値の値がこれより多い場合、Octaveは自動的に印刷を繰り返して、目的の出力を取得します。

ループを実現するには、シーケンス配列の間にゼロをインターリーブするだけでよいので、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

:あなたは2バイトで保存することができますx=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
ケビンCruijssen

@KevinCruijssen私はそれについて考えましたが、同じようには機能しません。その結果、29、30、または31個のスペースで始まる最初の行が生成されます。
トムカーペンター

1
@KevinCruijssenは実際、気にしないでください。許可されているとOPのコメントに気付いたところです。
トムカーペンター

うん。ルールがコメントに含まれているのは少し面倒です(特に、現在のチャレンジの説明と矛盾しているためです)。OPでチャレンジを編集して、29、30、または31から開始できることを反映するように依頼しました。コメントで許可されているようです。
ケビンクルーッセン

3

ルア、 81 75バイト

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

to_exp 1バイトを保存し、ループに入る前に一度だけ評価されます。for i=1,n ... n

-6 @ user202729に感謝

オンラインでお試しください!


1
PPCGへようこそ!TIOリンクを投稿に追加して、人々がプログラムをより簡単にテストできるようにすることができます。
user202729

76バイトまで答えをゴルフすることができます。ページ以外にも、Luaでのゴルフのヒントが役立つ場合があります。
user202729


3

パイソン3.684の 73 69バイト

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

-11バイトの@WheatWizardに感謝します。-4バイトの@JoKingに感謝します。


最終的にiは使用しないので、for i in[1]*30代わりに使用してバイトを節約できます。
小麦ウィザード

後でfrom random import*必要ないようにすることもできますrandom.。そして、あなたはあなたの後に改行スペースを削除することができます:
小麦ウィザード

に変更3029た場合は、"+".rjust(x)に置き換えることができます" "*x+"+"
小麦ウィザード

実際、私の最後のコメントに関しては、29ではなく30スペースである必要があります。現在の回答では29スペースしか配置されていないため、仕様を満たしていません。これは、30から31に変更することで修正できます。
小麦ウィザード

1
@WheatWizardありがとう!変更を追加し、同様にクレジットしました。1バイト短くなっ[1]*30[1]*xので変更しました。
口ひげモーゼ

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、 112関数形式が必要な場合は98バイト

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には、デフォルトで矢印関数が含まれていません。更新します
カイルフェアンズ

@Oliver、関数形式の追加:)
カイルフェアンズ

いいね!それが導入されたとき、私はわからないんだけど、私はあなたが交換することができると思うjoin(" ")join` `
オリバー

@Oliver ES5でそれができるかどうかわかりませんが、可能ですか?ES6で追加されたテンプレートリテラルだと思いましたか?
カイルフェアンズ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.