ボールの弧を描く


35

投げられたボールの放物線の軌跡を描きます。

入力は、ボールの初期上昇速度、正の整数vです。1秒ごとに、ボールは1スペースを右に移動しv、垂直にスペースを空けv1から、重力によりによって減少します。したがって、上昇速度は最終的にからvまで0下降し-v、最終的に初期の高さに戻ります。

ボールの位置は放物線を描きます。水平位置でx、その高さはy=x*(2*v+1-x)/2(0,0)、ボールの初期位置は左下にあります。

ボールの軌跡のASCIIアートを、Oそれが占める座標上のを使用して出力します。出力は、時間の経過に伴うパスのアニメーションではなく、単一の複数行のテキストである必要があります。

出力には、先頭の改行がなく、最大で1つの末尾の改行が必要です。一番下の行は、画面の左端と同じ高さである必要があります。つまり、余分な先行スペースはありません。末尾のスペースはOKです。出力線幅が出力ターミナルに収まると仮定することができます。

v = 1

 OO 
O  O

v = 2

  OO  
 O  O 

O    O

v = 3

   OO   
  O  O  

 O    O 


O      O

v = 4

    OO    
   O  O   

  O    O  


 O      O 



O        O

v = 10

          OO          
         O  O         

        O    O        


       O      O       



      O        O      




     O          O     





    O            O    






   O              O   







  O                O  








 O                  O 









O                    O

関連:跳ねるボールのシミュレーション


リーダーボード:


行のリストを出力できますか?
Rɪᴋᴇʀ

@Riker Nope、改行付きの文字列。
-xnor


V> 0のみを考慮する必要がありますか?
nmjcman101

はい、vは正です。
xnor

回答:


17

18 16 13バイト

@Neilのおかげで-3バイト!

F⊕N«←OM⊕ι↓»‖C

説明

F⊕N«        »    For ι (implicitly from 0) to (1 + input as number)
       ←O          Print O, with print direction rotated 180 degrees
         M⊕ι↓     Move 1+ ι units down

                ‖C Reflect (in the default direction, right), leaving original intact

オンラインでお試しください!リンクは冗長コードです。


私はこれをとても気に入っています、+ 1。また、OPの出力では大文字の「O」が使用されます。(それはまったく重要ではありませんlol)
アルバートレンショー

使用する場合は↘O、代わりに0からNまでをループすることができ、2バイトをすぐに節約できます。
ニール

@ニールありがとう!また、これは非常に古い投稿です:P(そして、新しい機能を使用する必要があるかどうか。おそらくそうではないでしょうか?)
ASCIIのみ

厳密に私はこれまでのところ、他の2つのバイトはあなたが交換されたとして、あなたに1つのバイトを保存した話す⁺¹。しかし、今あなたが移動したことからする‖CO書き込むことにより、別のバイトを保存することができます↙OMι↓私はバックアップを再びセーブ2バイトにしていて、。
ニール

また、TIOリンクを更新するのを忘れました。技術的には、新しい機能を使用できるようになったと思いますが、これらのバイトの功績を主張することはできません。
ニール

6

C、93 92

(注、誰かがコメントで87になった)

y,n;f(s){for(y=0;y<=s;){printf("%*c%*c",s-y+1,79,y*2+1,79);for(n=++y;s+1-n&&n--;)puts("");}}

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


読みやすい:

y,n;f(s){
    for(y=0;y<=s;){
        printf("%*c%*c",s-y+1,79,y*2+1,79);
        for(n=++y;s+1-n&&n--;)puts("");
    }
}

ノート:

出力された行の合計数を反復することで、両方のforループを1つのforループにまとめることができます。 n*-~n/2+1

y,n,r;f(s){
    for(r=s,y=n=0;r<s*-~s/2+1;)
        y==n?printf("%*c%*c",s-y+1,79,y*2+1,79),y=0,++n:r++,y++,puts("");
}

しかし、2つの別個のforループを使用するよりもさらに多くのバイトになる


