雨を降らせる


31

このチャットミニチャレンジに触発されました。

入力として文字列(ASCII印刷可能文字のみ)が与えられた場合、「雨」の文字を含む文字列を出力します。各文字は、下向きのランダムな行数(0文字列の長さと長さがランダムで、それぞれの確率がゼロではない)で、列ごとに1文字のみである必要があります。可能性のあるすべての出力は、発生する可能性がゼロ以外である必要があります。

それは少し混乱するかもしれないので、ここに例があります(そのCMCから引用):

Hello World

          d
H
       o
  llo

         l
      W
 e
        r

Hが1つ下のスペースdであり、ゼロが下であり、lloすべてが整列することに注意してください。のrで、最も遠いダウンしている9が、離れて上から文字列の長さよりもまだ小さいです。これはほんの一例であり、入力には他にも多くの可能性がありますHello World

他の例は次のとおりです。

test

t
 e
  s
   t


PP&CG

  & G
 P

P  C

  • 入力と出力は 任意の便利な方法で
  • 入力は空でないことが保証されます(つまり、受信することはありません ""入力として)。
  • STDOUTに出力するか、関数の結果として返すことができます。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。
  • 文字が適切に並んでいる限り、任意の量の余分な空白を使用できます(たとえば、長方形として自由に埋めることができます)。
  • 標準抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

2
タイトルを読んだとき、これにはアニメーションが関係すると考えられていました。このアニメーション版はありましたか?
シャギー

@Shaggy見たこともないし、見つけられたわけでもない。
AdmBorkBork

「任意の量の無関係な空白が許容されます」-それには空白の先頭行が含まれますか?
ジョナサンアラン

Matrixコードに基づいたものがありましたが、これら2つのキーワードで見つけられることを幸運に思います!アイデアをサンドボックス化しても構いませんか?
シャギー

回答の実装に必要な最大入力サイズはどれくらいですか?私は多くの人々がバックエンドグラウンドで「疑似ランダム」を使用するランダム関数を使用していることを見ています、そして特定の入力ワードはそれらのジェネレーターで使用されるシードのサイズよりも大きく、それらは失敗しますゼロ以外の確率で発生します。」指定した制約
Ferrybig

回答:


5

R、104バイト

function(s){m=matrix(" ",l<-nchar(s),l)
m[cbind(1:l,sample(l,l,T))]=el(strsplit(s,""))
write(m,1,l,,"")}

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

文字列として入力。stdoutに書き込みます。


scan(,'')たくさんの呼び出しを使用してネストすることでバイトを節約できますが、正直なところ、私は関数アプローチを非常に好んでいます。ただし、いくつかのアイデアが生まれるかもしれません。オンラインでお試しください!
CriminallyVulgar

(-1バイト)のsample(l,,T)代わりに十分だと思いますsample(l,l,T)
ロビンライダー

4

JavaScript(ES6)、72バイト

入力を文字のリストとして受け取ります。文字のマトリックスを返します。

a=>a.map((_,y)=>a.map((c,x)=>Math.random()<.5|!a[y+1]?(a[x]=' ',c):' '))

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


三項式を否定しないことで1バイト節約できると思います。
直交

2
@orthoplexこれは機能しません。なぜなら(0|'A') === (0|undefined)、残りの文字が最後の行に表示されることが保証されなくなるからです。(つまり、基本的に、|!a[y+1]完全に削除されたようなものです。)
Arnauld

GoogleはMath.random()、[0、1)で数値を返すので、そうなることができなかったMath.random()<.5と言いますMath.random()>0
nedla2004

@ nedla2004理論上、はい。実際には、私はそれがPRNGの実装(s)は、おそらく正確に戻ることができない可能性が非常に高いと思う(おろか十分近い0を0 0すべての構成が実際に発生する可能性があるように、)。実装によって言語を定義しているため、個人的にはそれが無効だと思います。
アーナルド

どのプラットフォームでjavascriptを作成しましたか?チャレンジには一意性の要件があり、最大入力を指定しないため、ほとんどのプラットフォームはmath.random()内部状態を持つ実装を使用しているため、一意の出力を生成できないため、これは本当に重要です。
フェリービッグ

4

Pyth-9バイト

行のリストを出力します。

.tm+*;OlQ

 .t                       Transpose, padding with spaces
  m      (Q implicit)     Map over input
   +    (d implicit)      Concatenate to loop var
    *                     String repeat
     ;                    This refers to the var replaced by loop var, which is d=" "
     O                    Random number less than
      lQ                  Length of input

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


4

J30 19バイト

