Gambar lengkung bola


35

Gambar lintasan parabola bola yang dilempar.

Input adalah kecepatan awal bola ke atas, bilangan bulat positif v. Setiap detik, bola menggerakkan 1ruang ke kanan dan vruang secara vertikal, dan kemudian vberkurang 1karena gravitasi. Jadi, kecepatan ke atas akhirnya mundur dari vke 0dan turun ke -v, akhirnya jatuh kembali ke ketinggian awal.

Posisi bola menelusuri parabola. Pada posisi horizontal x, tingginya adalah y=x*(2*v+1-x)/2, dengan (0,0)posisi awal bola di kiri bawah.

Keluarkan seni lintasan bola ASCII Odengan koordinat yang pernah didudukinya. Outputnya harus berupa satu bagian teks multi-baris, bukan animasi jalur seiring waktu.

Output seharusnya tidak memiliki baris baru dan paling banyak satu baris setelah baris. Intinya harus rata dengan tepi kiri layar, yaitu tidak memiliki spasi tambahan. Ruang tambahan tidak apa-apa. Anda dapat menganggap lebar jalur keluaran cocok di terminal keluaran.

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

Terkait: Simulasi bola memantul


Papan peringkat:


Bisakah kita membuka daftar baris?
Rɪᴋᴇʀ

@Riker Tidak, string dengan baris baru.
xnor


Apakah saya hanya perlu memperhitungkan V> 0?
nmjcman101

Ya, v akan positif.
xnor

Jawaban:


17

Arang , 18 16 13 byte

-3 byte terima kasih kepada @Neil !

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

Penjelasan

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

Cobalah online! Tautan adalah untuk kode verbose.


Saya sangat suka yang ini, +1; Output OP juga menggunakan huruf besar "O". (Bukan berarti itu penting sama sekali lol)
Albert Renshaw

Jika Anda menggunakan ↘Omaka Anda dapat loop dari 0 ke N inklusif sebagai gantinya yang menghemat dua byte segera.
Neil

@Neil Terima kasih! Juga, ini adalah posting yang sangat lama: P (dan saya ingin tahu apakah saya harus menggunakan fitur yang lebih baru. Mungkin tidak?)
ASCII-only

Sebenarnya saya hanya menyelamatkan Anda 1 byte sejauh dua byte lainnya Anda mengganti ⁺¹dengan . Namun sekarang setelah Anda memindahkan dari ‖Cke OAnda dapat menyimpan byte lain dengan menulis ↙OMι↓, jadi saya kembali ke penghematan dua byte lagi.
Neil

Anda juga lupa memperbarui tautan TIO Anda. Dan secara teknis saya percaya kita sekarang mengizinkan fitur yang lebih baru, tetapi saya tidak bisa mengklaim kredit untuk byte tersebut.
Neil

6

C, 93 92

(Catatan, seseorang mendapat 87 komentar)

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("");}}

Cobalah online!


Dapat dibaca:

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("");
    }
}

Catatan:

Saya dapat menutup keduanya untuk loop menjadi hanya satu untuk loop dengan mengulangi jumlah total baris yang dihasilkan, yang diberikan oleh rumus: 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("");
}

Tetapi akhirnya menjadi lebih banyak byte daripada hanya menggunakan dua loop terpisah untuk


Anda dapat menyimpan satu byte dengan menambahkan sdi awal, seperti ini: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 tidak akan mengkompilasi untuk saya. Saya juga mendapatkan 90 byte ketika saya menghitungnya (setelah menghapus karakter spasi)
Albert Renshaw

Yang saya lakukan adalah menambahkan ++s;di awal dan kemudian mengubah y<=ske y<sdan s-y+1ke s-ydan s+1-nke s-n, jadi itu harus dikompilasi (dan harus 91 byte).
Steadybox

Tampaknya ada sesuatu yang salah dengan pengkodean blok kode dalam komentar saya. Menyalin dan menempelkan kode dari komentar tidak akan mengkompilasi untuk saya juga.
Steadybox



5

GNU sed, 41

  • Skor termasuk +1 dari -rbendera ke sed.
s/$/OO/
:
s/(\s*) O( *)O$/&\n\1O \2 O/
t

Input dalam bentuk unary, sebagai string spasi - panjang string adalah input.

Cobalah online .


4

Python 2, 76 byte

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

Cukup mudah. Hal i-x+1and iini untuk mencegah sekelompok trailing newlines.


Memindahkan baris baru ke awal cetakan, seperti '\n'*(i-1)menghemat 7 byte sambil menghindari baris baru yang tertinggal.
Emigna

4

MATL , 19 17 byte

Q:tqYsQ79Z?PtPv!c

Cobalah di MATL Online! Atau verifikasi semua kasus uji .

