Vẽ cung tròn của một quả bóng


35

Vẽ quỹ đạo parabol của một quả bóng ném.

Đầu vào là vận tốc đi lên ban đầu của quả bóng, một số nguyên dương v. Mỗi giây, quả bóng di chuyển 1không gian bên phải và vkhông gian theo chiều dọc, và sau đó vgiảm dần 1do trọng lực. Vì vậy, vận tốc lên cuối cùng bước xuống từ vđến 0và xuống -v, cuối cùng rơi xuống với chiều cao ban đầu của nó.

Vị trí của quả bóng theo dấu parabola. Ở vị trí nằm ngang x, chiều cao của nó là y=x*(2*v+1-x)/2, với (0,0)vị trí ban đầu của quả bóng ở phía dưới bên trái.

Xuất ra nghệ thuật ASCII về quỹ đạo của quả bóng với Otọa độ mà nó từng chiếm giữ. Đầu ra phải là một đoạn văn bản nhiều dòng, không phải là hình động của đường dẫn theo thời gian.

Đầu ra không được có dòng mới hàng đầu và nhiều nhất là một dòng mới. Dòng dưới cùng phải được làm phẳng với cạnh trái của màn hình, tức là không có khoảng trắng ở đầu. Không gian lưu trữ là OK. Bạn có thể giả sử chiều rộng dòng đầu ra vừa với đầu cuối đầu ra.

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

Liên quan: Mô phỏng bóng nảy


Bảng xếp hạng:


Chúng ta có thể đưa ra một danh sách các dòng?
Rɪᴋᴇʀ

@Riker Không, chuỗi với dòng mới.
xnor

liên quan lỏng lẻo: codegolf.stackexchange.com/q/110410
Titus

Tôi chỉ cần tài khoản cho V> 0?
nmjcman101

Có, v sẽ tích cực.
xnor

Câu trả lời:


17

Than , 18 16 13 byte

-3 byte nhờ @Neil !

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

Giải trình

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

Hãy thử trực tuyến! Liên kết là để mã dài dòng.


Tôi thích cái này rất nhiều, +1; Ngoài ra đầu ra của OP sử dụng chữ hoa "O". (Không phải vấn đề gì cả lol)
Albert Renshaw

Nếu bạn sử dụng ↘Othì bạn có thể lặp từ 0 đến N, thay vào đó giúp bạn tiết kiệm hai byte ngay lập tức.
Neil

@Neil Cảm ơn! Ngoài ra, đây là một bài viết rất cũ: P (và tôi tự hỏi liệu tôi có nên sử dụng các tính năng mới hơn không. Có lẽ là không?)
ASCII - chỉ

Nói đúng ra tôi đã chỉ lưu bạn 1 byte cho đến nay là hai byte khác được bạn thay thế ⁺¹với . Tuy nhiên bây giờ mà bạn đã di chuyển từ ‖CđếnO bạn có thể lưu một byte khác bằng cách viết ↙OMι↓, vì vậy tôi sẽ sao lưu lại thành hai byte.
Neil

Ngoài ra, bạn quên cập nhật liên kết TIO của bạn. Và về mặt kỹ thuật tôi tin rằng chúng tôi hiện cho phép các tính năng mới hơn, nhưng tôi không thể yêu cầu tín dụng cho các byte đó.
Neil

6

C, 93 92

(Lưu ý, ai đó đã nhận được 87 trong các ý kiến)

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

Hãy thử trực tuyến!


Có thể đọc được

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

Ghi chú:

Tôi có thể thu gọn cả hai vòng lặp thành một vòng lặp bằng cách lặp lại tổng số dòng được xuất ra, được đưa ra bởi công thức: 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("");
}

Nhưng cuối cùng, nó thậm chí còn nhiều byte hơn là chỉ sử dụng hai vòng lặp for riêng biệt


Bạn có thể lưu một byte bằng cách tăng slúc đầu, như thế này: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 sẽ không biên dịch cho tôi. Ngoài ra tôi đã nhận được 90 byte khi tôi đếm nó (sau khi xóa các ký tự khoảng trắng)
Albert Renshaw

Tất cả tôi đã làm là thêm ++s;ngay từ đầu và sau đó thay đổi y<=sđể y<ss-y+1để s-ys+1-nđể s-n, vì vậy nó phải biên dịch (và nên là 91 byte).
Steadybox

Có vẻ như có gì đó không đúng với mã hóa khối mã trong nhận xét của tôi. Sao chép và dán mã từ nhận xét sẽ không biên dịch cho tôi.
Steadybox




4

Python 2, 76 byte

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

Khá đơn giản. Các i-x+1and ilà để ngăn chặn một loạt các dòng mới trailing.


Di chuyển dòng mới đến phần đầu của bản in, như '\n'*(i-1)tiết kiệm 7 byte trong khi tránh các dòng mới.
Emigna

4

MATL , 19 17 byte

Q:tqYsQ79Z?PtPv!c

Hãy thử nó tại MATL Online! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

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

