한 줄 수족관


31

제 시어머니는 마당에 잉어로 가득 찬 물고기 연못을 가지고 있습니다. 내 코드에서 다음과 같은 추출을 볼 때까지 실제로 내 마음을 교차시키지 않았습니다.

',') & '_'

... 내 화면에서 물고기 얼굴을 다시 바라보고있었습니다 ...

나에게 좋은 아이디어를주었습니다 ...

당신을위한 나의 탐구, 내 사랑하는 골퍼는 다음 규칙을 가진 한 줄 ASCII 수족관을 만드는 것입니다.

  • 탱크의 측면에서 탱크의 다른 측면으로 수족관의 크기는 60 자 이상 80 자 이하 여야합니다. 탱크의 측면은 파이프 / 바 ( |) 문자를 사용하여 표시해야합니다 .
  • 물고기는 탱크 측면 사이에서 왼쪽에서 오른쪽으로 "수영"할 수 있어야합니다. 회전 할 때 한 방향에서 다른 방향으로 전환하려면 정면도가 필요합니다.
  • 물고기는 다음과 같아야합니다.

    • }}< }} ',') 물고기 수영 권리
    • (',' {{ >{{ 물고기 수영 왼쪽
    • }}('_'){{ 앞면을 향한 물고기
  • 물고기가 방향을 바꾸면 (30 % 확률) 한 방향에서 시작하여 앞을 향한 다음 다른 방향을 향해야합니다 ... 물고기가 돌릴 수있는 충분한 공간이 있는지 확인하십시오. 탱크의 가장자리 최소 ...

  • 물고기가 거품을 불거나 방향을 바꾸지 않는 한, 탱크 측면의 6 칸 이내에 도달하면 방향을 바꿉니다.
  • 물고기 (왼쪽 또는 오른쪽)는 때때로 (10 % 확률) 거품을 연속적으로 날려 버리는 것을 중지 할 수 .oO*있으므로 (1 ) 거품이 존재하기 위해서는 물고기 옆에 공간이 있어야 물고기를 사용할 수 있습니다. 옆으로 만 수영하고 한 공간을 절약하십시오. 물고기가 움직이기 전에 거품이 사라져야합니다 ...

-여기에있는 코드 표시 기능이 약간 엄격하기 때문에 공백을 나타내는 문자가있는 일련의 물고기 동작 행 예제 ...이 코드를 작성할 때 대시가 공백으로 바뀔 것으로 예상됩니다 ...

여기의 각 줄은 시간 경과에서 프레임으로 간주 될 수 있습니다.

|-}}< }} ',')----------|
|--}}< }} ',')---------|
|---}}< }} ',')--------|
|----}}< }} ',')-------|
|-----}}< }} ',')------|
|-----}}< }} ',').-----|
|-----}}< }} ',')o-----|
|-----}}< }} ',')O-----|
|-----}}< }} ',')*-----|
|---------}}('_'){{----|
|-----------(',' {{ >{{|
|----------(',' {{ >{{-|
|---------(',' {{ >{{--|
|--------.(',' {{ >{{--|
|--------o(',' {{ >{{--|
|--------O(',' {{ >{{--|
|--------*(',' {{ >{{--|
|--------(',' {{ >{{---|
|-------(',' {{ >{{----|
|------(',' {{ >{{-----|

위의 예는 말했듯이 작지만 일반적인 아이디어를 얻습니다 ...

최단 코드 승리 ...

그렇지 않으면, 같은 줄에서 출력을 기대하고 있습니다 (가능한 경우). 여러 줄을 수행하는 경우 줄 바꿈으로 구분해야합니다.

또한 타이머는 2000ms 프레임 사이에 부과됩니다. 이것은 필수 입니다.

당신이 무엇을 보자!


물고기가 수족관 가장자리에 너무 가까워지면 회전해야합니까, 아니면 화면에서 사라질 수 있습니까? 이 상황에서 물고기가 거품을 날릴 수 있습니까? 또한 물고기가 두 번 연속으로 거품을 날리는 것이 가능해야합니까 (또는 금지되어 있거나 허용되어 있지는 않습니까)?
John Dvorak

1
잠깐만 요, 이런 식으로 변경하지 마십시오! 이미 코딩을 시작했습니다! 롤백 하시겠습니까?
John Dvorak

5
다음에 샌드 박스를 사용하십시오 .
John Dvorak

1
명시 적으로 언급되어 있지 않지만 수족관에는 정확히 하나의 물고기가 있어야한다고 생각합니까?
John Dvorak

1
그것은되어 필요한 물고기 5 월 거품 두 번 연속, 또는이 우리가하는 것을 허용 일어날 수 있도록? 그것은 나를 위해 3 문자 차이를 만듭니다.
John Dvorak

답변:


11

파이썬 3 (278)

이전 : 334, 332, 325, 302, 300, 299, 291, 286, 284, 281

import random,time
r=random.random
F="}}('_'){{%s","}}< }} ',')%s","%s(',' {{ >{{"
p,d=9,1
c=b=0
while 1:
 if c:p-=c+c*3*(2*d+c==1);d=c-c*d*d;c-=d
 elif b%5:b+=1
 elif.3>r()or{p*d}<{-5,53}:c=-d
 elif.1>r():b=1
 else:p+=d
 print('|%-70s|'%(' '*p+F[d])%' .oO*'[b%5]);time.sleep(2)

파이썬의 골프는 문장의 들여 쓰기 요구 사항으로 인해 항상 어렵지만 그럼에도 불구하고 이것은 엄청나게 잘되었습니다!

Volatility와 DSM 덕분에 골프를 더욱 발전시킬 수있었습니다.

클린 버전

from random import random as r
from time import sleep as s
F = { 1: "}}< }} ',')%s", 0: "}}('_'){{%s", -1: "%s(',' {{ >{{" }

# p: position (from left)
# d: direction (-1: left, +1: right)
# c: changing direction (0: not changing, +1: to right, -1: to left)
# b: bubble (0)
p, d, c, b = 9, 1, 0, 0

while 1:
    if c:
        p -= c*[1,4][2*d+c==1]
        if d:
            d = 0
        else:
            d, c = c, 0
    elif b % 5:
        b += 1
    else:
        # change direction
        if r() < .3 or p * d in (-5,53):
            c = -d
        # start bubbling
        elif r() < .1:
            b = 1
        # move forward
        else:
            p += d

    # print fish and sleep
    print('|{:<70}|'.format(' '*p+(F[d]%' .oO*'[b%5])))
    s(2)

7

루비, 291 289

l="(',' {{ >{{";m="    }}('_'){{    ";r="}}< }} ',')";w=?\s;s=w*6;q="|#{r+s*9}|"
f=->*s{(puts q;sleep 2)if q.sub! *s}
loop{rand>0.1||(f[") ",")."]||f[" (",".("];f[?.,?o];f[?o,?O];f[?O,?*];f[?*,w])
q[7]==?(||q[-8]==?)||rand<0.3?f[s+l,m]&&f[m,r+s]||f[r+s,m]&&f[m,s+l]:f[w+l,l+w]||f[r+w,w+r]}

물고기는 11 자 길이로 수족관을 6 * 9 + 11 + 2 = 67 자로 넓게하여 필요한 공차에 깔끔하게 맞습니다.

f람다 함수 고난도을 수행 그것은 인자 쌍 수족관의 치환을 적용 할 다음 시도로 교체를 수용한다. 성공하면 애니메이션의 한 프레임을 그립니다. 그런 다음 성공 값을 2(지연됨) 또는 nil(지연되지 않음)으로보고합니다.

물고기는 거품을 연속으로 두 번 날리지 않습니다. (Fix : ...while rand>0.1-4 문자)

강제 회전 전에도 물고기가 거품을 날릴 수 있습니다. (Fix : 분기 구조 재정렬)

기포가 완전히 사라진 프레임이 *있지만 (을 포함하여 ) 물고기는 빈 공간으로 이동하지 않았습니다. 이것은 글자를 따르지만 예제는 아닙니다. (수정 : 교체 f[?*,w]와 함께 q[?*]=w- 무료)

콘솔을 지우지 않습니다. 수정 : 추가 `clear`(UNIX) 또는 system 'cls'이전 (Windows 콘솔) puts q수정에 ( . 참조 ) 또는 사용 print대신 puts하고 앞에 추가 \r수족관 ( @manatwork에 의해 제안 ).

읽을 수있는 버전 :

# l - left fish; m - middle fish + space; r - right fish
# w - single space character; s - six spaces; q - the aquarium
l="(',' {{ >{{"; m="    }}('_'){{    "; r="}}< }} ',')";
w=" "; s=w*6; q="|#{r+s*9}|"
f = ->k,v do
  if q.sub! k,v
    puts q
    sleep 2
    return 2
  else
    return nil
  end
end

loop do
  if rand < 0.1
    f[") ",")."] || f[" (",".("]
    f[?.,?o]; f[?o,?O]; f[?O,?*]; f[?*,' ']
  end
  if q[7] == "(" || q[-8] == ")" || rand < 0.3
    (f[s+l,m] && f[m,r+s]) || (f[r+s,m] && f[m,s+l])
  else
    f[w+l,l+w] || f[r+w,w+r]
  end
end

\rq :의 시작 부분에 추가하겠습니다 q="\r|#{r+s*9}|". 그런 다음 $><<q대신 사용하십시오 puts q. 1 자 더 길지만 외부 명령을 사용하지 않고 더 좋아 보입니다.
manatwork

\r화면을 지우시겠습니까? 내 경우에는 그렇지 않습니다. 아니면, 왜 안좋아 puts?
John Dvorak

1
아니오, \r캐리지 리턴입니다. $><<q출력에 커서 를 사용 하면 커서가 같은 라인에 유지 되므로 (출력 후 puts강제 실행 \n) 다음 출력을 \r시작하면 현재 라인의 시작으로 되돌아 가서 거기서 출력을 시작합니다. 따라서 수족관 라인의 이전“이미지”를 덮어 씁니다.
manatwork

@manatwork 불행히도, 이것은 jRuby 대화 형 창을 완전히 망쳐 놓으며 \r.
John Dvorak

오. 유감입니다. 정보 감사합니다. 슬프게도 이것이 jRuby에 대해 처음 알게 된 사실입니다. :(
manatwork

3

R, 451 자

첫 번째 시도 :

f=function(j,p){cat("\r|",rep("-",j),p,rep("-",50-j),"|",sep="");Sys.sleep(2)};d=F;j=5;P=c("--}}(\'_\'){{--","-}}< }} \',\')-","-(\',\' {{ >{{-");B=c("-",".","o","O","*","-");g=Vectorize(gsub,v="replacement");b=list(g("-$",B,P[2]),g("^-",B,P[3]));repeat{if(j<5 & d){d=!d;j=j+1;f(j,P[1])};if(j>44 & !d){d=!d;f(j,P[1]);j=j-1};if(runif(1)<.1){for(i in b[[d+1]])f(j,i)}else{f(j,P[d+2])};if(runif(1)<.3){d=!d;f(j,P[1]);f(j,P[d+2])};if(d){j=j-1}else{j=j+1}}

들여 쓰기 :

f=function(j,p){ #Printing function (depends of buffer and kind of fish)
    cat("\r|",rep("-",j),p,rep("-",50-j),"|",sep="")
    Sys.sleep(2)
}
d=F   #Direction: if FALSE left to right, if TRUE right to left.
j=5   #Buffer from left side of tank
P=c("--}}(\'_\'){{--","-}}< }} \',\')-","-(\',\' {{ >{{-") #The fish
B=c("-",".","o","O","*","-") #The bubble sequence
g=Vectorize(gsub,v="replacement")
b=list(g("-$",B,P[2]),g("^-",B,P[3])) #Fish+bubble
repeat{
    if(j<5 & d){ #What happens if too close from left side
        d=!d
        j=j+1
        f(j,P[1])
        }
    if(j>44 & !d){ #What happens if too close from right side
        d=!d
        f(j,P[1])
        j=j-1}
    if(runif(1)<.1){ #If bubble sequence initiated
        for(i in b[[d+1]])f(j,i)
        }else{f(j,P[d+2])} #Otherwise
    if(runif(1)<.3){ #If fish decide to turn
        d=!d
        f(j,P[1])
        f(j,P[d+2])
    }
    if(d){j=j-1}else{j=j+1} #Increment or decrement j depending on direction
}

그것은 한 줄에 수족관을 stdout으로 인쇄합니다 (t + 1에서 수족관이 인쇄되기 전에 2 초 휴식 및 캐리지 리턴).


3

펄, 281

@f=("s O(',' {{ >{{","s}}('_'){{s","}}< }} ',')O s");$d=1;@o=split//," *Oo. ";{$_="|".$"x$x.$f[$d+1].$"x(44-$x).'|
';s/O/$o[$b]/;s/s/    /g;print;if($b||$t){$b--if$b;if($t){$d+=$t;$t=0if$d}}else{$x+=$d;$t=($x<1)-($x>43);if(!$t){$b=5if.9<rand;if(.7<rand){$t=-$d;$b=0}}}sleep 2;redo}

또는 더 명확하게

@f = ( "s O(',' {{ >{{", "s}}('_'){{s", "}}< }} ',')O s" );
$d = 1;
@o = split //, " *Oo. ";
{
    $_ = "|" . $" x $x . $f[ $d + 1 ] . $" x ( 44 - $x ) . '|
';
    s/O/$o[$b]/;
    s/s/    /g;
    print;
    if ( $b || $t ) {
        $b-- if $b;
        if ($t) { $d += $t; $t = 0 if $d }
    }
    else {
        $x += $d;
        $t = ( $x < 1 ) - ( $x > 43 );
        if ( !$t ) {
            $b = 5 if .9 < rand;
            if ( .7 < rand ) { $t = -$d; $b = 0 }
        }
    }
    sleep 2;
    redo
}

물고기가 올바르게 회전합니다. 거품이 불고 있습니다.

285- 당신이 스크롤 버전이 아닌 실제 수족관 느낌을 좋아한다면 :

$|=@f=("s O(',' {{ >{{","s}}('_'){{s","}}< }} ',')O s");$d=1;@o=split//," *Oo. ";{$_="\r|".$"x$x.$f[$d+1].$"x(44-$x).'|';s/O/$o[$b]/;s/s/    /g;print;if($b||$t){$b--if$b;if($t){$d+=$t;$t=0if$d}}else{$x+=$d;$t=($x<1)-($x>43);if(!$t){$b=5if.9<rand;if(.7<rand){$t=-$d;$b=0}}}sleep 2;redo}

어디서 선회합니까? $d=0"필요한 회전"사례에서 설정 을 볼 수 없습니다 .
John Dvorak

1
sleep2(공간없이) 나를 위해 작동하지 않습니다; 또한 회전 할 때 물고기의면이 정렬되지 않습니다. 그리고 거품은 결코 나타나지 않는 것 같습니다.
찌를

"또한 타이머는 2000ms 사이에 부과됩니다. 이것은 필수입니다." -이것은 전혀 일어나지 않습니다. 또한 거품이 나타나지 않고 물고기가 제자리에 있습니다. 물고기가 아니라 몸의 중심을 회전하는 동안 또한, 헤드가 제자리에 유지해야한다 (적어도 그 무엇 예제 방송)
존 드보락

드랏! 너무 열심히 골프. 수면 공간이 필요합니다! 물고기도 멋지게 거품을 일으켰습니다!
잠깐만

죄송합니다-가장자리를 돌 때 중간에 머리를 잊었습니다-재 작업이 필요합니다 ...
KevinColyer

2

C, 400 394 373 자

#define p printf
#define a(x) l[5]=r[11]=x;d();
char *l="      (',' {{ >{{",*f="    }}('_'){{    ",*r="}}< }} ',')      ",*c,s=7,i,*T;d(){p("|");for(i=0;i<s;i++)p(" ");p(c);for(i=0;i<70-s;i++)p(" ");puts("|");sleep(2);}b(){a(46)a(111)a(79)a(42)a(32)}t(){T=c;c=f;d();c=T==r?l:r;d();}m(){c==l?s--:s++;d();s>69||s<1?t():0;}main(){c=r;for(d();;)i=rand()%10,i?i>6?t():m():b();} 

공백으로 :

#define p printf
#define a(x) l[5]=r[11]=x;d();
char *l="      (',' {{ >{{",
     *f="    }}('_'){{    ",
     *r="}}< }} ',')      ",
     *c, 
     s=7,
     i,  
    *T; 
d(){
  p("|");
  for(i=0;i<s;i++)
    p(" ");
  p(c);
  for(i=0;i<70-s;i++)
    p(" ");
  puts("|");
  sleep(2);
}
b(){
  a(46)
  a(111)
  a(79)
  a(42)
  a(32)
}
t(){
  T=c;
  c=f;
  d();
  c=T==r?l:r;
  d();
}
m(){
  c==l?s--:s++;
  d();
  s>69||s<1?t():0;
}
main(){
  c=r;
  for(d();;)
    i=rand()%10,
    i?i>6?t():m():b();
}

1
i==l?(c=r):(c=l)단축 될 수 있습니까 c=i==l?r:l?
John Dvorak

할 수있을 것 같습니다. 감사!
Josh

다음과 같은 방법으로 몇 가지 문자를 저장할 수 있습니다#define p printf(
0mr8spkT 슬래시 pastebin.com

@Ace gcc는 내가 그렇게 할 때 그것을 좋아하지 않습니다.
Josh

그것은 나를 위해 작동합니다. oi41.tinypic.com/15fqbvb.jpg
pastebin.com 슬래시 0mr8spkT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.