ASCIIボールインボックスアニメーション


11

*四角形(境界を含む20 x 10文字)内に移動するASCIIボールを表示するプログラムを作成します。ボールが長方形を横切ることはできません。たとえば、壁に当たったときにぶつかります。シーンは0.1秒ごとにクリアおよび再描画する必要があり、ボールはフレームごとにxおよびy方向に1文字移動する必要があります。どの言語でも書かれた最短のプログラムが勝ちます。

出力例(フレーム1)

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

出力例(フレーム2)

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

出力例(フレーム8)

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

出力例(フレーム9)

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

4
99個の改行を印刷すると、画面をクリアする資格がありますか?
ヴェンテロ

私のモニターには1080x1920解像度がありません:)
mellamokb

回答:


7

Ruby 1.9、115文字

動作ロジックはダンコ答えに非常に似ています

このバージョンは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 Windowsで実行するバージョンの編集を参照してください(残念ながら自分でテストすることはできません)。
ヴェンテロ

使用clsは私にとっては機能しませんが、system ("cls")機能します。
解像度

@resは `cls`を使用します。リテラルバックティック。
マークリード

@MarkReed-それは私が書き込もうとしたものです。とにかく、それは動作しません。Windowsはsystem( "cls")を必要とするようです。
解像度

4

Powershell、144文字

ジョーイの優れた答えに基づいて、ボール座標はフレームインデックス(i)の関数であるという事実を使用しているため、次のようなものがある場合x=n-abs(n-(i mod (2*n)))、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秒前に置き換えた私のことをちょっと誇りに思っていましたが;-)。ただし、数式が必要であると確信していました。
ジョーイ

3

Python 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"Windowsで動作しますか?
パトリックオスシティ

@padde-Windows 7でRubyプログラムを実行すると動作しないようです(投稿への私のコメントをご覧ください)。
解像度

3

ルビー(179 174 147)

編集はさらにいくつかの文字を取り除きました:

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ですか?
ジョーイ

いいえ、1.9ではありません。SyntaxError: (irb):1: no .<digit> floating literal anymore; put 0 before dot。しかし、将来必要になった場合はそのことに戻ります、ありがとう!
パトリックオスシティ

1.9を使用している場合は、charリテラルを使用して、などの?*代わりにいくつかの項目を短縮できます'*'
Joey

Win7でRuby 1.9.3を使用すると、長方形が次々に(下に)印刷さ←[2J←[f+------------------+れ、それぞれが最初の行になります。
解像度

次に(にバック$> << "\e[2J\e[f"+f'cls';$><<fcls
ティックを

2

JavaScript(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

Haskell、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

1

Perl 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

Ruby 1.9、162文字

35文字は@Venteroの答えに恥ずかしがり屋ですが、実際のロジックに対して比較的簡単なアプローチを使用しながら、これまでのところそれを解決できることに感銘を受けました。^ [は、リテラル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

別のbashのエントリ- 213の 204文字

本当に受賞者ではありませんが、それでも楽しかったです。描画にはvt100文字シーケンスを使用します。(ここで報告されるコードは読みやすさのために215文字を使用しています。2文字はエスケープすることで削除できます。例: '*'-> \ *

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

Powershell、139バイト

DankoDurbićの回答に触発されました。

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

\行でeは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ベーシック、169 167バイト

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、あなたは(ループの最終的に数バイトを保存するために答を利用することができ、私はポジティブライン8と9がgolfedことができるんだけど、私は確かにどのように現時点ではないよ。。
MIライト

@MIWright私はAnsをどこに置きますか?
フェーズ

"| \ Output(O,1,Ans \ Output(O,20,Ans動作するはずです。
MIライト

@MIWrightしかし、それは2文字の文字列を3文字の文字列に置き換えませんか?そして、その上に2文字の文字列を追加して、+ 4にしますか?
フェーズ

どういう意味ですか?Ansは、で入力される1バイトのトークン2nd (-)です。|トークンは電卓上で2バイトであるため、最終的には1バイト節約されます。
MIライト

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.