音楽のビートを説明する


24

あなたは知っている-彼らはこのように見える:

ソース

目標は、次のような音楽ビートのイラストを描くことです。

=     =      =
=  =  =      =          =
== = ==   =  ==     = ====
== ====  == ===   = = =======
======== == ====  = ========= =
=================================

ルールは次のとおりです。

  • 図の幅は33シンボルですが、必要に応じて、この幅を超える後続スペースは許可されます。
  • 各列は等号(=)で構成されています。
  • 各列にはランダムな高さがあり(次の列の高さは前の列の高さに決して依存してはいけません)、1から6まで変化します。厳密ではない入力が少なくとも可能であれば問題ありません数学の確率(つまり、一部の入力は他の入力よりもまれにしか表示されない可能性があります)。
  • カラムは底部の上に浮いてはならず、隙間はありません
  • すべての列の最小の高さは1であるため、最後の行にも隙間はありません。常に33の等号で構成されます。
  • 高さ6の列を持たない可能性があるため(結局すべてランダムです):この場合、スペースでできた一番上の行を持つ必要はありません。この性質のあらゆるエッジケースに適用されます。コードが突然1を超える高さの列を提供しなかった場合、一番下の行の上にスペースで作られた追加の行を持つ必要はありません。
  • あなたは何も入力しません

@Lynn Oh、元々は指定していましたが、誤って投稿から削除しました。
ニカエル

11
(Nitpicking)それは、ビートを表すものではなく、特定の瞬間のスペクトログラムのように見えます
ルイスメンドー

2
列をスペースで区切ることはできますか?(つまり、一番下の行は= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
-LegionMammal978

2
出力の上に余分な行を入れても大丈夫ですか?
ジョンドヴォルザーク

1
「次の列の高さは、前の列の高さに決して依存するべきではありません」-ほとんどの言語の組み込み乱数ジェネレータはシードされています。このためMath.random()、線形合同ジェネレーターのパラメーターがわかっている場合、前の呼び出しからのような関数を直接計算できます。つまり、この基準を満たすために、ほとんどの組み込みランダム機能を変更する必要があります。私はこれがより良い表現であることを提案します。
パトリックロバーツ

回答:


12

Pyth、13バイト

そして私はゼリーしのいだ

j_.tm*hO6\=33

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

j_.tm*hO6\=33
    m      33  for 33 times:
       O6          yield a random number in [0,1,2,3,4,5].
      h            add one.
     *   \=        repeat "=" that number of times.
  .t           transpose, filling with whitespace
 _             reverse
j              join by newlines.

なぜこの仕事んここに
非常識な

@Insane PythはTIOではかなり時代遅れです。
デニス

@デニスしかし、私はTIOが大好きです: '(
非常識な

13

Dyalog APL、14 バイト

⊖⍉↑'='⍴¨⍨?33⍴6

説明

33⍴6 6の33回の繰り返し

?33個の6のそれぞれの範囲[1、n ]のランダムな整数

'='⍴¨⍨ これらの各回数繰り返される等号記号

リストのリストを行のテーブルに変換する

行を列に、列を行に転置する

逆さまに

実行例

入力は6つのスペースでインデントされます。

      ⊖⍉↑'='⍴¨⍨?33⍴6
=          ==        =      ==   
= =    =   ==      ====     ==   
= = = ===  ==  === ==== =  ===  =
= = ===== ==== === ==== = ====  =
=== ============== ==== ====== ==
=================================
      ⊖⍉↑'='⍴¨⍨?33⍴6
         =  =  =    =    =       
  =      =  =  ==  == == =  =    
 === == ==  =  === =======  =    
==== == ==  ====== ==========   =
==== ============= ========== = =
=================================
      ⊖⍉↑'='⍴¨⍨?33⍴6
             =    =   =  =       
         =   =    =   = == =     
=      = =   =    ==  = ==== === 
= = =  = =   =    ==  = ==== ====
=====  = == ==  ============ ====
=================================


9

JavaScript(ES6)、116バイト

(a=Array(33).fill``.map(_=>[,,,,,,].fill` `.fill('=',Math.random()*6)))[0].map((x,i)=>a.map(x=>x[i]).join``).join`
`

スニペットプレビュー

以下のアニメーションスニペ​​ットで確認してください。

F = () => (a=Array(33).fill``.map(_=>[,,,,,,].fill` `.fill('=',Math.random()*6)))[0].map((x,i)=>a.map(x=>x[i]).join``).join`
`

var interval;
G = () => output.innerHTML = F().split('\n').map((r, i) => `<span id="row-${6-i}">${r}</span>`).join('\n');
A = () => {
  clearInterval(interval);
  if (auto.checked) {
    speed.disabled = false;
    interval = setInterval(G, speed.value);
  } else {
    speed.disabled = true;
  }
}
S = () => {
  if (stylized.checked) {
    output.classList.add('stylized');
  } else {
    output.classList.remove('stylized');
  }
}

generate.onclick = G;
auto.onchange = speed.onchange = A;
stylized.onchange = S;

G();
A();
S();
#output {
  background: #000;
  color: #9fff8a;
  overflow: hidden;
  padding: 1em;
  line-height: 1;
}

