雨滴が私の…グラスに落ちていますか?


23

私は雨が降る英国に住んでいます。たくさん。また、見るためにメガネを着用する必要があるという不幸な必要性があります。つまり、雨が降ったとき(現在のように)、私はメガネをほとんど見ることができません。この挑戦はあなたがすべて同じことを経験できるようにするためです!

仕事

毎秒水滴が追加されたASCIIアートグラスを出力します。

入力

なし

出力

水滴が付いた眼鏡。

眼鏡

 ________________________
|          /__\          |
|         /    \         |
|        /      \        |
\_______/        \_______/

雨滴

雨滴はで示されます.。雨滴がメガネのレンズにランダムに配置されます。雨滴が置かれると、メガネは次のようになります

 ________________________
|          /__\          |
|    .    /    \         |
|        /      \        |
\_______/        \_______/

空白スペース()に.配置されている場合、イメージに配置されます。既に雨滴のある正方形に置かれた場合、滴は卒業します。

ドロップの手順は

  • 滴下なし:
  • 1滴配置: .
  • 配置された2つのドロップ: o
  • 配置された3つのドロップ: O
  • 4個以上のドロップを配置: @

ルール

  • 画像は所定の位置にあるかのように見えるはずです。これは、画面をクリアするか、画面を「クリア」するのに十分な改行を印刷できることを意味します。ステップのリストを返すことはできません。これについては申し訳ありませんが、それを回避できるはずです。
  • 画面を「クリア」するために改行を出力するときは、メガネの間に少なくとも3つの改行が必要です。
  • コードは、メガネが完全に段階的なドロップでいっぱいになるまで、つまり出力が次のようになるまで実行されます。
     ________________________
    | @@@@@@@@@@ / __ \ @@@@@@@@@@ |
    | @@@@@@@@@ / \ @@@@@@@@@ |
    | @@@@@@@@ / \ @@@@@@@@ |
    \ _______ / \ _______ /
  • バイト単位の最短コードが優先されます

メガネが完全に段階的な滴でいっぱいになるまでコードが実行されます」おそらくおおよそのスリープ/待機時間を指定しますか?150または250ミリ秒が好きですか?
ケビンCruijssen

2
メガネが最終出力のように見えるときにコードを停止する必要がありますか、それとも実行し続けることができますが、何にも影響しませんか?
TheLethalCoder

@TheLethalCoder仕様に書かれているように、メガネがいっぱいになるまで想像します:v-
ジェンカー

ドロップレットのランダムな落下は、レンズのビットの一部であっても、レンズ上でランダムに落下する必要が@あります。
ジェンカー

@TheLethalCoderそれはすべてが卒業した後に終了する必要があります
coairheringaahing

回答:


11

JavaScript(ES6)、269 267 265バイト

document.write('<pre id=o>')
a=[...` _8_8_8
| 9 /__\\  9|
| 9/ 4\\ 9|
| 8/ 6\\ 8|
\\_7/ 8\\_7/`.replace(/.\d/g,s=>s[0].repeat(s[1]))]
s=" .oO@@"
g=_=>o.innerHTML=a.join``
f=(i=s.indexOf(a[j=Math.random()*a.length|0])+1)=>i?g(a[j]=s[i]):f()
g()
setInterval(f,1e3)

編集:@Shaggyのおかげで2 4バイトを保存しました。


3
左上隅で何かがうまくいかない
-J42161217

-1バグがあるため(ジェニーのコメントを参照)
破壊可能なレモン

1
@DestructibleLemon申し訳ありませんが、Firefoxのクリップボードの「機能」に噛まれました...今は大丈夫です。
ニール

innerText代わりにtextContentとのsearch代わりに数バイトを保存しますindexOf。さらに、<pre id=oHTMLとして使用document.writeするのではなく、単にHTMLとして使用することにより、さらにいくつかのことができます。
シャギー

1
@Shaggy Great find、ありがとう!
ニール

5

Java 8、449 421バイト

v->{String q="########",g=" ________________________\n|##"+q+"/__\\##"+q+"|\n|#"+q+"/    \\#"+q+"|\n|"+q+"/      \\"+q+"|\n\\_______/        \\_______/\n\n\n";for(int t=0,n,x;g.matches("(?s).*[#\\.oO].*");Thread.sleep(150)){for(;(x=g.charAt(n=(int)(Math.random()*g.length())))!=35&x!=46&x!=111&x!=79;);if(t++>0)g=g.substring(0,n)+(x<36?".":x<47?"o":x<80?"@":"O")+g.substring(n+1);System.out.println(g.replace('#',' '));}}

