Bir topun yayını çizin


35

Atılan topun parabolik yörüngesini çizin.

Giriş, topun başlangıçtaki yukarı hızıdır, pozitif bir tamsayıdır v. Her saniye top, topu 1sağa ve vboşlukları dikey olarak hareket ettirir ve daha sonra yerçekimi nedeniyle vazalır 1. Bu nedenle, yukan doğru hızı sonunda aşağı adım viçin 0ve aşağı -vson olarak tekrar aşağı ilk yüksekliğe düşen.

Topun pozisyonları parabol izini sürüyor. Yatay konumda anda x, yüksekliği ise y=x*(2*v+1-x)/2olan, (0,0)sol alt topun başlangıç pozisyonuna.

Topun yörüngesindeki ASCII sanatını, Oşimdiye kadar kullandığı koordinatlarda gösterir. Çıktı, zaman içindeki yolun animasyonu değil, tek satırlı bir metin parçası olmalıdır.

Çıktının önde gelen hiçbir yeni satırları ve en fazla bir sondaki yeni satırı olmamalıdır. Alt çizgi, ekranın sol kenarı ile aynı hizada olmalı, yani fazladan boşluk bırakılmamalıdır. Sondaki boşluklar tamam. Çıkış çizgisi genişliğinin çıkış terminaline sığdığını varsayabilirsiniz.

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

İlgili: Zıplayan top simülasyonu


Liderler Sıralaması:


Bir satır listesi çıkarabilir miyiz?
Rɪᴋᴇʀ

@Riker No, newlines ile dize.
xnor


Sadece V> 0 hesaplaması yapmam gerekir mi?
nmjcman101

Evet, v pozitif olacak.
xnor

Yanıtlar:


17

Kömür , 18 16 13 bayt

@Neil sayesinde -3 bayt !

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

açıklama

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

Çevrimiçi deneyin! Link ayrıntılı kod için.


Bunu çok beğendim, +1; Ayrıca OP çıktısı büyük harf "O" kullanır. (Bu hiç de önemli değil)
Albert Renshaw

Eğer kullanırsanız ↘Oo zaman N 0'dan döngü hemen sana iki bayt kaydeder hangi yerine herşey dahil olabilir.
Neil

@Neil Teşekkürler! Ayrıca, bu çok eski bir yazı: P (ve daha yeni özellikler kullanmam gerekip gerekmediğini merak ediyorum. Muhtemelen değil mi?)
ASCII-sadece

Kesinlikle sadece şimdiye kadar diğer iki bayt değiştirmekte gibi size 1 bayt kaydettiğiniz konuşma ⁺¹ile . Ancak şimdi taşımış dan ‖Chiç Oyazı başka byte tasarruf sağlar ↙OMι↓yedekleyebilirim kaydetmeyi tekrar iki byte değilim bu yüzden.
Neil

Ayrıca TIO bağlantınızı güncellemeyi de unuttunuz. Teknik olarak şimdi daha yeni özelliklere izin verdiğimize inanıyorum, ancak bu baytlar için kredi talep edemiyorum.
Neil

6

C, 93 92

(Not, yorumlarda biri 87 oldu)

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

Çevrimiçi deneyin!


Okunabilir:

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

Notlar:

Her iki döngü için de, formül tarafından verilen toplam satır sayısını yineleyerek döngü için yalnızca bir taneye daraltabilirim: 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("");
}

Ancak, iki ayrı döngü için kullanmaktan çok daha fazla bayt olmakla sonuçlanır.


Bir bayt'ı sbaşlangıçta artırarak tasarruf edebilirsiniz , şunun gibi: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 benim için derlenmeyecek. Ayrıca bunu saydığımda 90 bayt aldım (boşluk karakterlerini çıkardıktan sonra)
Albert Renshaw

Tüm ı ekleyerek oldu did ++s;değişen ardından başında ve y<=shiç y<sve s-y+1hiç s-yve s+1-nhiç s-no derlemek (ve 91 byte olmalıdır), böylece.
Steadybox

Benim yorumumda kod bloğunun kodlanmasında yanlış bir şey var gibi görünüyor. Kodu yorumdan kopyalayıp yapıştırmak da benim için derleme yapmaz.
Steadybox



5

GNU sed, 41

  • Puan, -rbayraklardan sed'e kadar +1'i içerir .
s/$/OO/
:
s/(\s*) O( *)O$/&\n\1O \2 O/
t

Girdi, boşluk dizesi olarak tekdüzedir - dizenin uzunluğu giriştir.

Çevrimiçi deneyin .


4

Python 2,76 bayt

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

Oldukça basit. i-x+1and iArka yeni satır bir demet önlemektir.


Yeni çizgiyi, baskının başlangıcına taşımak, '\n'*(i-1)takip eden yeni çizgileri önlerken 7 byte kazandırır.
Emigna

4

MATL , 19 17 bayt

Q:tqYsQ79Z?PtPv!c

