Pingos de chuva estão caindo nos meus ... óculos?

23

Eu moro no Reino Unido, onde chove. Muito. Eu também tenho a infeliz necessidade de usar óculos para ver, o que significa que, quando chove (como está agora), mal consigo ver através deles. Esse desafio é para que todos possam experimentar o mesmo!

Tarefa

Saída de óculos artísticos ASCII com uma gota de água adicionada a cada segundo.

Entrada

Nenhum

Saída

Um par de copos com gotas de água sobre eles.

Óculos

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

Pingos de chuva

Uma gota de chuva é indicada por a .. Uma gota de chuva é colocada aleatoriamente nas lentes dos óculos. Então, quando uma gota de chuva é colocada, os óculos podem ficar assim

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

Se for colocado em um espaço em branco ( ), .será colocado um na imagem. Se for colocado em um quadrado que já tenha uma gota de chuva, a gota se formará.

Os passos nas gotas são

  • sem gotas colocadas:
  • 1 gota colocada: .
  • 2 gotas colocadas: o
  • 3 gotas colocadas: O
  • 4+ gotas colocadas: @

Regras

  • A imagem deve parecer como se estivesse no lugar. Isso significa que você pode limpar a tela ou imprimir novas linhas suficientes para "limpar" a tela. Você não pode retornar uma lista de etapas. Desculpe por isso, mas você deve conseguir solucionar isso.
  • Ao emitir novas linhas para "limpar" a tela, você deve ter pelo menos três novas linhas entre os óculos.
  • O código é executado até que os óculos estejam cheios de gotas totalmente graduadas, ou seja, até que a saída fique assim:
     ________________________
    | @@@@@@@@@@ / __ \ @@@@@@@@@@@ |
    | @@@@@@@@@ / \ @@@@@@@@@ |
    | @@@@@@@@ / \ @@@@@@@@ |
    \ _______ / \ _______ /
  • O menor código em bytes vence.
caird coinheringaahing
fonte
" O código é executado até que os óculos estejam cheios de gotas totalmente graduadas " Talvez especifique um tempo aproximado de espera / espera? Como 150 ou 250 ms?
Kevin Cruijssen
2
O código precisa parar quando os óculos se parecem com a saída final ou ele pode continuar funcionando, mas não afeta nada?
TheLethalCoder
@TheLethalCoder imagino até que os copos estão cheios, como está escrito na especificação: v
Jenkar
A queda aleatória do Droplet precisa cair aleatoriamente nas lentes, mesmo em parte dos bits das lentes @, certo?
21417 Jenkar
@TheLethalCoder ele deve terminar depois de tudo ter se formado
caird coinheringaahing

Respostas:

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)

Edit: Salvo 2 4 bytes graças a @Shaggy.

Neil
fonte
3
algo der errado no canto superior esquerdo
J42161217
-1 porque é grampeado (veja o comentário de Jenny)
Destrutível Lemon
1
@DestructibleLemon Desculpe por isso, fui mordido por um "recurso" da área de transferência do Firefox ... deve estar bem agora.
Neil
Salve alguns bytes com em innerTextvez de textContente em searchvez de indexOf. E mais alguns usando apenas <pre id=ocomo HTML, em vez de usá document.write-lo.
Shaggy
1
@ Shaggy Grande descoberta, obrigado!
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('#',' '));}}

Explicação:

Experimente aqui. ( Thread.sleepé removido para que você veja instantaneamente o resultado.)

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

Saída:

NOTA: Os pontos são um pouco estranhos no gif, mas isso é um problema no meu ScreenToGif.exe.
insira a descrição da imagem aqui

Kevin Cruijssen
fonte
1
Você sabe o que está me deslumbrante sobre, esses pontos estranhas (o mesmo se aplica a escala reduzida ") realmente se parece há uma gota de água real no topo da minha tela
Khaled.K
1
Isto não leva em conta a possibilidade de uma gota em um @: v
Jenkar
@ Jenkar é a segunda vez que você diz isso nas respostas. Por favor, explique o que você quer dizer.
caird coinheringaahing
@RandomUser Basicamente, o código atual nesta resposta procura por um ponto que ainda não seja um @, em vez de cair aleatoriamente nas lentes, mesmo que seja um. O "4+" nos requisitos parece indicar que esse não é o caso, mas deve-se cair aleatoriamente na lente, incluindo um @. Esta não é a interpretação correta?
Jenkar 24/05
@ Jenkar Não importa como faz, apenas o faz sem violar nenhuma regra ou brecha padrão. Eu nunca disse "Ele deve ter uma distribuição aleatória uniforme" na pergunta, então esta resposta está correta.
Caird coinheringaahing
3

F #, não recursivo 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))

Experimente online!

  • -7 bytes graças a @vzwick
    • usando o aliasing String.replicate
    • abrindo o sistema em vez de referenciá-lo sempre
  • -3 bytes, reduzindo o loop while para uma linha

Eu amo a premissa deste desafio :)

