ASCII Art "Flight Simulator"


24

EDIT

Здається, що в моїй друкарській помилці в початковому дописі сталася якась плутанина, яка використовувала малий o для визначення площини, а пізніше верхнього регістру. На жаль, ця помилка не потрапила до пісочниці. Оскільки багато членів написали відповіді на обидва, і оскільки помилка друку була моєю, я дозволю або великі, або малі o у визначенні площини. Я додав для цього нове правило.

Фон

Мені подобаються художні анімації ascii, як я їх називаю, ось ось ще одна. Я не думаю, що це занадто складно здійснити, тому, сподіваюся, отримаю кілька коротких та цікавих відповідей.

Для всіх членів громади

Якщо ви покращуєте свою відповідь, будь ласка, змініть свій байт як

old byte count новий кількість байтів

щоб ми могли бачити ваш прогрес. Спасибі!

Виклик

Ось площина асції

--O--

Ось злітно-посадкова смуга

____|     |____

Літак стартує на 5 нових лініях над злітно-посадковою смугою. Щоб запобігти будь-яким зіткненням метричної та імперської систем і зробити це справді міжнародним завданням, я не згадаю метрів і футів. Приклад:

        --O--




____|     |____

Літак повинен приземлитися рівно посередині злітно-посадкової смуги, як показано нижче:

____|--O--|____

Вхідні дані

Початкове горизонтальне положення площини визначається цілим числом, який використовується для позначення кінця лівого крила, тобто він знаходиться між 0 і 10 включно.

Вихідні дані

Кожен етап польоту літака повинен бути показаний. Приклад нижче (вхід = 10):

          --O--




____|     |____

         --O--



____|     |____

        --O--


____|     |____

       --O--

____|     |____

      --O--
____|     |____

____|--O--|____

Щоб все було просто, ми ігноруємо закони перспективи. Злітно-посадкова смуга залишається такого ж розміру, як ви наближаєтесь.

Правила

  • Оновлення Середина площини може бути великою або малою літерою o, але те, що обрано, має бути узгодженим у всьому коді. Якщо ваша мова не підтримує символів вище, сміливо використовуйте лише альтернативні символи ascii.
  • Площина опускається на 1 рядок на кадр.
  • Літак може рухатись лише на 1 простір вліво або вправо кожного разу, коли він опускається на одну лінію. Він не повинен рухатися по кожній лінії спуску. Поки він закінчується на злітно-посадковій смузі, це залежить від вас, коли він рухатиметься праворуч або ліворуч. Ти пілот!
  • Не потрібно обробляти помилки. Ви можете припустити, що вхід завжди буде дійсним цілим числом від 0-10 включно.
  • Вихідні дані повинні містити лише символи, показані вище (якщо ваша мова не підтримує їх, див. Відредаговане перше правило) і повинен бути однакового розміру, тобто повинен починати 6 рядків у ширину 15 символів. Висота може зменшуватися в міру просування, як у наведеному вище прикладі.
  • Програма або функція є прекрасною, але повинна дати результат, як показано вище.
  • Провідні / трейлінг простору / нові рядки мені добре підходять.
  • Будь ласка, сміливо очищайте екран між вихідними кадрами, якщо бажаєте. Це не вимога.
  • Стандартні лазівки заборонені, як завжди (хоча я не думаю, що існує багато таких, які допоможуть у цьому виклику).
  • Це кодовий гольф, тому найкоротша відповідь, очевидно, є переможцем і, ймовірно, отримає більшість голосів, але, можливо, не обов'язково буде прийнята як найкраща відповідь, якщо якесь дійсно цікаве рішення вийде якоюсь несподіваною мовою, навіть якщо вона довша. Сміливо публікуйте все, що відповідає правилам, якщо це працює.

Реалізація посилання Ungolfed в Python 2 доступна на веб-сайті Спробуйте це онлайн! тож ви можете побачити, як це виглядає для різних вхідних значень.


Я не думаю, що це колгогоров-складність, оскільки вихід залежить від
вкладених

Дякуємо за уточнення @ovs. Потім я видалю цей тег.
ElPedro

Зазвичай прийняття відповідає на відповідь, яка найкраще відповідає критерію виграшу об'єктивного. Ви можете отримати деяку помилку, якщо приймете іншу, довшу відповідь.
Рівень р. Св.

Дякуємо @LevelRiverSt. Чи є мета-повідомлення, щоб прояснити це? Якщо ні, то, можливо, краще не приймати жодної відповіді.
ElPedro

btw, я раніше прийняв більш довгу відповідь і віддав більше уваги на більш коротку відповідь, без жодних проблем з боку громади Попередній виклик . Будь ласка , дивіться мій Результат коментар в кінці питання. Це було не так?
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. Це єдиний, над яким я міг працювати.
Джуліан Лачнет

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 не підтримує _ або | і тому я замінив капітал I і -. Це не повинно впливати на кількість байтів.