MATL Online'da deneyin ! Veya tüm test durumlarını doğrulayın .

açıklama

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 bayt

Adnan sayesinde 4 byte kurtarıldı

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

Çevrimiçi deneyin!

açıklama

ƒ                   # 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 bayt için: ƒ¶N×'ONúRÂJ}.c:)
Adnan

@Adnan Teşekkürler! .cFarklı bir sürüm ile denedim , ancak o zaman iyi çalışmadı. Bunu denemeyi unuttum ve úvar olanı unuttum :)
Emigna

Seçtiğim zip yönteminden kesinlikle daha iyi, dikey olarak ilginç bir yaklaşım.
Magic Octopus Urn

4

JavaScript (ES6), 98 92 89 84 78 bayt

(Arnauld sayesinde -20 bayt!)

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

Özyinelemeli bir çözüm. Bu aynı zamanda benim ilk hiç JavaScript cevap, çok nazik olun lütfen! Hala bu temiz dilin sunduğu tüm şeyleri öğreniyorum, bu yüzden golf ipuçlarını çok takdir ediyorum. :)

Test Parçacığı

Çıktının tamamını görmek için kaydırma yapmanız gerekebilir.

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>


Ayrıca, backtick dizgilerinin içindeki değişkenler de dahil olmak üzere ${}, değişken kısım statik parçalarla çevrili olduğunda yalnızca bayt tasarrufu sağlar. Bu nedenle, bu dizgiler her zaman statik parçalarla başlamalı ve bitmelidir.
Luke

@Arnauld Tüm ipuçları için teşekkürler! Gerçekten onu takdir ederim! :)
R. Kap

@Luke Tavsiye için teşekkürler. Bu işe yarayacak. :)
R. Kap

Bunun 0yerine güvenle kullanabilirsiniz "0". Dizelere zorlanacaklar. Ve ikinci düşüncede: i++<v&&iaslında bir bayttan daha kısa (i<v)*++i.
Arnauld,

@Arnauld Bir kez daha teşekkür ederim! :)
R. Kap

3

RProgN2 , 37 bayt

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

Golf sahası dillerine atılmadan önce golf sahası dilime girmek.

Açıklaması

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

Çevrimiçi deneyin!


3

Retina, 29 19 bayt

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

Çevrimiçi deneyin!

Tekdüzen bir boşluk koşusu olarak girdiyi alır. JavaScript cevabımın limanı. Düzenleme: @ MartinEnder ♦ sayesinde 10 bayt kaydedildi.


Sadece birisinin Retsina denilen Retina spirali ile gelmesini bekliyorum.
Titus,

3

Bash , 76 bayt

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

ANSI kaçış dizileri kullandığından, yalnızca bir terminalde çalışır . CSI baytını ( 0x9b ) temsil eder .

Test sürüşü

$ # 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 $nqBir bayt kaydetmek için kullanabilirsiniz .
zeplin

Üzgünüm hayır. Daha sed ${n}quzun olanı kullanmak zorunda kalırdım .
Dennis,

Argh, görüyorsun, sed $n\qonun yerine yapabilirsin , ama bu da bayt sayısıyla aynı olacağı gibi bir anlam ifade etmiyor head!
zeplin


3

R, 89 bayt

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="")
  • Bir boşluk matrisi oluşturma (a değişkeni bu matrisin genişliğidir, birkaç bayt tasarruf sağlar)
  • Arkın tepesinden aşağıya ve dışa doğru çalışarak istenen yerleri "o" doldurun
  • Her matris satırının sonuna bir satır ekleyin
  • Matrisi tek bir dizeye daraltın ve yazdırın

Bu benim ilk golf denemem, yorumlarınızı bekliyoruz ...


3

Röda , 53 52 bayt

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

Çevrimiçi deneyin!

Kullanımı: main { f(5) }

Ungolfed versiyonu:

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

\n1 bayt yerine değişmez bir yeni satır kullanabilir ve kaydedebilir misiniz?
Kritixi Lithos,

@KritixiLithos Bu çalışıyor. Teşekkürler!
fergusq

2

Befunge, 75 73 bayt

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

Çevrimiçi deneyin!

İlk satır, v hızında okur ve bir kopyayı bellekte saklar. İkinci satır, daha sonra geri sayım v indisi olan, sıfıra i ve her tekrarında yığının üzerine bir karakter / uzunluk çiftlerinin bir dizi iter.

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

Bu sekans, istenen çıktının ters olarak kodlanmasının bir tür çalışma uzunluğu kodlamasını temsil eder. Son iki satır, daha sonra basitçe bu karakter / uzunluğu çiftlerden ayırır ve yığın boşalıncaya kadar her karakterin uzunluk oluşumunu verir .


2

Java 8, 129 124 109 bayt

golfed:

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

Çevrimiçi deneyin!

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