説明:

ここで試してみてください。Thread.sleep削除されるので、すぐに結果が表示されます。)

v->(){                      // Method without empty unused parameter and no return-type
  String q="########",g=" ________________________\n|##"+q+"/__\\##"+q+"|\n|#"+q+"/    \\#"+q+"|\n|"+q+"/      \\"+q+"|\n\\_______/        \\_______/\n\n\n";
                            //  The glasses (with inner spaces replaced by '#')
  for(int t=0,n,x;          //  Index integers
      g.matches("(?s).*[#\\.oO].*");
                            //   Loop (1) as long as the glasses still contain "#.oO"
      Thread.sleep(150)){   //   And sleep 150ms after each iteration to give the animation
    for(;                   //   Inner loop (2)
         (x=g.charAt(n=(int)(Math.random()*g.length())))!=35&x!=46&x!=111&x!=79;
                            //    To find the next '#', '.', 'o' or 'O' randomly
    );                      //   End of inner loop (2)
    if(t++>0)               //   Flag so it prints the initial glasses without a raindrop
      g=g.substring(0,n)+(x<36?".":x<47?"o":x<80?"@":"O")+g.substring(n+1);
                            //    Add a raindrop on this random position
    System.out.println(g    //   And print the glasses
        .replace('#',' ')); //   After we've replaced '#' with spaces
  }                         //  End of loop (1)
}                           // End of method

出力:

注:gifのドットは少し変ですが、それはScreenToGif.exeの問題です。
ここに画像の説明を入力してください


1
あなたが私を"
驚か

1
これは、@:vにドロップする可能性を考慮していません
ジェンカー

@Jenkar、それはあなたが答えで言ったのは二度目です。意味を説明してください。
コイナーリンガーをケア

@RandomUser基本的に、この回答の現在のコードは、たとえ@でなくても、レンズにランダムに落ちるのではなく、まだ@にならないスポットを探します。要件の「4+」は、これが当てはまらないことを示しているように見えますが、代わりに、@を含むレンズにランダムに当てはまる必要があります。これは正しい解釈ではありませんか?
ジェンカー

@Jenkar ルールや標準の抜け穴に違反することなくそれを実行するだけで、どのように実行してもかまいません。私は質問で「均一なランダム分布を持たなければならない」と言ったことがないので、この答えは問題ありません。
コメアリンガーアーイング

3

F#、非再帰379 414 404バイト

open System
let z=String.replicate
let mutable s,d=z 54" ",new Random()
while Seq.exists((<>)'@')s do printfn" %s\n|%s/__\\%s|\n|%s/    \\%s|\n|%s/%7s%s|\n\\_______/%9s_______/\n\n"(z 24"_")(s.[..9])(s.[10..19])(s.[20..28])(s.[29..37])(s.[38..45])"\\"(s.[46..53])"\\";Threading.Thread.Sleep(1000);d.Next54|>fun i->s<-(s.[i]|>function|' '->"."|'.'->"o"|'o'->"O"|_->"@")|>(fun c->s.Remove(i,1).Insert(i,c))

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

  • @vzwickのおかげで-7バイト
    • String.replicateのエイリアシングによる
    • 毎回参照するのではなく、システムを開くことにより
  • whileループを1行に減らして-3バイト

私はこの挑戦の前提が大好きです:)

耳虫に感謝します。

F#、406の 441 438 437 423バイト

open System
let z=String.replicate
let s,d=z 54" ",new Random()
let rec(!)s=s="";printfn" %s\n|%s/__\\%s|\n|%s/    \\%s|\n|%s/%7s%s|\n\\_______/%9s_______/\n\n"(z 24"_")(s.[..9])(s.[10..19])(s.[20..28])(s.[29..37])(s.[38..45])"\\"(s.[46..53])"\\";Threading.Thread.Sleep(1000);if Seq.exists((<>)'@')s then d.Next 54|>fun i-> !((s.[i]|>function|' '->"."|'.'->"o"|'o'->"O"|_->"@")|>(fun c->s.Remove(i,1).Insert(i,c)))else()
!s

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

  • sを文字列と比較して文字列に制約することにより、-3バイト
  • -1バイト、関数名は「!」になりました 呼び出し時に単一のスペースを節約する
  • @vzwickのおかげで-7バイト
    • String.replicateのエイリアシングによる
    • 毎回参照するのではなく、システムを開くことにより
  • -1バイト、d.Nextの呼び出し時に括弧は不要
  • -6バイト、関数は1行になりました

