Le gocce di pioggia cadono sui miei ... occhiali?


23

Vivo nel Regno Unito, dove piove. Un sacco. Ho anche la sfortunata necessità di dover indossare gli occhiali per vedere, il che significa che quando piove (come è ora), riesco a malapena a vederli. Questa sfida è per farti provare tutti lo stesso!

Compito

Output occhiali ASCII art con una goccia d'acqua aggiunta ogni secondo.

Ingresso

Nessuna

Produzione

Un paio di bicchieri con sopra delle gocce d'acqua.

Bicchieri

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

Gocce di pioggia

Una goccia di pioggia è indicata da a .. Una goccia di pioggia viene posizionata casualmente sulle lenti degli occhiali. Quindi, quando viene posizionata una goccia di pioggia, gli occhiali potrebbero apparire così

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

Se viene posizionato su uno spazio vuoto ( ), un. viene posizionato un sull'immagine. Se è posizionato su un quadrato che ha già una goccia di pioggia, la goccia si laurea.

I passaggi sulle gocce sono

  • nessuna goccia posizionata:
  • 1 goccia piazzata: .
  • 2 gocce posizionate: o
  • 3 gocce posizionate: O
  • 4+ gocce posizionate: @

Regole

  • L'immagine dovrebbe apparire come se fosse al suo posto. Ciò significa che è possibile cancellare lo schermo o stampare abbastanza righe per "cancellare" lo schermo. Non è possibile restituire un elenco di passaggi. Mi dispiace per questo, ma dovresti essere in grado di aggirare quello.
  • Quando si emettono nuove linee per "cancellare" lo schermo, è necessario disporre di almeno 3 nuove linee tra gli occhiali.
  • Il codice viene eseguito fino a quando gli occhiali non sono pieni di gocce completamente graduate, ovvero fino a quando l'output appare così:
     ________________________
    | @@@@@@@@@@ / __ \ @@@@@@@@@@ |
    | @@@@@@@@@ / \ @@@@@@@@@ |
    | @@@@@@@@ / \ @@@@@@@@ |
    \ _______ / \ _______ /
  • Vince il codice più breve in byte .

" Il codice viene eseguito fino a quando gli occhiali non sono pieni di gocce completamente graduate " Forse specificare un tempo di attesa / attesa approssimativo? Come 150 o 250 ms?
Kevin Cruijssen,

2
Il codice deve arrestarsi quando gli occhiali sembrano l'output finale o può continuare a funzionare ma non influire su nulla?
TheLethalCoder

@TheLethalCoder Immagino fino a quando gli occhiali non saranno pieni, come scritto nelle specifiche: v
Jenkar,

La caduta casuale di Droplet deve cadere casualmente sugli obiettivi anche su parte dei pezzi dell'obiettivo che sono @, giusto?
Jenkar,

@TheLethalCoder dovrebbe terminare dopo che tutti si sono laureati
caird coinheringaahing

Risposte:


11

JavaScript (ES6), 269 267 265 byte

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)

Modifica: salvato 2 4 byte grazie a @Shaggy.


3
qualcosa va storto nell'angolo in alto a sinistra
J42161217

-1 perché è infastidito (vedi il commento di Jenny)
Limone distruttibile

1
@DestructibleLemon Mi dispiace, sono stato morso da una "caratteristica" degli appunti di Firefox ... ora dovrebbe essere OK.
Neil,

Salva un paio di byte con innerTextinvece di textContente searchinvece di indexOf. E pochi altri semplicemente usando <pre id=ocome HTML, anziché document.writeing.
Shaggy,

1
@Shaggy Grande scoperta, grazie!
Neil,

5

Java 8, 449 421 byte

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

Spiegazione:

Provalo qui. ( Thread.sleepviene rimosso in modo da poter vedere immediatamente il risultato.)

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

Produzione:

NOTA: i punti sono un po 'strani nella gif, ma questo è un problema nel mio ScreenToGif.exe ..
enter image description here


1
Sai cosa mi sta abbagliando, quei punti strani (lo stesso vale per le dimensioni ridotte ") sembrano davvero che ci sia una vera goccia d'acqua sul mio schermo
Khaled.K

1
Ciò non spiega la possibilità che una goccia cada su un @: v
Jenkar

@Jenkar è la seconda volta che lo dici sulle risposte. Per favore, spiega cosa intendi.
caird coinheringaahing

@RandomUser Fondamentalmente, il codice corrente in questa risposta cerca un punto che non è ancora un @ su cui cadere, piuttosto che cadere sulle lenti in modo casuale, anche se è un at. Il "4+" nei requisiti sembra indicare che non è questo il caso, ma si dovrebbe cadere sull'obiettivo in modo casuale, incluso un @. Non è questa l'interpretazione corretta?
Jenkar,

@Jenkar Non importa come lo fa, solo che lo fa senza violare alcuna regola o scappatoia standard. Non ho mai detto "Deve avere una distribuzione casuale uniforme" nella domanda, quindi questa risposta va bene.
caird coinheringaahing

3

F #, 379 414 404 byte non ricorsivi

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

Provalo online!

  • -7 byte grazie a @vzwick
    • aliasing String.replicate
    • aprendo il sistema invece di fare riferimento ogni volta
  • -3 byte riducendo il ciclo while su una riga

Adoro la premessa di questa sfida :)