Döngü için iç içe ikinci için for(;j<v;++), çünkü bu noktada zaman işe yarayacağını düşünüyorum j==y. Ayrıca, ilk iç içe geçmiş döngünün içine ana forma String t="";(12) ve t+=" ";(8) ana içine ikinci bir dize değişkeni ekleyerek üçüncüyü kaldırabilirsiniz . Sonra üçüncü döngü sadece olurs+="o"+t+"o";
nmjcman101

Ayrıca, ilk iki iç içe döngüyü birleştirebilirsiniz, for(j=0;j<v;++j)s+=j<y?"\n":" ";bunun ne kadar t
örüldüğünden

t=""Başlangıçta s ile birlikte başlatabilir ve sonra t+=" "her döngüyü etrafa ekleyerek ekleyebilirsinizs+="o"+t+"o"
nmjcman101

2

Haskell, 69 bayt

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

Kullanım örneği: f 3-> " OO\n O O\n\n O O\n\n\nO O". Çevrimiçi deneyin! .


2

VBA, 124 112 85 88 66 63 59 bayt

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

Taylor Scott sayesinde toplam 29 bayt kaydedildi

Bu VBA Anında penceresinde çalıştırılmalı ve sonucu aynı şekilde yazdırmalısınız.

Genişletilmiş / Biçimlendirilmiş:

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

(Bir baskı komutundaki birleştirme işleminin operatör olmadan otomatik olduğu ortaya çıktı.)


b & s &Boşluk alarmı!
Hesap MakinesiFeline

Denedim ve ilk defa hata yaptım. Geri dönersek, genişleyeceğini fark ettim b &s &Stringama büyümeyeceğim b&s&String. Ayrıca, ilk başta, Spacetamamen sahip olmam gereken ve daha fazla bayt tasarrufu sağlayan işlevi kullanmak istediğinizi düşündüm .
Mühendis Toast

Sen yoğunlaşmasına olabilir for i=0 To vve debug.? bhiç for i=0To vve Debug.?biçin sırasıyla -2bayt. Ve sadece bildiğiniz gibi, topluluk fikir birliği, otomatik biçimlendirmeli diller için, otomatik biçimlendirilmeden önce sayılabileceğiniz anlamına gelir; bu değişiklikler yaptıktan sonra, 85 baytlık bir bayt sayısına sahip olmanız gerektiği anlamına gelir
Taylor Scott

İkinci bir bakışta, bu bir snippet'tir - bir işlev veya alt yordam değil; bu yüzden geçerli bir çözüm değil. Bunu bir Excel VBA acil pencere işlevine dönüştürerek ve [A1]( v=[A1]) ' den giriş alarak düzeltebileceğinize inanıyorum. Ayrıca, aslında sdeğişkene ihtiyacınız olmadığını düşünüyorum .
Taylor Scott

1
@TaylorScott Bu geçmişe bakıldığında belirgin bir gelişme gibi görünüyor ancak birleştirme işleminin hemen pencerede bir operatör gerektirmediğini bilmiyordum. Gelecekte bana bazı baytlar kazandıracak. ;Baskı komutunun sonuna bir ekleme yapmak zorunda kaldım, çünkü varsayılan olarak ekstra bir satır sonu eklemeye devam etti. Teşekkürler!
Mühendis Toast

2

05AB1E , 18 13 bayt

ÝηRO«ð×'O«ζ»

Çevrimiçi deneyin!

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

Jöle , 17 16 bayt

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

Çevrimiçi deneyin!

Nasıl?

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

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

Çevrimiçi olarak çalıştırın echo <v> | php -nR '<code>'veya test edin .

ilmeklerin $argngeri girişiyle ila 0ve $iyukarı 0;
baskılar - bu sırayla - her yinelemede

  • $i newlines (ilk yinelemede yok)
  • sol doldurma: $argnboşluklar
  • sol top: o
  • iç dolgu: 2*$iboşluklar
  • sağ top: o

1

V , 23 19 bayt

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

Çevrimiçi deneyin!

Açıklamak

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 bayt

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>

Özyinelemeyen çözüm. İndeksleme gereksinimi hem yukarıda hem de aşağıdaki 62 baytta can sıkıcıydı (daha kısa bir Retina portuyla sonuçlanıp sonuçlanmayacağını bilmiyorum) özyinelemeli bir çözüm:

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


0

Yığılmış, 67 63 bayt

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

İlk deneme, 67 bayt

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

Tam program Gibi bir şey üretir:

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

Hangi yastıklı, transpoze, ters çevrilmiş ve çıktı.


0

Toplu iş, 163 bayt

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

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

Sondaki yeni satır yok (kurallara izin verilir: " en çok sondaki satır ")


0

AHK, 93 bayt

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

Yinelenen tuş vuruşlarının içinde matematiğin nasıl yapıldığını çözebilseydim bu harika olurdu.
- VK20bir boşluğa eşittir
- dosya isminde FileAppendçıktıstdout*



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.