Quả bóng ASCII rơi


16

Đầu vào

Bạn được cung cấp một bản đồ 2D với các quả bóng và mặt đất trong đó. Nó trông như thế này:

  1         5          2
                 3
     4


__________________________

Mỗi số là một quả bóng, và _là mặt đất. Ký _tự gạch dưới không được phép trong bất kỳ dòng nào khác ngoài dòng trên mặt đất. Chỉ có không gian, dòng mới và chữ số 0-9được phép trên mặt đất. Bạn không thể cho rằng dòng cuối cùng là mặt đất - các dòng trống dưới mặt đất được cho phép. Bạn cũng có thể thêm khoảng trắng, để điền vào các dòng trống, nếu điều đó giúp bạn.

Các quả bóng có thể có số từ 0đến 9, có thể được đặt trên nhau, nhưng không phải dưới mặt đất. Số bóng sẽ là duy nhất.

Giả sử rằng mỗi ký tự là một mét .

Nhận bản đồ từ pastebin!
Kiểm tra trường hợp 1 - nên đầu ra một cái gì đó giống như này
trường hợp kiểm tra 2 - nên tạo ra kết quả tương tự như bản đồ đầu tiên

Thử thách

Thử thách của bạn là đọc một bản đồ như thế từ một tệp hoặc từ stdin- bạn được phép sử dụng cat balls.txt | ./yourexecutable- và tốc độ đầu ra của mỗi quả bóng khi nó chạm đất.

Đây là công thức cho vận tốc:

nhập mô tả hình ảnh ở đây

Giả sử đó hlà sự khác biệt về số dòng giữa số dòng của mặt đất và số dòng của quả bóng và gbằng nhau 10m/s^2.

Đầu ra

Bạn nên xuất từng số bóng và vận tốc m/sở mặt đất. Ví dụ N - Vm/s, Nsố bóng ở đâu và Vlà vận tốc của nó. Bạn cũng có thể xuất ra một mảng nếu bạn muốn.

Chúc mừng mã hóa! :)


Các trường hợp thử nghiệm không có kết quả như mong đợi không phải là các trường hợp thử nghiệm
edc65

@ edc65 Tôi đã thêm kết quả mong đợi vào câu hỏi
Jacajack

Có ổn không nếu tôi lấy thư mục làm đầu vào từ người dùng như một phần của chương trình?
Daniel

@Dopapp Ý bạn là gì?
Jacajack

Xem câu trả lời của tôi .
Daniel

Câu trả lời:


8

MATL , 31 30 27 25 byte

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

Đầu vào là một mảng char 2D với ;dấu phân cách hàng:

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

Hãy thử trực tuyến! Hoặc bao gồm một chữ cái đầu ttrong mã để hiển thị bản đồ cho rõ ràng hơn.

Dưới đây là các trường hợp thử nghiệm khác: thứ nhất , thứ hai .

Giải trình

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

Biên dịch và chạy với gcc -w golf.c -lm && cat balls.txt | ./a.out.


Điều đó thực sự tuyệt vời, thưa ngài! Tôi đã không nói rằng trong câu hỏi của tôi, nhưng tôi muốn bạn biết rằng, ví dụ của bạn không xuất ra bất cứ điều gì, khi ký tự khác ngoài 0 ... 9xảy ra trong tệp văn bản. Dù sao, +1, vì không chỉ ra điều này là lỗi của tôi
Jacajack

@Jacajack Không, bất kỳ ký tự nào cũng được miễn là nó không chứa ký tự có mã ASCII lớn hơn _. Tuy nhiên, điều này có thể được sửa chữa với một byte thêm ( !=thay vì <).
orlp

Chà, tôi đã sử dụng 'x' để thử nghiệm. Đừng bận tâm. Mã của bạn thật tuyệt :)
Jacajack

@Jacajack Trong phiên bản mới, nó không phải là sửa một ký tự nữa, nhưng tôi đã lưu thêm 3 byte :)
orlp

Đẹp! :) Tôi sẽ xem những gì tôi có thể làm với mã của mình khi tôi trở về nhà. Tôi biết nó có thể được rút ngắn rất nhiều, nhưng tôi không muốn nó là bản sao của bạn: p
Jacajack

6

C - 194 (-5) 150 137 byte

Với một chút thời gian và suy nghĩ, tôi đã đánh bại 44 byte
Nhờ orlp vì đã giúp tôi tiết kiệm được 13 byte

Tôi sẽ bắt đầu với mã C của mình:

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

Và phiên bản có thể đọc được của con người:

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

Biên dịch và chạy như thế: gcc -o balls ballsgolf.c -lm && cat 1.txt | ./balls

Đầu ra

1 10.000000
2 10.000000
3 8.944272
4 7.745967
5 10.000000

