상자 애니메이션에서 ASCII 볼


11

*사각형 안에 움직이는 ASCII 공을 표시하는 프로그램을 작성하십시오 (경계를 포함하여 20 x 10 자). 공이 사각형을 가로 질러서는 안됩니다. 장면은 0.1 초마다 클리어되고 다시 그려 져야하며, 공은 프레임마다 x와 y 방향으로 1 문자 이동해야합니다. 모든 언어로 작성된 가장 짧은 프로그램이 이깁니다.

출력 예 (프레임 1)

+------------------+
|*                 |
|                  |
|                  |
|                  |
|                  |
|                  |
|                  |
|                  |
+------------------+

출력 예 (프레임 2)

+------------------+
|                  |
| *                |
|                  |
|                  |
|                  |
|                  |
|                  |
|                  |
+------------------+

출력 예 (프레임 8)

+------------------+
|                  |
|                  |
|                  |
|                  |
|                  |
|                  |
|                  |
|       *          |
+------------------+

출력 예 (프레임 9)

+------------------+
|                  |
|                  |
|                  |
|                  |
|                  |
|                  |
|        *         |
|                  |
+------------------+

4
99 개의 줄 바꿈을 인쇄하면 화면을 지우는 것으로 인정됩니까?
Ventero

1080x1920해상도 와 모니터에 없습니다 :)
mellamokb

답변:


7

루비 1.9, 115 자

운동 논리는 Danko답변 과 매우 유사합니다 .

이 버전은 Linux에서만 테스트되었습니다.