説明

open System
let z = String.replicate    // define alias
let s, d = z 54 " ", new Random() // s holds a flat representation of the glasses.. glasses
let rec(!) s =
    s=""; // type s to string
    printfn" %s\n|%s/__\\%s|\n|%s/    \\%s|\n|%s/%7s%s|\n\\_______/%9s_______/\n\n"
        (z 24 "_")     // top of the glasses
        (s.[..9])      // slice
        (s.[10..19])   // and
        (s.[20..28])   // dice
        (s.[29..37])   // the
        (s.[38..45])   // glasses
        "\\"           // \ gets prepended with 6 spaces thanks to %7s
        (s.[46..53])
        "\\";          // same deal, just 8 spaces this time
    Threading.Thread.Sleep(1000);
    if Seq.exists((<>)'@') s then // if not everything's totally covered
        d.Next 54                 // get new random int < 54 (string has indices 0-53)
        |> fun i->                // passing is shorter than a let binding, saves two spaces and a new line
            !(                    // call the function again with new drop on glasses
              (s.[i]              // get part of the glasses drop fell on
              |>function
              |' '->"."           // promote drop
              |'.'->"o"
              |'o'->"O"
              |_->"@")
              |>(fun c-> s.Remove(i,1).Insert(i,c))) // and insert this in the string
    else ()
!s

あなたはで1つの文字を保存することができますopen Systemし、削除SystemからRandom()Threading.Thread.Sleep()通話;)
vzwick

さらにいくつかの文字を削りました:tio.run
##TZDfa4NADMff

おかげで@vzwick :)私はeditigあったように、他のいくつかのバイトを見つけた
ブルナー

2

Python 2、365 328バイト

それは少し良いです...

import time,random
g=' '+'_'*24+r"""
|xxX/__\Xxx|
|xX/    \Xx|
|X/      \X|
\_______/        \_______/""".replace('X','x'*8)
while 1:
 print'\n'*3+g.replace('x',' ')
 s='x.oO@@'
 if all(c not in g for c in s[:-2]):exit()
 i,c=random.choice([(i,s[s.index(j)+1])for i,j in enumerate(g)if j in s])
 g=g[:i]+c+g[i+1:]
 time.sleep(1)

オンラインで試す

上記のリンクでは、3行ではなく30行を使用していますが、ブラウザーウィンドウのサイズを垂直方向に十分小さくする場合は、3行で表示できます。10倍の速度に変更time.sleep(1)time.sleep(.1)ます。


2

C、313 309 305 304バイト

かなりゴルフダウンする必要があります。

c;f(r,q){for(char*m=" ________________________\n|**********/__\\**********|\n|*********/    \\*********|\n|********/      \\********|\n\\_______/        \\_______/\n";c<216;r=rand()%144,m-=135)for(system("clear");*m++;putchar(*m^42?*m:32))q=--r?*m:*m^42?*m^46?*m^111?*m^79?*m:64:79:111:46,c+=q!=*m,*m=q;}

次のテストスタブで実行します

main()
{
    srand(time(0));    
    f();
}

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


2

ルビー237の 224 228 218 206 198 197バイト

g=" #{?_*24}
|x##/__ax##|
|x#/    ax#|
|x/      ax|
a#{u=?_*7}/xa#{u}/


".gsub ?x,?#*8;217.times{|t|puts g.tr('#a',' \\');()while t<216&&g[x=rand*106]!~/[#.oO]/;g[x]=g[x].tr '#.oO','.oO@';sleep 1}

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

以前の回答は間違っていました。@に降る雨滴は考慮されていませんでした。どうやら要件ではありません。いくつかのバイトが保存されました。

これはエラーがスローされて終了しますが、完全なメガネが印刷されるとすぐに終了します。

  • 印刷をラムダに入れることで 13バイトを節約し、割り当てを変更してtr(duh)を使用することにより、
  • 1秒の要件で8バイトの損失。
  • 補間の代わりにgsubトリックを使用することで10バイトのゲインが得られます(mbomb007のPythonの回答から見たものと適応したもの))。
  • 印刷が1回のみ書き込まれるようになったため、ラムダ印刷を削除することで12バイト増加します。>。>
  • すべてを\\beにすることによる1バイトのゲインaにして、tr内で元に戻す
  • 最後の行のスペースを別の行に変更することにより、7バイトのゲインx(duh)。なぜこれがメインループに影響しないのかと疑問に思っている人がいる場合、メインループは最後の行を考慮してそのループを決定しませんx
  • メガネの上部の端を取り外すことで1バイトのゲイン