Гаразд, я в Linux. Чи можете ви порекомендувати завантаження, яке я можу перевірити? btw, я припускаю, що це працює, поки я не знайду перекладача, тому +1 :)
ElPedro

На жаль, немає. У мене на комп'ютері Windows 10 встановлені і Wabbitemu, і TilEm, але я перевіряю код на фізичному TI-84 +. Вибачте
Золоте співвідношення

Без проблем! Просто запитую :)
ElPedro

Через багато редагування коду, найшвидше чергували цю посаду та Джуліана Лачнета, поки ми обидва не дійшли висновку в 60 байт, і тоді я додав clrhome і зробив кількість байтів 62
Golden Ratio

3
TI-Basic ?! Приємно!
Дейв Кантер

6

Python 2, 107 байт

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

Спробуйте в Інтернеті

Просто жорсткі коди останнього рядка для посадкової площини. Це може бути гольф, повторно використовуючи деталі раніше або інтегруючись у петлю.


5

Perl, 94 байти

93 байти коду + -pпрапор.

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

Спробуйте в Інтернеті!


@ETHproductions Сподіваюся, вам сподобається }{$"возитися з підсвічуванням синтаксису).
Дада

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> snack </s> стека
Kritixi Lithos

Кожен раз, коли я задаю питання, перша відповідь - Javascript! +1
ElPedro

Привіт, було б добре, якби люди розмістили або Tryitonline (не знаю, чи це можливо за допомогою Javascript), або інше рішення з 10 прикладів, показаних вище. Чи можете ви розмістити вихід із напр. 2 замість цього? :)
ElPedro

@ElPedro, ви можете виконати JavaScript на консолі свого веб-переглядача, але також є деякі інтернет-консолі. Я додам посилання. Я також зміню приклад.
Лука

Спасибі. Жодних проблем. Я перебуваю у старому Javascript, де вам потрібна веб-сторінка для його виконання. Здогадайтесь, мені потрібно з часом :) Більше серверів у ці дні. Повага до швидкої та крутої відповіді.
ElPedro

3

Scala, 224 181 байт

EDIT : Я не мав уявлення, що ти можеш зробити "string"*nце повторити n разів! Скала продовжує дути мій розум. Відсутність if(t>0)замість цього if(t==0)була помилкою новачка. Дякую за поради, Сума !


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, тому впевнений, що це далеко не оптимально.


Можливо, ви хочете прочитати Поради щодо гольфу в scala
corvus_192

Вам це не потрібно :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

Безумовно

# 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

Scala , 177, 163, 159 137 байт

def p(x:Int,t:Int=5,a:String="\n"):String=a+(if(t>0)
" "*x+"--O--"+"\n"*t+"____|     |____\n"+p(x-(x-4).signum,t-1)else"____|--O--|____")

Виходячи з іншої відповіді , зі значним скороченням.


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

Це працює тому, що оператори розрядних рядків використовують значення кодових знаків символів у заданій позиції у двох рядках, щоб обчислити новий символ у цій позиції у вихідному рядку.
В цьому випадку:

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

Для великої Oплощини, ми могли б використати ~^(рядок побіжно 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. Я думаю, що все-таки слід пройти шлях. Просто розміщено для розваги та задля заохочення кращої відповіді Python.


Ви можете змагатися у власному виклику (див. Цей мета-пост ).
Дада

Ви можете просто зробити while-~x?
FlipTack

Також я думаю, що ви можете написати шматочок, з якого ви додаєте або віднімаєте iякi+=(i<5)-(i>5)
FlipTack

1

Befunge-93, 136 130 байт

&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

Рубін, 94 байти

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

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

Друкує положення літака з наступними новинками, а потім аеропорт. Потім вона переміщує площину на 1, -1 або 0, залежно від її положення відносно 5.

Після циклування вищезазначених 5 разів він друкує літак в аеропорту.


1

8-е , 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

Математика, 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, який друкує відстань над землею. Пояснення нижче наведено для старої версії, але вона в основному працює так само.

Для тестування (і естетики) у мене була дещо інша версія, в 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 секунди між кадрами.

Вибірка зразка

Зауважте, що я додав два нові рядки між кадрами. Найбільш гольф-код вище не додає порожні рядки між кадрами, холодніший очищає екран.

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

SmileBASIC, 109 105 байт

G$="_"*4INPUT X
FOR I=0TO 4?" "*X;"--O--";CHR$(10)*(4-I)?G$;"|     |";G$X=X-SGN(X-5)?NEXT?G$;"|--O--|";G$

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.