p=0
loop{u=(?|+?\s*18+"|
")*8
u[165-21*(7-p%14).abs-(17-p%34).abs]=?*
p+=1
puts"\e[2J",r=?++?-*18+?+,u,r
sleep 0.1}

Windows 7에서 Ruby 1.9.3 을 사용하면 화면에 새 줄이 puts"\e[2J"인쇄 ←[2J됩니다.
res

@res Windows에서 실행해야하는 버전에 대한 편집 내용을 참조하십시오 (불행히 직접 테스트 할 수는 없음).
Ventero

사용 cls은 저에게 효과적이지 않지만 작동합니다 system ("cls").
res

@res는`cls`를 사용합니다. 리터럴 백틱.
Mark Reed

@MarkReed-내가 쓰려고했던 것입니다. 어쨌든 작동하지 않습니다. Windows에는 시스템 ( "cls")이 필요한 것 같습니다.
res

4

Powershell, 144 자

공 좌표가 프레임 인덱스 (i)의 함수라는 사실을 사용하여 Joey의 탁월한 대답을 기반으로 하므로 x=n-abs(n-(i mod (2*n)))x 와 같은 것이 있으면 x는 0에서 n으로, 다시 0으로 이동합니다.

for(){cls
($l="+$('-'*18)+")
7..0|%{$j=$_
"|$(-join(17..0|%{'* '[$j-[Math]::abs(7-$i%14)-or$_-[Math]::abs(17-$i%34)]}))|"}
$l;$i++;sleep -m 100}

좋은데 비록 내가 if(-1,18-eq$x){$a*=-1;$x+=2*$a}if(-1,8-eq$y){$b*=-1;$y+=2*$b}4 if초 전에 대체 한 것을 자랑스럽게 생각했지만 ;-). 그래도 공식이 있어야한다고 확신했습니다.
Joey

3

파이썬 2, 234

나는 이것이 더 많은 골프를 칠 수 있다고 확신하지만, 나는 여기에 소파가있는 것입니다. 나중에 더 많은 작업을 할 것입니다

import os,time
a,b,c,d,e,n='+- |*\n'
w=d+c*18+d+n
s=a+b*18+a+n
x,y=0,0
g,h=17,7
j,k=1,1
while 1:
 if 0>x or x>g:j*=-1;x+=j
 if 0>y or y>h:k*=-1;y+=k
 os.system('cls');print s+w*y+d+c*x+e+c*(g-x)+d+n+w*(h-y)+s;x+=j;y+=k;time.sleep(0.1)

참고 : Windows 명령 콘솔에서 작동합니다. 다른 운영 체제는 cls화면을 지우는 것과 다른 명령을 사용할 수 있습니다.clear


수행 print "\e[H\e[2J"창 작업을?
Patrick Oscity

@padde-Windows 7에서 Ruby 프로그램을 실행할 때 작동하지 않는 것 같습니다 (게시물에 대한 내 의견 참조).
res

3

루비 ( 179 174 147)

EDIT 는 더 많은 문자를 제거했습니다.

l=?++?-*18+?++?\n
c=?|+?\s*18+?|+?\n
p=22
u=v=1
loop{f=l+c*8+l
f[p]=?*
puts"\e[2J"+f
p+=(u=f[p+u]==' '?u:-u)+21*(v=f[p+21*v]==' '?v:-v)
sleep 0.1}

편집 은 이제 174 개 문자를 제거했습니다.

l="+#{'-'*18}+\n";f=l+"|#{' '*18}|\n"*8+l;x=y=u=v=1
loop{f[21*y+x]='*';$><<"\e[2J\e[f"+f;f[21*y+x]=' '
u=f[21*y+x+u]==' '?u:-u;v=f[21*(y+v)+x]==' '?v:-v
x+=u;y+=v;sleep 0.1}

언 골프 드 :

l="+#{'-'*18}+\n"           # top and bottom lines 
f=l+"|#{' '*18}|\n"*8+l     # complete box as string
x=y=u=v=1                   # x,y position; u,v next move
loop {                      #
  f[21*y+x]='*'             # add ball to box
  $> << "\e[2J\e[f"+f       # clear screen and print box with ball
  f[21*y+x]=' '             # remove ball from box
  u=f[21*y+x+u]==' '?u:-u   # next move in x direction
  v=f[21*(y+v)+x]==' '?v:-v # next move in y direction
  x+=u                      # perform move
  y+=v                      # --"--
  sleep 0.1                 # .zZZ...
}                           #

sleep .1너무 작동 하지 않아야 합니까?
Joey

아니요, 1.9가 아닙니다. SyntaxError: (irb):1: no .<digit> floating literal anymore; put 0 before dot. 하지만 나중에 필요할 경우 다시 연락 드리겠습니다. 감사합니다!
Patrick Oscity

1.9를 사용하는 경우 char 리터럴을 사용하여 몇 가지를 줄일 수 있습니다 (예 : ?*대신 '*').
Joey

Win7에서 Ruby 1.9.3을 사용하면 각 ←[2J←[f+------------------+행이 첫 번째 줄인 사각형이 하나씩 인쇄됩니다 (아래) .
res

다음으로 변경 $> << "\e[2J\e[f"+f하십시오 'cls';$><<f(백틱 사용 cls)
Patrick Oscity

2

자바 스크립트 (275 283 )

s=Array(19).join(' ');n='\n';z=Array(9).join('|'+s+'|'+n).split(n,8);
x=y=0;a=b=1;t='+'+s.replace(/ /g,'-')+'+';
setInterval(function(){u=z[y];z[y]=u.replace(eval('/( {'+x+'}) /'),'$1*');
$('#o').text(t+n+z.join('\n')+n+t);z[y]=u;x+=a;y+=b;if(!x|x==17)a=-a;if(!y|y==7)b=-b},100)

데모 : http://jsfiddle.net/eKcfu/2/

나는 이것을 꽤 빨리 작성 했으므로 여전히 개선의 여지가 약간 있다고 확신합니다. 제안은 환영합니다 :)

편집 1 : 불필요한 별도의 함수 호출을 제거하고에 직접 포함하십시오 setInterval.


2

하스켈, 212 자

import System
main=mapM_ f$s 19`zip`s 9
s n=[2..n]++[n-1,n-2..3]++s n
f p=r"clear">>putStr(unlines[[" |-+*"!!(19#i+2*(9#j)+4*e((i,j)==p))|i<-[1..20]]|j<-[1..10]])>>r"sleep 0.1"
b#n=e$n<2||n>b
e=fromEnum
r=system

각 좌표에 대해 무한 시퀀스를 만든 다음 함께 압축하여 (2 및 3 행) 좌표 계산에보다 기능적인 접근 방법을 사용합니다. 나머지는 그림 코드입니다.


2

PowerShell을 184 185 215

몸이 아플 때 뇌가 제대로 작동하지 않기 때문에 반 골프 만 가능합니다 ...

그래도 몇 가지 좋은 요령이 있습니다.

for($a=$b=1){cls
($l="+$('-'*18)+")
0..7|%{$j=$_
"|$(-join(0..17|%{'* '[$j-$y-or$_-$x]}))|"}
$l
$x+=$a;$y+=$b
if(-1,18-eq$x){$a*=-1;$x+=2*$a}if(-1,8-eq$y){$b*=-1;$y+=2*$b}sleep -m 100}

[편집] : 필드를 반복하는 것이 훨씬 짧습니다.


2

QBASIC (QB64) 178 173 바이트

a$="+------------------+
?a$
for c=1to 8
?"|                  |
next
?a$
do
x=19-abs(17-(i mod 34))
y=9-abs(7-(i mod 14))
locate y,x
?"*
_delay .1
locate y,x
?" "
i=i+1
loop

DLosc 덕분에 -5 바이트


좋은! 무한 루프의 경우 5 바이트 DO ... LOOP대신 사용 하여 WHILE 1 ... WEND저장할 수 있습니다 .
DLosc 2018 년

1

펄 5, 141 자

print"\e[H\e[2J",$h="+"."-"x18 ."+
",(map{"|".$"x$q,(abs$t%14-7)-$_?$":"*",$"x(17-$q),"|
"}0..7),$h,select'','','',0.1while$q=abs$t++%34-17,1

예제 출력과 같이 왼쪽 상단에서 시작하지 않지만 요구 사항으로 표시되지는 않습니다.


1

루비 1.9, 162 자

@Ventero의 대답에 35 문자가 부끄러워졌지만 실제 논리에 비교적 간단한 접근 방식을 사용 하면서이 문제를 해결할 수 있다는 것에 깊은 인상을 받았습니다. ^ [는 리터럴 ESC (1 문자)입니다.

x=y=0
v=h=1
s=' '
loop{puts"^[[2J"+b="+#{?-*18}+",*(0..7).map{|i|"|#{i!=y ?s*18:s*x+?*+s*(17-x)}|"},b
y+=v
y+=v*=-1if y<0||y>7
x+=h
x+=h*=-1if x<0||x>17
sleep 0.1}

1

R, 233 자

s=c("\n+",rep("-",18),"+");for (j in 1:8){cat(s,sep="");cat(rep(c("\n|",rep("",17),"|"),j-1));cat(c("\n|",rep(" ",j-1),"*",rep(" ",18-j),"|"),sep="");cat(rep(c("\n|",rep("",17),"|"),8-j));cat(s,sep="");Sys.sleep(0.1);system("clear")}

1

또 다른 배쉬 항목 -213 204 문자

실제로 수상자는 아니지만 그럼에도 불구하고 재미있었습니다. 도면에 vt100 문자 시퀀스를 사용합니다. (여기에보고 된 코드는 가독성을 위해 215자를 사용합니다. 예를 들어 '*'-> \ *

e(){ printf "\e[$1";}
e 2J;e H
h='+------------------+'
echo $h
for((;++j<9;));do printf '|%18s|\n';done
echo $h
e '3;2H*'
while :;do
e 'D '
((i/17%2))&&e D||e C
((++i/7%2))&&e A||e B
e 'D*'
sleep .1
done

1

파워 쉘, 139 바이트

Danko Durbić의 답변에서 영감을 얻었습니다 .

for(){cls
,"+$('-'*18)+
"*2-join("|$(' '*18)|
"*8-replace"^(\W{$(21*[Math]::abs(7-$i%14)+[Math]::abs(17-$i++%34))}.) ",'$1*')
sleep -m 100}

이 스크립트는 -replace연산자를 사용 *하여 사각형 내부를 그 립니다 .

작동 방식을 설명하는 덜 골프 스크립트 :

for(){
    cls
    $y=[Math]::abs(7-$i%14)
    $x=[Math]::abs(17-$i++%34)
    $b="+$('-'*18)+`n"
    $m="|$(' '*18)|`n"*8-replace"^(\W{$(21*$y+$x)}.) ",'$1*'
    ,$b*2-join($m)          # draw it
    sleep -m 100
}

0

배쉬 278300 , 296

h="+------------------+"
w="|                  |"
g(){
echo -e "\e[$2;$1H$3"
}
g 1 1 $h
for i in {1..8}
do
echo "$w"
done
echo $h
x=4
y=4
p=1
q=1
for((;;))
do
((x==19&&p==1||x==2&&p==-1))&&p=-$p
((y==9&&q==1||y==2&&q==-1))&&q=-$q
x=$((x+p))
y=$((y+q))
g $x $y \*
sleep .1
g $x $y " "
done

라인의 \ 전자는 echo -e "\e[$2;$1H$3"에 의해 제조 할 수있다

echo -e "\x1b"

그것을 대체하십시오. 이진 0x1b는 3 자 더 짧습니다. 레이아웃 소프트웨어 만 사용하도록 강제하기 때문에 "\ e"에 대해 1 만 계산합니다 \e.


익명 사용자 제안 편집은 제거하는 $내부 문자 ((...))및 교체 x=$(($x+$p))((x+=p))유사하게 다음 라인에. (또한 \e이스케이프 문자 사용 을 제안했습니다 ).
피터 테일러

\*대한 대안으로 작동 할 수도 있습니다 "*".
피터 테일러

@PeterTaylor : 익명의 사용자에게 감사합니다. 나는 제안 1을 통합하고 수정 된 형태로 2를 사용하지 않습니다.
사용자가 알 수 없음

@userunknown : 당신의있는 거 담당자 1,337의 요구가 영구적으로 제자리에 고정합니다 : P
mellamokb

1
@mellamokb : 사라졌습니다.
사용자가 알 수 없음

0

TI 기본, 169167 바이트

1→X
1→Y
1→S
1→T
While 1
ClrHome
Output(Y,X,"*
S(X>1 and X<20)+(X=1)-(X=20→S
T(Y>1 and Y<10)+(Y=1)-(Y=10→T
X+S→X
Y+T→Y
For(N,1,20,19
For(O,1,10,9
Output(O,N,"+
End
End
For(N,2,19
For(O,1,10,9
Output(O,N,"-
End
End
For(O,2,9
Output(O,1,"|
Output(O,20,"|
End
End

엄청 느리지 만 작동합니다.


(X=20)→S할 수있다 (X=20→S, 당신은 마지막을 위해 (루프에서 몇 바이트를 저장 Ans By의를 활용할 수 있습니다 내가 9 golfed 수있는 긍정적 인 라인 8을,하지만 난 어떻게 순간에 확실하지 않다..
MI 라이트

@MIWright Ans를 어디에 두겠습니까?
단계

"| \ Output(O,1,Ans \ Output(O,20,Ans작동해야합니다.
MI Wright

@MIWright하지만 두 문자열을 세 문자열로 바꾸지 않습니까? 그리고 그 위에 두 개의 문자열을 추가하면 +4입니까?
단계

무슨 소리 야? Ans로 입력 된 1 바이트 토큰 입니다 2nd (-). |토큰은 계산기에서 2 바이트 이므로 1 바이트를 절약 하게됩니다.
MI Wright

0

PHP, 196186148 바이트

6 바이트를 절약하기 위해 정수 오버플로를 피했습니다. 오버플로 전에 290 억 년 동안 실행될 것입니다. 32 비트 시스템에서 여전히 6.8 년. 그 말은 받아 들일 만하다.

위치를 조정하는 대신 위치를 계산하면 로트가 많이 절약되어 전체 로트를 한 번에 다른 로트로 준비 할 수있었습니다.

for(;++$i;$s[-3-21*abs($i%14-7)-abs($i%34-17)]="*",print$f(_,9e5,"
").$s.$z,usleep(1e5))$s=($f=str_pad)($z=$f("+",19,"-")."+
",189,$f("|",19)."|
");
").$z;

로 실행 -nr . PHP 7.1이 필요합니다.

고장 :

for(;++$i;      # infinite loop:
                    # 2. set asterisk at appropriate position
    $s[-3-21*abs($i%14-7)-abs($i%34-17)]="*";
                    # 3. clear screen: print 900k newlines
    print$f(_,9e5*0+2,"\n")
            .$s.$z, # 4. print field
    usleep(1e5))    # 5. sleep 100000 microseconds
                    # 1. create template
    $s=($f=str_pad)($z=$f("+",19,"-")."+\n",189,$f("|",19)."|\n");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.