공의 호를 그리십시오


35

던진 공의 포물선 궤적을 그립니다.

입력은 공의 초기 상향 속도, 양의 정수 v입니다. 매초 공은 1공간을 오른쪽으로 이동 하고 v수직으로 간격을 둔 다음 중력으로 인해 v줄어 듭니다 1. 그래서, 상승 속도는 결국에서 아래 단계 v0와 아래로 -v마침내 아래로 초기 높이 하락.

공의 위치는 포물선을 추적합니다. 수평 위치에서 x, 높이입니다 y=x*(2*v+1-x)/2으로, (0,0)왼쪽 아래에있는 볼의 초기 위치.

공의 궤적에 대한 ASCII 아트를 공이 O차지하는 좌표에 출력 합니다. 출력은 시간 경과에 따른 경로 애니메이션이 아닌 단일 여러 줄의 텍스트 조각이어야합니다.

출력에는 선행 줄 바꿈이없고 최대 한 줄의 줄 바꿈이 있어야합니다. 결론은 화면의 왼쪽 가장자리와 같은 높이 여야합니다. 즉, 추가 선행 공간이 없습니다. 후행 공백은 괜찮습니다. 출력 라인 너비가 출력 터미널에 맞는 것으로 가정 할 수 있습니다.

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 17

예, 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"를 사용합니다. (모든 롤에 중요하지는 않습니다)
Albert Renshaw

사용 ↘O하면 0에서 N까지 반복하여 대신 2 바이트를 절약 할 수 있습니다.

@ 닐 감사합니다! 또한, 이것은 매우 오래된 게시물입니다 : P (그리고 새로운 기능을 사용해야하는지 궁금합니다. 아마 아닐까요?)
ASCII 전용

엄밀히 말하면 나는 다른 두 바이트가으로 대체 ⁺¹되는 한 1 바이트 만 절약 했습니다 . 그러나 지금 당신이 이동 한 것을 로부터를 ‖C받는 O작성하여 다른 바이트를 저장할 수 있습니다 당신이 ↙OMι↓내가 다시 다시 저장해 두 바이트 해요, 그래서.
Neil

또한 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 루프를 하나의 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("");
}

그러나 두 개의 별도 for-loop를 사용하는 것보다 훨씬 많은 바이트가됩니다.


다음 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 바이트를 얻었습니다.
Albert Renshaw

모든 내가 추가 한 않았다 ++s;변경 후 시작과 y<=sy<ss-y+1s-ys+1-ns-n가 컴파일해야한다 (91 바이트해야한다), 그래서.
Steadybox

내 의견에 코드 블록 인코딩에 문제가있는 것 같습니다. 주석에서 코드를 복사하여 붙여 넣는 것도 컴파일되지 않습니다.
Steadybox




4

파이썬 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 바이트를 절약합니다.
Emigna

4

MATL , 19 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

05AB1E , 18 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다른 버전으로 시도했지만 제대로 작동하지 않았습니다. 이것으로 그것을 시도하는 것을 잊었고 ú존재하는 것을 잊었다 :)
Emigna

내가 선택한 zip 방법보다 확실히 낫습니다.
Magic Octopus Urn

4

자바 스크립트 (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)

재귀 솔루션. 이것은 또한 내 처음으로 이제까지 자바 스크립트에 대한 답변, 그래서 부드러운 주시기 바랍니다! 나는 여전히이 깔끔한 언어가 제공하는 모든 것을 배우고 있으므로 골프 팁이 매우 높이 평가됩니다. :)

테스트 스 니펫

전체 출력을 보려면 스크롤해야 할 수도 있습니다.

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>


또한 백틱 문자열 안에 변수를 포함 ${}하면 변수 부분이 정적 부분으로 둘러싸 일 때 바이트 만 절약됩니다. 따라서 이러한 문자열은 항상 정적 부분으로 시작하고 끝나야합니다.
Luke

@Arnauld 모든 팁을 주셔서 감사합니다! 정말 감사! :)
R. Kap

@Luke 조언을 주셔서 감사합니다. 유용 할 것입니다. :)
R. Kap

0대신에 안전하게 사용할 수 있습니다 "0". 그들은 끈으로 강요됩니다. 그리고 다시 생각하면 : i++<v&&i실제로 1 바이트보다 짧습니다 (i<v)*++i.
Arnauld

@Arnauld 다시 한번 감사합니다! :)
R. Kap

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 스핀 오프를 내놓기를 기다리고 있습니다.
Titus

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바이트를 저장하는 데 사용할 수 있습니다 .
zeppelin