Lưu 4 byte: ~(c=getchar())thay vì (c=getchar())!=EOF.
bến tàu

@marinus Đó là những gì tôi đã có.
orlp

1
if (x != -1)là giống như if (~x)(trên hai máy bổ sung) bởi vì ~-1(là duy nhất) 0. Trong C golf không bao giờ sử dụng while(cond), for(;cond;)cũng như miễn là và cung cấp nhiều cơ hội hơn để chơi golf. Trong ví dụ của bạn, điều này có thể trở thành for(;~(c=getchar());n=c==95?l:n)b[c]=(l+=c==10);.
orlp

@orlp Tôi hiểu, cảm ơn vì lời khuyên :)
Jacajack

1
l=1có thể tránh được bằng cách tạo lđối số đầu tiên cho main, vì thời gian chạy C chuyển số lượng đối số thành chính làm đối số đầu tiên ( argc) và khi bạn gọi một chương trình mà không có bất kỳ đối số dòng lệnh nào ( ./a.out) argc = l = 1. n=0;là không cần thiết, vì số nguyên toàn cầu được tự động khởi tạo thành 0. Vì vậy, n;sẽ đủ.
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

Hãy thử trực tuyến!



@orlp Ồ, tôi nghĩ mặt đất chỉ có thể ở dòng cuối cùng.
Rò rỉ Nun



1
@orlp Đó là trong quy tắc "Bạn có thể thêm khoảng trắng, để điền vào các dòng trống, nếu điều đó giúp bạn."
Rò rỉ 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

Nhiều byte được lưu nhờ Luis Mendo

Định dạng đầu vào:

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

Giải trình:

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 byte

Phiên bản 6, 84 byte: (Cảm ơn Leaky Nun!)

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

Phiên bản 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()]

Phiên bản 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()]

Phiên bản 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()])

Phiên bản 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

Các phiên bản trên lấy một chuỗi các chuỗi làm đầu vào.

Phiên bản 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

Cái này lấy thư mục của tập tin làm đầu vào từ người dùng.


1 for l in i->1for l in i
Nữ tu bị rò rỉ

@LeakyNun, thủ thuật đó có hoạt động với tất cả các từ khóa và số không?
Daniel

1
Tôi cũng tin như thế. Ngoài ra, (n-1)*20->~-n*20
Leaky Nun

1
Giữ lấy. Không Python3 yêu cầu dấu ngoặc đơn với printcuộc gọi?
Yytsi

1
@LeakyNun Không, nó không hoạt động đối với tất cả các từ khóa và số trong Python 2. Nó đặc biệt không hoạt động đối với các từ khóa bắt đầu bằng một e, bởi vì sau đó, mã thông báo Python sẽ cố phân tích nó thành ký hiệu khoa học dấu phẩy động (ví dụ 1e5). Ví dụ thất bại : f = lambda n:-1if n<0else 1. Một ví dụ thất bại trong cả hai phiên bản Python là 0or 1bởi vì mã thông báo cho rằng 0obắt đầu một số bát phân.
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()]

Hàm ẩn danh chấp nhận đầu vào bằng đối số dưới dạng chuỗi nhiều dòng với tất cả các dòng trống chứa đầy khoảng trắng và trả về một mảng trong đó mỗi phần tử có dạng [số bóng, tốc độ].

Làm thế nào nó hoạt động

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]

Hãy thử nó trên Ideone


Trong trường hợp này, tôi nghĩ, đó là đoạn mã chứ không phải là tập lệnh Python độc lập đầy đủ, phải không?
Jacajack

@Jacajack Đây thực tế là một chức năng, không phải là một đoạn mã, được cho phép theo mặc định . Trong Python, các hàm lambda là các hàm không có tên có thể gán cho một biến và sau đó được gọi khi cần; bạn có thể viết f = MyAnswer, và sau đó gọi bằng cách sử dụng f(x). Có một sự đồng thuận rằng không cần phải đặt tên lambdas . Nhân tiện, thử thách này!
TheBikingViking

Chắc chắn, tôi chỉ nghĩ rằng lambdas được coi là đoạn mã ở đây ( meta.codegolf.stackexchange.com/a/1146/55729 ). Tôi đoán mọi thứ đều ổn, sau đó. Cảm ơn ý kiến ​​của bạn :)
Jacajack

2

JavaScript (ES6) 93

Chỉnh sửa 2 byte đã lưu thx @Jacajack

Một hàm với một chuỗi nhiều dòng làm tham số đầu vào. Đầu ra không được sắp xếp (vì điều này không được yêu cầu)

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

Kiểm tra

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>


Sẽ không sqrt(x)ngắn hơn pow(x,.5)?
Jacajack

@Jacajack vâng cảm ơn tôi không biết làm thế nào điều đó tuột khỏi tâm trí tôi
edc65
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.