E grazie per il wormworm.

F #, 406 441 438 437 423 byte

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

Provalo online!

  • -3 byte vincolando s a stringa confrontandolo con stringa
  • -1 byte, il nome della funzione ora è "!" salvare un singolo spazio quando lo si chiama
  • -7 byte grazie a @vzwick
    • aliasing String.replicate
    • aprendo il sistema invece di fare riferimento ogni volta
  • -1 byte, non è necessaria la parentesi quando si chiama d.Prossimo
  • -6 byte, la funzione è ora una riga

Spiegazione

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

Puoi salvare 1 carattere open Systeme rimuovendolo Systemda Random()e Threading.Thread.Sleep()chiama;)
vzwick

Qualche altro personaggio rasato: tio.run/##TZDfa4NADMff/…
vzwick

@vzwick grazie :) Ho trovato altri byte mentre stavo modificando
Brunner

2

Python 2, 365 328 byte

Va un po 'meglio ...

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)

Provalo online

Il link sopra utilizza 30 righe anziché 3, ma puoi vederlo con 3 se ridimensiona la finestra del browser in modo che sia sufficientemente piccola in verticale. Passare time.sleep(1)a time.sleep(.1)per 10 volte la velocità.


2

C, 313 309 305 304 byte

Deve essere golfato un po ';

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

Lo eseguo con il seguente stub di prova

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

enter image description here


2

Rubino , 237 224 228 218 206 198 197 byte

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}

Provalo online!

La risposta precedente era sbagliata, non teneva conto di una goccia di pioggia che cadeva su una @.Apparentemente non è un requisito. Alcuni byte salvati.

Questo termina con un errore generato, ma termina definitivamente non appena vengono stampati gli occhiali pieni.

  • Salvato 13 byte inserendo la stampa in una lambda e modificando l'assegnazione per utilizzare tr (duh)
  • Perdita di 8 byte con il requisito di 1 secondo.
  • Guadagno di 10 byte usando il trucco gsub invece dell'interpolazione (visto e adattato dalla risposta Python di mbomb007 ).
  • Guadagna 12 byte rimuovendo la stampa lambda ora che la stampa viene scritta una sola volta>.>
  • 1 byte guadagno rendendo tutto il \\be aposteriore, quindi modificando all'interno tr
  • Guadagno di 7 byte mettendo il cambio degli spazi sull'ultima riga con un altro x(duh). Nel caso in cui alcuni di voi ragazzi si stiano chiedendo perché questo non influisce sul ciclo principale: il ciclo principale non considera l'ultima riga per determinarne il loop x.
  • Guadagno di 1 byte rimuovendo l'estremità della parte superiore degli occhiali

Yay <200 byte: D

Gif:

Gif


3
Per riferimento futuro puoi modificare la tua risposta precedente a una che funziona invece di eliminarla e aggiungerne una nuova.
TheLethalCoder

Potresti aggiungere un gif di questa corsa?
caird coinheringaahing

@RandomUser Fatto.
Jenkar,

1

Bash, 576 510 429 416 byte

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, ho giocato molto a golf. Se qualcuno ha qualche idea per l'ulteriore golf, sono aperto a suggerimenti

Provate voi stessi! Ha il sonno commentato a causa del limite di 60 secondi

Ecco la gif:

inserisci qui la descrizione dell'immagine


1

Perl, 167 byte

Nota che \x1bè un personaggio letterale di fuga.

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

Guardalo online!


0

Mathematica, 438 byte

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]

ecco un risultato gif di velocità 10x

inserisci qui la descrizione dell'immagine


Non hai mai usato Mathematica ma potresti assegnarlo a Table, 95e 32?
caird coinheringaahing

Come in t=Table x = 32e y = 95?
caird coinheringaahing

sì, naturalmente. L'ho giocato a golf molto da ieri
J42161217

Potresti riuscire a rimuovere 6 byte sostituendo l'ultimo Flattencon f?
caird coinheringaahing

0

PHP, 262 254 byte

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;

Corri con -nRo provalo online .

abbattersi

# 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+=)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.