Narysuj łuk piłki


35

Narysuj paraboliczną trajektorię rzuconej piłki.

Dane wejściowe to początkowa prędkość kuli w górę, dodatnia liczba całkowita v. Co sekundę piłka porusza się w 1prawo v, a następnie w pionie, a następnie vzmniejsza się 1z powodu grawitacji. Tak, prędkość w górę ostatecznie rezygnuje z vcelu 0i dół -v, w końcu spada z powrotem do jego pierwotnej wysokości.

Pozycje piłki śledzą parabolę. W pozycji poziomej x, jego wysokość y=x*(2*v+1-x)/2, z (0,0)początkowego położenia kuli u dołu po lewej stronie.

Wyjmij sztukę ASCII z trajektorii piłki za pomocą Owspółrzędnych, które ona kiedykolwiek zajmuje. Wynik powinien być pojedynczym, wieloliniowym tekstem, a nie animacją ścieżki w czasie.

Wyjście nie powinno mieć wiodących nowych linii i co najwyżej jednej końcowej nowej linii. Dolna linia powinna być zrównana z lewą krawędzią ekranu, tzn. Nie może mieć dodatkowych spacji. Końcowe spacje są OK. Możesz założyć, że szerokość linii wyjściowej pasuje do terminala wyjściowego.

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

Powiązane: Symulacja odbicia piłki


Tabela liderów:


Czy możemy podać listę linii?
Rɪᴋᴇʀ

@Riker Nie, ciąg znaków z nowymi liniami.
xnor


Czy muszę brać pod uwagę tylko V> 0?
nmjcman101

Tak, v będzie dodatni.
xnor

Odpowiedzi:


17

Węgiel drzewny , 18 16 13 bajtów

-3 bajty dzięki @Neil !

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

Wyjaśnienie

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

Wypróbuj online! Link jest do pełnego kodu.


Bardzo mi się podoba, +1; Również dane wyjściowe OP używają wielkich liter „O”. (To nie ma znaczenia, lol)
Albert Renshaw

Jeśli używasz ↘O, możesz zamiast tego zapętlić od 0 do N włącznie, co natychmiast oszczędza dwa bajty.
Neil,

@Neil Thanks! Jest to również bardzo stary post: P (i zastanawiam się, czy powinienem używać nowszych funkcji. Prawdopodobnie nie?)
tylko ASCII

Ściśle mówiąc mam tylko 1 bajt zapisany Cię tak daleko jak pozostałe dwa bajty ty wymianie ⁺¹z . Jednak teraz, kiedy przeniósł się od ‖Cdo Omożna zapisać kolejny bajt po piśmie ↙OMι↓, więc jestem z powrotem w górę do dwóch bajtów zapisać ponownie.
Neil

Zapomniałeś również zaktualizować link do TIO. I technicznie uważam, że teraz zezwalamy na nowsze funkcje, ale nie mogę żądać uznania za te bajty.
Neil,

6

C 93 92

(Uwaga, ktoś dostał 87 w komentarzach)

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

Wypróbuj online!


Czytelny:

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

Uwagi:

Mogę zwinąć obie pętle w jedną pętlę, iterując całkowitą liczbę wyprowadzonych linii, co wynika ze wzoru: 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("");
}

Ale ostatecznie jest nawet więcej bajtów niż tylko użycie dwóch oddzielnych pętli for


Możesz zapisać jeden bajt, zwiększając go sna początku, w ten sposób: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 nie skompiluje się dla mnie. Dostałem także 90 bajtów, kiedy to policzyłem (po usunięciu białych znaków)
Albert Renshaw

Wszystko, co zrobiłem, to dodanie ++s;na początku, a następnie przejście y<=sdo y<si s-y+1do s-yi s+1-ndo s-n, więc powinno się skompilować (i powinno mieć 91 bajtów).
Steadybox

Wydaje się, że w moim komentarzu jest coś nie tak z kodowaniem bloku kodu. Kopiowanie i wklejanie kodu z komentarza również się dla mnie nie kompiluje.
Steadybox



5

GNU sed, 41

  • Wynik obejmuje +1 od -rflag do sed.
s/$/OO/
:
s/(\s*) O( *)O$/&\n\1O \2 O/
t

Dane wejściowe są jednostkowe, jako ciąg spacji - długość łańcucha jest danymi wejściowymi.

Wypróbuj online .


4

Python 2, 76 bajtów

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

Dość proste. Ma i-x+1and ito na celu zapobieganie wiązaniu się nowych linii.


