Regentropfen fallen auf meine ... Brille?


23

Ich lebe in Großbritannien, wo es regnet. Viel. Ich habe auch die unglückliche Notwendigkeit, eine Brille tragen zu müssen, um zu sehen, was bedeutet, dass ich bei Regen (wie es jetzt ist) kaum aus ihnen heraussehen kann. Diese Herausforderung ist so, dass Sie alle das gleiche erleben können!

Aufgabe

Geben Sie ASCII-Kunstgläser mit einem Tropfen Wasser pro Sekunde aus.

Eingang

Keiner

Ausgabe

Eine Brille mit Wassertropfen darauf.

Brille

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

Regentropfen

Ein Regentropfen wird mit a bezeichnet .. Ein Regentropfen wird zufällig auf die Brillengläser gelegt. Wenn also ein Regentropfen platziert wird, könnte die Brille so aussehen

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

Wenn es sich auf einer leeren Stelle befindet ( ), wird ein .auf dem Bild platziert. Wird es auf ein Feld gelegt, auf dem sich bereits ein Regentropfen befindet, wird der Tropfen graduiert.

Die Schritte auf Tropfen sind

  • keine Tropfen platziert:
  • 1 Tropfen platziert: .
  • 2 Tropfen platziert: o
  • 3 Tropfen platziert: O
  • 4+ Tropfen platziert: @

Regeln

  • Das Bild sollte so aussehen, als ob es an Ort und Stelle bleibt. Dies bedeutet, dass Sie entweder den Bildschirm löschen oder genügend Zeilenumbrüche drucken können, um den Bildschirm zu "löschen". Sie können keine Liste von Schritten zurückgeben. Tut mir leid, aber Sie sollten in der Lage sein, das zu umgehen.
  • Wenn Sie Zeilenumbrüche ausgeben, um den Bildschirm zu "löschen", müssen mindestens 3 Zeilenumbrüche zwischen den Gläsern sein.
  • Der Code läuft so lange, bis die Gläser voll sind, dh bis die Ausgabe so aussieht:
     ________________________
    | @@@@@@@@@ / __ \ @@@@@@@@@ |
    | @@@@@@@@ / \ @@@@@@@@ |
    | @@@@@@@ / \ @@@@@@@ |
    \ _______ / \ _______ /
  • Kürzester Code in Bytes gewinnt.

" Der Code wird so lange ausgeführt, bis die Brille voll ist. " Geben Sie möglicherweise eine ungefähre Schlaf- / Wartezeit an. Wie 150 oder 250 ms?
Kevin Cruijssen

2
Muss der Code anhalten, wenn die Brille wie die endgültige Ausgabe aussieht, oder kann er weiterlaufen, ohne jedoch irgendetwas zu beeinflussen?
TheLethalCoder

@TheLethalCoder Ich würde mir vorstellen, bis die Gläser voll sind, wie in der Spezifikation geschrieben: v
Jenkar

Droplets zufälliger Fall muss zufällig auf Linsen fallen, auch auf Teile der Linsen @, oder?
Jenkar

@TheLethalCoder sollte es beenden, nachdem alle abgeschlossen haben
Caird Coinheringaahing

Antworten:


11

JavaScript (ES6), 269 267 265 Bytes

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)

Bearbeiten: 2 4 Bytes dank @Shaggy gespeichert.


3
in der oberen linken Ecke
läuft

-1, weil es fehlerhaft ist (siehe Jennys Kommentar)
Destructible Lemon

1
@DestructibleLemon Tut mir leid, ich wurde von einem "Feature" in der Firefox-Zwischenablage gebissen ... sollte jetzt OK sein.
Neil

Speichern Sie ein paar Bytes mit innerTextanstelle von textContentund searchanstelle von indexOf. Und ein paar mehr, wenn Sie nur <pre id=oals HTML verwenden, anstatt es zu document.writeschreiben.
Shaggy

1
@ Shaggy Tolle Entdeckung, danke!
Neil

5

Java 8, 449 421 Bytes

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('#',' '));}}

Erläuterung:

Probieren Sie es hier aus. ( Thread.sleepWird entfernt, damit Sie das Ergebnis sofort sehen.)

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

Ausgabe:

HINWEIS: Die Punkte im GIF sind etwas seltsam, aber das ist ein Problem in meinem ScreenToGif.exe.
Bildbeschreibung hier eingeben


1
Weißt du, worüber ich "
geblendet werde? Diese

1
Dies berücksichtigt nicht die Möglichkeit, dass ein Tropfen
Uhr

@Jenkar, das ist das zweite Mal, dass du das auf Antworten gesagt hast. Bitte erläutern Sie, was Sie meinen.
Caird Coinheringaahing

@RandomUser Grundsätzlich sucht der aktuelle Code in dieser Antwort nach einer Stelle, auf die noch kein @ fallen kann, anstatt zufällig auf die Linsen zu fallen, selbst wenn es sich um ein at handelt. Die "4+" in Anforderungen scheinen darauf hinzudeuten, dass dies nicht der Fall ist, sondern dass man willkürlich auf die Linse fallen sollte, einschließlich eines @. Ist das nicht die richtige Interpretation?
Jenkar

@Jenkar Es spielt keine Rolle, wie es funktioniert, nur, dass es keine Regeln oder Standardlücken verletzt. Ich habe in der Frage nie "Es muss eine gleichmäßige Zufallsverteilung haben" gesagt, daher ist diese Antwort in Ordnung.
Caird Coinheringaahing

3

F #, nicht rekursive 379 414 404 Bytes

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))