E obrigado pelo verme.

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

Experimente online!

  • -3 bytes restringindo s a string comparando-o com string
  • -1 byte, o nome da função agora é "!" economizando um único espaço ao chamá-lo
  • -7 bytes graças a @vzwick
    • usando o aliasing String.replicate
    • abrindo o sistema em vez de referenciá-lo sempre
  • -1 byte, sem necessidade de parênteses ao chamar d.Next
  • -6 bytes, a função agora é uma linha

Explicação

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
fonte
Você pode salvar um caractere por open Systeme remoção Systemdo Random()e Threading.Thread.Sleep()chamadas;)
vzwick
Mais alguns caracteres depilados: tio.run/##TZDfa4NADMff/…
vzwick
@vzwick obrigado :) encontrados mais alguns bytes como eu estava editig
Brunner
2

Python 2, 365 328 bytes

Isso é um pouco melhor ...

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)

Experimente online

O link acima usa 30 linhas em vez de 3, mas você pode vê-lo com 3 se redimensionar a janela do navegador para ser pequena o suficiente na vertical. Mude time.sleep(1)para time.sleep(.1)para velocidade 10x.

mbomb007
fonte
2

C, 313 309 305 304 bytes

Precisa ser jogado bastante;

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

Eu o executo com o seguinte esboço de teste

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

insira a descrição da imagem aqui

cleblanc
fonte
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}

Experimente online!

A resposta anterior estava errada, não levou em consideração uma gota de chuva caindo em um @. Aparentemente, não é um requisito. Alguns bytes salvos.

Isso termina com um erro, mas definitivamente termina assim que os óculos cheios são impressos.

  • Economizou 13 bytes colocando a impressão em uma lambda e alterando a atribuição para usar tr (duh)
  • Perda de 8 bytes com o requisito de 1 segundo.
  • Ganho de 10 bytes usando o truque gsub em vez de interpolação (visto e adaptado da resposta Python do mbomb007 ).
  • Ganho de 12 bytes removendo a impressão lambda agora que a impressão é gravada apenas uma vez>.>
  • Ganho de 1 byte, fazendo todo o \\possível a, e depois voltando para dentro do tr
  • Ganho de 7 bytes colocando a alteração dos espaços na última linha com outra x(duh). Caso alguns de vocês estejam se perguntando por que isso não afeta o loop principal: o loop principal não considera a última linha para determinar sua x.
  • Ganho de 1 byte removendo a extremidade superior dos óculos

Yay <200 bytes: D

Gif:

Gif

Jenkar
fonte
3
Para referência futura, você pode editar sua resposta anterior para uma que funcione, em vez de excluí-la e adicionar uma nova.
TheLethalCoder
Você poderia adicionar um gif dessa corrida?
caird coinheringaahing
@RandomUser Done.
Jenkar 24/05
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

Uau, jogou muito golfe. Se alguém tiver alguma idéia para jogar golfe, estou aberto a sugestões

Tente você mesmo! Tem o sono comentado por causa do limite de 60 segundos

Aqui está o gif:

insira a descrição da imagem aqui

DrnglVrgs
fonte
1

Perl, 167 bytes

Observe que \x1bé um caractere de escape literal.

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

Veja online!

Dom Hastings
fonte
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]

aqui está um gif de resultado de velocidade de 10x

insira a descrição da imagem aqui

J42161217
fonte
Nunca utilizado Mathematica, mas você poderia atribuir a Table, 95e 32?
caird coinheringaahing
Como em t=Table x = 32e y = 95?
Caird coinheringaahing
sim, claro.
Joguei
Você pode remover 6 bytes substituindo o último Flattenpor 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;

Corra com -nRou experimente online .

demolir

# 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
fonte