Desenhe o arco de uma bola


35

Desenhe a trajetória parabólica de uma bola lançada.

A entrada é a velocidade inicial ascendente da bola, um número inteiro positivo v. A cada segundo, a bola move o 1espaço para a direita e os vespaços na vertical e depois vdiminui 1devido à gravidade. Assim, a velocidade ascendente finalmente desce do vque 0e para baixo para -v, finalmente, caindo de volta para sua altura inicial.

As posições da bola traçam uma parábola. Na posição horizontal x, sua altura é y=x*(2*v+1-x)/2, com (0,0)a posição inicial da bola no canto inferior esquerdo.

Arte ASCII de saída da trajetória da bola com Os nas coordenadas que ela ocupa. A saída deve ser um único pedaço de texto com várias linhas, não uma animação do caminho ao longo do tempo.

A saída não deve ter novas linhas iniciais e, no máximo, uma nova linha final. A linha inferior deve estar nivelada com a borda esquerda da tela, ou seja, sem espaços à esquerda extras. Os espaços à direita estão OK. Você pode assumir que a largura da linha de saída se encaixa no terminal de saída.

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

Related: Simulação de bola quicando


Entre os melhores:


Podemos enviar uma lista de linhas?
— Rɪᴋᴇʀ

@Riker Nope, string com novas linhas.
— Xnor

Relacionado livremente: codegolf.stackexchange.com/q/110410
— Titus

Preciso apenas contabilizar V> 0?
— nmjcman101

Sim, v será positivo.
— Xnor

Respostas:


17

Carvão , 18 16 13 bytes

-3 bytes graças a @Neil !

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

Explicação

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

Experimente online! Link é um código detalhado.


Eu gosto muito deste, +1; A saída do OP também usa "O" maiúsculo. (Não que isso importe em tudo lol)
— Albert Renshaw

Se você usar ↘O, poderá fazer um loop de 0 a N, inclusive, o que economiza dois bytes imediatamente.
— Neil

@ Neil Obrigado! Além disso, este é um post muito antiga: P (e eu me pergunto se eu deveria estar usando os recursos mais recentes Provavelmente não.?)
— ASCII-only

Estritamente falando Eu só te salvou 1 byte medida em que os outros dois bytes que você estava substituindo ⁺¹com ⊕. No entanto, agora que você moveu ←de do ‖Cpara o, Opode salvar outro byte escrevendo ↙OMι↓, então voltarei ao salvamento de dois bytes novamente.
— Neil

Você também esqueceu de atualizar seu link TIO. E tecnicamente acredito que agora permitimos recursos mais novos, mas não posso reivindicar crédito por esses bytes.
— Neil

6

C 93 93

(Note, alguém chegou a 87 nos comentários)

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

Experimente online!


Legível:

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

Notas:

Posso recolher ambos os loops em apenas um loop for iterando o número total de linhas emitidas, que é fornecido pela fórmula: 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("");
}

Mas acaba sendo ainda mais bytes do que apenas usar dois for-loops separados


Você pode salvar um byte incrementando sno início, desta forma: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 2/17/17

@Steadybox não será compilado para mim. Também eu tenho 90 bytes quando eu contei que (após a remoção de espaços em branco)
— Albert Renshaw

Tudo o que fiz foi adicionar o ++s;início e depois mudar y<=spara y<se s-y+1para s-ye s+1-npara s-n, portanto, ele deve ser compilado (e deve ter 91 bytes).
— Steadybox #

Parece que há algo errado com a codificação do bloco de código no meu comentário. Copiar e colar o código do comentário também não será compilado para mim.
— Steadybox #



5

GNU sed, 41

  • A pontuação inclui +1 de -rsinalizadores para sed.
s/$/OO/
:
s/(\s*) O( *)O$/&\n\1O \2 O/
t

A entrada é unária, como uma sequência de espaços - o comprimento da sequência é a entrada.

Experimente online .


4

Python 2, 76 bytes

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

Bem simples. O i-x+1and iobjetivo é evitar um monte de novas linhas finais.


Mover a nova linha para o início da impressão, como '\n'*(i-1)economiza 7 bytes, evitando as novas linhas à direita.
— Emigna

