Bola ASCII yang jatuh

16

Memasukkan

Anda diberi peta 2D dengan bola dan tanah di dalamnya. Ini terlihat seperti ini:

  1         5          2
                 3
     4


__________________________

Setiap angka adalah bola, dan itu _adalah permukaan tanah. _Karakter garis bawah tidak diperbolehkan di garis lain selain garis permukaan tanah. Hanya ada spasi, baris baru dan angka yang 0-9diizinkan di atas permukaan tanah. Anda tidak dapat mengasumsikan bahwa baris terakhir adalah permukaan tanah - garis kosong di bawah permukaan tanah diizinkan. Anda juga dapat menambahkan spasi, untuk mengisi baris kosong, jika itu membantu Anda.

Bola dapat memiliki angka dari 0hingga 9, dapat ditempatkan di atas satu sama lain, tetapi tidak di bawah tanah. Nomor bola akan menjadi unik.

Asumsikan bahwa setiap karakter adalah satu meter .

Dapatkan peta dari pastebin!
Test case 1 - harus menampilkan sesuatu seperti ini
Test case 2 - harus menghasilkan hasil yang sama seperti peta pertama

Tantangan

Tantangan Anda adalah membaca peta seperti itu dari file atau dari stdin- Anda diizinkan untuk menggunakan cat balls.txt | ./yourexecutable- dan output kecepatan setiap bola ketika menyentuh tanah.

Berikut rumus untuk kecepatan:

masukkan deskripsi gambar di sini

Asumsikan itu hadalah perbedaan nomor baris antara nomor baris ground, dan nomor baris bola, dan itu gsama dengan 10m/s^2.

Keluaran

Anda harus menampilkan setiap jumlah bola dan kecepatan di m/spermukaan tanah. Misalnya N - Vm/s, di mana Nnomor bola dan Vkecepatannya. Anda juga dapat menampilkan array jika mau.

Selamat coding! :)

Jacajack
sumber
Kasus uji tanpa hasil yang diharapkan bukanlah kasus uji
edc65
@ edc65 Saya menambahkan hasil yang diharapkan ke pertanyaan
Jacajack
Apakah boleh jika saya mengambil direktori sebagai input dari pengguna sebagai bagian dari program?
Daniel
@Dappapp Apa maksud Anda sebenarnya?
Jacajack
Lihat jawaban saya .
Daniel

Jawaban:

8

MATL , 31 30 27 25 byte

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

Input adalah array char 2D dengan ;pemisah baris:

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

Cobalah online! Atau sertakan inisial tdalam kode untuk menampilkan peta agar lebih jelas.

Berikut ini adalah contoh-contoh uji lainnya: pertama , kedua .

Penjelasan

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
Luis Mendo
sumber
7

C, 125 122 121 byte

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

Kompilasi & jalankan dengan gcc -w golf.c -lm && cat balls.txt | ./a.out.

orlp
sumber
Bagus sekali, tuan! Saya tidak mengatakan itu dalam pertanyaan saya, tetapi saya ingin Anda tahu, bahwa contoh Anda tidak menghasilkan apa-apa, ketika karakter selain 0 ... 9muncul dalam file teks. Pokoknya, +1, karena tidak menunjukkan ini adalah kesalahan saya
Jacajack
@ Jacajack Tidak, karakter apa pun boleh saja asalkan tidak mengandung karakter dengan kode ASCII lebih besar dari _. Namun, ini bisa diperbaiki dengan satu byte tambahan ( !=bukan <).
orlp
Yah, saya menggunakan 'x' untuk pengujian. Lupakan. Kode Anda luar biasa :)
Jacajack
@ Jacajack Dalam versi baru itu bukan perbaikan satu karakter lagi, tapi saya menyimpan 3 byte lagi :)
orlp
Bagus! :) Saya akan melihat apa yang bisa saya lakukan dengan kode saya, ketika saya kembali ke rumah. Saya tahu ini bisa dipersingkat banyak, tapi saya tidak ingin itu menjadi salinan milik Anda: p
Jacajack
6

C - 194 (-5) 150 137 byte

Dengan sedikit lebih banyak waktu dan pemikiran, saya bermain golf 44 byte
Terima kasih kepada orlp karena membantu saya menghemat 13 byte

Saya akan mulai dengan kode C saya:

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

Dan versi yang dapat dibaca manusia:

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

Kompilasi dan jalankan seperti itu: gcc -o balls ballsgolf.c -lm && cat 1.txt | ./balls

Keluaran

