빗방울이 내 안경에 떨어지고 있습니까?


23

나는 비가 내리는 영국에 산다. 많이. 또한 안경을 착용해야하는 불행한 필요성이 있습니다. 즉, 비가 올 때 (지금처럼), 나는 거의 눈을 see 수 없습니다. 이 도전은 모두 똑같이 경험할 수 있도록하는 것입니다!

태스크

매 초마다 한 방울의 물로 ASCII 아트 안경을 출력하십시오.

입력

없음

산출

그들에 물 방울과 안경의 쌍.

안경

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

빗방울

빗방울은로 표시됩니다 .. 빗방울이 안경 렌즈에 무작위로 배치됩니다. 빗방울을 놓으면 안경이 이렇게 보일 수 있습니다.

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

공백 ( )에 .배치하면 이미지에가 배치됩니다. 이미 빗방울이있는 광장에 놓으면 물방울이 눈금이됩니다.

방울의 단계는

  • 방울을 배치하지 않았습니다 :
  • 1 방울 놓기 : .
  • 2 방울 떨어 뜨림 : o
  • 3 방울 떨어 뜨림 : O
  • 4 방울 떨어 뜨림 : @

규칙

  • 이미지가 보일 것입니다 그대로있는 것처럼 . 즉, 화면을 지우거나 화면을 "지우기"에 충분한 줄 바꿈을 인쇄 할 수 있습니다. 단계 목록을 리턴 할 수 없습니다. 죄송하지만이 문제를 해결할 수 있습니다.
  • 화면을 "지우기"위해 줄 바꿈을 출력 할 때는 안경 사이에 줄 바꿈이 3 개 이상 있어야합니다.
  • 코드는 안경이 완전히 점진 된 방울로 가득 찰 때까지, 즉 출력이 다음과 같이 보일 때까지 실행됩니다.
     ________________________
    | @@@@@@@@@@ / __ \ @@@@@@@@@@@ |
    | @@@@@@@@@@ / \ @@@@@@@@@ ||
    | @@@@@@@@@ / \ @@@@@@@@@ |
    \ _______ / \ _______ /
  • 바이트 단위의 최단 코드가 이깁니다.

" 안경이 완전히 점진 된 방울로 가득 찰 때까지 코드가 실행됩니다. "대략적인 수면 / 대기 시간을 지정합니까? 150 또는 250ms처럼?
Kevin Cruijssen

2
안경이 최종 출력처럼 보일 때 코드를 중지해야합니까, 아니면 계속 작동 할 수 있지만 아무런 영향을 미치지 않습니까?
TheLethalCoder

@TheLethalCoder 나는 스펙에 기록 된대로 안경이 가득 찰 때까지 상상할 것입니다 : v
Jenkar

액 적의 임의 추락은 렌즈의 비트의 일부에서도 렌즈에 무작위로 추락해야합니다 @.
Jenkar

@TheLethalCoder 모든 졸업 후 종료해야합니다
caird coinheringaahing

답변:


11

자바 스크립트 (ES6), 269 267 265 바이트

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)

편집 : @Shaggy 덕분에 2 4 바이트가 절약되었습니다.


3
왼쪽 상단에서 문제가 발생 함
J42161217

-1 버그이기 때문에 -1 (Jenny의 의견 참조)
Destructible Lemon

1
@DestructibleLemon 죄송합니다. Firefox 클립 보드의 "기능"에 물 렸습니다. 지금은 괜찮습니다.
Neil

innerText대신 textContentsearch대신 몇 바이트를 저장하십시오 indexOf. 그리고 <pre id=oHTML을 사용 document.write하는 대신 HTML로 사용하여 몇 가지 더 있습니다.
얽히고 설킨 Shaggy

1
@Shaggy 위대한 찾기 감사합니다!
Neil

5

자바 8, 449421 바이트

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

설명:

여기에서 시도하십시오. ( Thread.sleep결과가 즉시 표시되도록 제거되었습니다.)

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

산출:

참고 : gif에서는 점이 약간 이상하지만 내 ScreenToGif.exe의 문제입니다.
여기에 이미지 설명을 입력하십시오


1
당신은 저를 "
현혹시키는

1
이것은 하락이 @ : v에 떨어질 가능성을 설명하지 않습니다.
Jenkar

@ Jenkar 당신이 대답에 두 번째로 말했다. 무슨 뜻인지 설명해주세요.
caird coinheringaahing

@RandomUser 기본적으로이 답변의 현재 코드는 at에 있어도 렌즈에 무작위로 떨어지는 것이 아니라 @가 아닌 스팟을 찾습니다. 요구 사항의 "4+"는 이것이 사실이 아니라는 것을 나타내는 것으로 보이며 대신 @를 포함하여 렌즈에 무작위로 떨어집니다. 이것이 올바른 해석이 아닙니까?
Jenkar

@Jenkar 규칙이나 표준 허점을 위반하지 않고 수행 하는 방식에 관계없이 중요 합니다 . 나는이 질문에 "일관된 무작위 분포가 있어야합니다"라고 말한 적이 없으므로이 대답은 괜찮습니다.
caird coinheringaahing

