ASCII Art“ Flight Simulator”


24

แก้ไข

ปรากฏว่ามีความสับสนบางอย่างหลังจากที่พิมพ์ผิดของฉันในโพสต์ต้นฉบับซึ่งใช้ตัวพิมพ์เล็ก o เพื่อกำหนดระนาบและจากนั้นพิมพ์ใหญ่ในภายหลัง น่าเสียดายที่ข้อผิดพลาดนี้ไม่ได้รับใน Sandbox เนื่องจากสมาชิกหลายคนได้เขียนคำตอบด้วยทั้งคู่และเนื่องจากการพิมพ์ผิดเป็นความผิดของฉันฉันจะอนุญาตทั้งตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก o ในคำจำกัดความของเครื่องบิน ฉันได้เพิ่มกฎใหม่สำหรับสิ่งนี้

พื้นหลัง

ฉันชอบภาพเคลื่อนไหว ASCIIเพราะฉันมักจะเรียกพวกเขาดังนั้นนี่เป็นอีกภาพหนึ่ง ฉันไม่คิดว่ามันจะยากเกินไปที่จะทำให้บรรลุผลได้

ถึงสมาชิกชุมชนทั้งหมด

หากคุณปรับปรุงคำตอบของคุณโปรดแก้ไขจำนวนไบต์เป็น

ไบต์เก่านับจำนวนไบต์ใหม่

เพื่อให้เราสามารถเห็นความคืบหน้าของคุณ ขอบคุณ!

ท้าทาย

นี่คือเครื่องบิน ascii

--O--

นี่คือทางวิ่ง ASCII

____|     |____

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

        --O--




____|     |____

เครื่องบินจะต้องลงจอดตรงกลางรันเวย์ดังที่แสดงด้านล่าง:

____|--O--|____

อินพุต

ตำแหน่งแนวนอนเริ่มต้นของเครื่องบินถูกกำหนดโดยอินพุตจำนวนเต็มซึ่งใช้เพื่ออ้างอิงปลายของปีกซ้ายนั่นคืออยู่ระหว่าง 0 ถึง 10

เอาท์พุต

แต่ละเที่ยวบินของเครื่องบินจะต้องแสดงให้เห็น ตัวอย่างด้านล่าง (อินพุต = 10):

          --O--




____|     |____

         --O--



____|     |____

        --O--


____|     |____

       --O--

____|     |____

      --O--
____|     |____

____|--O--|____

เพื่อให้สิ่งต่าง ๆ ง่ายขึ้นเรากำลังเพิกเฉยต่อกฎของมุมมอง รันเวย์มีขนาดใกล้เคียงกับที่คุณเข้าใกล้

กฎระเบียบ

  • อัปเดตจุดกึ่งกลางของระนาบอาจเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก o แต่สิ่งใดก็ตามที่เลือกจะต้องสอดคล้องกันตลอดทั้งรหัส หากภาษาของคุณไม่รองรับอักขระข้างต้นอย่าลังเลที่จะใช้อักขระ ASCII สำรองเท่านั้น
  • ระนาบลงมา 1 บรรทัดต่อเฟรม
  • ระนาบสามารถเลื่อน 1 ช่องไปทางซ้ายหรือขวาในแต่ละครั้งที่ลงมาหนึ่งบรรทัด มันไม่จำเป็นต้องเคลื่อนที่ไปตามสายเลือดแต่ละเส้น ตราบใดที่มันเสร็จสิ้นบนรันเวย์มันขึ้นอยู่กับคุณเมื่อมันเคลื่อนไปทางขวาหรือซ้าย คุณเป็นนักบิน!
  • ไม่ต้องจัดการข้อผิดพลาด คุณอาจสันนิษฐานว่าข้อมูลที่ป้อนจะเป็นจำนวนเต็มที่ถูกต้องตั้งแต่ 0-10 รวม
  • ผลลัพธ์จะต้องประกอบด้วยอักขระที่แสดงด้านบนเท่านั้น (หากภาษาของคุณไม่รองรับกฎแรกที่แก้ไขแล้ว) และต้องมีขนาดเท่ากันนั่นคือต้องเริ่มต้น 6 บรรทัดความสูง 15 ตัว ความสูงสามารถลดลงได้ตามความคืบหน้าดังในตัวอย่างด้านบน
  • โปรแกรมหรือฟังก์ชั่นใช้งานได้ดี แต่จะต้องสร้างเอาต์พุตตามที่แสดงไว้ด้านบน
  • ฉันเป็นผู้นำ / ต่อท้ายช่องว่าง / ขึ้นบรรทัดใหม่
  • โปรดล้างหน้าจอระหว่างเฟรมเอาต์พุตหากคุณต้องการ นี่ไม่ใช่ข้อกำหนด
  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาตตามปกติ (แม้ว่าฉันจะไม่คิดว่าจะมีหลายสิ่งที่จะช่วยแก้ไขปัญหานี้ได้)
  • นี่คือรหัสกอล์ฟเพื่อให้คำตอบที่สั้นที่สุดเห็นได้ชัดว่าเป็นผู้ชนะและอาจจะได้รับคะแนนมากที่สุด แต่อาจไม่ได้รับการยอมรับว่าเป็นคำตอบที่ดีที่สุดถ้ามีคำตอบที่น่าสนใจจริง ๆ อย่าลังเลที่จะโพสต์สิ่งใดก็ตามที่เป็นไปตามกฎตราบเท่าที่มันใช้งานได้