Penjelasan

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

05AB1E , 18 14 byte

Disimpan 4 byte berkat Adnan

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

Cobalah online!

Penjelasan

ƒ                   # 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 

Untuk 14 byte: ƒ¶N×'ONúRÂJ}.c:)
Adnan

@ Adnan Terima kasih! Saya mencoba .cdengan versi yang berbeda, tetapi tidak berfungsi dengan baik. Lupa tentang mencobanya dengan yang satu ini dan benar-benar lupa yang úada :)
Emigna

Jelas lebih baik daripada metode zip yang saya pilih, pendekatan yang menarik secara vertikal.
Magic Octopus Urn

4

JavaScript (ES6), 98 92 89 84 78 byte

(-20 byte terima kasih kepada Arnauld!)

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

Solusi rekursif. Ini juga jawaban pertama saya di JavaScript, jadi harap lembut! Saya masih mempelajari semua bahasa rapi ini yang ditawarkan, jadi tips bermain golf sangat dihargai. :)

Cuplikan Tes

Anda mungkin perlu menggulir untuk melihat seluruh output.

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>


Juga, termasuk variabel di dalam string backtick dengan ${}hanya menyimpan byte ketika bagian variabel dikelilingi oleh bagian statis. Dengan demikian, string ini harus selalu dimulai dan diakhiri dengan bagian statis.
Luke

@Arnauld Terima kasih atas semua tipsnya! Saya sangat menghargai itu! :)
R. Kap

@ Lukas Terima kasih atas sarannya. Itu akan berguna. :)
R. Kap

Anda dapat menggunakan dengan aman 0alih-alih "0". Mereka akan dipaksa untuk string. Dan pada pemikiran kedua: i++<v&&isebenarnya satu byte lebih pendek dari (i<v)*++i.
Arnauld

@Arnauld Terima kasih sekali lagi! :)
R. Kap

3

RProgN 2 , 37 byte

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

Masuk dengan bahasa jenis golf saya sebelum bahasa golf yang tepat melompat.

Dijelaskan

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

Cobalah online!


3

Retina, 29 19 byte

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

Cobalah online!

Mengambil input di unary sebagai ruang kosong. Port jawaban JavaScript saya. Sunting: Disimpan 10 byte berkat @ MartinEnder ♦.


Saya hanya menunggu seseorang untuk datang dengan spin off Retina yang disebut Retsina.
Titus

3

Bash , 76 byte

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

Hanya bekerja di terminal karena menggunakan urutan pelarian ANSI . mewakili byte CSI ( 0x9b ).

Uji coba

$ # 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

Anda dapat menggunakan sed $nquntuk menyimpan satu byte.
zeppelin

Sayangnya tidak. Saya harus menggunakan sed ${n}qyang lebih lama.
Dennis

Argh, saya mengerti, Anda bisa melakukannya sed $n\q, tetapi itu juga tidak masuk akal, karena jumlah byte yang sama head!
zeppelin


3

R, 89 byte

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="")
  • Buat matriks spasi (variabel a adalah lebar matriks ini, hemat beberapa byte)
  • Isi "o" di lokasi yang diperlukan, bekerja dari atas busur ke bawah dan ke luar
  • Tambahkan baris baru di akhir setiap baris matriks
  • Perkecil matriks ke string tunggal dan cetak

Ini adalah usaha pertama saya di golf, komentar selamat datang ...


3

Röda , 53 52 byte

f n{seq 0,n|{|i|["
"*i," "*(n-i),"O"," "*i*2,"O"]}_}

Cobalah online!

Pemakaian: main { f(5) }

Versi tidak disatukan:

function f(n) {
    seq(0, n) | for i do
        push("\n"*i, " "*(n-i), "O", " "*i*2, "O")
    done
}

Bisakah Anda menggunakan baris baru literal dan bukannya \nmenyimpan 1 byte?
Kritixi Lithos

@ KritixiLithos Itu bekerja. Terima kasih!
fergusq

2

Befunge, 75 73 byte

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

Cobalah online!

Baris pertama membaca dalam kecepatan, v , dan menyimpan salinan dalam memori. Baris kedua kemudian menghitung mundur dari v ke nol, dengan indeks i , dan pada setiap iterasi mendorong urutan pasangan karakter / panjang ke tumpukan.

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

Urutan ini merupakan semacam enkode run-length dari output yang diperlukan secara terbalik. Dua baris terakhir kemudian cukup memunculkan pasangan karakter / panjang ini dari tumpukan, menampilkan kejadian panjang masing-masing karakter , hingga tumpukan kosong.


2

Java 8, 129 124 109 byte

Golf:

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

Cobalah online!

Tidak Disatukan:

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);
  }
}