Đã lưu 4 byte nhờ Adnan

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

Hãy thử trực tuyến!

Giải trình

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

Đối với 14 byte: ƒ¶N×'ONúRÂJ}.c:)
Adnan

@Ad Nam Cảm ơn! Tôi đã thử .cvới một phiên bản khác, nhưng sau đó nó không hoạt động tốt. Quên về việc thử nó với cái này và hoàn toàn quên nó útồn tại :)
Emigna

Chắc chắn tốt hơn phương pháp zip tôi đã chọn, cách tiếp cận thú vị theo chiều dọc.
Bạch tuộc ma thuật Urn

4

JavaScript (ES6), 98 92 89 84 78 byte

(-20 byte nhờ Arnauld!)

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

Một giải pháp đệ quy. Đây cũng là đầu tiên của tôi bao giờ câu trả lời trong Javascript, vì vậy hãy nhẹ nhàng! Tôi vẫn đang học tất cả các ngôn ngữ gọn gàng này để cung cấp, vì vậy các mẹo chơi golf được đánh giá rất cao. :)

Kiểm tra đoạn trích

Bạn có thể cần phải cuộn để xem toàn bộ đầu ra.

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>


Ngoài ra, bao gồm các biến bên trong chuỗi backtick ${}chỉ lưu các byte khi phần biến được bao quanh bởi các phần tĩnh. Như vậy, các chuỗi này phải luôn luôn bắt đầu và kết thúc với các phần tĩnh.
Luke

@Arnauld Cảm ơn tất cả các lời khuyên! Tôi rất trân trọng điều này! :)
R. Kap

@Luke Cảm ơn lời khuyên. Điều đó sẽ có ích. :)
R. Kap

Bạn có thể sử dụng một cách an toàn 0thay vì "0". Họ sẽ bị ép buộc thành chuỗi. Và trên suy nghĩ thứ hai: i++<v&&ithực sự là một byte ngắn hơn (i<v)*++i.
Arnauld ngày

@Arnauld Cảm ơn bạn một lần nữa! :)
R. Kap

3

RProgN 2 , 37 byte

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

Hòa nhập với ngôn ngữ chơi golf của tôi trước khi những người chơi golf thích hợp nhảy vào.

Giải thích

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

Hãy thử trực tuyến!


3

Võng mạc, 29 19 byte

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

Hãy thử trực tuyến!

Đưa đầu vào trong unary như một khoảng trống. Cổng câu trả lời JavaScript của tôi. Chỉnh sửa: Đã lưu 10 byte nhờ @ MartinEnder ♦.


Tôi chỉ chờ đợi ai đó nghĩ ra một bản Retina được gọi là Retsina.
Tít

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

Chỉ hoạt động trong một thiết bị đầu cuối vì nó sử dụng các chuỗi thoát ANSI . đại diện cho byte CSI ( 0x9b ).

Chạy thử nghiệm

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

Bạn có thể sử dụng sed $nqđể lưu một byte.
zeppelin

Thật đáng buồn không. Tôi phải sử dụng sed ${n}qlâu hơn.
Dennis

Argh, tôi hiểu rồi, bạn có thể làm sed $n\qthay thế, nhưng điều đó cũng không có ý nghĩa gì nhiều, vì nó sẽ có cùng số byte như 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="")
  • Tạo một ma trận khoảng trắng (biến a là chiều rộng của ma trận này, tiết kiệm một vài byte)
  • Điền vào "o" tại các vị trí cần thiết, làm việc từ đỉnh vòng cung trở xuống và hướng ra ngoài
  • Thêm một dòng mới ở cuối mỗi hàng ma trận
  • Thu gọn ma trận xuống một chuỗi và in

Đây là nỗ lực đầu tiên của tôi trong việc chơi golf, ý kiến ​​hoan nghênh ...


3

Röda , 53 52 byte

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

Hãy thử trực tuyến!

Sử dụng: main { f(5) }

Phiên bản bị đánh cắp:

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

Bạn có thể sử dụng một dòng mới thay vì \nvà tiết kiệm 1 byte không?
Kritixi Lithos

@KritixiLithos Điều đó hoạt động. Cảm ơn!
fergusq

2

Befunge, 75 73 byte

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

Hãy thử trực tuyến!

Dòng đầu tiên đọc theo vận tốc, v và lưu một bản sao trong bộ nhớ. Dòng thứ hai sau đó đếm ngược từ v xuống 0, với chỉ số i và trên mỗi lần lặp sẽ đẩy một chuỗi các cặp ký tự / độ dài lên ngăn xếp.

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

Trình tự này đại diện cho một loại mã hóa độ dài chạy của đầu ra được yêu cầu ngược lại. Hai dòng cuối cùng sau đó chỉ cần bật các cặp ký tự / độ dài này ra khỏi ngăn xếp, xuất ra các lần xuất hiện độ dài của mỗi ký tự , cho đến khi ngăn xếp trống.


2

Java 8, 129 124 109 byte

Chơi gôn

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

Hãy thử trực tuyến!

