Düşen ASCII topları


16

Giriş

Size topları ve içinde zemin olan bir 2B harita verilir. Şöyle görünüyor:

  1         5          2
                 3
     4


__________________________

Her sayı bir top ve _zemin seviyesidir. Alt çizgi _karakterine zemin seviyesi çizgisinden başka bir satırda izin verilmez. 0-9Zemin seviyesinin üstünde sadece boşluklar, satır başları ve rakamlar kullanılabilir . Son satırın zemin seviyesi olduğunu varsayamazsınız - zemin seviyesinin altındaki boş çizgilere izin verilir. Boş satırları doldurmak için boşluklar da ekleyebilirsiniz, bu size yardımcı oluyorsa.

Toplar gelen sayılar olabilir 0için 9, yer altında birbiri üzerine yerleştirilmiş, ancak yapılabilir. Topun numaraları benzersiz olacak.

Her karakterin bir metre olduğunu varsayın .

Haritadan pastebin!
Test durumu 1 - bunun gibi bir çıktı vermelidir
Test durumu 2 - ilk harita ile aynı sonuçları üretmelidir

Meydan okuma

Zorluk, bir dosyadan veya stdin- kullanmanıza izin verilen - gibi bir haritayı okumak cat balls.txt | ./yourexecutableve yere çarptığında her topun hızını çıkarmaktır .

İşte hız formülü:

resim açıklamasını buraya girin

Bunun hzeminin çizgi numarası ile topun çizgi numarası arasındaki çizgi numarası farkı olduğunu ve bunun geşit olduğunu varsayalım 10m/s^2.

Çıktı

Her top sayısını ve hızını m/szemin seviyesinde vermelisiniz . Örneğin , top numarası ve hızı N - Vm/snerede . İsterseniz bir dizi çıktısı da verebilirsiniz.NV

Mutlu kodlama! :)


Beklenen sonucu olmayan test vakaları test vakası değildir
edc65

@ edc65 Ben soruya beklenen sonuçları ekledim
Jacajack

Dizini programın bir parçası olarak kullanıcıdan girdi olarak almam uygun olur mu?
Daniel

@Dopapp Tam olarak ne demek istiyorsun?
Jacajack

Cevabımı gör .
Daniel

Yanıtlar:


8

MATL , 31 30 27 25 bayt

95\16\5B#fG&X>1)b- 20*X^h

Giriş, ;satır ayırıcı olarak bir 2D karakter dizisidir :

['  1         5          2  ';'                 3        ';'     4                    ';'                          ';'                          ';'__________________________']

Çevrimiçi deneyin! Veya haritayı daha fazla netlik için görüntülemek üzere koda bir başt harf ekleyin .

Diğer test örnekleri: birinci , ikinci .

açıklama

95\      % Take input implicitly. Modulo 95: convert to numbers and map '_' into 0
16\      % Modulo 16: map space into 0 and digit chars into corresponding numbers
5B#f     % Find row indices and values of nonzero entries
G        % Push input again
&X>      % Index of maximum of each column. This finds character '_'
1)       % Get first value (they are all equal)
b        % Bubble row indices of numbers up in the stack
-        % Subtract to get distance from each number to the ground
20*X^    % Multiply by 20, take sqrt. This gives the velocity values
h        % Horizontally concat numbers and velocities. Display implicitly

7

Cı, 125 122 121 bayt

b[99]={};main(l,c){for(;(c=getchar())<95u;)b[c]=(l+=c==10);for(c=47;++c<58;)b[c]&&printf("%c,%f\n",c,sqrt((l-b[c])*20));}

Derleyin ve çalıştırın gcc -w golf.c -lm && cat balls.txt | ./a.out.


Gerçekten harika, efendim! Benim sorumda bunu söylemedim, ama bilmenizi isterim ki, örneğinizin karakteri0 ... 9 metin dosyasından . Her neyse, +1, çünkü bunu işaret etmem benim hatam
Jacajack

@Jacajack Hayır, herhangi bir karakter ASCII kodundan daha büyük bir karakter içermediği sürece iyidir _. Bununla birlikte, bu ( !=yerine <) bir ekstra bayt ile düzeltilebilir .
orlp

Test için 'x' kullandım. Boşver. Kodunuz harika :)
Jacajack

@Jacajack Yeni sürümde artık bir karakter düzeltmesi değil, 3 bayt daha kaydettim :)
orlp

Güzel! :) Eve döndüğümde kodumla neler yapabileceğime bir göz atacağım. Çok kısaltılabileceğini biliyorum, ama senin bir kopyası olmasını istemiyorum: p
Jacajack