4

MATL , 19 17 bytes

Q:tqYsQ79Z?PtPv!c

Experimente no MATL Online! Ou verifique todos os casos de teste .

Explicação

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 bytes

Guardado 4 bytes graças a Adnan

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

Experimente online!

Explicação

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

Para 14 bytes: ƒ¶N×'ONúRÂJ}.c:)
— Adnan

@Adnan Thanks! Eu tentei .ccom uma versão diferente, mas não funcionou bem na época. Esqueceu sobre a tentativa lo com um presente e completa esqueceu que úexiste :)
— Emigna

Definitivamente melhor do que o método zip que eu escolhi, abordagem interessante verticalmente.
— Magic Octopus Urn

4

JavaScript (ES6), 98 92 89 84 78 bytes

(-20 bytes graças a Arnauld!)

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

Uma solução recursiva. Esta é também a minha primeira vez resposta em JavaScript, então por favor seja gentil! Ainda estou aprendendo tudo o que essa linguagem interessante tem a oferecer, por isso as dicas de golfe são muito apreciadas. :)

Snippet de teste

Pode ser necessário rolar para ver a saída inteira.

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>


Além disso, a inclusão de variáveis ​​dentro de cadeias de backtick com ${}apenas salva bytes quando a parte variável é cercada por partes estáticas. Como tal, essas cadeias sempre devem começar e terminar com peças estáticas.
— Lucas

@ Arnauld Obrigado por todas as dicas! Eu realmente gostei disso! :)
— R. Kap

@ Luke Obrigado pelo conselho. Isso será útil. :)
— R. Kap

Você pode usar com segurança em 0vez de "0". Eles serão coagidos a cordas. E pensando bem: i++<v&&ina verdade, é um byte menor que (i<v)*++i.
— Arnauld

@ Arnauld Obrigado mais uma vez! :)
— R. Kap

3

RProgN 2 , 37 bytes

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

Entrando no meu tipo de linguagem de golfe antes que os idiomas adequados de golfe entrem.

Explicado

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

Experimente online!


3

Retina, 29 19 bytes

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

Experimente online!

Recebe entrada como unário como uma corrida de espaços. Porta da minha resposta JavaScript. Editar: salvou 10 bytes graças a @ MartinEnder ♦.


Só estou esperando que alguém faça um spin off da Retina chamado Retsina.
— Titus

3

Bash , 76 bytes

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

Funciona apenas em um terminal, pois utiliza seqüências de escape ANSI . ›representa o byte CSI ( 0x9b ).

Execução de teste

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

Você pode usar sed $nqpara salvar um byte.
— Zeppelin #

Infelizmente não. Eu teria que usar o sed ${n}qque é mais longo.
— Dennis

Argh, entendo, você pode fazer isso sed $n\q, mas isso também não faz muito sentido, pois seria a mesma contagem de bytes que head!
— zeppelin


3

R, 89 bytes

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="")
  • Crie uma matriz de espaços (a variável a é a largura dessa matriz, economizando alguns bytes)
  • Preencha "o" s nos locais necessários, trabalhando de cima para baixo e para fora do arco
  • Adicione uma nova linha no final de cada linha da matriz
  • Recolha a matriz em uma única sequência e imprima

Esta é a minha primeira tentativa de golfe, comentários bem-vindos ...


3

Röda , 53 52 bytes

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

Experimente online!

Uso: main { f(5) }

Versão não destruída:

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

Você pode usar uma nova linha literal em vez de \nsalvar 1 byte?
— Kritixi Lithos

@KritixiLithos Isso funciona. Obrigado!
— fergusq

2

Befunge, 75 73 bytes

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

Experimente online!

A primeira linha lê a velocidade, ve salva uma cópia na memória. A segunda linha faz uma contagem regressiva de v para zero, com o índice ie , em cada iteração, empurra uma sequência de pares de caracteres / comprimento para a pilha.

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

Essa sequência representa um tipo de codificação de execução da saída necessária no sentido inverso. As duas últimas linhas simplesmente retiram esses pares de caracteres / comprimento da pilha, produzindo ocorrências de comprimento de cada caractere , até que a pilha esteja vazia.


2