Probieren Sie es online!

  • -7 Bytes dank @vzwick
    • durch Aliasing von String.replicate
    • durch Öffnen des Systems, anstatt jedes Mal darauf zu verweisen
  • -3 Bytes durch Reduzieren der while-Schleife auf eine Zeile

Ich liebe die Voraussetzung dieser Herausforderung :)

Und danke für den Ohrwurm.

F #, 406 441 438 437 423 Bytes

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

Probieren Sie es online!

  • -3 Bytes, indem Sie s auf string beschränken, indem Sie es mit string vergleichen
  • -1 Byte, Funktionsname ist jetzt "!" Speichern eines einzelnen Leerzeichens beim Aufrufen
  • -7 Bytes dank @vzwick
    • durch Aliasing von String.replicate
    • durch Öffnen des Systems, anstatt jedes Mal darauf zu verweisen
  • -1 Byte, beim Aufruf von d.Next sind keine Klammern erforderlich
  • -6 Bytes, Funktion ist jetzt eine Zeile

Erläuterung

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

Sie können 1 Zeichen speichern , indem Sie open Systemund das Entfernen Systemvon der Random()und Threading.Thread.Sleep()Anrufe;)
vzwick

Noch ein paar Charaktere rasiert: tio.run/##TZDfa4NADMff/…
vzwick

@ Vzwick danke :) fand ein paar Bytes, als ich editig war
Brunner

2

Python 2, 365 328 Bytes

Das ist ein bisschen besser ...

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)

Probieren Sie es online aus

Der obige Link verwendet 30 Zeilen anstelle von 3, aber Sie können ihn mit 3 sehen, wenn Sie die Größe Ihres Browserfensters so ändern, dass es vertikal klein genug ist. Wechseln Sie time.sleep(1)zu time.sleep(.1)für 10x Geschwindigkeit.


2

C, 313 309 305 304 Bytes

Muss einiges runtergolfen werden;

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

Ich führe es mit dem folgenden Teststub aus

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

Bildbeschreibung hier eingeben


2

Ruby , 237 224 228 218 206 198 197 Bytes

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}

Probieren Sie es online!

Die vorherige Antwort war falsch und berücksichtigte keinen Regentropfen, der auf ein @ fiel. Anscheinend keine Voraussetzung. Einige Bytes gespeichert.

Dies wird mit einem Fehler beendet, der jedoch definitiv beendet wird, sobald die volle Brille gedruckt wurde.

  • 13 Bytes wurden eingespart, indem der Ausdruck in ein Lambda umgewandelt und die Zuweisung geändert wurde, um tr (duh) zu verwenden.
  • Verlust von 8 Bytes bei der Anforderung von 1 Sekunde.
  • 10 Bytes gewinnen durch Verwendung des gsub-Tricks anstelle der Interpolation (gesehen und angepasst aus der Python-Antwort von mbomb007 ).
  • 12 Bytes gewinnen durch Entfernen des Lambda-Ausdrucks, wenn der Ausdruck nur einmal>.> Geschrieben wird
  • 1-Byte-Gewinn durch Bilden des \\Beins aund anschließendes Zurückwechseln in die tr
  • 7 Byte Gewinn durch Setzen der Leerzeichen in der letzten Zeile mit einem anderen x(duh). Falls sich einige von euch fragen, warum dies die Hauptschleife nicht beeinflusst: Die Hauptschleife berücksichtigt nicht die letzte Zeile, um ihre zu bestimmen x.
  • 1-Byte-Gewinn durch Entfernen des oberen Randes der Brille

Ja <200 Bytes: D

Gif:

Gif


3
Zum späteren Nachschlagen können Sie Ihre vorherige Antwort auf eine funktionierende Antwort ändern, anstatt sie zu löschen und eine neue hinzuzufügen.
TheLethalCoder

Könntest du ein GIF von diesem Rennen hinzufügen?
Caird Coinheringaahing

@RandomUser Fertig.
Jenkar

1

Bash, 576 510 429 416 Bytes

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

Wow, viel Golf gespielt. Wenn jemand eine Idee für weiteres Golfen hat, bin ich offen für Vorschläge

Versuch es selber! Es hat den Schlaf wegen der 60-Sekunden-Grenze kommentiert

Hier ist das GIF:

Bildbeschreibung hier eingeben


1

Perl, 167 Bytes

Beachten Sie, dass dies \x1bein buchstäbliches Escapezeichen ist.

$_="\x1bc 24_
|10X/__\\10X|
|9X/4 \\9X|
|8X/6 \\8X|
\\7_/8 \\7_/
";s/\d+(.)/$1x$&/ge;do{$a[rand 54]++,sleep print s/X/($",".",o,O)[$a[$-++%54]]||"@"/ger}while grep$_<4,@a

Sehen Sie es online!


0

Mathematica, 438 Bytes

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]

Hier ist ein 10x Geschwindigkeits-Ergebnis-GIF

Bildbeschreibung hier eingeben


Nie verwendet Mathematica aber könnten Sie zuweisen Table, 95und 32?
Caird Coinheringaahing

Wie in t=Table x = 32und y = 95?
Caird Coinheringaahing

ja natürlich. Ich habe seit gestern viel
Golf gespielt

Sie könnten 6 Bytes entfernen, indem er die letzte Ersetzung Flattenmit f?
Caird Coinheringaahing

0

PHP, 262 254 Bytes

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;

Laufen Sie mit -nRoder versuchen Sie es online .

Nervenzusammenbruch

# 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+=)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.