Des gouttes de pluie tombent sur mes… lunettes?

23

J'habite au Royaume-Uni, où il pleut. Beaucoup. J'ai aussi la malheureuse nécessité de devoir porter des lunettes pour voir, ce qui signifie que lorsqu'il pleut (comme c'est le cas actuellement), je peux à peine voir hors d'eux. Ce défi est pour que vous puissiez tous vivre la même chose!

Tâche

Sortie de verres d'art ASCII avec une goutte d'eau ajoutée chaque seconde.

Contribution

Aucun

Sortie

Une paire de verres avec des gouttes d'eau dessus.

Des lunettes

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

Gouttes de pluie

Une goutte de pluie est désignée par un .. Une goutte de pluie est placée au hasard sur les verres des lunettes. Donc, quand une goutte de pluie est placée, les lunettes peuvent ressembler à ceci

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

S'il est placé sur un espace vide ( ), un .est placé sur l'image. S'il est placé sur un carré qui a déjà une goutte de pluie, la goutte est graduée.

Les étapes sur les gouttes sont

  • aucune goutte placée:
  • 1 goutte placée: .
  • 2 gouttes placées: o
  • 3 gouttes déposées: O
  • 4+ gouttes placées: @

Règles

  • L'image doit avoir l' air de rester en place. Cela signifie que vous pouvez soit effacer l'écran, soit imprimer suffisamment de nouvelles lignes pour «effacer» l'écran. Vous ne pouvez pas retourner une liste d'étapes. Désolé pour cela, mais vous devriez pouvoir contourner cela.
  • Lors de la sortie de sauts de ligne pour "effacer" l'écran, vous devez avoir au moins 3 sauts de ligne entre les lunettes.
  • Le code s'exécute jusqu'à ce que les verres soient pleins de gouttes entièrement graduées, c'est-à-dire jusqu'à ce que la sortie ressemble à ceci:
     ________________________
    | @@@@@@@@@@ / __ \ @@@@@@@@@@ | |
    | @@@@@@@@@ / \ @@@@@@@@@ |
    | @@@@@@@@ / \ @@@@@@@@ |
    \ _______ / \ _______ /
  • Le code le plus court en octets gagne.
caird coinheringaahing
la source
" Le code fonctionne jusqu'à ce que les verres soient remplis de gouttes entièrement graduées " Peut-être spécifier un temps de sommeil / d'attente approximatif? Comme 150 ou 250 ms?
Kevin Cruijssen
2
Le code doit-il s'arrêter lorsque les lunettes ressemblent à la sortie finale ou peut-il continuer à fonctionner mais ne rien affecter?
TheLethalCoder
@TheLethalCoder J'imagine jusqu'à ce que les verres soient pleins, comme écrit dans la spécification: v
Jenkar
La chute aléatoire de Droplet doit tomber au hasard sur les lentilles, même sur une partie des bits de la lentille qui sont @, non?
Jenkar
@TheLethalCoder devrait se terminer après tous ont obtenu leur diplôme
Caird coinheringaahing

Réponses:

11

JavaScript (ES6), 269 267 265 octets

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)

Edit: sauvé 2 4 octets grâce à @Shaggy.

Neil
la source
3
quelque chose ne va pas dans le coin supérieur gauche
J42161217
-1 car il est buggé (voir le commentaire de Jenny)
Destructible Lemon
1
@DestructibleLemon Désolé, j'ai été mordu par une "fonctionnalité" du presse-papiers de Firefox ... ça devrait aller maintenant.
Neil
Enregistrez quelques octets avec innerTextau lieu de textContentet searchau lieu de indexOf. Et un peu plus en utilisant simplement du <pre id=oHTML, plutôt qu'en l' utilisant document.write.
Shaggy
1
@Shaggy Super trouvaille, merci!
Neil
5

Java 8, 449 421 octets

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

Explication:

Essayez-le ici. ( Thread.sleepest supprimé pour que vous puissiez voir instantanément le résultat.)

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

Sortie:

REMARQUE: les points sont un peu bizarres dans le gif, mais c'est un problème dans mon ScreenToGif.exe ..
entrez la description de l'image ici

Kevin Cruijssen
la source
1
Vous savez ce qui m'éblouit, ces points étranges (la même chose s'applique à la réduction d'échelle ") semblent vraiment qu'il y a une vraie goutte d'eau sur mon écran
Khaled.K
1
Cela ne tient pas compte de la possibilité d'une chute tombant sur un @: v
Jenkar
@Jenkar, c'est la deuxième fois que vous dites cela sur les réponses. Explique ce que tu veux dire, s'il te plait.
caird coinheringaahing
@RandomUser Fondamentalement, le code actuel de cette réponse recherche un endroit qui n'est pas encore un @ sur lequel tomber, plutôt que de tomber au hasard sur les lentilles, même s'il s'agit d'un at. Le "4+" dans les exigences semble indiquer que ce n'est pas le cas, mais au lieu de cela, il faut tomber sur l'objectif au hasard, y compris un @. N'est-ce pas la bonne interprétation?
Jenkar
@Jenkar Peu importe comment il le fait, juste qu'il le fait sans violer les règles ou les failles standard. Je n'ai jamais dit "Il doit avoir une distribution aléatoire uniforme" dans la question, donc cette réponse est très bien.
caird coinheringaahing
3

