বক্স অ্যানিমেশন এএসসিআইআই বল


11

এমন একটি প্রোগ্রাম লিখুন যা *একটি আয়তক্ষেত্রের ভিতরে চলন্ত ASCII বল প্রদর্শন করে (সীমানা সহ 20 বাই 10 অক্ষর)। বলটি অবশ্যই আয়তক্ষেত্রটি অতিক্রম করবে না, উদাহরণস্বরূপ যখন প্রাচীরটি হিট করবে তখন সেটিকে বন্ধ করবে। দৃশ্যটি অবশ্যই সাফ হওয়া উচিত এবং প্রতি 0.1 সেকেন্ডে পুনরায় ছবি আঁকতে হবে এবং বলটি অবশ্যই প্রতিটি ফ্রেমে x এবং y দিকের মধ্যে 1 চর স্থানান্তর করতে হবে। যে কোনও ভাষার লিখিততমতম প্রোগ্রামটি জিততে পারে।

উদাহরণ আউটপুট (ফ্রেম 1)

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

উদাহরণ আউটপুট (ফ্রেম 2)

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

উদাহরণ আউটপুট (ফ্রেম 8)

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

উদাহরণ আউটপুট (ফ্রেম 9)

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

4
99 নিউলাইন মুদ্রণ স্ক্রিন সাফ করার যোগ্যতা অর্জন করবে?
ভেন্টোরো

1080x1920রেজোলিউশন সহ আমার মনিটরে নেই :)
মেল্লামোকব

উত্তর:


7

রুবি 1.9, 115 টি অক্ষর

আন্দোলন যুক্তিবিজ্ঞান বেশ অনুরূপ Danko এর উত্তর

এই সংস্করণটি কেবল লিনাক্সে পরীক্ষা করা হয়েছে।

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}

