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.

" 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.


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


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

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.


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


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


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


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!


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


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+=)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.