|:@,.]{.~"+_2-#?@##

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


1
0|:]{.~"+_1-#?#以下のための15バイト
ガレノスイワノフ

@GalenIvanovこのアイデアは大好きですが、ダイアッド取引には繰り返しが必要ないため、出力の範囲は可能性の全範囲に及ぶことはありません。たとえば、2つの文字がランダムに同じ高さに落ちてしまうことはありません。
ヨナ

@Conor、0|:]{.~"+_2-#?@##回答の振る舞いを変更せずに17バイトで実行できます。
ジョナ

1
@Jonahはい、そうです。それに気づき、別の17バイトのソリューションがありました。
ガレンイワノフ

4

Japt、8バイト

@Shaggyから-1バイト

y_iUÊö ç

y_iUÊö ç        Full Program. Implicit input U
y_              transpose and map each row in U (Call it X)
  i             Insert at the beginning of X:
       ç        " " repeated ↓ many times
   UÊö          random integer in [0, length of U] 
                implicit transpose back and output

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



笑@Shaggy私は少し前に同じ答えを得ました、私はちょうど説明を加えていました。とにかくありがとうc:
ルイス・フェリペ・デ・イエス・ムニョス

3

APL(Dyalog Unicode)、16 バイトSBCS

匿名の暗黙の接頭辞関数

⍉∘↑⊢↑¨⍨∘-∘?≢⍴1+≢

 ひもの長さ

1+ それに追加されたもの

≢⍴ その「長さ」のコピー

∘? 範囲1のランダムな整数…それら、そして…

∘- 否定してから…

⊢↑¨⍨ 各文字から多くの要素を取り、左側にスペースを埋める

∘↑ 文字列のリストをマトリックスにミックスし、右側にスペースを埋める

 転置

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


2

Japt、8バイト

yÈùUÊö Ä

それを試してみてください

yÈùUÊö Ä     :Implicit input of string U
y            :Transpose
 È           :Pass each column through the following function and transpose back
  ù          :  Left pad with spaces to length
   UÊ        :    Length of U
     ö       :    Random number in the range [0,UÊ)
       Ä     :    Plus 1

2

ゼリー、10バイト

³LŻX⁶x;)z⁶

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

      )    | For each input character
³L         | Length of original input
  Ż        | 0..length
   X       | Random number from that list
    ⁶x     | That number of spaces
       ;   | Concatenate to the character
        z⁶ | Finally transpose with space as filler

スペースの先頭の行を出力できるので、9バイト(8があるかもしれませんが...)
ジョナサンアラン

@JonathanAllanは範囲と同等ではないでしょう0..(length - 1)か?質問は0から文字列の長さの間を指定します。それとも何か不足していますか?
ニックケネディ

私はかなり確信して、私は9を持っていた、と私はうーん...それは私が上に示唆するもの波平と思いますよ空白有数の約3日前に尋ねられたとき-ああ、私は包括らし忘れてしまった
ジョナサン・アラン


2

PHP、88バイト

for($o='';$i<$l=strlen($argn);$o[$i+$l*rand(0,$l)]=$argn[$i++]);echo chunk_split($o,$l);

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

または、PHPの暗号化ランダム整数関数を使用して94バイト

for($o='';$i<$l=strlen($argn);$o[$i+$l*random_int(0,$l)]=$argn[$i++]);echo chunk_split($o,$l);

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

からの入力、STDINへの出力STDOUT。として実行:

$ echo Hello World|php -nF rain.php
   l  W    
  l        

 e      r d

H      o   

         l 


    o 

-1バイト(スペースではなく空の文字列)および+1バイト(ルールの側でエラー)thx to @ ASCII-only!


これが許可されているかどうかは疑問に思います、なぜならあなたは<?phpそれが?>閉じることを含めていないからです。場合にも、それの罰金のように思える$o空の文字列です
ASCIIのみ

@ASCIIのみ、あなたは正しい、空の文字列も動作します(もう少し文句を言います)。終了タグと再開タグの使用に関する決定は定かではありませんが、更新を続けるために更新します。THX!
640KB

このチャレンジのルールは「可能性のあるすべての出力は再びゼロではない確率で発生する必要があります」と言うことに注意してください。これは、PHP rand関数では不可能です。シードランドが使用するため、技術的には、すべての状況であなたの答えがこの条件を満たすことができません
Ferrybig

@Ferrybig従来のPHP / libc randはあまり役に立たないことに同意しますが、PHP(7.1+)のサポート/プロダクションバージョンはすべてmt_rand、乱数生成のためにMersenne Twister RND()を内部的に使用します。これがこの課題に対して十分にランダムではないという懸念はありますか?
640KB

mt_randまた、内部で擬似乱数システムを使用し、制限もあります。PHPは64ビット数でコンパイル(およびシードに使用することであると仮定するとrand、またはmt_randこのフルレンジを受け入れる)が13文字より短い長さの点で最大の単語のためのユニークな出力を生成します。あなたは私に言わせればかなり制限
Ferrybig