উইন্ডোজ 7 এর অধীনে রুবি 1.9.3 সহ, স্ক্রিনে puts"\e[2J"কেবল ←[2J(এবং একটি নতুন লাইন) মুদ্রণ করে।
মাঝামাঝি

@res আমার সম্পাদনাটি এমন সংস্করণের জন্য দেখুন যা উইন্ডোতে চলবে (দুর্ভাগ্যক্রমে এটি নিজে পরীক্ষা করতে পারে না)।
ভেন্টোরো

ব্যবহার করা clsআমার পক্ষে কাজ করে না, তবে system ("cls")তা করে।
মাঝামাঝি

@res `ক্লস` ব্যবহার করেন` আক্ষরিক ব্যাকটিক্স।
মার্ক রিড

@ মার্করিড - এটিই আমি লেখার চেষ্টা করেছি .. যাইহোক, এটি কার্যকর হয় না। উইন্ডোজকে সিস্টেমের প্রয়োজন বলে মনে হচ্ছে ("ক্লস")।
মাঝামাঝি

4

পাওয়ারশেল, 144 টি অক্ষর

জোয়ের দুর্দান্ত উত্তরের উপর ভিত্তি করে , বল স্থানাঙ্কগুলি ফ্রেম সূচক (i) এর একটি ফাংশন হিসাবে ব্যবহার করে, তাই আপনার মতো কিছু থাকলে x=n-abs(n-(i mod (2*n)))এক্স 0 থেকে এন, ফিরে 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}যা ifএর আগে চারটি প্রতিস্থাপন করেছে ;-)। যদিও আমি নিশ্চিত যে এখানে একটি সূত্র থাকতে হবে।
জোয়

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)

দ্রষ্টব্য: উইন্ডোজ কমান্ড কনসোলটিতে কাজ করে। অন্যান্য অপারেটিং সিস্টেমগুলি clsস্ক্রিনটি সাফ করার চেয়ে আলাদা কমান্ড ব্যবহার করতে পারে , যেমনclear


না print "\e[H\e[2J"Windows এ কাজ করে?
প্যাট্রিক অসিটি

@ প্যাডে - উইন্ডোজ under এর অধীনে আপনার রুবি প্রোগ্রামটি চালানোর সময় এটি কার্যকর হবে বলে মনে হয় না (আপনার পোস্টে আমার মন্তব্য দেখুন)।
মাঝামাঝি

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}

Ungolfed:

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খুব কাজ করা উচিত নয় ?
জোয়ি

না, না। SyntaxError: (irb):1: no .<digit> floating literal anymore; put 0 before dot। তবে ভবিষ্যতে যদি আমার এটির প্রয়োজন হয় তবে আমি ফিরে আসব, ধন্যবাদ!
প্যাট্রিক অসিটি

আপনি 1.9 করছেন, তাহলে আপনি কিছু বিষয় কমান গৃহস্থালির কাজ লিটারেল ব্যবহার করতে পারেন, যেমন ?*পরিবর্তে '*', ইত্যাদি
জোয়ি

উইন under এর অধীনে রুবি ১.৯.৩ ব্যবহার করে, এই মুদ্রণগুলি একের পরের (নীচে) আয়তক্ষেত্র হয়, প্রত্যেকটি ←[2J←[f+------------------+প্রথম লাইন হিসাবে থাকে।
মাঝামাঝি

তারপরে পরিবর্তিত $> << "\e[2J\e[f"+fকরুন 'cls';$><<f(এর জন্য ব্যাকটিক্স ব্যবহার করুন cls)
প্যাট্রিক অসসিটি

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) আরও কার্যকর করার পদ্ধতি ব্যবহার করে approach বাকিটি কোড অঙ্কন করছে।


2

পাওয়ারশেল, 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

কিউবাসিক (কিউবি 64), 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

-5 বাইট DLosc ধন্যবাদ


নিস! অসীম লুপের জন্য, আপনি 5 বাইটের DO ... LOOPজায়গায় ব্যবহার করতে পারেন WHILE 1 ... WENDএবং সংরক্ষণ করতে পারেন ।
DLosc

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 টি অক্ষর

৩৫ জন চরিত্র @ ভেন্টোরোর উত্তর নিয়ে লজ্জা পেয়েছে, তবে আমি অভিভূত হয়েছিলাম যে সত্য যুক্তিটির তুলনায় অপেক্ষাকৃত সরল পদ্ধতি ব্যবহার করার পরেও আমি এটিকে নামতে পেরেছি। ^ [একটি আক্ষরিক 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

আর, 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 টি অক্ষর ব্যবহার করা হয়েছে, 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

পাওয়ারশেল, 139 বাইট

ডানকো দুর্বিয়ের উত্তর দ্বারা অনুপ্রাণিত ।

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

বাশ 278 300, 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"

এটি প্রতিস্থাপন। বাইনারি 0x1 বি হিসাবে এটি 3 টি অক্ষর সংক্ষিপ্ত; আমি "\ ই" এর জন্য মাত্র 1 গণনা করি কারণ কেবলমাত্র লেআউটিং সফ্টওয়্যারই আমাকে ব্যবহার করতে বাধ্য করে \e


একজন অনামী ব্যবহারকারী সম্পাদনাগুলি $ভিতরে প্রতীকগুলি সরিয়ে এবং একই লাইনের সাথে একই জায়গায় ((...))প্রতিস্থাপন করার পরামর্শ দিয়েছিল । (তারা পালানোর চরিত্রটি ব্যবহার করার পরামর্শও দিয়েছিল )। x=$(($x+$p))((x+=p))\e
পিটার টেলর

আমি এটির সাথে \*প্রতিস্থাপন হিসাবে কাজ করতে পারে তার পাশাপাশি প্রস্তাব করব "*"
পিটার টেলর

@ পিটারটেলর: বেনামে ব্যবহারকারীর জন্য ধন্যবাদ। আমি 1 নং পরামর্শটি অন্তর্ভুক্ত করেছি এবং পরিবর্তিত আকারে 2 ব্যবহার করি না এবং আপনার।
ব্যবহারকারী অজানা

@ ইউজারুননড: আপনার 1,337স্থায়ীভাবে স্থায়ীভাবে তালাবদ্ধ হওয়া দরকার: পি
মেল্লামোকব

1
@ মেল্লামোকব: শেষ হয়ে গেছে।
ব্যবহারকারী অজানা

0

টিআই বেসিক, 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 লাইনটি গল্ফ করতে পারি তবে এই মুহুর্তে আমি নিশ্চিত নই
এমআই রাইট

@ মিআইরাইট আমি উত্তরগুলি কোথায় রাখব?
ফেজ

"| \ Output(O,1,Ans \ Output(O,20,Ansকাজ করা উচিত.
এমআই রাইট

@ মিআইরাইট কিন্তু এটি কি দুটি চরিত্রের স্ট্রিংকে তিনটি অক্ষরের স্ট্রিংয়ের পরিবর্তে নয়? এবং এর উপরে দুটি চরিত্রের স্ট্রিং যুক্ত করছেন, এটি +4 করে?
ফেজ

আপনি কি বোঝাতে চেয়েছেন? Ansএকটি হল এক বাইট টোকেন সঙ্গে টাইপ করা 2nd (-)|টোকেনটি ক্যালকুলেটারে দুটি বাইট হওয়ায় এটি একটি বাইট সংরক্ষণ করবে।
এমআই রাইট

0

পিএইচপি, 196 186 148 বাইট

আমি 6 বাইট সংরক্ষণ করতে একটি পূর্ণসংখ্যার ওভারফ্লো এড়ানো সরিয়েছি। এটি প্রবাহিত হওয়ার আগে 29 বিলিয়ন বছর ধরে চলবে; 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 । পিএইচপি 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.