Ung dung:

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


Đối với vòng lặp lồng nhau thứ hai, tôi nghĩ for(;j<v;++)sẽ hoạt động, bởi vì tại thời điểm này j==y. Ngoài ra, bạn có thể loại bỏ thứ ba bằng cách thêm một biến chuỗi thứ hai bên trong vòng lặp chính cho vòng lặp String t="";(12) và t+=" ";(8) bên trong vòng lặp lồng nhau đầu tiên. Sau đó, vòng lặp thứ ba sẽ trở thànhs+="o"+t+"o";
nmjcman101

Ngoài ra, bạn có thể kết hợp hai vòng lặp lồng nhau đầu tiên với nhau for(j=0;j<v;++j)s+=j<y?"\n":" ";mặc dù tôi không chắc cách kết nối này với nhận xét trước đó của tôi vềt
nmjcman101

Bạn có thể khởi tạo t=""cùng với s ở đầu, sau đó thêm t+=" "từng vòng lặp sau khi bạn thực hiệns+="o"+t+"o"
nmjcman101


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

Đã lưu tổng cộng 29 byte nhờ Taylor Scott

Điều này phải được chạy trong cửa sổ VBA Im Instant và in kết quả tương tự.

Mở rộng / Định dạng, nó trở thành:

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

(Hóa ra việc ghép nối trong lệnh in là tự động mà không cần toán tử.)


b & s &Cảnh báo không gian!
Máy

Tôi đã thử và nó đã sai lần đầu tiên. Quay trở lại, tôi nhận ra nó sẽ mở rộng b &s &Stringnhưng không b&s&String. Ngoài ra, lúc đầu tôi nghĩ bạn có nghĩa là sử dụng Spacehàm mà tôi hoàn toàn nên có và cuối cùng tiết kiệm được nhiều byte hơn.
Kỹ sư Toast

Bạn có thể ngưng tụ for i=0 To vdebug.? bđến for i=0To vDebug.?b, tương ứng cho -2byte. Và để bạn biết, sự đồng thuận của cộng đồng là đối với các ngôn ngữ có tính năng tự động định dạng, bạn có thể đếm trước khi nó được tự động định dạng, nghĩa là sau khi bạn thực hiện những thay đổi này, bạn nên có số byte là 85 Byte
Taylor Scott

Ở cái nhìn thứ hai, đây là một đoạn - không phải là hàm hoặc chương trình con; vì vậy nó không phải là một giải pháp hợp lệ Tôi tin rằng bạn có thể khắc phục điều này bằng cách chuyển đổi nó thành hàm cửa sổ ngay lập tức VBA của Excel và lấy đầu vào từ [A1]( v=[A1]) Ngoài ra, tôi không nghĩ rằng bạn thực sự cần sbiến.
Taylor Scott

1
@TaylorScott Điều đó có vẻ như là một sự cải thiện rõ ràng khi nhìn lại nhưng tôi không biết rằng việc ghép nối không yêu cầu một nhà điều hành trong cửa sổ ngay lập tức. Điều đó sẽ giúp tôi tiết kiệm một số byte trong tương lai. ;Mặc dù vậy, tôi đã phải thêm một vào cuối lệnh in, bởi vì nó tiếp tục thêm một ngắt dòng bổ sung theo mặc định. Cảm ơn!
Kỹ sư Toast

2

05AB1E , 18 13 byte

ÝηRO«ð×'O«ζ»

Hãy thử trực tuyến!

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

Thạch , 17 16 byte

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

Hãy thử trực tuyến!

Làm sao?

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

Chạy với echo <v> | php -nR '<code>'hoặc kiểm tra nó trực tuyến .

vòng lặp $argnxuống từ đầu vào đến 0$ilên từ 0;
in - theo thứ tự đó - trong mỗi lần lặp

  • $i dòng mới (không có trong lần lặp đầu tiên)
  • đệm trái: $argndấu cách
  • bóng trái: o
  • đệm bên trong: 2*$ikhông gian
  • bóng phải: o

1

V , 23 19 byte

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

Hãy thử trực tuyến!

Giải thích

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>

Giải pháp không lợi nhuận. Yêu cầu lập chỉ mục rất khó chịu, cả ở trên và 62 byte sau (tôi không biết liệu nó có dẫn đến cổng Retina ngắn hơn không) giải pháp đệ quy:

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


0

Xếp chồng lên nhau, 67 63 byte

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

Nỗ lực ban đầu, 67 byte

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

Chương trình đầy đủ. Tạo ra một cái gì đó như:

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

Đó là phần đệm, chuyển, đảo ngược và xuất ra.


0

Hàng loạt, 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}}

Không có dòng mới nào (theo quy định cho phép: " nhiều nhất một dòng mới ")


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

Nếu tôi có thể tìm ra cách làm toán bên trong việc lặp lại tổ hợp phím, điều đó thật tuyệt.
- VK20tương đương với khoảng trắng
- FileAppendxuất ra stdoutnếu tên tệp là*



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.