พิพิธภัณฑ์สัตว์น้ำ One Line


31

พ่อแม่ผัวของฉันมีบ่อปลาในบ้านของพวกเขาเต็มไปด้วยปลาคราฟ มันไม่ได้ข้ามความคิดของฉันจนกว่าฉันจะสังเกตเห็นสารสกัดต่อไปนี้จากรหัสของฉัน

',') & '_'

... ฉันหันหน้าเข้าหาปลาจากหน้าจอของฉัน ...

ซึ่งทำให้ฉันมีความคิดที่ดี ...

การแสวงหาของฉันสำหรับคุณนักกอล์ฟที่รักของฉันคือการสร้างตู้ปลา ASCII แบบบรรทัดเดียวด้วยกฎต่อไปนี้:

  • ขนาดของตู้ปลาจากด้านข้างของถังไปยังอีกด้านหนึ่งของถังควรมีขนาดไม่เกิน 60 ตัวอักษรและไม่ควรใหญ่กว่า 80 ตัวอักษร ต้องระบุด้านของถังโดยใช้ท่อ / บาร์ (|ตัวอักษร )
  • ปลาจะต้องสามารถ "ว่ายน้ำ" จากซ้ายไปขวาระหว่างด้านข้างของถัง ขณะที่พวกเขากำลังจะหมุนจำเป็นต้องมีมุมมองด้านหน้าสำหรับการเปลี่ยนจากทิศทางหนึ่งไปยังอีกทิศทางหนึ่ง
  • ปลาต้องมีลักษณะดังนี้:

    • }}< }} ',') ปลาว่ายน้ำถูกต้อง
    • (',' {{ >{{ ปลาว่ายซ้าย
    • }}('_'){{ ปลาหันหน้าไปทางด้านหน้า
  • เมื่อปลาหันไปเปลี่ยนทิศทาง (โอกาส 30%) มันจะต้องเริ่มจากทิศทางเดียวหันหน้าไปทางด้านหน้าจากนั้นหันไปอีกทิศทางหนึ่ง ... ตรวจสอบให้แน่ใจว่ามีที่ว่างเพียงพอสำหรับปลาที่จะเปิด ขอบของรถถังขั้นต่ำ ...

  • หากปลาไม่ได้เป่าฟองหรือเปลี่ยนทิศทางมันจะดำเนินต่อไปในทิศทางที่มันกำลังเผชิญหากมันได้รับภายในหกช่องว่างด้านข้างของถังมันจะเปลี่ยนทิศทาง
  • ปลา (หันหน้าไปทางซ้ายหรือขวา) ในบางโอกาส (โอกาส 10%) หยุดที่จะเป่าฟองสบู่อย่างต่อเนื่อง ( .oO*) ดังนั้นปลาจะต้องมีพื้นที่ว่างอยู่ข้างๆพวกมันเพื่อให้ฟองมีอยู่ดังนั้นปลาจึงสามารถ เพียงว่ายน้ำอยู่ใกล้กับด้านข้างประหยัดพื้นที่เดียว ฟองจะต้องหายไปก่อนที่ปลาจะสามารถเดินหน้าต่อไป ...

ชุดตัวอย่างของเส้นพฤติกรรมของปลาโดยมี-ตัวอักษรระบุช่องว่างเนื่องจากคุณลักษณะการแสดงรหัสที่นี่ค่อนข้างเข้มงวด ... ฉันคาดหวังว่าขีดกลางเหล่านี้จะถูกแทนที่ด้วยช่องว่างเมื่อคุณใช้รหัสนี้ ...

แต่ละบรรทัดที่นี่อาจถูกพิจารณาว่าเป็นเฟรมตามเวลา

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

ฯลฯ ตัวอย่างข้างต้นคืออย่างที่ฉันพูดเล็ก แต่คุณได้รับความคิดทั่วไป ...

รหัสที่สั้นที่สุดชนะ ...

ฉันคาดหวังเอาท์พุทในบรรทัดเดียวกัน (ถ้าเป็นไปได้) ถ้าไม่แสดงเฟรมหลังจากเฟรมอย่างต่อเนื่องเป็นเรื่องปกติ ... ไม่ว่าคุณจะไปหนึ่งบรรทัดหรือหลายบรรทัดขึ้นอยู่กับคุณ หากคุณกำลังทำหลายบรรทัดพวกเขาจะต้องคั่นด้วยบรรทัดใหม่

นอกจากนี้ยังมีการจับเวลาระหว่างเฟรม 2000ms นี่คือผลบังคับใช้

มาดูกันว่าคุณมีอะไรบ้าง!


หากปลาอยู่ใกล้กับขอบตู้ปลามากเกินไปจำเป็นต้องหมุนหรือไม่หรืออาจหลุดออกจากหน้าจอ? เป็นไปได้ไหมที่ปลาจะระเบิดฟองสบู่ในสถานการณ์เช่นนี้? นอกจากนี้จะต้องเป็นไปได้ (หรือเป็นสิ่งต้องห้ามหรือได้รับอนุญาต แต่ไม่จำเป็น) เพื่อให้ปลาเป่าฟองสบู่อย่างต่อเนื่องสองครั้งหรือไม่
John Dvorak

1
เดี๋ยวก่อนอย่าเปลี่ยนแปลงอะไรแบบนี้! ฉันเริ่มเขียนโค้ดแล้ว! คุณจะกลับใจไหม?
John Dvorak

5
โปรดใช้sandboxในครั้งต่อไป
John Dvorak

1
มันไม่ได้ระบุไว้อย่างชัดเจน แต่ฉันเดาว่าต้องมีปลาหนึ่งตัวในตู้ปลาใช่ไหม
John Dvorak

1
มันจำเป็นหรือไม่ที่ปลาจะฟองสองครั้งติดต่อกันหรือเราอนุญาตให้ปล่อยมันขึ้นมาได้หรือไม่? มันทำให้ความแตกต่างสามตัวละครสำหรับฉัน
John Dvorak

คำตอบ:


11

Python 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)

การเล่นกอล์ฟใน Python นั้นยากเสมอเนื่องจากความต้องการเยื้องของข้อความ แต่ถึงอย่างนั้นก็ทำได้ดีมาก!

ขอบคุณมากสำหรับความผันผวนและ DSM ที่ช่วยให้ฉันเล่นกอล์ฟได้มากขึ้น

เวอร์ชั่นสะอาด

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`(Unix) หรือsystem 'cls'(คอนโซล Windows) ก่อนที่puts qจะแก้ไข( Ref. )หรือใช้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

ฉันจะเพิ่มจุดเริ่มต้นของคิวไปนี้:\r q="\r|#{r+s*9}|"จากนั้นใช้แทน$><<q puts qมีความยาว 1 อักขระ แต่ดูดีขึ้นโดยไม่ใช้คำสั่งภายนอก
จัดการ

\rล้างหน้าจอหรือไม่ มันไม่ได้อยู่ในกรณีของฉัน หรือทำไมคุณไม่ชอบputs?
John Dvorak

1
ไม่\rคือการคืนสินค้า โดยใช้$><<qสำหรับผลลัพธ์เคอร์เซอร์จะยังคงอยู่ในบรรทัดเดียวกัน ( putsบังคับ a \nหลังเอาท์พุต) ดังนั้นการเริ่มต้นเอาต์พุตถัดไปด้วย\rจะข้ามกลับไปที่จุดเริ่มต้นของบรรทัดปัจจุบันและเริ่มเอาต์พุตจากที่นั่น ดังนั้นจะเขียนทับ "รูปภาพ" ก่อนหน้าของบรรทัดพิพิธภัณฑ์สัตว์น้ำ
จัดการ

@manatwork โชคร้ายนี้อย่างสมบูรณ์ messes up หน้าต่างโต้ตอบ JRuby \rซึ่งละเว้น
John Dvorak

โอ้ เสียใจเป็นอย่างยิ่ง. และขอบคุณสำหรับข้อมูล น่าเศร้าที่นี่เป็นข้อเท็จจริงแรกที่ฉันได้เรียนรู้เกี่ยวกับ jRuby :(
จัดการ

3

R, 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
}

มันพิมพ์ตู้ปลาเป็น stdout ในบรรทัดเดียว (จากนั้นแบ่ง 2 วินาทีและกลับรถก่อนที่พิพิธภัณฑ์สัตว์น้ำที่ t + 1 จะถูกพิมพ์)


3

Perl, 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ในกรณี "การเปลี่ยนที่จำเป็น"
John Dvorak

1
sleep2(ไม่มีที่ว่าง) ไม่ทำงานสำหรับฉัน เมื่อคุณหมุนคุณจะไม่ปรับหน้าปลาให้อยู่ในแนวเดียวกัน และดูเหมือนว่าฟองจะไม่ปรากฏ
สะกิด

"ตัวจับเวลายังถูกกำหนดระหว่างเฟรม 2000 มิลลิวินาทีซึ่งเป็นสิ่งจำเป็น" - สิ่งนี้ไม่ได้เกิดขึ้นเลยสำหรับฉัน นอกจากนี้ฟองอากาศจะไม่ปรากฏขึ้นปลาเพิ่งเข้ามาแทนที่ นอกจากนี้หัวควรอยู่ในสถานที่ในขณะที่ปลาหมุนไม่ใช่ศูนย์กลางของร่างกาย (อย่างน้อยนั่นคือสิ่งที่แสดงให้เห็นตัวอย่าง)
จอห์น Dvorak

DRAT! แข็งเกินไป ต้องการพื้นที่เพิ่มเติมด้วยการนอนหลับ! ปลากำลังเดือดอย่างมากเช่นกัน! แขวนบน ...
KevinColyer

โอ๊ะลืมหัวตรงกลางเมื่อหมุนที่ขอบ - ต้องการการทำงานซ้ำ ...
KevinColyer

2

C, 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ไหม
John Dvorak

ดูเหมือนว่าจะสามารถ ขอบคุณ!
Josh

คุณสามารถบันทึกตัวละครไม่กี่ตัวโดย#define p printf(
pastebin.com slash 0mr8spkT

@ Ace gcc ไม่ชอบเมื่อฉันทำเช่นนั้น
Josh

มันใช้งานได้สำหรับฉัน oi41.tinypic.com/15fqbvb.jpg
pastebin.com slash 0mr8spkT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.