落下ボールマップの作成


16

前書き

以前にこのゲームを聞いたことがない人のために。できるだけ長く生き残る必要があるボールをプレーしています。これは、左または右に移動して穴に移動することによって行われます。マップは上に移動するため、長く生き残るためには下に移動する必要があります。画像を検索する場合、おそらく私が意味するゲームを知っているでしょう。

タスク

正の整数nを指定するとn層の落下ボールマップが出力されます。レイヤー間には、4つの改行があります。レイヤーの幅は25個の下線文字で構成され、長さ5の穴が1つあります。つまり、合計幅は30になります。これは各レイヤーの後にランダムにシフトされます。有効なレイヤーの例は次のとおりです。

_______________     __________

穴は、レイヤーが円柱のように端にある場合もあります。

  _________________________   

先頭に2つのスペースと末尾に3つのスペースがあることに注意してください。作る単一幅5の穴を。

テストケース

以下のために、N = 4、これは有効な出力です。

_______________     __________





______     ___________________





_______________________     __





  _________________________

注:穴は均一に分布している必要があります。末尾および/または先頭の改行が許可されます。

これはであるため、バイト数が最小の提出が勝ちです!


1
@DonMuesli母、それは誰にでも起こりうる:p
アドナン

回答:


7

Pyth、19バイト

VQ.>+*\_25*d5O30*b4

ここで試してみてください!

説明

VQ。> + * \ _ 25 * d5O30 * b4#Q =入力

VQ#Q回繰り返す
     * \ _ 25#25アンダースコア
          * d5#5スペース
    +#アンダースコアとスペースを連結
  。> O25#この文字列を0〜29回回転
                * b4#区切り改行を印刷する

4

ルビー、74 71 59

基本的に1行であるということは、安定したラムダを使用できることを思い出させてくれたAlex A.に感謝します。

f=->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}}

puts最後に改行を追加します(一方、Rubyは追加printしません)ので、5改行に更新されました。
バリューインク

すべてがループをtimes介して私に3バイトを保存するための機能を呼び起こしforます:D
Value Ink

1
57バイト:->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}} ここで試してください
アレックスA.

関数に名前を付ける必要がないため、提出の一部としてラムダを割り当てる必要はありません。
アレックスA.

1
(->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}})[input]それを呼び出すために割り当てる必要があるか、または単に指定することができます。これはサイト上で非常に一般的です。
アレックスA.

3

ジュリア、72バイト

n->join([join(circshift(["_"^25*" "^5...],rand(1:30)))"\n"^5 for i=1:n])

これは、整数を受け入れて文字列を返す匿名関数です。呼び出すには、変数に割り当てます。

25個のアンダースコアとそれに続く5個のスペースの文字列を作成し、それを文字の配列にスプラットします。ランダムな回数(1〜30回)循環的にシフトし、1つのストリングに戻し、5つの改行を追加します。このプロセスはn回繰り返されます。nは入力です。結果の配列が結合されて返されます。

ここで試してみてください


3

PowerShell 65バイト

0..$args[0]|%{-join("_"*25+" "*5)[($r=Random 25)..($r-29)];,""*5}

nのループを実行します回の繰り返し。乱数を取得し、末尾に5つのスペースがあるアンダースコア文字列を作成します。ランダムな場所から開始するための配列としての文字列へのインデックス。負のインデックスは最後から折り返します。そのバックアップに再度参加し、5つの改行を追加します。

編集:私は-Maximumそれが定位置であるため、私はパラメータが必要だと思った理由がわかりません。TimmyDのおかげで、いくつかのバイトを削り、入力を忘れていたため、65に戻りました。


@TimmyDまだ1.0を持っている人がいたら驚いたでしょう。ダウンロードとしてのみ利用可能で、OSには同梱されていません。2.0を標準と見なすべきです。
マット

@TimmyD PowerShell 1.0が関係する点ではなく、その点に同意します。誰かがそれを使用してこのサイトにいる場合、それは私を驚かせるでしょう。3.0以上の機能を使用した場合は、必ず強調表示します。
マット


2

SpecBAS-93バイト