次のsように、先頭で増分することで1バイトを保存できますy,n;f(s){++s;for(y=0;y<s;){printf("%*c%*c",s-y,79,y*2+1,79);for(n=++y;s-n&&n--;)puts("");}}
。– Steadybox

@Steadyboxはコンパイルできません。また、(空白文字を削除した後)それを数えたときに90バイトを得ました
アルバートレンショー

すべて私が追加されたなかった++s;最初で、その後変更y<=sするy<ss-y+1するs-ys+1-ns-n、それはコンパイルする必要があります(と91バイトである必要があります)ので、。
-Steadybox

私のコメントのコードブロックのエンコーディングに何か問題があるようです。コメントからコードをコピーして貼り付けても、コンパイルされません。
Steadybox




4

Python 2、76バイト

x=input()
for i in range(x):print' '*(x-i),'O'+' '*i*2+'O'+'\n'*(i-x+1and i)

ものすごく単純。これi-x+1and iは、後続の改行の束を防ぐためです。


改行を印刷の先頭に移動すると'\n'*(i-1)、末尾の改行を避けながら7バイトを節約できます。
エミグナ

4

MATL19 17バイト

Q:tqYsQ79Z?PtPv!c

MATL Online試しくださいまたは、すべてのテストケースを確認します

説明

Q        % Implicitly input v. Add 1
:        % Push [1 2 ... v+1]
tq       % Duplicate and subtract 1: pushes [0 1 ... v]]
Ys       % Cumulative sum: gives [0 1 3 6 ...]
Q        % Add 1: gives [1 2 4 7 ...]
79       % Push 79 (ASCII for 'O')
Z?       % Create sparse matrix from column indices [1 2 3 4 ...],
         % row indices [1 2 4 7 ...], and data 79
P        % Flip vertically
tP       % Duplicate, flip vertically
v        % Concatenate the two matrices vertically
!        % Transpose
c        % Convert to char. Implicitly display. Char 0 is shown as space

4

05AB1E18 14バイト

Adnanのおかげで4バイト節約

ƒ¶N×'ONúRÂJ}.c

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

説明

ƒ                   # for N in [0 ... input]
 ¶N×                # push N newlines
    'O              # push "O"
      Nú            # pad with N spaces in front
        RÂ          # reverese and create a reversed copy
          J         # join everything to a string
           }        # end loop
            .c      # pad lines until centered 

14バイトの場合:ƒ¶N×'ONúRÂJ}.c:)
Adnan

@Adnanありがとう!.c別のバージョンで試しましたが、うまくいきませんでした。これで試してみることを忘れ、ú存在することを完全に忘れてしまった:)
エミグナ

私が選んだzipメソッドよりも間違いなく優れており、興味深いアプローチです。
魔法のタコUr

4

JavaScript(ES6)、 98 92 89 84 78バイト

(Arnauldのおかげで20バイト!)

f=(v,i=0)=>i>v?"":" "[r="repeat"](v-i)+0+" "[r](2*i)+0+`
`[r](i++<v&&i)+f(v,i)

再帰的なソリューション。これも私の初めてです JavaScriptでの回答でもあるので、優しくしてください!私はまだこのきちんとした言語が提供しなければならないことをすべて学んでいるので、ゴルフのヒントは非常に高く評価されています。:)

テストスニペット

出力全体を表示するには、スクロールが必要な場合があります。

f=(v,i=0)=>i>v?"":" "[r="repeat"](v-i)+0+" "[r](2*i)+0+`
`[r](i++<v&&i)+f(v,i)
<input id=i min=1 type=number><button onclick=alert(f(document.getElementById("i").value))>Submit</button>


また、${}変数部分が静的部分に囲まれている場合にのみ、バイトを保存するバックティック文字列内に変数を含めます。そのため、これらの文字列は常に静的部分で始まり、静的部分で終わる必要があります。
ルーク

@Arnauldすべてのヒントをありがとう!ほんとうにありがとう!:)
R.カップ

@Lukeアドバイスをありがとう。それは重宝します。:)
R.カップ

0代わりに安全に使用できます"0"。それらは文字列に強制されます。そして、考え直して:i++<v&&i実際には1バイトよりも短い(i<v)*++i
アーナルド