Przeniesienie nowego wiersza na początek wydruku, na przykład, '\n'*(i-1)oszczędza 7 bajtów, unikając jednocześnie kończących się nowych wierszy.
Emigna

4

MATL , 19 17 bajtów

Q:tqYsQ79Z?PtPv!c

Wypróbuj w MATL Online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

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 bajtów

Zaoszczędzono 4 bajty dzięki Adnan

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

Wypróbuj online!

Wyjaśnienie

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

Dla 14 bajtów: ƒ¶N×'ONúRÂJ}.c:)
Adnan

@Adnan Thanks! Próbowałem .cz inną wersją, ale wtedy nie działało to dobrze. Zapomniałem o wypróbowaniu go z tym i kompletnie zapomniałem, że úistnieje :)
Emigna

Zdecydowanie lepsza niż metoda zip, którą wybrałem, ciekawe podejście w pionie.
Magic Octopus Urn

4

JavaScript (ES6), 98 92 89 84 78 bajtów

(-20 bajtów dzięki Arnauldowi!)

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

Rozwiązanie rekurencyjne. To także mój pierwszy kiedykolwiek odpowiedź w JavaScript, więc proszę o łagodny! Wciąż uczę się tego wszystkiego, co ma do zaoferowania schludny język, więc wskazówki dotyczące gry w golfa są bardzo mile widziane. :)

Test Snippet

Konieczne może być przewinięcie, aby zobaczyć całe wyjście.

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>


Również uwzględnianie zmiennych wewnątrz ciągów zwrotnych z ${}zapisywaniem bajtów tylko wtedy, gdy część zmienna jest otoczona częściami statycznymi. Jako takie, ciągi te zawsze powinny zaczynać się i kończyć częściami statycznymi.
Łukasz

@Arnauld Dzięki za wszystkie wskazówki! Bardzo to doceniam! :)
R. Kap

@Luke Dzięki za radę. To się przyda. :)
R. Kap

Możesz bezpiecznie używać 0zamiast "0". Będą przymuszani do strun. Z drugiej strony: i++<v&&ijest tak naprawdę o jeden bajt krótszy niż (i<v)*++i.
Arnauld,

@Arnauld Jeszcze raz dziękuję! :)
R. Kap

3

RProgN 2 , 37 bajtów

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

Zapoznanie się z moim golfowym językiem, zanim wskoczą odpowiednie golfowe języki.

Wyjaśnił

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

Wypróbuj online!


3

Retina, 29 19 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe unarne jako ciąg spacji. Port mojej odpowiedzi JavaScript. Edycja: Zapisano 10 bajtów dzięki @ MartinEnder ♦.


Czekam tylko na kogoś, kto wymyśli spin-off Retiny o nazwie Retsina.
Tytus

3

Bash , 76 bajtów

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

Działa tylko w terminalu, ponieważ wykorzystuje sekwencje specjalne ANSI . reprezentuje bajt CSI ( 0x9b ).

Testowe uruchomienie

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

Możesz użyć, sed $nqaby zapisać bajt.
zeppelin

Niestety nie. Musiałbym użyć, sed ${n}qktóry jest dłuższy.
Dennis

Argh, rozumiem, możesz sed $n\qzamiast tego zrobić , ale to też nie ma większego sensu, ponieważ byłby to ten sam licznik bajtów jak head!
zeppelin


3

R, 89 bajtów

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="")
  • Utwórz macierz spacji (zmienna a jest szerokością tej macierzy, oszczędzając kilka bajtów)
  • Wypełnij „o” w wymaganych miejscach, pracując od góry łuku w dół i na zewnątrz
  • Dodaj nowy wiersz na końcu każdego wiersza macierzy
  • Zwiń matrycę do pojedynczego łańcucha i wydrukuj

To moja pierwsza próba gry w golfa, komentarze mile widziane ...


3

Röda , 53 52 bajty

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

Wypróbuj online!

Stosowanie: main { f(5) }

Wersja bez golfa:

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

Czy możesz użyć dosłownie nowej linii zamiast \ni zapisać 1 bajt?
Kritixi Lithos

@KritixiLithos To działa. Dzięki!
fergusq

2

Befunge, 75 73 bajtów

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

Wypróbuj online!

Pierwszy wiersz odczytuje prędkość v i zapisuje kopię w pamięci. Druga linia następnie odlicza od v do zera, z indeksem i , i na każdej iteracji wypycha sekwencję par znak / długość na stos.

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

Ta sekwencja reprezentuje rodzaj kodowania długości wymaganego wyjścia w odwrotnej kolejności. Ostatnie dwa wiersze następnie po prostu usuwają te pary znak / długość ze stosu, wyświetlając długość wystąpień każdego znaku , aż stos będzie pusty.