1

10 9バイト

↑Eθ◧ι⊕‽Lθ

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:@ASCIIのみのおかげで1バイト保存されました。説明:

  θ         Input string
 E          Map over characters
        θ   Input string
       L    Length
      ‽     Random value
     ⊕      Incremented
    ι       Current character
   ◧        Padded to length
↑           Print rotated

ASCIIのみが指し示すように、同じ効果のために文字を下ではなく上にランダムに移動できます(ただし、上部ではなく下部に余分な空白がある場合があります)。文字の配列を上に印刷することは、通常、文字列を印刷することと同等です。そのため、パディングは各文字をランダムに垂直方向にオフセットします。


代わりに印刷するのがうまくいくのだろうか?
ASCIIのみ

1

05AB1E(レガシー)、9 バイト

εIgÝΩú}ζ»

文字列または文字のリストとして入力します(どちらでも構いません)。

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

はるかに遅い9バイトの代替:

gDÝsãΩúζ»

文字のリストとして入力します。

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

新しいバージョンでは..の€S前に明示的に指定する必要があるため、どちらも05AB1Eのレガシーバージョンを使用しますζ

説明:

ε       # Map each character in the (implicit) input to:
 Ig     #  Take the length of the input
   Ý    #  Create a list in the range [0, input-length]
    Ω   #  Pop and push a random integer from this list
     ú  #  Pad the current character with that many leading spaces
      # After the map: zip/transpose; swapping rows/columns (with space as default filler)
  »     # Then join all strings by newlines (and it output implicitly as result)

g          # Get the length of the (implicit) input-list
 D         # Duplicate this length
  Ý        # Create a list in the range [0, input-length]
   sã      # Take the cartesian product of this list that many times
     Ω     # Pop and push a random list from this list of lists of integers
      ú    # Pad the characters in the (implicit) input-list with that many spaces
       ζ   # Zip/transpose; swapping rows/columns (with space as default filler)
        »  # Then join all strings by newlines (and it output implicitly as result)

の線に沿って考えていたがgD¸s∍ÝδΩ、それはもっと長い...そして、OOO ...これは、新しい05AB1Eでも動作しません;)。
マジックタコop


1

ジュリア、69バイト

f(s)=(n=length(s);z=fill(' ',n,n);for i=1:n z[rand(1:n),i]=s[i]end;z)

これは、or fを受け入れ、a を返す関数を定義しますStringVector{Char}Matrix{Char}

ゴルフをしていない:

function f(s)
    n = length(s)
    z = fill(' ', n, n)  # an n×n matrix of spaces
    for i = 1:n
        # set a random entry in the ith column to the ith character in s
        z[rand(1:n),i] = s[i] 
    end
    z
end

例:

julia> f("test")
4×4 Array{Char,2}:
 't'  ' '  ' '  ' '
 ' '  ' '  ' '  ' '
 ' '  'e'  ' '  't'
 ' '  ' '  's'  ' '

これは確かに優れている可能性があります。私のゴルフのスキルはかなり錆びています。

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



1

PowerShellの108の 102 98バイト

mazzyのおかげで-4バイト

$a=1..($z=($y=$args|% t*y).count)|%{random $z}
1..$z|%{-join($y|%{" $_"[$a[$i++%$z]-eq+$r]});$r++}

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

基本的に1..length文字列を2回繰り返します。1 回は各文字のランダムな行の位置を取得し、2回目はこれらのインデックスを使用して各行を実際に構築します。1回のスイープでそれを行う方法を考え出すことが、大きなバイトの節約になる場所です。



0

SmileBASIC 3、62バイト

LINPUT T$L=LEN(T$)CLS
FOR I=0TO L-1LOCATE,RND(L+1)?T$[I];
NEXT


0

Python-92バイト

import random
lambda s:map(None,*[(random.randrange(len(s))*' '+c).ljust(len(s))for c in s])

次を含める必要がありますimport random
MilkyWay90

@ MilkyWay90 d'oh
マルティセン

1
from random import*代わりに使用して1バイトを保存できます。
直交

map(None,...Python 3では動作しないと思うので、タイトルにPython 2を指定する必要があります。
直交



0

Python 3、208バイト

import random as r;x=input();R=range(len(x));c=[r.choice(R) for i in R];y=[' '*c[i]+x[i]+' '*(len(x)-c[i]) for i in R];R=range(len(y));print('\n'.join([''.join(r) for r in [[y[i][j] for i in R] for j in R]]))

ランダムな選択肢のリストを作成してから、各ランダムな選択肢で指定されたインデックスを除くすべての場所に空白のある列のリストを作成します。列は行に転置され、その間に改行が印刷されます。

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

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