#output.stylized {
  line-height: 0.25;
  font-size: 2em;
  margin: 0.5em 0 0 0;
  padding: 0.5em;
}

.stylized #row-1 { color: #9fff8a; }
.stylized #row-2 { color: #c5ff8a; }
.stylized #row-3 { color: #e0ff8a; }
.stylized #row-4 { color: #ffe88a; }
.stylized #row-5 { color: #ffc28a; }
.stylized #row-6 { color: #ff8a8a; }
<button id="generate">Generate</button>
<label>Auto: <input id="auto" type="checkbox" checked/></label>
<label>Speed: <select id="speed">
  <option value="25">25</option>
  <option value="50">50</option>
  <option value="100" selected>100</option>
  <option value="200">200</option>
  <option value="400">400</option>
  <option value="600">600</option>
  <option value="800">800</option>
  <option value="1000">1000</option>
</select></label>
<label>Stylized: <input id="stylized" type="checkbox" checked/></label>
<pre id="output"></pre>


1
うわー、それは本当にクールです!
ニカエル

8

C、87バイト

f(x,y){for(y=6;y--;){srand(time(0));for(x=33;x--;)putchar("= "[rand()%6<y]);puts("");}}

として呼び出しますf();。この答えはtime(0)、同じ結果(秒単位)を6回連続して呼び出すという事実に依存しています。これは事実上常に真実ですが、おそらく言及する価値があります。


あなたが入れてxyそれらを宣言することを避けるためにint。入力がないため、これは許可されますか?はいの場合、それは素晴らしいアイデアです!
aloisdgは回復モニカ言う

2
コーディングしてみました。f();Thats niceで実行できます!Cがそれをできることを知りませんでした。
aloisdgは、モニカーを復活させる

あなたのコードが本当に好きです。117バイトの結果を得るためにC#に移植しました。文字通りあなたのコードであるため、投稿するかどうかはわかりません。
aloisdgは回復モニカ言う

1
あなたが私を信用している限り、それを自由に投稿してください。:)
リン

8

チェダー、68 65バイト(非競合)

->(1:33).map(->IO.sprintf("%6s","="*Math.rand(1,7))).turn().vfuse

O_Oチェダーは実際にうまくやっています!sprintfturnを使用して作業の大部分を行います。vfuseは、垂直ヒューズです。つまり、配列を垂直に結合します。これは非常にゴルフっぽいですが、かなり速いです。バージョンはプレリリースv 1.0.0-beta.10であり、これはチャレンジの後日です。

説明

->           // Anonymous function
  (1:33)     // Range 1-33 inclusive
  .map(->    // Loop through the above range
    IO.sprintf("%6s",       // `sprintf` from C/C++
      "="*Math.rand(1,7)    // Repeat `=` a random time from [1,7)
    )
  ).turn().vfuse     // Turn it 90deg, and fuse it vertically

いくつかの例を実行します:

ここに画像の説明を入力してください



5

Python 2、95バイト

from random import*
x=map(randrange,[6]*33)
for y in range(6):print''.join('= '[z>y]for z in x)

4

Python 3、115バイト

Pythonにはチャンスさえなかった...

from random import*
for k in zip(*[[' ']*(6-len(j))+j for j in[randint(1,6)*['=']for i in[0]*33]]):print(*k,sep='')

使い方

from random import*    Import everything in the random module
randint(1,6)*['=']     Create a list containing a random number in [1,6] of '='...
...for i in[0]*33      ...33 times...
[...]                  ...and store in a list X
for j in...            For all lists j in X...
[' ']*(6-len(j))+j     ...create a list containing j padded with the correct number of
                       spaces to give a height of 6...
[...]                  ...and store in a list Y

Y now contains a list for each output line, but transposed.

for k in zip(*...):...  For all lists k in the transpose of Y...
print(*k,sep='')        Print all elements in k with no separating space

Ideoneでお試しください



3

SpecaBAS-76バイト

1 FOR x=1 TO 33: r=1+INT(RND*6): FOR y=7-r TO 6: ?AT y,x;"=": NEXT y: NEXT x

関連する画面座標に等号を印刷します。

ここに画像の説明を入力してください

色のスポットとGOTOループで

ここに画像の説明を入力してください



2

C#、200 117バイト

()=>{var s="";int x,y=6;for(;y-->0;){var r=new Random();for(x=33;x-->0;)s+="= "[r.Next(6)<y?1:0];s+='\n';}return s;};