การใช้งานอ้างอิงแบบไม่อัปโหลดใน Python 2 มีให้ที่ทดลองใช้ออนไลน์! เพื่อให้คุณสามารถดูว่ามันมองหาค่าอินพุตที่แตกต่างกันอย่างไร


ฉันไม่คิดว่ามันเป็น kolmogorov-complex เนื่องจากผลลัพธ์ขึ้นอยู่กับอินพุต
ovs

ขอบคุณสำหรับการชี้แจง @ovs ฉันจะลบแท็กนั้น
ElPedro

โดยปกติแล้วการตอบรับจะไปที่คำตอบที่สอดคล้องกับเกณฑ์การชนะแบบมีวัตถุประสงค์มากที่สุด คุณอาจได้รับสะเก็ดระเบิดถ้าคุณตอบอีกตอบรับอีกต่อไป
ระดับแม่น้ำ St

ขอบคุณ @LevelRiverSt มีเมตาโพสต์ที่จะชี้แจงเรื่องนี้หรือไม่? ถ้าไม่เช่นนั้นอาจดีกว่าที่จะไม่ยอมรับคำตอบใด ๆ
ElPedro

ครับผมได้รับการยอมรับคำตอบอีกต่อไปก่อนและให้เครดิตกับคำตอบที่สั้นลงเช่นเดียวกับ probs จากชุมชนไม่มีความท้าทายก่อนหน้า โปรดดูความคิดเห็นผลลัพธ์ของฉันในตอนท้ายของคำถาม มันผิดหรือเปล่า?
ElPedro

คำตอบ:


5

TI-BASIC, 61 ไบต์

