वन लाइन एक्वेरियम


31

मेरे सास-ससुर उनके कोठी में एक मछली का बच्चा है, जो कोई से भरा है। यह वास्तव में मेरे दिमाग को पार नहीं करता था जब तक कि मैंने अपने कोड से निम्नलिखित अर्क को नहीं देखा था।

',') & '_'

... मैं मछली-चेहरे मेरी स्क्रीन से मुझे देख रहा था ...

जिसने मुझे एक महान विचार दिया है ...

आपके लिए मेरी खोज, मेरे प्यारे गोल्फरों, एक-एक ASCII एक्वेरियम बनाना है, जिसमें निम्नलिखित नियम हैं:

  • टैंक के दूसरी तरफ से टैंक के दूसरी तरफ के एक्वेरियम का आकार 60 अक्षरों से छोटा नहीं होना चाहिए और 80 वर्णों से बड़ा नहीं होना चाहिए। टैंक के पक्षों को पाइप / बार ( |) वर्ण का उपयोग करके इंगित करने की आवश्यकता है ।
  • मछली को टैंक के किनारों के बीच दाएं से बाएं "तैरना" करने में सक्षम होना चाहिए। जैसा कि वे मोड़ रहे होंगे, एक दिशा से दूसरी दिशा में संक्रमण के लिए एक सामने का दृश्य आवश्यक है।
  • मछली को निम्न जैसा दिखना चाहिए:

    • }}< }} ',') मछली तैरना सही है
    • (',' {{ >{{ मछली तैरना छोड़ दिया
    • }}('_'){{ सामने की ओर मछली
  • जब कोई मछली दिशा बदलने (30% मौका) की ओर मुड़ती है, तो उसे एक दिशा से शुरू होना चाहिए, सामने की ओर, फिर दूसरी दिशा का सामना करना चाहिए ... सुनिश्चित करें कि मछली के मुड़ने के लिए पर्याप्त जगह है, अर्थात इससे पहले छह स्थानों की आवश्यकता होती है। न्यूनतम टैंक के किनारे ...

  • जब तक एक मछली बुलबुले या बदलती दिशा में बह रही है, तब तक यह उस दिशा में जारी रहेगा जो सामना कर रहा है, अगर यह टैंक के किनारे के छह स्थानों के भीतर हो जाता है, तो यह दिशा बदल देगा।
  • मछली (बाएं या दाएं) का सामना कर सकती है (10% मौका) उत्तराधिकार में बुलबुले को रोकने के लिए ( .oO*), इसलिए मछली को बुलबुले के अस्तित्व के लिए उनके बगल में एक स्थान उपलब्ध होना आवश्यक है, इसलिए एक मछली हो सकती है केवल पक्षों के करीब तैरें, एक स्थान को बचाएं। मछली के हिलने से पहले बुलबुला गायब हो जाना चाहिए ...

मछलियों के व्यवहार की उदाहरण लाइनों की एक श्रृंखला, -रिक्त स्थान का संकेत देने वाले पात्रों के साथ , क्योंकि यहाँ पर कोड डिस्प्ले फीचर थोड़ा सख्त है ... मुझे उम्मीद है कि जब आप इसे कोड करेंगे तो इन डैश को रिक्त स्थान से बदल दिया जाएगा ...

यहां प्रत्येक पंक्ति को समय-चूक में एक फ्रेम माना जा सकता है।

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

आदि उपरोक्त उदाहरण है, जैसा कि मैंने कहा, छोटा है, लेकिन आप सामान्य विचार प्राप्त करते हैं ...

सबसे छोटा कोड जीतता है ...

मैं एक ही लाइन (यदि संभव हो) पर आउटपुट की उम्मीद कर रहा हूं, यदि नहीं, तो उत्तराधिकार में फ्रेम के बाद फ्रेम प्रदर्शित करना ठीक है ... चाहे आप एक लाइन पर जाएं या कई लाइनें आपके ऊपर हैं। यदि आप कई लाइनें कर रहे हैं, तो उन्हें एक नई रेखा से अलग किया जाना चाहिए।

इसके अलावा फ्रेम, 2000ms के बीच एक टाइमर लगाया जाता है। यह अनिवार्य है

आइए देखें कि आपको क्या मिला है!


यदि मछली एक्वेरियम के किनारे के बहुत करीब पहुंच जाती है, तो क्या इसे चालू करना आवश्यक है, या यह स्क्रीन से बाहर हो सकता है? क्या यह संभव है कि मछली इस स्थिति में बुलबुले उड़ाए? इसके अलावा, यह संभव है (या क्या यह निषिद्ध है, या उत्तराधिकार में दो बार बुलबुले उड़ाने के लिए मछली के लिए अनुमति दी गई है लेकिन इसकी आवश्यकता नहीं है)।
जॉन ड्वोरक

1
रुको, नहीं, इस तरह से बदलाव मत करो! मैंने पहले ही कोडिंग शुरू कर दी है! क्या आप वापस लुढ़कने का मन करेंगे?
जॉन ड्वोरक

5
कृपया अगली बार सैंडबॉक्स का उपयोग करें ।
जॉन ड्वोरक

1
यह स्पष्ट रूप से नहीं कहा गया है, लेकिन मुझे लगता है कि मछलीघर में बिल्कुल एक मछली होना चाहिए?
जॉन ड्वोरक

1
यह है के लिए आवश्यक है कि मछली मई बुलबुला दो बार लगातार, या हम कर रहे हैं की अनुमति दी यह हो जाने के लिए? यह मेरे लिए तीन-चरित्र का अंतर बनाता है।
जॉन ड्वोरक

जवाबों:


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)

पायथन में गोल्फिंग हमेशा बयानों की मांग की वजह से मुश्किल होता है, लेकिन इसके बावजूद, यह अविश्वसनीय रूप से अच्छी तरह से चला गया!

मुझे इतना आगे गोल्फ में मदद करने के लिए अस्थिरता और डीएसएम के लिए बड़ा धन्यवाद।

साफ संस्करण

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]}

मछली ग्यारह वर्ण लंबी है, जिससे मछलीघर 6 * 9 + 11 + 2 = 67 वर्ण चौड़ा हो जाता है, जो आवश्यक सहिष्णुता में बड़े करीने से फिट बैठता है।

fलैम्ब्डा समारोह सभी बड़े कार्य करता है: यह तर्क की एक जोड़ी है, तो मछलीघर पर प्रतिस्थापन लागू करने के लिए प्रयास के रूप में एक प्रतिस्थापन स्वीकार करता है। यदि यह सफल होता है, तो यह एनीमेशन के एक फ्रेम को पेंट करता है। इसके बाद सफलता मूल्य 2(देरी से लिया गया) या nil(निष्पादित नहीं होने की देरी ) के रूप में रिपोर्ट करता है ।

मछली लगातार दो बार बुलबुले नहीं उड़ाएगी। (फिक्स: ...while rand>0.1- 4 चैकर)

मछली एक मजबूर मोड़ से पहले भी बुलबुले उड़ा सकती है। (फिक्स: शाखा संरचना को फिर से व्यवस्थित करें)

एक फ्रेम है जहां बुलबुला पूरी तरह से (सहित *) चला गया है, लेकिन मछली परिणामस्वरूप शून्य में नहीं गई है। यह अक्षर का अनुसरण करता है, लेकिन उदाहरण का नहीं। (फिक्स: के f[?*,w]साथ बदलें q[?*]=w- मुक्त)

कंसोल को साफ़ नहीं करता है। फिक्स: ऐड `clear`(यूनिक्स) या system 'cls'से पहले (विंडोज कंसोल) 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?
जॉन ड्वोरक

1
नहीं, \rगाड़ी वापसी है। $><<qआउटपुट के लिए उपयोग करने से कर्सर एक ही लाइन ( आउटपुट के बाद putsबलों \n) में \rरहेगा इसलिए अगला आउटपुट शुरू करने से वर्तमान लाइन की शुरुआत में वापस कूद जाएगा और वहां से आउटपुट शुरू होगा। इस प्रकार एक्वैरियम लाइन की पिछली "छवि" को ओवरराइट करता है।
प्रातः

@manatwork दुर्भाग्य से, यह पूरी तरह से jRuby इंटरएक्टिव विंडो को गड़बड़ करता है, जो इसे अनदेखा करता है \r
जॉन ड्वोरक

ओह। ऐसा सुनने के लिए क्षमा करें। और जानकारी के लिए धन्यवाद। अफसोस की बात है कि यह पहला तथ्य है जो मैंने जॉबी के बारे में सीखा है। :(
मैनटवर्क

3

आर, 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
}

यह एक्वेरियम को एक ही लाइन पर स्टडआउट के रूप में प्रिंट करता है (तब 2 एस ब्रेक होता है और टी + 1 पर एक्वेरियम से पहले गाड़ी वापस लौट जाती है)।


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"आवश्यक मोड़" मामले में सेटिंग नहीं देख सकता ।
जॉन ड्वोरक

1
sleep2(स्पेस के बिना) मेरे लिए काम नहीं कर रहा है; जब आप मुड़ रहे हों, तो आप मछली के चेहरे को संरेखित न रखें। और बुलबुले कभी दिखाई नहीं देते।
प्रहार

"इसके अलावा फ्रेम, 2000ms के बीच एक टाइमर लगाया गया है। यह अनिवार्य है।" - मेरे लिए ऐसा बिल्कुल नहीं है। इसके अलावा, बुलबुले दिखाई नहीं देते हैं, मछली बस जगह में बैठती है। इसके अलावा, मछली को मोड़ते समय सिर को जगह पर रहना चाहिए, न कि शरीर के केंद्र (कम से कम जो उदाहरण से पता चलता है)
जॉन ड्वोरक

Drat! गोल्फ भी मुश्किल है। नींद के साथ एक अतिरिक्त स्थान की आवश्यकता है! मछली भी अच्छी तरह से बुदबुदा रही थी! रुको ...
केविनकोलियर

उफ़ - किनारों को
मोड़ते

2

सी, 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?
जॉन ड्वोरक

ऐसा लगता है कि यह हो सकता है। धन्यवाद!
जोश

आप कुछ पात्रों को सहेज सकते हैं#define p printf(
pastebin.com स्लैश 0mr8spkT

@ कोई भी ऐसा नहीं करता है जब मैं ऐसा करता हूं।
जोश

इससे मेरा काम बनता है। oi41.tinypic.com/15fqbvb.jpg
pastebin.com स्लैश 0mr8spkT
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.