Java 8, 129 124 109 bytes

Golfe:

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

Experimente online!

Ungolfed:

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


Para o segundo aninhado for loop, acho for(;j<v;++)que funcionaria, porque neste momento j==y. Além disso, você pode remover a terceira adicionando uma segunda variável de cadeia dentro do loop for principal String t="";(12) e t+=" ";(8) dentro do primeiro loop aninhado. Em seguida, o terceiro ciclo só se tornas+="o"+t+"o";
— nmjcman101

Além disso, você pode combinar os dois primeiros loops aninhados para for(j=0;j<v;++j)s+=j<y?"\n":" ";embora eu não tenho certeza como isso malhas com o meu comentário anterior sobret
— nmjcman101

Você pode inicializar t=""junto s no início, e depois adicionar t+=" "cada laço em torno depois de fazers+="o"+t+"o"
— nmjcman101

2

Haskell, 69 bytes

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

Exemplo de uso: f 3-> " OO\n O O\n\n O O\n\n\nO O". Experimente online! .


2

VBA, 124 112 85 88 66 63 59 bytes

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

Economizado 29 bytes no total graças a Taylor Scott

Isso deve ser executado na janela Imediata do VBA e imprimir o resultado da mesma forma.

Expandido / Formatado, torna-se:

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

(Acontece que a concatenação em um comando de impressão é automática sem um operador.)


b & s &Alerta de espaços!
— CalculatorFeline

Eu tentei e errou pela primeira vez. Voltando, percebi que ele se expandirá, b &s &Stringmas não b&s&String. Além disso, no começo, pensei que você pretendia usar a Spacefunção que eu deveria ter e que acabou economizando mais bytes.
— Engenheiro Toast

Você pode condensar for i=0 To ve debug.? bpara for i=0To ve Debug.?b, respectivamente, para -2bytes. E só assim você sabe, o consenso da comunidade é que para idiomas com formatação automática, você pode contar antes de ser Autoformatted, ou seja, depois de fazer essas alterações, você deve ter uma contagem de bytes de 85 Bytes
— Taylor Scott

Em uma segunda olhada, este é um trecho - não uma função ou sub-rotina; portanto, não é uma solução válida. Acredito que você poderia corrigir isso convertendo-o em uma função de janela imediata do Excel VBA e obtendo a entrada de [A1]( v=[A1]) Além disso, não acho que você realmente precise da svariável.
— Taylor Scott

11
@ TaylorScott Isso parece uma melhoria óbvia em retrospecto, mas eu não sabia que a concatenação não exigia um operador na janela imediata. Isso me poupará alguns bytes no futuro. Eu tive que adicionar um ;no final do comando de impressão, porque ele continuava adicionando uma quebra de linha extra por padrão. Obrigado!
— Engineer Toast

2

05AB1E , 18 13 bytes

ÝηRO«ð×'O«ζ»

Experimente 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

Geléia , 17 16 bytes

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

Experimente online!

Quão?

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

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

Execute echo <v> | php -nR '<code>'ou teste on-line .

lacetes $argnpara baixo a partir da entrada para 0e $ia partir de 0;
imprime - nessa ordem - em cada iteração

  • $i novas linhas (nenhuma na primeira iteração)
  • preenchimento esquerdo: $argnespaços
  • bola esquerda: o
  • estofamento interno: 2*$i espaços
  • bola direita: o

1

V , 23 19 bytes

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

Experimente online!

Explicar

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 bytes

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>

Solução não recursiva. O requisito de indexação era irritante, tanto na solução recursiva anterior quanto nos seguintes 62 bytes (não sei se resultaria em uma porta Retina mais curta):

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


0

Empilhados, 67 63 bytes

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

Tentativa inicial, 67 bytes

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

Programa completo. Gera algo como:

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

Qual é o preenchido, transposto, revertido e emitido.


0

Lote, 163 bytes

@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 bytes

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

Nenhuma nova linha final (permitida pelas regras: " no máximo uma nova linha final ")


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

Se eu conseguisse descobrir como fazer matemática, pressionando repetidamente as teclas, isso seria ótimo.
- VK20equivale a um espaço
- FileAppendgera como stdoutse o nome do arquivo for*



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.