F #, non récursif 379 414 404 octets

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

Essayez-le en ligne!

  • -7 octets grâce à @vzwick
    • par aliasing String.replicate
    • en ouvrant System au lieu de le référencer à chaque fois
  • -3 octets en réduisant la boucle while à une ligne

J'adore la prémisse de ce défi :)

Et merci pour le ver de l'oreille.

F #, 406 441 438 437 423 octets

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

Essayez-le en ligne!

  • -3 octets en contraignant s à la chaîne en le comparant à la chaîne
  • -1 octet, le nom de la fonction est désormais "!" économiser un seul espace lors de l'appel
  • -7 octets grâce à @vzwick
    • par aliasing String.replicate
    • en ouvrant System au lieu de le référencer à chaque fois
  • -1 octet, pas besoin de parenthèses lors de l'appel de d.Next
  • -6 octets, la fonction est maintenant une ligne

Explication

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
Brunner
la source
Vous pouvez enregistrer 1 caractère en le open Systemsupprimant Systemdes appels Random()et Threading.Thread.Sleep();)
vzwick
Quelques autres personnages rasés: tio.run/##TZDfa4NADMff/…
vzwick
@vzwick merci :) a trouvé quelques autres octets pendant que je modifiais
Brunner
2

Python 2, 365 328 octets

C'est un peu mieux ...

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)

Essayez-le en ligne

Le lien ci-dessus utilise 30 lignes au lieu de 3, mais vous pouvez le voir avec 3 si vous redimensionnez la fenêtre de votre navigateur pour être suffisamment petite verticalement. Passez time.sleep(1)à time.sleep(.1)une vitesse 10x.

mbomb007
la source
2

C, 313 309 305 304 octets

Doit être un peu joué au golf;

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

Je l'exécute avec le talon de test suivant

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

entrez la description de l'image ici

cleblanc
la source
2

Rubis , 237 224 228 218 206 206 198 197 octets

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}

Essayez-le en ligne!

La réponse précédente était fausse, elle ne tenait pas compte d'une goutte de pluie tombant sur un @. Apparemment pas une exigence. Quelques octets enregistrés.

Cela se termine avec une erreur lancée, mais cela se termine définitivement dès que les verres pleins sont imprimés.

  • 13 octets enregistrés en mettant l'impression dans un lambda et en changeant l'affectation pour utiliser tr (duh)
  • 8 octets de perte avec l'exigence de 1 seconde.
  • 10 octets gagnent en utilisant l'astuce gsub au lieu de l'interpolation (vu et adapté de la réponse Python de mbomb007 ).
  • Gain de 12 octets en supprimant l'impression lambda maintenant que l'impression n'est écrite qu'une seule fois>.>
  • Gain de 1 octet en faisant tout le \\be a, puis en revenant à l'intérieur du tr
  • Gain de 7 octets en plaçant le changement des espaces sur la dernière ligne avec un autre x(duh). Dans le cas où certains d'entre vous se demandent pourquoi cela n'affecte pas la boucle principale: la boucle principale ne prend pas en compte la dernière ligne pour la déterminer x.
  • Gain de 1 octet en retirant le bout de la lunette

Oui <200 octets: D

Gif:

Gif

Jenkar
la source
3
Pour référence future, vous pouvez modifier votre réponse précédente en une réponse qui fonctionne au lieu de la supprimer et d'en ajouter une nouvelle.
TheLethalCoder
Pourriez-vous ajouter un gif de cette course?
caird coinheringaahing
@RandomUser Done.
Jenkar
1

Bash, 576 510 429 416 octets

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, j'ai beaucoup joué au golf. Si quelqu'un a une idée de golf, je suis ouvert aux suggestions

Essayez-le vous-même! Il a commenté le sommeil en raison de la limite de 60 secondes

Voici le gif:

entrez la description de l'image ici

DrnglVrgs
la source
1

Perl, 167 octets

Notez qu'il \x1bs'agit d'un caractère d'échappement littéral.

$_="\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

Voyez-le en ligne!

Dom Hastings
la source
0

Mathematica, 438 octets

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]

voici un gif de résultat de vitesse 10x

entrez la description de l'image ici

J42161217
la source
Vous n'avez jamais utilisé Mathematica, mais pourriez-vous affecter à Table, 95et 32?
caird coinheringaahing
Comme dans t=Table x = 32et y = 95?
caird coinheringaahing
Oui bien sûr. J'ai beaucoup
joué
Vous pourrez peut-être supprimer 6 octets en remplaçant le dernier Flattenpar f?
caird coinheringaahing
0

PHP, 262 254 octets

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;

Courez avec -nRou essayez-le en ligne .

panne

# 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+=)
Titus
la source