Input A
A
For(B,1,5
ClrHome
Output(5,1,"----/     /----
Output(B,Ans,"--O--
Ans+6-median({5,7,Ans
End

คุณรู้จักล่ามออนไลน์หรือดาวน์โหลด (สำหรับ Linux) เพื่อทำการทดสอบหรือไม่? +1 สำหรับคำตอบที่สมมติว่ามันใช้งานได้ดี)
ElPedro

ตรวจสอบ TilEm เป็นคนเดียวที่ฉันสามารถทำงานได้
Julian Lachniet

2
+1 สำหรับถามใครบางคนที่อาจมีคำตอบที่ต่างออกไป จะตรวจสอบ TilEm และขอบคุณสำหรับเคล็ดลับ
ElPedro

8

TI-BASIC, 62 ไบต์

:Input A
:A
:For(N,3,8
:ClrHome
:Output(8,1,"----I     I----
:Output(N,Ans,"--O--
:Ans+(Ans<6)-(Ans>6
:End

โปรดทราบว่า TI-BASIC ไม่รองรับ _ หรือ | ดังนั้นฉันจึงแทนที่ด้วยทุนที่ฉันและ - สิ่งนี้ไม่ควรมีผลกับจำนวนไบต์


ตกลงฉันอยู่บน Linux คุณช่วยแนะนำการดาวน์โหลดที่ฉันจะทดสอบได้ไหม? btw ฉันคิดว่ามันใช้งานได้จนกว่าฉันจะพบล่ามดังนั้น +1 :)
ElPedro

น่าเสียดายที่ไม่มี ฉันมี Wabbitemu และ TilEm ติดตั้งอยู่ในคอมพิวเตอร์ Windows 10 ของฉันแล้ว แต่ฉันทดสอบรหัสบน TI-84 + จริง ขออภัย
อัตราส่วนทองคำ

ไม่มีปัญหา! แค่ถาม :)
ElPedro

เนื่องจากมีการแก้ไขโค้ดจำนวนมากการสลับที่เร็วที่สุดระหว่างโพสต์นี้กับ Julian Lachniet's จนกว่าเราทั้งคู่จะได้ข้อสรุป 60 ไบต์ ณ จุดที่ฉันเพิ่ม clrhome และนับไบต์ 62
อัตราส่วนทองคำ

3
TI-Basic ?! ดี!
Dave Kanter

6

Python 2, 107 ไบต์

n=input();h=5
while h:print' '*n+'--O--'+'\n'*h+'____|     |____\n';n-=cmp(n,5);h-=1
print'____|--O--|____'

ลองออนไลน์

เพียงฮาร์ดโค้ดบรรทัดสุดท้ายสำหรับเครื่องบินลงจอด เป็นไปได้ที่จะถูก Golfed โดยนำชิ้นส่วนกลับมาใช้ใหม่จากก่อนหน้าหรือรวมเข้ากับลูป


5

Perl, 94 ไบต์

รหัสไบต์ 93 + -pธง

$\="____|     |____
";$p="--O--";for$i(-5..-1){print$"x$_.$p.$/x-$i;$_+=5<=>$_}$\=~s/ +/$p/}{

ลองออนไลน์!


@ETHproductions หวังว่าคุณจะสนุกกับการ}{(และ$"messing ด้วยการเน้นไวยากรณ์)
Dada

3

JavaScript (ES6), 108 ไบต์

f=(a,b=5)=>b?" ".repeat(a)+`--O--${`
`.repeat(b)}____|     |____

`+f(a<5?a+1:a-1,b-1):"____|--O--|____"

ทดสอบมัน

การใช้

เพียงแค่โทรหาfดัชนีของเครื่องบิน

f(2)

เอาท์พุต

  --O--




____|     |____

   --O--



____|     |____

    --O--


____|     |____

     --O--

____|     |____

    --O--
____|     |____

____|--O--|____

คุณสามารถเพิ่ม <s> อาหารว่าง </s> ตัวอย่างสแต็ก
Kritixi Lithos

ทุกครั้งที่ฉันถามคำถามคำตอบแรกคือ Javascript! +1
ElPedro

เดี๋ยวก่อนจะดีถ้าคนโพสต์ Tryitonline (ไม่ทราบว่าเป็นไปได้ด้วย Javascript) หรือวิธีแก้ปัญหาที่แตกต่างจากตัวอย่าง 10 ข้อที่แสดงด้านบน คุณสามารถโพสต์ผลลัพธ์จากเช่น 2 แทนได้หรือไม่ :)
ElPedro

@ElPedro คุณสามารถเรียกใช้ JavaScript ในคอนโซลเบราว์เซอร์ของคุณ แต่ยังมีคอนโซลออนไลน์บางส่วน ฉันจะเพิ่มลิงค์ ฉันจะเปลี่ยนตัวอย่าง
ลุค

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

3

สกาลา, 224 181 ไบต์

แก้ไข : ฉันไม่รู้ว่าคุณสามารถทำ"string"*nซ้ำได้ n ครั้ง! สกาล่ายังคงระเบิดความคิดของฉัน การหายไปif(t>0)แทนที่จะif(t==0)เป็นความผิดพลาดหน้าใหม่ ขอบคุณสำหรับเคล็ดลับSuma !


def?(x:Int,t:Int=5):Unit={var(p,o)=("--o--","")
o=s"____|${if(t>0)" "*5 else p}|____\n"
for(i<-0 to t)o=if(i!=0&&i==t)" "*x+p+o else "\n"+o
println(o)
if(t>0)?(x-(x-4).signum,t-1)}

ข้อสังเกตเดิม:

ฉันคิดว่าวิธีแก้ปัญหาแบบเรียกซ้ำจะเป็นเรื่องสนุกที่จะลอง ฉันค่อนข้างใหม่กับ Scala ดังนั้นฉันมั่นใจว่านี่ไกลเกินกว่าที่ควร



:Unit=คุณไม่จำเป็นต้อง การข้ามเครื่องหมายเท่ากับจะตั้งค่าชนิดส่งคืนเป็นหน่วย
corvus_192

นอกจากนี้ทำไมคุณไม่เริ่มต้นoในบรรทัดแรก และเนื่องจากiเป็นเสมอ> = 0 คุณสามารถเปลี่ยนi!=0&&i==tเป็นi>0&i==t(บรรทัดที่ 3)
corvus_192

2

แบตช์ 230 ไบต์

@echo off
set/ax=10-%1
set s=          --O--
for /l %%i in (0,1,4)do call:l %%i
echo ____^|--O--^|____
exit/b
:l
call echo %%s:~%x%%%
for /l %%j in (%1,1,3)do echo(
echo ____^|     ^|____
echo(
set/a"x-=x-5>>3,x+=5-x>>3

xเป็นจำนวนของช่องว่างที่จะลบออกจากจุดเริ่มต้นของสตริงsดังนั้นฉันลบพารามิเตอร์จาก 10 x-=sgn(x-5)บรรทัดสุดท้ายเป็นรุ่นที่ใกล้ที่สุดมีการ


2

sed, 181 ไบต์ + 2 สำหรับ-nrแฟล็ก

s/10/X/
:A
s/^/ /;y/0123456789X/-0123456789/;/[0-9]/bA;s/ -/P\n\n\n\n\n____|P|____/
:B
h;s/P([\n|])/--O--\1/;s/P/     /;s/^ *_/_/;p;/^_/q;x;s/\n//
/^ {5}$/bB;/ {6}/s/  //;s/^/ /;bB

Ungolfed

# Add leading spaces
s/10/X/
:A
    s/^/ /
    y/0123456789X/-0123456789/
/[0-9]/bA

s/ -/P\n\n\n\n\n____|P|____/

:B
    # Place plane in appropriate spot
    h
    s/P([\n|])/--O--\1/
    s/P/     /
    s/^ *_/_/
    p
    /^_/q
    x

    # Movement
    s/\n//
    /^ {5}$/bB
    # move left one extra, since we'll move right next line
    / {6}/s/  // 
    s/^/ /
bB

การใช้งาน: $ echo 2 | sed -nrf flightsim.sed


2

เรติน่า , 86 83 ไบต์

.+
$* --O--¶¶¶¶¶¶____|     |____
{*`$
¶
2D`¶
 ( {5})
$1
}`^ {0,4}-
 $&
 +
--O--
G`_

ลองออนไลน์!

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



2

Perl 6 , 97 90 81 ไบต์

{say "{"{" "x 15}\n"x 5}____|     |____"~|("\0"x$^h+$_*(17-$h/5)~"--O--") for ^6}

ตรงกันข้ามกับสิ่งที่ดูเหมือนว่ามันจะออก * ระนาบตัวพิมพ์เล็ก ( --o--) ตามที่ได้รับอนุญาตโดยคำอธิบายงานที่อัปเดต

ลองออนไลน์!

มันทำงานอย่างไร

ตัวดำเนินการสตริงบิตทริป FTW!

{                                                  # Lambda accepting horizontal index $h.
    say                                            # Print the following:
        "{ "{ " " x 15 }\n" x 5 }____|     |____"  # The 15x6 background string,
        ~|                                         # bitwise-OR'd against:
        (
            "\0"                                   # The NULL-byte,
            x $^h + $_*(17 - $h/5)                 # repeated by the plane's offset,
            ~ "--O--"                              # followed by an OR mask for the plane.
        )
    for ^6                                         # Do this for all $_ from 0 to 5.
}

มันใช้งานได้เนื่องจากตัวดำเนินการสตริง bitwise ใช้ค่า codepoint ของอักขระที่ตำแหน่งที่กำหนดในสองสตริงเพื่อคำนวณอักขระใหม่ที่ตำแหน่งนั้นในสตริงเอาต์พุต
ในกรณีนี้:

space  OR  O   =  o
space  OR  -   =  -
any    OR  \0  =  any

สำหรับOระนาบตัวพิมพ์ใหญ่เราสามารถใช้~^(สตริง bitwise XOR) โดยมีหน้ากากระนาบ\r\ro\r\r(+4 ไบต์สำหรับแบ็กสแลช):

space  XOR   o  =  O
space  XOR  \r  =  -
any    XOR  \0  =  any

สูตรสำหรับการชดเชยระนาบh + v*(17 - h/5)ถูกทำให้ง่ายขึ้นจาก:

  v*16         # rows to the vertical current position
+ h            # columns to the horizontal starting position
+ (5 - h)*v/5  # linearly interpolated delta between horizontal start and goal

1

Python 2 , 160 ไบต์

i,s,p,l,r,c,x=input(),' ','--O--','____|','|____',0,4
while x>=0:print'\n'.join([s*i+p]+[s*15]*x+[l+s*5+r])+'\n';c+=1;x-=1;i=((i,i-1)[i>5],i+1)[i<5]
print l+p+r

ลองออนไลน์!

นี่คือการดำเนินการอ้างอิงที่ลงไปถึง 160 จาก 384 ยังคงเป็นวิธีที่ฉันคิดว่า เพิ่งโพสต์เพื่อความสนุกและเพื่อสนับสนุนคำตอบของงูหลามที่ดีกว่า


คุณสามารถแข่งขันในความท้าทายของคุณเอง (ดูโพสต์เมตานี้ )
Dada

คุณสามารถทำwhile-~xอะไรได้บ้าง
FlipTack

นอกจากนี้ผมคิดว่าคุณสามารถเขียนบิตที่คุณเพิ่มหรือลบออกจากiเป็นi+=(i<5)-(i>5)
FlipTack

1

Befunge-93, 136 130 bytes

&5>00p10p55+v
:::00g>:1-\v>:"____|     |_"
>:1-\v^\+55_$"--O--"10g
^\*84_$>:#,_10g::5v>:#,_@
<_v#!:-1g00+`\5\-`<^"____|--O--|____"

ลองออนไลน์!

คำอธิบาย

&                          Read the plane position.
 5                         Initialise the plane height.
  >                        Begin the main loop.

   00p                     Save the current height.
      10p                  Save the current position.
         55+:              Push two linefeed characters.

         "____|     |_"    Push most of the characters for the airport string.
:::                        Duplicate the last character three times to finish it off.

   00g>:1-\v               Retrieve the current height, and then push
      ^\+55_$                that many copies of the linefeed character.

             "--O--"       Push the characters for the plane.

>:1-\v              10g    Retrieve the current position, and then push
^\*84_$                      that many copies of the space character.

       >:#,_               Output everything on the stack in reverse.

            10g::          Retrieve the current position and make two copies to work with.
                 5v        If it's greater than 5
                -`<          then subtract 1.
           +`\5\           If it's less than 5 then add 1.

        g00                Retrieve the current height.
      -1                   Subtract 1.
 _v#!:                     If it's not zero, repeat the main loop.

^"____|--O--|____"         Otherwise push the characters for the landed plane.
>:#,_@                     Output the string and exit.

1

Ruby, 94 ไบต์

->a{5.times{|i|puts" "*a+"--O--#{?\n*(5-i)}____|     |____

";a+=5<=>a};puts"____|--O--|____"}

พิมพ์ตำแหน่งของเครื่องบินตามด้วยการขึ้นบรรทัดใหม่แล้วที่สนามบิน จากนั้นมันก็เลื่อนระนาบด้วย 1, -1 หรือ 0 ขึ้นอยู่กับตำแหน่งเทียบกับ 5

หลังจากวนลูป 5 ครั้งด้านบนมันจะพิมพ์เครื่องบินในสนามบิน


1

8th , 177 172 ไบต์

: f 5 >r 5 repeat over " " swap s:* . "--O--" . ' cr r> times "____|     |____\n\n" . over 5 n:cmp rot swap n:- swap n:1- dup >r while "____|--O--|____\n" . 2drop r> drop ; 

คำfคาดว่าจะเป็นจำนวนเต็มระหว่าง 0 ถึง 10

การใช้

4 f

คำอธิบาย

: f \ n --
  5 >r     \ Push vertical distance from airport to r-stack
  5 repeat 
    \ Print plane
    over " " swap s:* . "--O--" . 
    \ Print airport 
    ' cr r> times "____|     |____\n\n" . 
    \ Now on the stack we have:
    \ distanceFromLeftSide distanceFromAirport
    over      \ Put distance from left side on TOS 
    5 n:cmp   \ Compare left distance and 5. Return
              \ -1 if a<b, 0 if a=b and 1 if a>b
    rot       \ Put distance from left side on TOS   
    swap n:-  \ Compute new distance from left side 
    swap n:1- \ Decrement distance from airport
    dup >r    \ Push new airport-distance on the r-stack  
  while 
  "____|--O--|____\n" .  \ Print final step
  2drop r> drop          \ Empty s-stack and r-stack
;

1

Mathematica, 111 ไบต์

If[#<1,"____|--O--|____"," "~Table~#2<>"--O--"<>"
"~Table~#<>"____|     |____

"<>#0[#-1,#2+#2~Order~5]]&[5,#]&

ฟังก์ชั่นไม่ระบุชื่อ รับตัวเลขเป็นอินพุตและส่งคืนสตริงเป็นเอาต์พุต อาจจะเล่นกอล์ฟต่อไป


1

QBIC , 93 91 84 ไบต์

:{X=space$(a)+@--O--`┘a=a-sgn(a-5)~t>-1|?X[t|?]t=t-1?@____|`+@     `+_fB|\_xB+A+_fB

ปล่อยบางไบต์โดยแทนที่การประกาศ X $; ปรับ FOR FOR ให้พิมพ์ระยะทางเหนือพื้นดิน คำอธิบายด้านล่างนี้สำหรับรุ่นเก่า แต่โดยทั่วไปแล้วจะใช้งานได้เหมือนกัน

สำหรับการทดสอบ (และสุนทรียศาสตร์) ฉันมีรุ่นที่แตกต่างกันเล็กน้อยที่ 103 ไบต์:

:{_z.5|_CX=Y[a|X=X+@ `]X=X+@--O--`
a=a-sgn(a-5)
~u>0|?X';`[u|?]u=u-1?@____|`+@     `+_fC|\_xC+_tB+_fC

สิ่งเหล่านี้มีหน้าที่เหมือนกัน ส่วนที่สองมีส่วนเพิ่มเติมที่หน้าจอจะถูกลบระหว่างเฟรมและจะหยุดเป็นเวลา 0.5 วินาทีระหว่างเฟรม

ตัวอย่างผลลัพธ์

โปรดทราบว่าฉันได้เพิ่มบรรทัดใหม่สองบรรทัดระหว่างเฟรม รหัส golfed ที่สุดด้านบนไม่เพิ่มบรรทัดว่างระหว่างเฟรมตัวล้างจะล้างหน้าจอ

Command line: 10


          --O--




____|     |____


         --O--



____|     |____


        --O--


____|     |____


       --O--

____|     |____


      --O--
____|     |____


____|--O--|____

คำอธิบาย

เนื่องจากฉันรู้สึกถึงสิ่งนี้ในหลาย ๆ อย่างที่ฉันชอบเกี่ยวกับ QBIC และให้ข้อมูลเชิงลึกที่ดีเกี่ยวกับการทำงานของฟังก์ชั่นบางอย่างภายใต้ประทุน โปรดทราบว่า QBIC เป็นหัวใจสำคัญของล่าม QBasic สำหรับ Codegolf รหัส QBIC เข้า - รหัสออกมา QBasic (และดำเนินการในภายหลัง)

:{      get the starting offset (called 'a') from the command line, and start a DO-loop

----  cool code only  ----
_z.5|_C At the start of a DO-loop, pause for half a second and clear the screen
---- resume golf-mode ----

---- #1 - The tip of the left wing is anywhere between 0 and 10 positions to the right.
----       Create the plane with the spacing in X$
X=Y          Clear X$
[a|          For each point in the current offset
X=X+@ `]     Add a space to X$
    - Every capital letter in QBIC references that letter+$, a variable of type String
    - @ and ` start and end a string literal, in this case a literal space.
    - ] ends one language construct (an IF, DO or FOR). Here, it's NEXT
X=X+@--O--`  Create the actual plane
    - @ and `once again create a string literal. Every literal that is created in this
      way is assigned its own capital letter. This is our second literal, so the body of
      our plane is stored in B$ (A$ contains the space, remember?)

---- #2 Adjust the offset for the next iteration      
a=a-sgn(a-5) The clever bit: We have an offset X in the range 0 - 10, and 5 attempts to 
             get this to be == 5. X - 5 is either positive (X = 6 - 10), negative 
             (X = 0 - 4) or 0 (X=5). sgn() returns the sign of that subtraction 
             as a 1, -1 or 0 resp. We then sub the sign from 'a', moving it closer to 5.

---- #3 Draw the plane, the empty airspace and the landing strip             
~u>0|     Are we there yet?
    - ~ is the IF statement in QBIC
    - It processes everything until the | as one true/false expression
    - All the lower-case letters are (or better, could be) references to numeric 
      variables. Since QBasic does not need to post-fix those, they double as 'natural' 
      language: ignored by QBIC and  passed as literal code to the QBasic beneath.
    - The lower-case letters q-z are kinda special: at the start of QBIC, these 
      are set to 1 - 10. We haven't modified 'u' yet, so in the first DO-loop, u=5

?X';`     If we're still air-borne, print X$ (our plane, incl. spacers)
    - ? denotes PRINT, as it does in QBasic.
    - ' is a code literal in QBIC: everything until the ` is not parsed, but 
      passed on to QBasic.
    - In this case, we want a literal ; to appear after PRINT X$. This suppresses 
      QBasic's normal line-break after PRINT. This needs to be a code literal 
      because it is the command to read a String var from the command Line in QBIC.
[u|?]     FOR EACH meter above the ground, print a newline
u=u-1     Descent 1 meter
?@____|`  Print the LHS of the landing strip
+@     `  plus 5 spaces
+_fC|     plus the LHS reversed.
\         ELSE - touchdown!
_x        Terminate the program (effectively escape the infinite DO-loop)
    - the _x command has an interesting property: ULX, or Upper/Lowercase Extensibility. 
      Writing this command with an uppercase _X does something similar, yet different. 
      The _x command terminates, and prints everything found between _x and | before 
      quitting. Uppercase _X does not look for |, but only prints something if it is 
      followed by a character in the ranges a-z and A-Z - it prints the contents of 
      that variable.
C+B+_fC   But before we quit, print C$ (the LHS of the landing strip) and the plane, 
          and the LHS flipped.

---- #4 QBIC has left the building
- Did I say _x looks for a | ? Well, that gets added implicitly by QBIC at the end of 
  the program, or when one ( ']' ) or all ( '}' ) opened language constructs are closed.
- Also, all still opened language constructs are automatically closed at EOF.
- Had we stored anything in Z$, that would also be printed at this time.


1

PHP 7, 139 ไบต์

ยังคงยาวมาก

for($x=$argv[1],$d=6;$d--;$x+=5<=>$x)for($i=$p=-1;$i++<$d;print"$s
")for($s=$i<$d?" ":"____|     |____
";!$i&++$p<5;)$s[$x+$p]="--O--"[$p];

รับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่ง -rทำงานด้วย

ทำให้พังถล่ม

for($x=$argv[1],                        // take input
    $y=6;$y--;                          // loop height from 5 to 0
    $x+=5<=>$x)                             // post increment/decrement horizontal position
    for($i=$p=-1;$i++<$y;                   // loop $i from 0 to height
        print"$s\n")                            // 3. print
        for($s=$i<$y?" ":"____|     |____\n";   // 1. template=empty or runway+newline
            !$i&++$p<5;)$s[$x+$p]="--O--"[$p];  // 2. if $i=0, paint plane
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.