アスキーアート「フライトシミュレーター」


24

編集

元の投稿のタイプミスに続いて、プレーンを定義するために小文字のoを使用し、後で大文字を使用する混乱があったようです。残念ながら、このバグはサンドボックスで検出されませんでした。多くのメンバーが両方で答えを書いているので、タイプミスが私のせいだったので、飛行機の定義で大文字または小文字のoを許可します。これに新しいルールを追加しました。

バックグラウンド

アスキーアートアニメーションが好きなので、ここにもう1つあります。これは実装するのが難しすぎるとは思わないので、うまくいけば短く興味深い答えが得られるでしょう。

仲間のコミュニティメンバー全員に

答えを改善する場合は、バイトカウントを次のように変更してください。

古いバイト数新しいバイト数

進捗状況を確認できます。ありがとう!

チャレンジ

これはアスキープレーンです

--O--

これがアスキーの滑走路です

____|     |____

飛行機は滑走路の上の5つの改行から始まります。メートル系と帝国系の間の衝突を防ぎ、これを真に国際的な課題にするために、メートルやフィートについては言及しません。例:

        --O--




____|     |____

以下に示すように、飛行機は滑走路の真ん中に正確に着陸する必要があります。

____|--O--|____

入力

平面の最初の水平位置は、左翼の先端を参照するために使用される整数入力によって定義されます。つまり、0〜10の間です。

出力

飛行機の飛行の各段階を表示する必要があります。以下の例(input = 10):

          --O--




____|     |____

         --O--



____|     |____

        --O--


____|     |____

       --O--

____|     |____

      --O--
____|     |____

____|--O--|____

物事をシンプルに保つために、私たちは遠近法則を無視しています。滑走路は、近づくと同じサイズのままです。

ルール

  • 更新プレーンの中央は大文字または小文字oのどちらでもかまいませんが、どちらを選択してもコード全体で一貫している必要があります。ご使用の言語が上記の文字をサポートしていない場合は、ASCIIのみの代替文字を使用してください。
  • 平面は、フレームごとに1行下降します。
  • 平面は、1行下がるたびに1スペースだけ左または右に移動できます。下降ラインごとに移動する必要はありません。滑走路で終了する限り、右または左に移動するのはあなた次第です。あなたはパイロットです!
  • エラー処理は不要です。入力は常に0〜10の有効な整数であると仮定できます。
  • 出力は上記の文字のみで構成されている必要があり(言語でサポートされていない場合は編集された最初のルールを参照)、同じサイズである必要があります。上記の例のように、高さが進むにつれて減少する場合があります。
  • プログラムまたは機能は問題ありませんが、上記のような出力を生成する必要があります。
  • 先頭/末尾のスペース/改行は、私には問題ありません。
  • 必要に応じて、出力フレーム間の画面をクリアしてください。これは必須ではありません
  • 通常のように禁止されている標準的な抜け穴(この種の課題に役立つ多くのものはないと思いますが)。
  • これはコードゴルフですので、最短の回答が明らかに勝者であり、おそらくほとんどの票を獲得しますが、本当に興味深い解決策が予想外の言語で登場した場合、たとえそれが長くても、必ずしも最良の回答として受け入れられるとは限りません。それが機能する限り、ルールを満たすものは何でも自由に投稿してください。

Python 2のUngolfedリファレンス実装は、Try it onlineで入手できます!そのため、さまざまな入力値を検索する方法を確認できます。


私は、出力が入力に依存することはコルモゴロフ複雑だとは思わない
OVS

@ovsの説明をありがとう。そのタグを削除します。
エルペドロ

通常、承認は、目的の勝利基準に最も適合する回答に進みます。別の長い回答を受け入れると、多少の問題が発生する場合があります。
レベルリバーセント

@LevelRiverStに感謝します。これを明確にするメタ投稿はありますか?そうでない場合は、おそらく回答を受け入れない方が良いでしょう。
エルペドロ

ところで、私は前に長い答えを受け入れ、コミュニティからの無ちゃったごめんなさいと同様に短く答えに信用を与えている前の挑戦。質問の最後にある結果コメントをご覧ください。これは間違っていましたか?
エルペドロ