@Lynn アルゴリズムに移動し、83バイトを節約します!

入力なしのC#ラムダ。出力は文字列です。オンラインでお試しください

コード:

()=>{
    var s="";int x,y=6;
    for(;y-->0;){
        var r=new Random();
        for(x=33;x-->0;)
            s+="= "[r.Next(6)<y?1:0];
        s+='\n';
    }return s;
};

2

Haskell、164バイト

Haskellは純粋に機能的な言語であるため、最初から運命づけられていました。とにかくやってみたところ、実際に必要なオーバーヘッドはそれほど大きくないことがわかりました。

import System.Random
import Data.List
f r n|r>n=' '|0<1='='
s=do
g<-newStdGen
mapM_ putStrLn$transpose$map(\n->map(f$mod n 6)[0..5])(take 33(randoms g)::[Int])

使用法:

s

説明:

import System.Random

使用できるようにするnewStdGenにはrandoms

import Data.List

使用できるように transpose

f r n|r>n=' '|0<1='='

最初の引数が2番目の引数よりも大きい場合にスペースを出力し、それ以外の場合にスペースを出力する関数を定義します=map (f m) [0..5]与えられた番号mとリストで呼び出されます[0,1,2,3,4,5]。(下記参照)

s=do
g<-newStdGen

新しい標準乱数ジェネレーターを作成します

(take 33(randoms g)::[Int])

33のランダムな整数を取ります。

map(\n->map(f$mod n 6)[0..5])

計算し、リストにm = n % 6マッピング(f m)します。これらの行は33個のランダムな整数のリストにマッピングされ、テーブルが作成されます。(Haskellのテーブルはリストのリストです)[0,1,2,3,4,5]"======", " =====", ..., " ="

transpose$

テーブルの列と行を切り替えます

mapM_ putStrLn$

テーブルのすべての行を印刷します



1

Mathematica、78バイト