1 a$="_"*25+" "*5: INPUT n: FOR i=1 TO n: r=1+INT(RND*30): ?a$(r TO)+a$( TO r-1)''''': NEXT i

25個のアンダースコア+ 5個のスペースの文字列を作成し、ランダムな開始点を選択し、その位置で文字列を接合し、文字列の先頭を終了するように固定します。

アポストロフィは改行を強制するため、文字列の最後に1つ、空の行が4つあります。


2

MATL、23バイト

:"95l25X"5Z"h30YrYS10ct

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

説明

:"           % take input n implicitly. Repeat loop n times
  95l25X"    %   row vector with number 95 ('_') repeated 25 times
  5Z"        %   row vector of 5 blank spaces
  h          %   concatenate vertically
  30Yr       %   random number uniformly distributed on [1,2,...,30]
  YS         %   circularly shift
  10c        %   newline character. Includes another newline when printed
  t          %   duplicate
             % implicitly end loop and display stack contents

2

Java、177140バイト

i ++を移動する-1バイト

-2バイトで元の意味のない空白を残す

-char []がまったく必要ないことを認識して、Blueに-34バイト

なぜなら、Javaを知っているからです。

n->{String s="";for(;n-->0;){int r=(int)(Math.random()*30);for(int i=0;i<30;){s+=i>r&i<r+6|r>24&i++<=r%25?" ":"_";}s+="\n\n\n\n";}return s;}

わずかに未使用:

Function<Integer, String> fallingBall = n -> {
    String s = "";
    for (;n-->0;) {
        int r = (int)(Math.random()*30);
        for (int i=0; i<30; i++) {
            s += i>r&i<r+6|r>24&i<=r%25?" ":"_";
        }
        s += "\n\n\n\n";
    }
    return s;
}

JavaにはString 'rotate'がないため、別のアプローチをとる必要がありました。穴の開始インデックスを表すランダムな整数0〜29を生成しました(OBO >はより小さいため>=)。個々のキャラクターは、ロジックによって決定されます

l[index] = (index>random && index<random+6) || (random>24 && index<=random%25) ? ' ' : '_';

これにより、全体の「ラップ」の性質が処理されます。


i ++を最後に使用した場所に置くことで、1バイト節約できます。
ブルー

スマート。ハッキーだがスマート。スニペットの先頭に意味のない空白を残しているのは、まだ賢いです(s = "")。両方とも修正されました。
CAD97

また、char配列を削除し、charリテラルを文字列リテラルに変更し、forループの内側でs + =を使用することで、より多くのデータを保存できます。私はちょうどそれテスト
ブルー

ところで素晴らしい答え
ブルー

それは、それを行う1つの方法に焦点を当てることで得られます。-34(!)バイト。
CAD97

1

Python 3.5-109 113バイト(各結果の間に4つの新しい行を出力するために+4):

def g(a,j='_'*25+' '*5):
 for l in range(a):import random;n=random.randrange(len(j)+1);print(j[-n:]+j[:-n]+'\r'*4)

ゴルフされていないフォーム:

# j is the starting string with the 25 underscores and then 5 spaces at the end
def g(a,j='_'*25+' '*5):
    import random #Import the random module
    for l in range(a): # Do the following as many times as provided by the user
        n=random.randrange(len(j)+1) Get a random number in the range 0-29
        print(j[-n:]+j[:-n]+'\r'*4) #Shift the string characters right "n" times and print out the results with 4 new lines in between

基本的には、25個の下線とそれに続く5個のスペースで構成される文字列「j」が、関数「g」の引数として指定されます。次に、ランダムモジュールがインポートされ、ユーザーが指定した回数だけ範囲内0 => 29で乱数が選択され、文字列「j」がその回数だけ右にシフトされます。結果は、各反復の後に出力され、各結果の間に4つの新しい行が挿入されます。


これも間に改行を印刷しますか?
アドナン

@AandN今ではありません。:)
R. Kap

実際には、4つの改行を印刷する必要があります:p。に変更する'\r'こと'\r'*4でおそらく動作するはずです。また、私はあなたが変えることができると思いますrange(a+1)range(a)
アドナン

@AandN実際には、実際に使用range(a)するa-1と行数が実際に出力されるためrange(a+1)、ユーザーが指定した正確な行数を出力するのに最適な方法です。また、各結果の間に4つの新しい行を出力するようになりました。
R.ガプス

うーん、これは奇妙です。これをテストしたところg(5)、5文字ではなく6文字が表示されるため、変更a+1するaとおそらく修正されるでしょう。
アドナン

1

Python、119 103バイト

import random
s='_'*20+' '*5
def f(n,a=random.randint(0,25)):[print(s[a:]+s[:a]+3*'\n')for _ in' '*n]

ランダムを既定の引数に設定したため、最新の更新は機能しません。そのため、関数は常に同じ行n時間を出力します
-Sp3000
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.