3

비 재귀 F 번호, 379 414 404 바이트

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

온라인으로 사용해보십시오!

  • @vzwick 덕분에 -7 바이트
    • 별명으로 String.replicate
    • 매번 참조하는 대신 시스템을 열어서
  • while 루프를 한 줄로 줄임으로써 -3 바이트

나는이 도전의 전제를 좋아한다 :)

그리고 귀 벌레에 감사드립니다.

F 번호, 406 441 438 437 423 바이트

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

온라인으로 사용해보십시오!

  • 문자열과 비교하여 s를 문자열로 제한하여 -3 바이트
  • -1 바이트, 함수 이름은 이제 "!" 호출 할 때 단일 공간 절약
  • @vzwick 덕분에 -7 바이트
    • 별명으로 String.replicate
    • 매번 참조하는 대신 시스템을 열어서
  • -1 바이트, d.Next를 호출 할 때 괄호가 필요 없음
  • -6 바이트, 기능은 이제 한 줄입니다

설명

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

다음과 같은 방법으로 1 개 문자를 저장할 수 있습니다 open System및 제거 System으로부터 Random()Threading.Thread.Sleep()통화)
vzwick

문자 몇 개 더 면도 : tio.run/##TZDfa4NADMff/…
vzwick

덕분에 @vzwick : 내가 editig이었다 같은 다른 몇 바이트를 발견
브루너

2

파이썬 2, 365 328 바이트

조금 나아 졌어요 ...

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)

온라인으로 사용해보십시오

위의 링크는 3 대신 30 줄을 사용하지만 브라우저 창의 크기를 세로로 충분히 작게 조정하면 3으로 볼 수 있습니다. 변경 time.sleep(1)time.sleep(.1)10 배 속도.


2

C, 313 309 305 304 바이트

꽤 많이 골프를 쳐야합니다.

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

다음 테스트 스텁으로 실행합니다.

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

여기에 이미지 설명을 입력하십시오


2

루비 , 237 224 228 218 206 198 197 바이트

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}

온라인으로 사용해보십시오!

이전 답변이 잘못되었으므로 @에 떨어지는 빗방울을 고려하지 않았습니다. 분명히 요구 사항이 아닙니다. 일부 바이트가 저장되었습니다.

오류가 발생하면 종료되지만 전체 안경이 인쇄되는 즉시 종료됩니다.

  • 인쇄를 람다넣고 tr (duh)을 사용하도록 할당을 변경하여 13 바이트를 절약했습니다.
  • 1 초 요구 사항으로 8 바이트 손실
  • 보간 대신 gsub 트릭을 사용하여 10 바이트를 얻습니다 ( mbomb007의 Python answer 에서 보고 수정 ).
  • 인쇄가 한 번만 기록되므로 람다 인쇄를 제거하여 12 바이트 증가>.>
  • 모든 \\be a을 만든 다음 tr 내부로 다시 변경 하여 1 바이트 게인
  • 마지막 줄의 공백을 다른 줄 x(duh)로 변경하여 7 바이트 게인 . 여러분 중 일부가 왜 이것이 메인 루프에 영향을 미치지 않는지 궁금해하는 경우 메인 루프는 마지막 라인을 고려하지 않습니다 x.
  • 안경 상단의 끝을 제거하여 1 바이트 게인

예 <200 바이트 : D

GIF :

GIF


3
나중에 참조 할 수 있도록 이전 답변을 삭제하고 새 답변을 추가하는 대신 작동하는 답변을 편집 할 수 있습니다.
TheLethalCoder

이 달리기의 gif를 추가 할 수 있습니까?
caird coinheringaahing

@RandomUser 완료.
Jenkar

1

강타, 576 510 429 416 바이트

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

와, 골프 많이 했어요 더 이상의 골프에 대한 아이디어가있는 사람은 제안을 할 수 있습니다

직접 해보십시오! 60 초 제한으로 인해 수면에 주석이 달렸습니다.

다음은 gif입니다.

여기에 이미지 설명을 입력하십시오


1

펄, 167 바이트

참고 \x1b리터럴 이스케이프 문자입니다.

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

온라인으로보십시오!


0

매스 매 티카, 438 바이트

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]

여기에 10 배속 결과 gif가 있습니다

여기에 이미지 설명을 입력하십시오


절대로 Mathematica를 사용하지하지만 당신은에 할당 할 수 있습니다 Table, 95그리고 32?
caird coinheringaahing

에서 t=Table x = 32와 같이 y = 95?
caird coinheringaahing

네 물론 이죠 나는 어제부터 그것을 많이
골프

마지막 바이트를 교체하여 6 바이트를 제거 할 수 있습니다. Flattenf? .
caird coinheringaahing

0

PHP, 262254 바이트

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;

온라인으로 실행 -nR하거나 사용해보십시오 .

고장

# 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+=)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.