[Question]
  [
I live in the UK, where it rains. A lot. I also have the unfortunate necessity to need to wear glasses to see, which means that when it rains (as it is now), I can barely see out of them. This challenge is so that you can all experience the same!
## Task
Output ASCII art glasses with a drop of water added each second.
## Input
None
## Output
A pair of glasses with drops of water on them.
### Glasses
```
 ________________________
|          /__\          |
|         /    \         |
|        /      \        |
\_______/        \_______/
```
### Raindrops
A raindrop is denoted by a `.`. A raindrop is randomly placed on the glasses' lenses. So when a raindrop is placed, the glasses might look like this
```
 ________________________
|          /__\          |
|    .    /    \         |
|        /      \        |
\_______/        \_______/
```
If it is placed on a blank space (), an `.` is placed on the image. If it is placed on a square which already has a raindrop, the drop graduates.
The steps on drops are
* no drops placed:
* 1 drop placed: `.`
* 2 drops placed: `o`
* 3 drops placed: `O`
* 4+ drops placed: `@`
## Rules
* The image should **look** as though it stays in place. This means that you can either clear the screen or print enough newlines to "clear" the screen. You cannot return a list of steps. Sorry about this, but you should be able to work around that.
* When outputting newlines to "clear" the screen, you must have at least 3 newlines between the glasses.
* The code runs until the glasses are full of fully graduated drops i.e. until the output looks like this:
```
     ________________________
    |@@@@@@@@@@/__\@@@@@@@@@@|
    |@@@@@@@@@/    \@@@@@@@@@|
    |@@@@@@@@/      \@@@@@@@@|
    \_______/        \_______/
```
* Shortest code in *bytes* wins.
  
[Answer]
## 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: Saved ~~2~~ 4 bytes thanks to @Shaggy.
[Answer]
# Java 8, ~~449~~ ~~421~~ 420 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;);g=t++>0?g.substring(0,n)+(x<36?".":x<47?"o":x<80?"@":"O")+g.substring(n+1):g;System.out.println(g.replace('#',' '));}}
```
-1 byte thanks to *@ceilingcat*.
**Explanation:**
[Try it here.](https://tio.run/##dZJbT8IwFIDf/RXHkkjLsEJEUGqdPvgIPpj44owpY3TT0c614Azw27GFeUmMp0kv3zltun19EUtxrItEvUxft3EujIGRyNTqACBTNilnIk5g7JcAS51NIcYPflgSsGmp3w3cVnFS2Ewr5oo2B64zVtgshjEo4LBdHl@t7m2ZKQlvHDXqQG3JETz/E5Fau5LgLUAnbhHV87XHe@qv4/g3/qGef@Eoqs@rMz73RVzWNcRmusTuS8HyTlu1KybpXNg4TQxGODSEth4bUUT13RNtIcLIytczXHFJ41SUNxYr7vcTPBI2paVQUz3HpCVpnihpU0xcHPLTs6PqkPf6vu92u34YXDDCJLdBcNUJJTWLidn9JezuQQJcXZ72Q0TRsLrsDUKk/eS8E6JrNER3iAS/d6igS4aS3X8Ym8ypXlhaOG5zhSUtkyJ3DnGz0Ww3oUkI22y2zGsqFpPcaapt7eTOnXq8l/X4BOKv4/1DUDTGapHnZK98s/0E) (`Thread.sleep` is removed so you instantly see the result.)
```
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)
    g=t++>0??               //   Flag so it prints the initial glasses without a raindrop
      g.substring(0,n)+(x<36?".":x<47?"o":x<80?"@":"O")+g.substring(n+1):g;
                            //    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