1 10.000000
2 10.000000
3 8.944272
4 7.745967
5 10.000000
Jacajack
sumber
Simpan 4 byte: ~(c=getchar())bukan (c=getchar())!=EOF.
marinus
@marinus Itulah yang saya miliki.
orlp
1
if (x != -1)adalah sama dengan if (~x)(pada mesin pelengkap dua) karena ~-1(unik) 0. Dalam C golf tidak pernah digunakan while(cond), karena for(;cond;)hanya sepanjang dan memberikan lebih banyak peluang untuk bermain golf. Dalam contoh Anda ini bisa menjadi for(;~(c=getchar());n=c==95?l:n)b[c]=(l+=c==10);.
orlp
@ orlp Saya mengerti, terima kasih atas sarannya :)
Jacajack
1
l=1dapat dielakkan dengan membuat largumen pertama main, karena runtime C meneruskan sejumlah argumen ke utama sebagai argumen pertama ( argc), dan ketika Anda memanggil program tanpa argumen baris perintah ( ./a.out), lalu argc = l = 1. n=0;tidak perlu, karena bilangan bulat global secara otomatis diinisialisasi ke 0. Jadi n;sudah cukup.
orlp
4

Pyth, 27 26 25 24 byte

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 @ * 20-xd \ _k2dC

Cobalah online!

bocor Nun
sumber
@ Atau Oh, saya pikir permukaan tanah hanya bisa di baris terakhir.
Leaky Nun
@ Atau Tidak, tidak
Leaky Nun
1
@ orlp Ada dalam aturan bahwa "Anda dapat menambahkan spasi, untuk mengisi baris kosong, jika itu membantu Anda."
Leaky Nun
3

Matlab, 100 96 89 90 byte

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

Banyak byte yang disimpan berkat Luis Mendo

Masukkan format:

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

Penjelasan:

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
pajonk
sumber
3

Python 3, 84 byte

Versi 6, 84 byte: (Terima kasih untuk Leaky Nun!)

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

Versi 5, 91 byte:

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

Versi 4, 92 byte:

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

Versi 3, 99 byte:

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()])

Versi 2, 102 byte:

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

Versi di atas mengambil array string sebagai input.

Versi 1, 140 byte:

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

Ini mengambil direktori file sebagai input dari pengguna.

Daniel
sumber
1 for l in i->1for l in i
Leaky Nun
@ LeakyNun, apakah trik itu berfungsi dengan semua kata kunci dan angka?
Daniel
1
Saya percaya begitu. Juga, (n-1)*20->~-n*20
Leaky Nun
1
Tahan. Bukankah Python3 memerlukan tanda kurung dengan printpanggilan itu?
Yytsi
1
@LeakyNun Tidak, itu tidak bekerja untuk semua kata kunci dan angka dalam Python 2. Secara khusus tidak bekerja untuk kata kunci yang dimulai dengan e, karena kemudian tokenizer Python akan mencoba untuk menguraikannya sebagai notasi ilmiah floating point (misalnya 1e5). Contoh yang gagal: f = lambda n:-1if n<0else 1. Contoh yang gagal di kedua versi Python adalah 0or 1, karena tokenizer berpikir 0omemulai angka oktal.
orlp
2

Python 3, 84 byte

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

Fungsi anonim yang menerima input dengan argumen sebagai string multi-garis dengan semua baris kosong diisi dengan spasi, dan mengembalikan array di mana setiap elemen berbentuk [nomor bola, kecepatan].

Bagaimana itu bekerja

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]

Cobalah di Ideone

TheBikingViking
sumber
Dalam hal ini, saya pikir, ini adalah potongan kode daripada skrip Python mandiri yang lengkap, bukan?
Jacajack
@Jacajack Ini sebenarnya sebuah fungsi, bukan cuplikan, yang diizinkan secara default . Dalam Python, fungsi lambda adalah fungsi tanpa nama yang dapat ditugaskan ke variabel dan kemudian dipanggil saat dibutuhkan; Anda bisa menulis f = MyAnswer, dan kemudian menelepon menggunakan f(x). Ada konsensus bahwa tidak perlu menyebut lambdas . Omong-omong, tantangan yang bagus!
TheBikingViking
Tentu, saya hanya berpikir lambdas diasumsikan sebagai potongan kode di sini ( meta.codegolf.stackexchange.com/a/1146/55729 ). Saya kira semuanya baik-baik saja. Terima kasih atas pendapat Anda :)
Jacajack
2

JavaScript (ES6) 93

Edit 2 byte yang disimpan thx @Jacajack

Fungsi dengan string multiline sebagai parameter input. Output tidak diurutkan (karena ini tidak diminta)

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

Uji

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>

edc65
sumber
Bukankah sqrt(x)lebih pendek dari itu pow(x,.5)?
Jacajack
@ Jacajack ya terima kasih saya tidak tahu bagaimana itu lepas dari pikiran saya
edc65