イェイ<200バイト:D

GIF:

GIF


3
後で参照するために、以前の回答を削除して新しい回答を追加する代わりに、機能する回答に編集できます。
TheLethalCoder

このランニングのgifを追加できますか?
コイナーリンガーアーイング

@RandomUser完了。
ジェンカー

1

Bash、576 510 429 416バイト

j()(IFS=
printf "$*")
for i in {53..0};{ a[$i]= 
b[$i]=@;}
while(($i == 0));do clear
echo  " ________________________
|`j ${a[@]::10}`/__\\`j ${a[@]:10:10}`|
|`j ${a[@]:20:9}`/    \\`j ${a[@]:29:9}`|
|`j ${a[@]:38:8}`/      \\`j ${a[@]:46}`|
\_______/        \_______/"
[ `j ${a[@]}` = `j ${b[@]}` ]&&{
i=1
}
sleep 1
d=`shuf -i0-53 -n1`
c=${a[$d]}
case $c in  )a[$d]=.;;.)a[$d]=o;;o)a[$d]=0;;0)a[$d]=@;esac
done

うわー、たくさんゴルフをしました。さらにゴルフをするためのアイデアがあれば、私は提案を受け入れます

自分で試してみてください!60秒の制限があるため、スリープがコメントされています

ここにgifがあります:

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



0

Mathematica、438バイト

f=Flatten;p=Print;z=32;q=95;l=124;t=Table;v=z~t~8;s={f@{z,q~t~24,z},f@{124,z~t~10,47,q,q,92,z~t~10,l},f@{l,z~t~9,47,z~t~4,92,z~t~9,l},f@{l,v,47,z~t~6,92,v,l},f@{92,q~t~7,47,v,92,q~t~7,47}};c=0;Monitor[While[c<54,a=s[[i=RandomInteger@{2,4},j=RandomChoice[Range[2,13-i]~Join~Range[14+i,25]]]];If[a==z,s[[i,j]]=46,If[a==46,s[[i,j]]=111,If[a==111,s[[i,j]]=48,If[a==48,s[[i,j]]=64]]]];c=Count[Flatten@s,64];Pause@1],Column@FromCharacterCode@s]

これは10倍速の結果gifです

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


Mathematicaを使用していないが、あなたはに割り当てることができないTable9532
コイナーリンガーをケア

同様にt=Table x = 32してy = 95
共犯

はい、もちろん。私は昨日からそれをたくさんゴルフ
-J42161217

最後Flattenf?に置き換えることにより、6バイトを削除できる場合があります。
コメアリンガーアーイング

0

PHP、262 254バイト

for($t=" 8_8_8_
|Y9Y/__\Y9Y|
|9Y/4 \9Y|
|8Y/6 \8Y|
\\7_/8 \\7_/";$c=$t[$i++];)$s.=$c<1?$c:str_repeat($t[$i++],$c);for(;$c=$s[++$k];)$c!=Y?:$s[$m[]=$k]=" ";for(;$u<216;print str_pad($s,999,"
",sleep(1)))$u+=($c=".oO@"[$a[$p=rand(0,53)]++])&&$s[$m[$p]]=$c;

で実行する-nR、オンラインで試してください

壊す

# prep 1: generate template from packed string
for($t=" 8_8_8_\n|Y9Y/__\Y9Y|\n|9Y/4 \9Y|\n|8Y/6 \8Y|\n\\7_/8 \\7_/";
    $c=$t[$i++];)$s.=$c<1?$c:str_repeat($t[$i++],$c);
# prep 2: map substituted spaces and replace with real spaces
for(;$c=$s[++$k];)$c!=Y?:$s[$m[]=$k]=" ";
# loop until glasses are fully wet:
for(;$u<216;
    # 4. print glasses prepended with 865 newlines
    print str_pad($s,999,"\n",
    # 3. wait 1 second
        sleep(1)))
    $u+=($c=".oO@"[
        $a[$p=rand(0,53)    # 1. pick random position
        ]++])               # 2. and increment
        &&$s[$m[$p]]=$c         # if not fully wet, graduate drop
    ;                           # and increment drop count ($u+=)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.