回答:


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をチェックして、ヒントをありがとう。
エルペドロ

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と-に置き換えました。これはバイトカウントに影響しません。


OK、Linuxを使用しています。これをテストするためにダウンロードを推奨できますか?ところで、私は通訳が見つかるまで
うまくいくと思う

残念だけど違う。Windows 10コンピューターにWabbitemuとTilEmの両方をインストールしていますが、物理的なTI-84 +でコードをテストします。すみません
黄金比

問題ない!ちょうど尋ねる:)
ElPedro

コードの編集の多くのために、最速我々両方は私がclrhomeを追加した時点で、60バイトの結論に来るまで、このポストとジュリアンLachnietの間で交互にして作られたバイト数62
黄金比

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--|____'

オンラインで試す

着陸飛行機の最後の行を単にハードコードします。ループの前の部分を再利用するか、ループに統合することにより、ゴルフを行うことができます。



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
エルペドロ

ねえ、人々がTryitonline(Javascriptでそれが可能かどうかわからない)または上記の10の例の別の解決策のいずれかを投稿したらいいでしょう。代わりに、たとえば2からの出力を投稿できますか?:)
エルペドロ

@ElPedro、ブラウザコンソールでJavaScriptを実行できますが、オンラインコンソールもいくつかあります。リンクを追加します。例も変更します。
ルーク

ありがとう。問題ありません。私はあなたがそれを実行するためにウェブページを必要とする昔のJavascriptに夢中です。私は時間で取得する必要があると思います:)最近のサーバーサイド。迅速でクールな回答を尊重します。
エルペドロ

3

Scala、224181バイト

編集:私はあなたが"string"*nそれをn回繰り返すためにあなたができることがわからなかった!Scalaは私の心を吹き続けます。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=。等号を省略すると、戻り値の型がUnitに設定されます。
corvus_192

また、なぜo最初の行で初期化しないのですか?のでi、常に> = 0である、あなたは変更することができますi!=0&&i==ti>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からパラメーターを減算します。最後の行は、Batchに最も近いバッチx-=sgn(x-5)です。


2

sed、181バイト+ -nrフラグ用2

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

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

ビットごとの文字列演算子は、2つの文字列の特定の位置にある文字のコードポイント値を使用して、出力文字列のその位置にある新しい文字を計算するため、機能します。
この場合:

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

大文字のOプレーンの場合~^、プレーンマスク\r\ro\r\r(バックスラッシュの+4バイト)を使用して(string bitwise XOR)を使用できます。

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

オンラインでお試しください!

これは、384から160に絞り込まれたリファレンス実装です。楽しみのために投稿し、Pythonのより良い回答を奨励しています。


自分のチャレンジに参加できます(このメタ投稿を参照)。
ダダ

できるのwhile-~x
-FlipTack

また、私はあなたがいずれかから加算または減算ビット書くことができると思うii+=(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--|____"}

飛行機の位置、改行、空港の順に印刷します。次に、5を基準とした位置に応じて、平面を1、-1、または0ずつ移動します。

上記の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

Mathematica、111バイト

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

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

匿名関数。入力として数値を受け取り、出力として文字列を返します。おそらくさらにゴルフすることができます。


1

QBIC93 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

これらは機能的に同じです。2番目のものには、フレーム間で画面がクリアされ、フレーム間で0.5秒間停止するという追加機能があります。

サンプル出力

フレーム間に2つの改行を追加したことに注意してください。上記の最もゴルフされたコードは、フレーム間に空の行を追加せず、よりクールなコードは画面をクリアします。

Command line: 10


          --O--




____|     |____


         --O--



____|     |____


        --O--


____|     |____


       --O--

____|     |____


      --O--
____|     |____


____|--O--|____

説明

これはQBICについて私が本当に好きな多くのことに触れており、その機能のいくつかがボンネットの下でどのように機能するかについての良い洞察を与えると感じているので、私は説明を少しやり過ぎました。QBICは、そのコアがCodegolfのQBasicインタープリターであることに注意してください。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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.