2

Java 8, 129 124 109 bajtów

Gra w golfa:

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

Wypróbuj online!

Nie golfowany:

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


Dla drugiego zagnieżdżonego dla pętli myślę, for(;j<v;++)że zadziałałoby, ponieważ w tym momencie j==y. Można również usunąć trzeci, dodając drugą zmienną łańcuchową w głównej pętli for String t="";(12) i t+=" ";(8) w pierwszej zagnieżdżonej pętli. Wtedy właśnie s+="o"+t+"o";
pojawia się

Możesz także połączyć dwie pierwsze zagnieżdżone pętle, for(j=0;j<v;++j)s+=j<y?"\n":" ";chociaż nie jestem pewien, jak to się łączy z moim poprzednim komentarzem na tematt
nmjcman101

Możesz zainicjować t=""obok s na początku, a następnie dodać t+=" "każdą pętlę po zakończenius+="o"+t+"o"
nmjcman101

2

Haskell, 69 bajtów

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

Przykład użycia: f 3-> " OO\n O O\n\n O O\n\n\nO O". Wypróbuj online! .


2

VBA, 124 112 85 88 66 63 59 bajtów

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

Zaoszczędź w sumie 29 bajtów dzięki Taylor Scott

Należy uruchomić okno Natychmiastowe w VBA i wydrukować wynik w ten sam sposób.

Po rozwinięciu / sformatowaniu staje się:

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

(Okazuje się, że konkatenacja w poleceniu drukowania odbywa się automatycznie bez operatora.)


b & s &Ostrzeżenia o przestrzeniach!
CalculatorFeline

Próbowałem i po raz pierwszy popełniłem błąd. Wracając, zdałem sobie sprawę, że się rozszerzy, b &s &Stringale nie b&s&String. Poza tym początkowo myślałem, że zamierzasz użyć Spacefunkcji, którą całkowicie powinienem mieć, i ostatecznie zaoszczędziłem więcej bajtów.
Inżynier Toast

Można skraplać for i=0 To vi debug.? bna for i=0To vi Debug.?b, odpowiednio dla -2bajtów. I właśnie wiesz, społeczna zgoda jest taka, że ​​w przypadku języków z automatycznym formatowaniem możesz liczyć, zanim zostanie automatycznie sformatowany, co oznacza, że ​​po dokonaniu tych zmian powinieneś mieć liczbę bajtów 85 bajtów
Taylor Scott

Po drugim spojrzeniu jest to urywek - nie funkcja ani podprogram; więc nie jest to prawidłowe rozwiązanie. Uważam, że można to naprawić, przekształcając w funkcję bezpośredniego okna programu Excel VBA i biorąc dane wejściowe z [A1]( v=[A1]). Nie sądzę też, żebyś potrzebował szmiennej.
Taylor Scott,

1
@TaylorScott To wydaje się oczywistą poprawą z perspektywy czasu, ale nie wiedziałem, że konkatenacja nie wymaga operatora w bezpośrednim oknie. To pozwoli mi zaoszczędzić trochę bajtów w przyszłości. Musiałem jednak dodać ;na końcu polecenia print, ponieważ domyślnie dodawało to dodatkowy podział wiersza. Dzięki!
Engineer Toast

2

05AB1E , 18 13 bajtów

ÝηRO«ð×'O«ζ»

Wypróbuj 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

Galaretka , 17 16 bajtów

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

Wypróbuj online!

W jaki sposób?

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

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

Uruchom go echo <v> | php -nR '<code>'lub przetestuj online .

zapętla w $argndół od wejścia do 0i w $igórę od 0;
drukuje - w tej kolejności - w każdej iteracji

  • $i nowe linie (brak w pierwszej iteracji)
  • lewa wyściółka: $argnspacje
  • lewa piłka: o
  • wewnętrzna wyściółka: 2*$i spaces
  • prawa piłka: o

1

V , 23 19 bajtów

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

Wypróbuj online!

Wyjaśniać

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 bajtów

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>

Nonrecursive solution. Indexing requirement was annoying, both in the above and the following 62-byte (I don't know whether it would result in a shorter Retina port) recursive solution:

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


0

Stacked, 67 63 bytes

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

Initial attempt, 67 bytes

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

Full program. Generates something like:

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

Which is the padded, transposed, reversed, and outputted.


0

Batch, 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}}

No trailing newline (allowed by the rules: "at most one trailing newline")


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 *



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.