```
**Output:**
NOTE: The dots are a bit weird in the gif, but that's a problem in my ScreenToGif.exe..  
[![enter image description here](https://i.stack.imgur.com/WHxax.gif)](https://i.stack.imgur.com/WHxax.gif)
[Answer]
# Python 2, ~~365~~ 328 bytes
That's a bit better...
```
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)
```
[**Try it online**](https://repl.it/IPuU/2)
The above link uses 30 lines instead of 3, but you can see it with 3 if you resize your browser window to be small enough vertically. Change `time.sleep(1)` to `time.sleep(.1)` for 10x speed.
[Answer]
# F#, non-recursive ~~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))
```
[Try it online!](https://tio.run/##Tc9Rb4IwEAfwdz9F04RAEzlBYWpU4utetkT2NgxhcM4m0DJapzN8d1bAJbuX/v7X3CV3Um4lhew6WaMg8Y/SWE1K1OS@i3XDxSc0WJc8zzQO7eqis48SiZoWuzsJA0roVOCVHDJRyMphk@uZm@8YvwBvXGnlONuI2XubKVJIUpuV@iQosVQiWkvN0jRJLNWOgZj6F62lGpwk6Vgza63@aNqCOncyD2hKmaPgHWB9HOB7AP7Dc@P56uE1wGI5erECCMIjo0lC@xw8AYSLMW/ezg1mRX/8KIhLxNrxPc9jmwJe8KbDoI1OF0G4G6mt22/gx6GTay5FaxPbjSjQ1oYe0kD2eKVtap49ZW3k9PO5mYcDVvIbHT71GTwLhY02zhnrul8 "F# (Mono) – Try It Online")
* -7 bytes thanks to @vzwick
	+ by aliasing String.replicate
	+ by opening System instead of referencing it every time
* -3 bytes by reducing the while loop to one line
I love the premise of this challenge :)
And thanks for the earworm.
# 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
```
[Try it online!](https://tio.run/##TdBRa4MwEAfw932KNCAmUK/a2rWlU/q6lw3m3maRoucqaHRetnXF7@6idrB7ye9/4QK5nJyqVnXf1w0qFv2QxuquRM2uQaTbQr1Di01ZpCeNY5vmWXBla58zPlf4zV5OKqsrIcfLFlMxkxRQwPm@MdM6V5xZFKvOokWSxLFF3RSYqX/R2tDoOE6mWlg7@qNpKy6ubOnzhEtB8AawO47wXADv5qXxcnvzDmC1mbzaAvjro@RxzIfs3wOsV1Pev55bPGXDPydBVCI2wnNdV@6LnEX4AXgpSJMQD6G0D7Ykps9mVxk84UWbVXRh/qlY4YRsJob3i@PYSXVRq85mthNy4J0NA2qDesAz7xJzHLjsQjHMp05I8IJV/YWimHsSHhVhq41TKSWWhGbJM@r7Xw "F# (Mono) – Try It Online")
* -3 bytes by constraining s to string by comparing it with string
* -1 byte, function name is now "!" saving a single space when calling it
* -7 bytes thanks to @vzwick
	+ by aliasing String.replicate
	+ by opening System instead of referencing it every time
* -1 byte, no need for parenthesis when calling d.Next
* -6 bytes, function is now one line
# Explanation
```
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
```
[Answer]
# C, ~~313~~ ~~309~~ ~~305~~ 304 bytes
Needs to be golfed down quite a bit;
```
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;}
```
I run it with the following test stub
```
main()
{
    srand(time(0));    
    f();
}
```
[![enter image description here](https://i.stack.imgur.com/vDQjS.gif)](https://i.stack.imgur.com/vDQjS.gif)
[Answer]
# [Ruby](https://www.ruby-lang.org/), 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}
```
[Try it online!](https://tio.run/nexus/ruby#HYzRCoIwGIXv9xTLgVMx1yQ0MLE36AFUZNlQwVR0kuDsrbu2rf/i/Oc7cM5exQZEa1I4/nkDckGIFAVTT2ogUJ0iDX@vSQKG1jlWlXAji/YbAQAYXjXND5gsboKcS@TT0BPNi0@rFHKYxQQrT4wWRgy7GGYZtiPLftdNy6G4@jQwzSpd4pF1T4eegvzwISny@ntOIpXnsRbVh1iHakHpDUdTy/kA6bbv364/lqys@Q8 "Ruby – TIO Nexus")
Previous answer was wrong, it did not take into account a raindrop falling on a @. Apparently not a requirement. Some bytes saved.
This terminates with an error thrown, but this definitely terminates as soon as the full glasses are printed.
* Saved 13 bytes by putting the printing into a lambda, and changing the assignment to use tr (duh)
* 8 bytes loss with the 1 second requirement.
* 10 bytes gain by using the gsub trick instead of interpolation (seen & adapted from [mbomb007's Python answer](https://codegolf.stackexchange.com/questions/122284/raindrops-are-falling-on-my-glasses/122557#122557)).
* 12 bytes gain by removing the lambda printing now that the print is written only once >.>
* 1 byte gain by making all the `\\` be `a`, then changing back inside the tr
* 7 byte gain by putting the changing the spaces on the last line with another `x` (duh). In case some of you guys are wondering why this doesn't affect the main loop : the main loop doesn't consider the last line to determine its `x`.
* 1 byte gain by removing the  at the end of the top of the glasses
Yay < 200 bytes :D
Gif : 
[![Gif](https://i.stack.imgur.com/Xj3kB.gif)](https://i.stack.imgur.com/Xj3kB.gif)
[Answer]
## 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]
```
here is a 10x speed result gif 
[![enter image description here](https://i.stack.imgur.com/BjXYp.gif)](https://i.stack.imgur.com/BjXYp.gif)
[Answer]
# 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, golfed a lot. If anyone have any idea for further golfing, I'm open to suggestions
[Try it yourself!](https://tio.run/##ddDBaoNAEAbg@zzFYJegBe0am5K4LHgq9NyjEV11xQ2iQVt6MAu99EX7IlaNaZND5/TPz8eyTCq6chgOpmW@PL9yOLaqfivQIPeGBUXTokJVY7/xHIdq1qMIiYr49@cXpHMKmIaPUlXSNIlCzpFaFssbzCopWpBZ2SAaGP8zcEoOSHoRBpHvu1QnD3G83/91Lp3b07VbU383Qhznmq53U30jva2/XeStfXya5H75xAJGcikMCPFX6wT5eUvPW7Ra9aC4CxruukrKI7qQ86Qr3wu0FbU3Htq1m0DGpwdIHmnIRCeRZNMpx9NZc8sdxpwlNow1S6SM0SUGTHYig7yp5TD8AA) It has the sleep commented because of the 60 seconds limit
Here is the gif:
[![enter image description here](https://i.stack.imgur.com/snQlG.gif)](https://i.stack.imgur.com/snQlG.gif)
[Answer]
## Perl, 167 bytes
**Note that `\x1b` is a literal escape character.**
```
$_="\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
```
[See it online!](https://asciinema.org/a/90ybDoChlx5kaznCUGTHKv5ZY)
[Answer]
# 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;
```
Run with `-nR` or [try it online](http://sandbox.onlinephpfunctions.com/code/ea6ce8dcc4729cf3bc0781abd2e2cf9c6b085891).
**breakdown**
```
# 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+=)
```
]