StringRiffle[(PadLeft[Array["="&,#+1],6," "]&/@5~RandomInteger~33),"
",""]&

匿名関数。入力を受け取らず、出力として文字列を返します。Unicode文字はU + F3C7で、を表し\[Transpose]ます。


1

R、102バイト

m=rep(" ",33);for(i in 1:6){n=ifelse(m=="=",m,sample(c(" ","="),33,T,c(6-i,i)));m=n;cat(n,"\n",sep="")}

説明

m=rep(" ",33) 次のループの空のベクトルを初期化します

n=ifelse(m=="=",m,sample(c(" ","="),33,T,c(6-i,i)))=上の行にがある場合は、下のスポットにも=; があることを確認してください。それ以外の場合はランダムに選択します。ランダムな選択は=、a)一番下の行がすべてであり、b)全体にきちんとした形が得られるように重み付けされます。

cat(n,"\n",sep="") その行を最後に改行を付けてコンソールに出力し、要素間にスペースを入れないでください!


1

PHP、95 92 89バイト

<?php for(;++$i<34;)for($j=6,$e=' ';$j--;)$a[$j].=$e=rand(0,$j)?$e:'=';echo join("
",$a);

実際にこれにかなり満足しています。しばらくの間、理論的には任意の入力を生成できるバージョンがありましたが、実際には=の固体ブロックのみを生成しましたが、これは短く、均等に分散されています!
7個の未定義のものを生成します。実行すると必ず通知されますが、それで問題ありません。

編集:よく私はちょうど結合が破裂のエイリアスであることを学んだので、それはいいですね。


1

J、18バイト

|.|:'='#~"0>:?33#6

非常にシンプルなもの。マイルからのバグ修正付き!


これは、範囲[0、6]のランダムな整数を選択しますが、OPは[1、6]を必要としました。>:?33#6範囲[1、6]の整数をランダムに取得できます。また、ランク0のコピーはを使用して短くなり'='#~"0ます。この結果、|.|:'='#~"0>:?33#6残念ながら、増分演算子を含めることで2バイトの節約が緩和されます。
マイル

@milesおっ、ありがとう!とてもかっこいい。
コナーオブライエン

1

Perl、64バイト

@f=$_="="x33;s/=/rand>.4?$&:$"/ge,@f=($_.$/,@f)while@f<6;print@f

使用法

perl -e '@f=$_="="x33;s/=/rand>.3?$&:$"/ge,@f=($_.$/,@f)while@f<6;print@f'
  = =           =  ==      =    =
  = =         ===  ==      =    =
= = =         ===  ==      =    =
= = =   = =   ===  ===   = =    =
= = == =====  === ====   ===  = =
=================================

Perl、68バイト

ANSIエスケープコードに依存してカーソルを移動し、最初に6行をドロップダウンし、次に元の行(すべて=s)を書き込み、行を上に移動し、s/=/rand>.4?$&:$"/ge置換されなくなるまで置換された文字列()を繰り返し印刷する代替バージョン これにより、6行を超える書き込みが行われる可能性がありますが、最終的には空の行に置き換えられます。

注:\x1bsは実際にはASCII Esc文字です。

print"\x1bc\x1b[6B",$_="="x33;print"\x1b[1A\x1b[33D$_"while s/=/rand>.4?$&:$"/ge

1

ルビー、 102 99 84 83バイト

s='
'*203;33.times{|j|a=(' '*rand(6)).ljust 6,'=';6.times{|i|s[i*34+j]=a[i]}};$><<s

改行でいっぱいの文字列から始める、大幅に短縮された新しいアプローチ。

古いバージョン...

s='';204.times do|i|s+=->i{i%34==0?"\n":i>170?'=':s[i-34]=='='?'=':rand(2)==1?'=':' '}[i]end;puts s

...先頭に新しい行を付けて出力しました。@Barbarossaのアプローチと同様のアプローチを使用しますが、単一ループでのRubyでの最初の提出。

このプログラムの作業中にRubyで気に入ったこと:

  • .times ループ
  • rand() かなり短いです
  • 括弧なしの三項演算子の積み重ね

私は好きではなかった(主にゴルフの面で):

  • $グローバル変数には必須.timesループではそれほど必須ではない
  • doおよびendキーワード 単一行のブロックに置き換えることができます
  • 0 偽物ではない

0

JavaScript、179バイト

まだこれを少しゴルフに取り組んでいます。これは簡単だから好きです。

n=>{a=Array(33).fill(0).map(n=>Math.floor(Math.random()*6)+1);r=Array(6).fill("");r.map((e,m)=>{a.map(n=>{if (n<=m+1){r[m]+="="}else r[m]+=" "})});return r.join('\n');}

使用法:

>q=n=>{a=Array(33).fill(0).map(n=>{return Math.floor(Math.random() * 6)+1});
r=Array(6).fill("");r.map((e,m)=>{a.map(n=>{if (n<=m+1){r[m]+="="}else r[m]+=" "})});return r.join('\n');}
>q();
           = =  =   =    = =     
=   =    = = =  =  == =  = =  =  
= = =  = === ====  ====  = = === 
= = =  = === ==========  ======= 
= === ===========================
=================================

あなたは置き換えることができるはず.map(n=>{return Math.floor(Math.random() * 6)+1}).map(n=>Math.floor(Math.random()*6)+1)。ラムダは
素晴らしいです

if (n<=m+1){r[m]+="="}elseかもしれif(n<=m+1)r[m]+="=" else
aloisdg復活モニカ言う

私は自分でPRNGを作成する必要がありましたが、Forthプログラムはそれほど長くありません。:P
mbomb007

0

4番目、190バイト

自分で作成しなければなりませんでした PRNGがありましたここからxor-shiftを取得しました。単語fは、出力を表示するために複数回呼び出す単語です。

variable S utime S !
: L lshift xor ;
: R S @ dup 13 L dup 17 rshift xor dup 5 L dup S ! 6 mod ;
: f
33 0 DO R LOOP
1 -5 DO
33 0 DO
I PICK J + 0< 1+ IF ." =" ELSE SPACE THEN
LOOP CR
LOOP
; f

オンラインで試してください -システム時間は、どのサーバー(または何か)がコードを実行しているかに基づく2つの値のいずれかであることに注意してください。それ以外は、何らかの理由でオンラインIDEで変更されません。したがって、表示される出力は2つだけです。utime整数に変更することにより、手動でシードを設定できます。

非ゴルフ

variable seed                   \ seed with time
utime seed !

: RNG                           \ xor-shift PRNG
seed @
dup 13 lshift xor
dup 17 rshift xor
dup 5 lshift xor
dup seed !
6 mod                           \ between 0 and 6, exclusive
;

: f 33 0 DO RNG LOOP            \ push 33 randoms
    1 -5 DO                     \ for (J = -6; J <  0; J++)
        33 0 DO                 \ for (I =  0; I < 33; I++)
            I PICK J + 0< 1+ IF \ if  (stack[I] < J)
                61 EMIT         \ print "="
            ELSE
                32 EMIT         \ print " "
            THEN
        LOOP
        CR                      \ print "\n"
    LOOP
; f

アンゴルフドオンライン


0

JavaScript、165バイト

// function that fills a column with a specified number of = signs
m=l=>Array(6).fill``.map((e,i)=>i<l?"=":" ");
// fill an array of 33 length with columns of random number of = signs
a=Array(33).fill``.map(e=>m(Math.ceil(Math.random()*6)));
// transponse the rows and columns and print to console
a[0].map((c,i)=>a.map(r=>r[5-i])).map(r=>console.log(r.join``))

改行は不要ですが、何が起こっているかを簡単に確認できます。最適なソリューションではありませんが、少なくとも私には理にかなっています。

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