बॉक्स एनिमेशन में ASCII बॉल


11

एक प्रोग्राम लिखें जो *एक आयत के अंदर एक चलती ASCII गेंद को प्रदर्शित करता है (सीमा सहित 20 द्वारा 10 वर्ण)। गेंद को आयत को पार नहीं करना चाहिए, जैसे दीवार से टकराने पर टकराता है। हर 0.1 सेकंड में दृश्य को साफ़ किया जाना चाहिए और गेंद को हर फ्रेम में x और y दिशा में 1 बार ले जाना चाहिए। किसी भी भाषा में लिखा गया सबसे छोटा कार्यक्रम जीत जाता है।

उदाहरण आउटपुट (फ्रेम 1)

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

उदाहरण आउटपुट (फ्रेम 2)

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

उदाहरण आउटपुट (फ्रेम 8)

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

उदाहरण आउटपुट (फ्रेम 9)

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

4
क्या 99 नई ख़ूबियाँ छापना स्क्रीन साफ़ करने के योग्य है?
वेंटरो

1080x1920संकल्प के साथ मेरे मॉनिटर पर नहीं :)
mellamokb

जवाबों:


7

रूबी 1.9, 115 वर्ण

आंदोलन का तर्क डैंको के उत्तर के समान है ।

यह संस्करण केवल लिनक्स पर परीक्षण किया गया है।

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 `cls` का उपयोग करते हैं। शाब्दिक बैकटिक्स।
मार्क रीड रीड

@MarkReed - यही मैंने लिखने की कोशिश की है। वैसे भी, यह काम नहीं करता है। विंडोज को सिस्टम ("cls") की आवश्यकता लगती है।
रेस

4

पॉवरशेल, 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}जो 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"खिड़कियों पर काम करता है ?
पैट्रिक ऑस्सिटी

@पैड - जब मैं विंडोज 7 के तहत आपका रूबी प्रोग्राम चलाता हूं, तो यह काम नहीं करता है (अपनी पोस्ट पर मेरी टिप्पणी देखें)।
रेस

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}

EDIT ने मुंहतोड़ जवाब दिया, अब 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काम भी नहीं करना चाहिए ?
जोई

नहीं, 1.9 में। SyntaxError: (irb):1: no .<digit> floating literal anymore; put 0 before dot। लेकिन मुझे लगता है कि अगर भविष्य में इसकी आवश्यकता है, तो मैं वापस आऊंगा, धन्यवाद!
पैट्रिक ऑस्सिटी

यदि आप 1.9 पर हैं, तो आप कुछ चीजों को छोटा करने के लिए चार शाब्दिक का उपयोग कर सकते हैं, जैसे कि ?*इसके बजाय '*', आदि
जॉय

Win7 के तहत रूबी 1.9.3 का उपयोग करते हुए, यह प्रिंट एक के बाद एक (नीचे) आयताकार करता है, प्रत्येक ←[2J←[f+------------------+पहली पंक्ति के रूप में होता है।
रेस

तो बदल $> << "\e[2J\e[f"+fकरने के लिए 'cls';$><<f(के लिए उपयोग बैकटिक cls)
पैट्रिक 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

पॉवरशेल, 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

-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 वर्ण

@ वेंटरो के जवाब से 35 साल शर्माने लगे, लेकिन मैं प्रभावित था कि मैं वास्तविक तर्क के लिए अपेक्षाकृत सरल दृष्टिकोण का उपयोग करते हुए इसे दूर तक प्राप्त कर सकता था। ^ [एक शाब्दिक ESC (1 char) है।

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 बाइट्स

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

बैश 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

लाइन में \ e echo -e "\e[$2;$1H$3"द्वारा उत्पादित किया जा सकता है

echo -e "\x1b"

इसे बदलने के लिए। बाइनरी 0x1 बी के रूप में यह 3 चार्ट छोटा है; मैं "\ e" के लिए सिर्फ 1 की गिनती करता हूं, क्योंकि केवल लेआउटिंग सॉफ़्टवेयर मुझे उपयोग करने के लिए मजबूर करता है \e


एक अनाम उपयोगकर्ता ने $प्रतीकों को अंदर हटाने ((...))और बदलने x=$(($x+$p))के लिए ((x+=p))और इसी तरह निम्नलिखित पंक्ति पर संपादन करने का सुझाव दिया । (उन्होंने \eपलायन चरित्र के लिए उपयोग करने का भी सुझाव दिया )।
पीटर टेलर

मैं इसके अलावा सुझाव देना चाहूंगा कि \*यह प्रतिस्थापन के रूप में काम कर सकता है "*"
पीटर टेलर

@PeterTaylor: अनाम उपयोगकर्ता को धन्यवाद। मैंने सुझाव संख्या 1 को शामिल किया, और संशोधित रूप में, और तुम्हारा 2 का उपयोग नहीं किया।
उपयोगकर्ता अज्ञात

@userunknown: आप 1,337स्थाई रूप से जगह में बंद होने की जरूरत के प्रतिनिधि हैं: P
mellamokb

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, और आप फ़ाइनल फॉर (लूप) में कुछ बाइट्स को बचाने के लिए Ans का लाभ उठा सकते हैं। मैं पॉज़िटिव लाइन्स 8 और 9 गोल्फ हो सकता हूं, लेकिन मुझे यकीन नहीं है कि इस समय कैसे हो।
MI राइट

@MIWright मैं Ans कहाँ रखूँगा?
चरण

"| \ Output(O,1,Ans \ Output(O,20,Ansकार्य करना चाहिए।
एमआई राइट

@MIWright लेकिन क्या तीन वर्ण स्ट्रिंग के साथ दो वर्ण स्ट्रिंग की जगह नहीं है? और इसके ऊपर दो वर्ण स्ट्रिंग जोड़कर, इसे +4 बना दिया है?
चरण

क्या मतलब? Ansएक है एक-बाइट टोकन , साथ टाइप किया 2nd (-)। यह एक बाइट की बचत को समाप्त कर देगा, क्योंकि |टोकन कैलकुलेटर पर दो बाइट्स है।
एमआई राइट

0

PHP, 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। 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");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.