Untuk loop kedua untuk loop, saya pikir for(;j<v;++)akan berhasil, karena pada saat ini j==y. Selain itu, Anda bisa menghapus yang ketiga dengan menambahkan variabel string kedua di dalam loop utama untuk String t="";(12) dan t+=" ";(8) di dalam loop bersarang pertama. Kemudian loop ketiga menjadis+="o"+t+"o";
nmjcman101

Juga, Anda dapat menggabungkan dua loop bersarang pertama for(j=0;j<v;++j)s+=j<y?"\n":" ";meskipun saya tidak yakin bagaimana t
kaitan

Anda dapat menginisialisasi di t=""samping s di awal, dan kemudian menambahkan t+=" "setiap loop di sekitar setelah Anda melakukannyas+="o"+t+"o"
nmjcman101

2

Haskell, 69 byte

r=replicate
f n=[0..n]>>= \a->r a '\n'++r(n-a)' '++'O':r(2*a)' '++"O"

Contoh penggunaan: f 3-> " OO\n O O\n\n O O\n\n\nO O". Cobalah online! .


2

VBA, 124 112 85 88 66 63 59 byte

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

Total 29 byte disimpan berkat Taylor Scott

Ini harus dijalankan di jendela VBA Immediate dan cetak hasilnya dengan cara yang sama.

Diperluas / Diformat, menjadi:

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

(Ternyata rangkaian dalam perintah cetak otomatis tanpa operator.)


b & s &Waspada spasi!
CalculatorFeline

Saya mencoba dan itu salah pertama kali. Kembali, saya menyadari itu akan berkembang b &s &Stringtetapi tidak b&s&String. Juga, pada awalnya saya pikir Anda bermaksud menggunakan Spacefungsi yang seharusnya saya miliki dan yang akhirnya menghemat lebih banyak byte.
Engineer Toast

Anda dapat menyingkat for i=0 To vdan debug.? bke for i=0To vdan Debug.?b, masing-masing untuk -2byte. Dan agar Anda tahu, konsensus komunitas adalah bahwa untuk bahasa dengan autoformatting, Anda dapat menghitung sebelum autoformatted, artinya setelah Anda membuat perubahan ini, Anda harus memiliki hitungan byte 85 Bytes
Taylor Scott

Pada pandangan kedua, ini adalah cuplikan - bukan fungsi atau subrutin; jadi itu bukan solusi yang valid. Saya percaya bahwa Anda dapat memperbaikinya dengan mengubahnya menjadi fungsi jendela langsung Excel VBA dan mengambil input dari [A1]( v=[A1]) Juga, saya tidak berpikir Anda benar-benar membutuhkan svariabel.
Taylor Scott

1
@TaylorScott Itu sepertinya perbaikan yang jelas dalam retrospeksi tapi saya tidak tahu bahwa penggabungan tidak memerlukan operator di jendela langsung. Itu akan menyelamatkan saya beberapa byte di masa depan. Saya memang harus menambahkan a ;ke akhir perintah cetak, karena itu terus menambahkan jeda baris tambahan secara default. Terima kasih!
Engineer Toast

2

05AB1E , 18 13 byte

ÝηRO«ð×'O«ζ»

Cobalah online!

Ý                # [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

Jelly , 17 16 byte

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

Cobalah online!

Bagaimana?

‘Ḷ+\Ṛ⁶ẋ;€”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 byte

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

Jalankan dengan echo <v> | php -nR '<code>'atau coba online .

loop $argnturun dari input ke 0dan $idari 0;
mencetak - dalam urutan itu - di setiap iterasi

  • $i baris baru (tidak ada dalam iterasi pertama)
  • padding kiri: $argnspasi
  • bola kiri: o
  • inner padding: 2*$ispasi
  • bola kanan: o

1

V , 23 19 byte

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

Cobalah online!

Menjelaskan

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 byte

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>

Solusi non rekursif. Persyaratan pengindeksan menjengkelkan, baik di atas dan 62-byte berikut (saya tidak tahu apakah itu akan menghasilkan port Retina lebih pendek) solusi rekursif:

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


0

Ditumpuk, 67 63 byte

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

Upaya awal, 67 byte

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

Program lengkap. Menghasilkan sesuatu seperti:

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

Yaitu yang empuk, transpos, dibalik, dan dikeluarkan.


0

Batch, 163 byte

@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

Ruby, 52 byte

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

Tidak ada trailing newline (diizinkan oleh aturan: " paling banyak satu trailing newline ")


0

AHK, 93 byte

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%,*

Jika saya bisa mengetahui cara melakukan matematika di dalam penekanan tombol berulang, itu akan bagus.
- VK20sama dengan spasi
- FileAppendmenghasilkan stdoutjika nama file*



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.