6

C - 194 (-5) 150 137 bayt

Biraz daha zaman ve düşünme ile 44 bayt golf yaptım 13 bayt kurtarmama yardım ettiğim için orlp
sayesinde

C kodumla başlayacağım:

b[256]={},n,i=47;main(l,c){for(;~(c=getchar());n=c==95?l:n)b[c]=(l+=c==10);for(;++i<58;)b[i]&&printf("%d %f\n",i-48,sqrt((n-b[i])*20));}

Ve insan tarafından okunabilir versiyon:

//Throws many warnings, but lack of libraries is tolerated

/*
    c - current character
    l - line number (starts at 1)
    n - ground level
    i - iterator
    b - balls array
*/

b[256] = {}, n, i = 47; //That actually works, as long as you are using ASCII

main( l, c )
{
    for ( ;~( c = getchar( ) ); n = c == 95 ? l : n ) //Read stdin and search for ground
        b[c] = ( l += c == 10 ); //Increment lines counter on newlines, and save line numbers

    for ( ; ++i < 58; ) //Iterate through balls
        b[i] && printf( "%d %f\n", i - 48, sqrt( ( n - b[i] ) * 20 ) ); //Print out data    
}

Derleyin ve çalıştırın: gcc -o balls ballsgolf.c -lm && cat 1.txt | ./balls

Çıktı

1 10.000000
2 10.000000
3 8.944272
4 7.745967
5 10.000000

4 bayt kaydet: ~(c=getchar())yerine (c=getchar())!=EOF.
marinus

@marinus Ben de bunu yaptım.
orlp

1
if (x != -1)if (~x)(ikisinin tamamlayıcı makinelerinde) ile aynıdır çünkü ~-1(benzersiz) 0. C golf kullanmak asla while(cond)gibi for(;cond;)tıpkı uzun ve golf için daha fazla fırsat sağlar. Örneğinizde bu olabilir for(;~(c=getchar());n=c==95?l:n)b[c]=(l+=c==10);.
orlp

@ orlp Anlıyorum, tavsiye için teşekkürler :)
Jacajack

1
l=1C çalışma zamanı ana argüman sayısını ilk argümanı ( ) olarak geçirdiğinden ve herhangi bir komut satırı argümanı ( ) olmadan bir programı çağırdığınızda l, ilk argümanı yaparak atlatılabilir . global tamsayılar otomatik olarak 0 olarak başlatıldığından gereksizdir . mainargc./a.outargc = l = 1n=0;n;
orlp

4

Pyth, 27 26 25 24 bayt

smf-hT "_". e, b @ * 20-xd \ _k2dC
 smf @ hT`M; .e, b @ * 20-xd \ _k2dC 
smf @ T`M; .e, b @ * 20-xd \ _k2dC
sm @ # `M; .e b @ x 20-xd \ _k2dC

Çevrimiçi deneyin!



@orlp Oh, zemin seviyesinin sadece son satırda olabileceğini düşündüm.
Leaky Nun



1
@orlp Kural olarak "Boşlukları doldurmak için boşluklar ekleyebilirsiniz, bu size yardımcı oluyorsa."
Leaky Nun

3

Matlab, 100 96 89 90 bayt

s=input('');X=find(s==95);for i=0:9
[x y]=find(s==48+i);if(x)[i sqrt(20*(X(1)-x))]
end
end

Birçok bayt sayesinde Luis Mendo

Giriş biçimi:

['  1         9          2  ';'                 3        ';'     4                    ';'                          ';'                          ';'__________________________']

Açıklama:

X=find(s==95)         -- finds '_', we'll need X(1) to determine max height
for i=0:9             -- loops through balls' numbers
[x y]=find(s==48+i)   -- finds the ball
if(x)                 -- if it is present
[i sqrt(20*(X(1)-x))] -- output its number and velocity

3

Python 3, 84 bayt

Sürüm 6, 84 bayt: (Leaky Nun sayesinde!)

lambda a:[(c,(~-(len(a)-i)*20)**.5)for i,s in enumerate(a)for c in s if c.isdigit()]

Sürüm 5, 91 bayt:

lambda a:[c+":"+str((~-(len(a)-i)*20)**.5)for i,s in enumerate(a)for c in s if c.isdigit()]

Sürüm 4, 92 bayt:

lambda i:[c+":"+str((~-(len(i)-n)*20)**.5)for n in range(len(i))for c in i[n]if c.isdigit()]

Sürüm 3, 99 bayt:

def r(i):x=len(i);print([c+":"+str((~-(x-n)*20)**.5)for n in range(x)for c in i[n] if c.isdigit()])

Sürüm 2, 102 bayt:

def r(i):
 n=len(i)
 for l in i:
  for c in l:
   if c.isdigit():print(c+":"+str((~-n*20)**.5))
  n-=1

Yukarıdaki sürümler bir dizi dizeyi girdi olarak alır.

Sürüm 1, 140 bayt:

with open(input(),"r")as i:
 n=sum(1for l in i);i.seek(0)
 for l in i:
  for c in l:
   if c.isdigit():print(c+":"+str((~-n*20)**.5))
  n-=1

Bu, dosyanın dizinini kullanıcıdan girdi olarak alır.


1 for l in i->1for l in i
Sızdıran Rahibe

@LeakyNun, bu hile tüm anahtar kelimeler ve sayılarla çalışır mı?
Daniel

1
Öyle inanıyorum. Ayrıca, (n-1)*20->~-n*20
Sızdıran Rahibe

1
Tut. Python3 printçağrı ile parantez gerektirmez mi?
Yytsi

1
@LeakyNun Hayır Python 2'deki tüm anahtar kelimeler ve sayılar için çalışmaz. Özellikle bir ile başlayan anahtar kelimeler için çalışmaz e, çünkü Python tokenizer onu kayan nokta bilimsel gösterim olarak ayrıştırmaya çalışacaktır (örn. 1e5). Örnek başarısız: f = lambda n:-1if n<0else 1. Her iki Python sürümünde başarısız olan bir örnek 0or 1, belirteç 0obir sekizlik sayı başlattığını düşünür .
orlp

2

Python 3, 84 bayt

lambda x:[[i,(20*x[x.find(i):x.find('_')].count('\n'))**.5]for i in x if i.isdigit()]

Bağımsız değişken, girdiyi boşluklarla dolu tüm boş satırlarla çok satırlı bir dize olarak kabul eden ve her öğenin [top numarası, hız] biçiminde olduğu bir dizi döndüren anonim bir işlev.

Nasıl çalışır

lambda x                      Function with input x
...for i in x if i.isdigit()  Loop through all characters i in x for which i is a digit,
                              and hence one of the balls
x[x.find(i):x.find('_')]      Slice x to give the substring between the ball and the ground
....count('\n')               Count the number of newlines in the substring to give the
                              height of the ball
(20*...)**.5                  Calculate the speed of the ball as it hits the ground
[i,...]                       Package the ball number and speed into a list
:[...]                        Return all ball-speed pairs as a list with elements [ball
                              number, speed]

Ideone üzerinde deneyin


Bu durumda, sanırım, tam bağımsız Python betiği yerine kod snippet'i, değil mi?
Jacajack

@Jacajack Aslında bu, varsayılan olarak izin verilen bir snippet değil, bir işlevdir . Python'da lambda işlevleri, bir değişkene atanabilen ve sonra gerektiğinde çağrılabilen, adı olmayan işlevlerdir; yazabilir f = MyAnswerve daha sonra kullanarak arayabilirsiniz f(x). Lambdaları adlandırmaya gerek olmadığına dair bir fikir birliği vardır . Bu arada güzel bir meydan okuma!
TheBikingViking

Elbette, lambdaların burada kod parçacıkları olduğu varsayıldım ( meta.codegolf.stackexchange.com/a/1146/55729 ). Sanırım her şey yolunda.
Fikriniz

2

JavaScript (ES6) 93

Düzenle 2 kaydedilen thx bayt @Jacajack

Giriş parametresi olarak çok satırlı dizeye sahip bir işlev. Çıktı sıralanmamış (bu talep edilmediğinden)

a=>[...a].reverse().map(c=>c>'Z'?b=i:c<' '?++i:c>' '&&console.log(c,Math.sqrt((i-b)*20)),i=0)

Ölçek

F=
a=>[...a].reverse().map(c=>c>'Z'?b=i:c<' '?++i:c>' '&&console.log(c,Math.sqrt((i-b)*20)),i=0)

function test()
{
  F(I.value);
}

test()
#I { height: 12em; width: 30em}
<textarea id=I>
    
 
  1         5          2
                 3
     4


__________________________




</textarea>
<button onclick="test()"></button>


Bundan sqrt(x)daha kısa olmaz mıydı pow(x,.5)?
Jacajack

@Jacajack evet teşekkürler Aklımdan nasıl geçtiğini bilmiyorum
edc65
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.