안타깝게도 sed ${n}q더 긴 것을 사용해야 합니다.
Dennis

Argh, 나는 당신이 sed $n\q대신 할 수 있지만, 그것은 같은 바이트 수이기 때문에 그다지 의미가 없습니다 head!
zeppelin


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"를 채우고 호의 상단에서 아래쪽으로 그리고 바깥쪽으로 작업하십시오.
  • 각 행렬 행 끝에 줄 바꿈 추가
  • 행렬을 단일 문자열로 축소하고 인쇄

이것은 골프에 대한 나의 첫 번째 시도입니다.



2

Befunge, 75 73 바이트

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

온라인으로 사용해보십시오!

첫 번째 줄은 속도 v를 읽고 사본을 메모리에 저장합니다. 그런 다음 두 번째 줄 은 인덱스 i를 사용하여 v 에서 0으로 카운트 다운 하고 각 반복에서 일련의 문자 / 길이 쌍을 스택으로 푸시합니다.

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

이 시퀀스는 필요한 출력의 런 렝스 인코딩 종류를 반대로 나타냅니다. 마지막 두 줄은 스택에서이 문자 / 길이 쌍을 팝 하여 스택이 비워 질 때까지 각 문자길이 발생을 출력 합니다.


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


두 번째로 중첩 된 for 루프의 for(;j<v;++)경우이 시점에서 작동하기 때문에 작동 한다고 생각 합니다 j==y. 또한 첫 번째 중첩 루프 내부의 기본 for 루프 String t="";(12) 및 t+=" ";(8) 안에 두 번째 문자열 변수를 추가하여 세 번째 문자열 변수를 제거 할 수 있습니다. 그런 다음 세 번째 루프는s+="o"+t+"o";
nmjcman101

또한 처음 두 개의 중첩 루프를 결합 할 수 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

Taylor Scott 덕분에 총 29 바이트 절약

VBA 즉시 실행 창에서 실행하고 결과를 동일하게 인쇄해야합니다.

확장 / 형식화는 다음과 같습니다.

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

(인쇄 명령의 연결은 운영자없이 자동으로 나타납니다.)


b & s &공백 경보!
CalculatorFeline

나는 시도하고 처음으로 잘못했다. 돌아가서, 나는 그것이 확장 b &s &String되지만 깨지지 않을 것이라는 것을 깨달았습니다 b&s&String. 또한 처음 Space에는 완전히 가지고 있어야 하는 기능 을 사용해야한다고 생각했는데 더 많은 바이트를 절약했습니다.
엔지니어 토스트

당신은 축소 할 수 있습니다 for i=0 To vdebug.? bfor i=0To vDebug.?b에 대한 각각 -2바이트. 커뮤니티의 합의는 자동 서식 기능이있는 언어의 경우 자동 서식이 지정되기 전에 계산할 수 있다는 것입니다. 즉, 이러한 변경을 수행 한 후에는 바이트 수가 85 바이트 여야합니다.
Taylor Scott

두 번째로 보면, 이것은 스 니펫입니다. 함수 나 서브 루틴이 아닙니다. 따라서 올바른 솔루션이 아닙니다. Excel VBA 즉시 창 함수를 변환하고 [A1]( v=[A1]) 에서 입력을 받아이 문제를 해결할 수 있다고 생각합니다. 또한 실제로 s변수 가 필요하다고 생각하지 않습니다 .
Taylor Scott

1
@TaylorScott 그것은 회고의 명백한 개선처럼 보이지만 연결에 즉각적인 창에서 운영자가 필요하지 않다는 것을 몰랐습니다. 앞으로 몇 바이트를 절약 할 수 있습니다. ;그러나 기본적으로 줄 바꿈을 계속 추가했기 때문에 인쇄 명령 끝에 a를 추가해야했습니다 . 감사!
엔지니어 토스트

2

05AB1E , 18 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$i0에서;
각 반복에서 순서대로 인쇄

  • $i 개행 (첫 번째 반복에서는 없음)
  • 왼쪽 패딩 : $argn공백
  • 왼쪽 공 : o
  • 내부 패딩 : 2*$i공백
  • 오른쪽 공 : o

1

V , 23 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}}

후행 줄 바꿈 없음 (규칙에서 허용 : " 최대 하나의 후행 줄 바꿈 ")


0

AHK, 93 바이트

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

반복되는 키 입력으로 수학을 수행하는 방법을 알아낼 수 있다면 좋을 것입니다.
- VK20공간 총점
- FileAppend출력에 stdout파일명인지*



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.