@Arnauldもう一度ありがとう!:)
R.カップ

3

RProgN 2、37バイト

x=0xR{y@xy-` *`o` y2**`o...2y{[` };};

適切なゴルフの言語が飛び込む前に、私の種類のゴルフ言語を取り入れる。

説明した

x=              # Set 'x' to the input
0xR{            # For everything between the input and 0
    y@          # Set the iteration value to y, for this function only.
    xy-` *      # Subtract y from x, repeat the string " " that many times.
    `o          # Push an "o" to the stack.
    ` y2**      # Push 2*y " "'s to the stack
    `o          # Push another "o" to the stack
    ...         # Concatenate the parts of this string together, giving us the two balls.
    2y{[` };    # For all numbers between 2 and y, add a newline.
};              #

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


3

網膜、29 19バイト

 ?
$.`$*¶$&$'O$`$`O

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

入力をスペースの連続として単項で受け取ります。JavaScript回答のポート。編集:@ MartinEnder♦のおかげで10バイト保存されました。


私は誰かがRetsinaと呼ばれるRetinaスピンオフを思い付くのを待っています。
タイタス

3

バッシュ、76バイト

for((n=$1+1;--n;));{
yes ''|head -$n
r=$r${n}AO
t=›${n}BO$t
}
echo O${r}O$t

ANSIエスケープシーケンスを使用するため、ターミナルでのみ機能しますCSIバイトを表します(0x9b)をます。

試運転

$ # The terminal's encoding must be set to ISO-8859-1.
$
$ xxd -g 1 arc.sh
0000000: 66 6f 72 28 28 6e 3d 24 31 2b 31 3b 2d 2d 6e 3b  for((n=$1+1;--n;
0000010: 29 29 3b 7b 0a 79 65 73 20 27 27 7c 68 65 61 64  ));{.yes ''|head
0000020: 20 2d 24 6e 0a 72 3d 24 72 9b 24 7b 6e 7d 41 4f   -$n.r=$r.${n}AO
0000030: 0a 74 3d 9b 24 7b 6e 7d 42 4f 24 74 0a 7d 0a 65  .t=.${n}BO$t.}.e
0000040: 63 68 6f 20 4f 24 7b 72 7d 4f 24 74              cho O${r}O$t
$
$ bash arc.sh 1
 OO
O  O
$ bash arc.sh 2
  OO
 O  O

O    O
$ bash arc.sh 3
   OO
  O  O

 O    O


O      O
$ bash arc.sh 4
    OO
   O  O

  O    O


 O      O



O        O

を使用sed $nqしてバイトを保存できます。
ツェッペリン

悲しいことに、いいえ。sed ${n}q長い方を使用する必要があります。
デニス

Argh、私は、あなたがsed $n\q代わりに行うことができますが、それは同じバイトカウントになるので、あまり意味がありませんhead
ツェッペリン


3

R、89バイト

a=2*v+3
x=matrix(" ",a,v^2+1)
for(k in 0:v)x[c(1-k,k+2)+v,k^2+1]="o"
x[a,]="\n"
cat(x,sep="")
  • スペースのマトリックスを作成します(変数aはこのマトリックスの幅で、数バイトを節約します)
  • 必要な場所に「o」を入力し、弧の上部から下および外に向かって作業します
  • 各行列行の最後に改行を追加します
  • マトリックスを1つの文字列にまとめて印刷する

これはゴルフの私の最初の試みです、コメントを歓迎します



2

Befunge、75 73バイト

<vp00:&
1<-1_:v#\+55:g01\-g01g00" O"1\*2g01" O"1p0
#@_\:v>$$:!
1\,:\_^#:-

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

最初の行は、速度vを読み取り、メモリにコピーを保存します。2行目は、インデックスiを使用してvからゼロにカウントダウンし、各反復で文字/長さのペアのシーケンスをスタックにプッシュします。

Length  Character
-----------------
1       'O'
i*2     ' '
1       'O'
v-i     ' '
i       LINEFEED

このシーケンスは、必要な出力の逆の種類のランレングスエンコーディングを表します。最後の2行は、これらの文字/長さのペアをスタックからポップし、スタックが空になるまで各文字の長さの出現を出力します。


2

ジャワ8、129の 124 109バイト

ゴルフ:

v->{String s="",t="";for(int j,y=0;y<=v;++y){for(j=0;j<v;++j)s+=j<y?"\n":" ";s+="o"+t+"o";t+="  ";}return s;}

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

ゴルフをしていない:

public class DrawTheArcOfABall {

  public static void main(String[] args) {
    for (int i = 1; i < 6; ++i) {
      System.out.println(f(v -> {
        String s = "", t = "";
        for (int j, y = 0; y <= v; ++y) {
          for (j = 0; j < v; ++j) {
            s += (j < y ? "\n" : " ");
          }
          s += "o" + t + "o";
          t += "  ";
        }
        return s;
      } , i));
      System.out.println();
      System.out.println();
    }
  }

  private static String f(java.util.function.IntFunction<String> f, int v) {
    return f.apply(v);
  }
}


ネストされた2番目のforループではfor(;j<v;++)、この時点で動作するため、動作すると思いますj==y。また、最初のネストされたループ内のメインforループString t="";(12)およびt+=" ";(8)内に2番目の文字列変数を追加することにより、3番目を削除できます。次に、3番目のループはちょうどs+="o"+t+"o";
-nmjcman101

また、最初の2つのネストされたループを結合することもできますがfor(j=0;j<v;++j)s+=j<y?"\n":" ";、これについての以前のコメントとどのように一致するかはわかりませんt
一致する -nmjcman101

t=""最初にsとともに初期化して、実行後にt+=" "各ループを追加することができますs+="o"+t+"o"
nmjcman101


2

VBA、124 112 85 88 66 63 59バイト

For i=0To[A1]:?Space([A1]-i)"O"Space(2*i)"O"String(i,vbCr):Next

テイラースコットのおかげで合計29バイトを節約

これは、VBAイミディエイトウィンドウで実行し、同じ結果を出力する必要があります。

展開/フォーマットされ、次のようになります。

For i=0 To [A1]
   Debug.Print Space([A1]-i) & "O" & Space(2*i) & "O" & String(i,vbCr)
Next

(印刷コマンドでの連結は、オペレーターなしで自動的に行われることが判明しています。)


b & s &スペースアラート!
電卓

試しましたが、最初は間違いでした。戻って、私はそれが拡大するb &s &Stringが、ではないことに気づいたb&s&String。また、最初は、あなたSpaceが私が完全に持つべき機能を使用するつもりだったと思いました。
エンジニアトースト

あなたは凝縮できるfor i=0 To vdebug.? bするfor i=0To vDebug.?b、それぞれのために、-2バイト。ちょうどあなたが知っているように、コミュニティの合意は、それがautoformattedされる前に、オートフォーマットを持つ言語のために、あなたはこれらの変更を行った後、あなたは85バイトのバイト数が必要です意味、カウントしてもよいということである
テイラー・スコット

もう一度見ると、これはスニペットであり、関数やサブルーチンではありません。したがって、有効なソリューションではありません。Excel VBAイミディエイトウィンドウ関数に変換し、[A1]v=[A1])から入力を取得することでこれを修正できると考えています。また、実際にs変数が必要だとは思いません。
テイラースコット

1
@TaylorScott振り返ってみると明らかに改善されているように見えますが、連結にはイミディエイトウィンドウに演算子が必要ないことは知りませんでした。将来的には数バイト節約できます。;ただし、デフォルトで余分な改行を追加し続けるため、印刷コマンドの最後にaを追加する必要がありました。ありがとう!
エンジニアトースト

2

05AB1E18 13バイト

ÝηRO«ð×'O«ζ»

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

Ý                # [0..n]
 €LRO            # [0.sum(), 0..1.sum(), ..., 0..n-1.sum(), 0..n.sum()]
     «          # Mirror image the array [0, 0..n.sum(), 0]
       ð×'O«     # Push that many spaces with an O appended to it.
            .B   # Pad small elements with spaces to equal largest element length.
              ø» # Transpose and print.

1

ゼリー17 16 バイト

‘Ḷ+\Ṛ⁶ẋ;€”Om0z⁶Y

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

どうやって?

‘Ḷ+\Ṛ⁶ẋ;€”Om0z⁶Y - Main link: v         e.g. 3
‘                - increment: v+1            4
 Ḷ               - lowered range             [0,1,2,3]
  +\             - reduce with addition      [0,1,3,6]
    Ṛ            - reverse                   [6,3,1,0]
     ⁶           - a space                   ' '
      ẋ          - repeat (vectorises)       ['      ','   ',' ','']
       ;€        - concatenate each with
         ”O      -     an 'O'                ['      O','   O',' O','O']
           m0    - concatenate reflection    ['      O','   O',' O','O','O','O ','O   ','O      ']
             z⁶  - transpose with space fill ['   OO   ','  O  O  ','        ',' O    O ','        ','        ','O      O']
               Y - join with line feeds      ['   OO   \n  O  O  \n        \n O    O \n        \n        \nO      O']
                 - implicit print

1

PHP、76バイト

for(;$argn>=0;$s.="  ")echo($r=str_repeat)("
",$i++),$r(" ",$argn--),o,$s,o;

オンラインで実行するecho <v> | php -nR '<code>'、オンラインでテストします

ループ$argnダウン入力からへ0$iアップ0から。
各順序で-その順序で-印刷します

  • $i 改行(最初の反復ではなし)
  • 左パディング:$argnスペース
  • 左のボール: o
  • 内側のパディング:2*$iスペース
  • 右のボール: o

1

V23 19バイト

2éoÀñYço/^2á O
HPJ>

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

説明する

2éo            " Insert two 'o's
   Àñ          " <Arg> times repeat
     Y         " Yank the current (top) line.  This is always '\s*oo'
      ço/      " On every line that matches 'o'
         ^     " Go to the first non-whitespace character (the 'o')
          2á   " Append two spaces (between the two 'o's
             O " Add a blank line on top of the current one
H              " Go to the first line
 P             " Paste in front ('\s*oo')
  J            " Join this line with the blank line immediately after it
   >           " Indent once

1

JavaScript(ES6)、87バイト

f=
n=>' '.repeat(n+1).replace(/./g,"$`#$'O$`$`O").replace(/ *#/g,s=>[...s].fill``.join`
`)
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

非再帰的なソリューション。上記と後続の62バイト(Retinaポートが短くなるかどうかはわかりません)の両方で、インデックス付けの要件は迷惑でした。

f=n=>~n?` `.repeat(n)+`OO`+f(n-1).replace(/^ *O/gm,`
$&  `):``


0

スタック、67 63バイト

args 0#1+:@x:>{!n x\-1-' '*'O'+n 2*' '*+'O'+x 1-n!=n*LF*+out}"!

最初の試行、67バイト

args 0# :@v 1+2*:>[:v:+1+\-2/*' '*'O'+''split]"!fixshape tr rev out

完全なプログラム。次のようなものを生成します。

('O'
 ' ' 'O'
 ' ' 'O'
 'O')

パディング、転置、反転、出力されます。


0

バッチ、163バイト

@set l=@for /l %%i in (1,1,%1)do @call
@set s=
%l% set s= %%s%%
@set t=
%l%:c&for /l %%j in (2,1,%%i)do @echo(
:c
@echo %s%O%t%O
@set s=%s:~1%
@set t=  %t%

0

ルビー、52バイト

->x{(0..x).map{|a|$><<$/*a+' '*(x-a)+?O+' '*a*2+?O}}

末尾の改行はありません(ルールで許可されています:「最大で1つの末尾の改行」)


0

AHK, 93 bytes

m=0
n=1
f=%1%-1
Loop,%1%{
r=%r%{VK20 %f%}O{VK20 %m%}O{`n %n%}
m+=2
n++
f--
}
FileAppend,%r%,*

If I could figure out how to do math inside of repeating keystrokes, that'd be great.
- VK20 equates to a space
- FileAppend outputs to stdout if the filename is *



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.