Tôi đã từng giải các câu đố golf mã như bạn, nhưng sau đó tôi đã lấy một mũi tên ở đầu gối


18

Bị đánh vào đầu gối bằng mũi tên dường như là chấn thương của sự lựa chọn ngay bây giờ. Như vậy, tôi đề xuất các thách thức golf sau đây.

Bạn có một nhà thám hiểm trông như thế này:

  O
 /|\
/ | \
  |
  |
 / \
/   \

Đưa ra một tệp văn bản chứa một cung (được vẽ như một }biểu tượng), một tập hợp các bức tường (được vẽ như #các biểu tượng) và một nhà thám hiểm, viết mã nhỏ nhất để tính góc và vận tốc ban đầu mà bạn nên bắn một mũi tên để bắn anh ở đầu gối.

Giả sử như sau:

  • Mỗi ký tự trong tệp là 0,5 x 0,5 mét.
  • Mũi tên được bắn từ trung tâm của }, tức là phần bù của0.25m, 0.25m
  • Trọng lực là 10ms^-2
  • Mũi tên nặng 0.1kg
  • Mũi tên là một điểm, tức là va chạm chỉ xảy ra khi tọa độ của mũi tên đi vào một trong các khối.
  • Vận tốc ban đầu tối đa là 50m/s
  • Góc có thể nằm trong khoảng từ 0 (thẳng lên) và 180 (thẳng xuống)
  • Đánh vào bất kỳ phần nào của chân của nhà thám hiểm được coi là một cú đánh vào đầu gối.
  • Một bức tường ( #ký tự) chiếm toàn bộ một khối 0,5mx 0,5m.
  • Mũi tên có thể di chuyển trên "đỉnh" của tệp, nhưng không có gì ngăn đầu vào bắt đầu bằng một trần các #ký tự.
  • Bạn không thể xuyên tường bằng mũi tên.
  • Đánh bất kỳ phần nào khác của nhà thám hiểm là không được phép!
  • Bạn sẽ hiển thị một lỗi nếu đánh vào đầu gối là không thể.

Ví dụ đầu vào:

                                 #                        
}                                                     O   
                        #                            /|\  
                                                    / | \ 
            #                                         |   
                            #                         |   
                                                     / \  
                                                    /   \  

Hãy đặt câu hỏi nếu bạn cần :)


1
Mũi tên có thể di chuyển "qua" khu vực được mô tả bằng tệp văn bản không?
JB

2
Có bao nhiêu người bạn biết ai cao trên 3 m? : P
Peter Taylor

@JB - Có, nhưng không có gì để ngăn chặn đầu vào bắt đầu bằng một dòng lớn #############...
Đa thức

2
@PeterTaylor - Mọi người đều biết rằng mọi người trong các game RPG rất lớn không tương xứng;)
Đa thức

2
Trọng lượng của mũi tên là dư thừa, chắc chắn?
Paul R

Câu trả lời:


11

Python, 599 ký tự

import os,sys
from math import*
I=os.read(0,999)
O=[]
h=v=0
for i in I:
 if'#'==i:O+=[(h,v,h+1,v+1),(h+1,v,h,v+1)]
 if'O'==i:O+=[(h,v+1,h-2,v+3)];T=(h,v+5,h-2,v+7)
 if'}'==i:e=h+.5;c=v+.5
 h+=1
 if'\n'==i:v+=1;h=0

def X(K,L):
 A,B,C=K;p=L[0];q=L[2]-p;r=L[1];s=L[3]-r;A,B,C=A*q*q,2*A*p*q+B*q-s,A*p*p+B*p+C-r;d=B*B-4*A*C
 return 0 if d<0 else any(0<x<1 for x in[(sqrt(d)-B)/2/A,(-sqrt(d)-B)/2/A])

R=range(1,999)
for v in R:
 for z in R:
  z*=pi/999;d=v*sin(z)/10;b=-v*cos(z)/10
  K=20/d/d,b/d-40*e/d/d,c+20*e*e/d/d-b*e/d
  if X(K,T)and not any(X(K,x)for x in O):print v/2,z;sys.exit(0)
print'ERROR'

Các X(K,L)thói quen mất một parabol K=(a,b,c)đại diện y = ax ^ 2 + bx + c và một đoạn thẳng L=(a,b,c,d)đại diện cho phân khúc giữa (a, b)(c, d) . Cả chướng ngại vật ( O) và đích ( T) đều được lặp lại dưới dạng phân đoạn dòng. Tất cả các khoảng cách được chia tỷ lệ theo hệ số 2.

Đầu vào ví dụ cho quỹ đạo sau (theo mặc định, vận tốc tối thiểu là một):

  --                             #          --            
--                                            -       O   
                        #                      -     /|\  
                                                -   / | \ 
            #                                    -    |   
                            #                     -   |   
                                                   - / \  
                                                    -   \  

bạn có thể đảo ngược Rđể có được đường vận tốc tối đa:

                                 #                        
-------------                                         O   
             -----------#                            /|\  
                        --------                    / | \ 
            #                   -------               |   
                            #          -----          |   
                                            -----    / \  
                                                 -----  \  

Làm tốt lắm. Chỉ có khiếu nại là giới hạn kích thước đầu vào là 999 byte. Nó có thể khá dễ dàng hơn, xem xét kích thước tiềm năng của các bản vẽ ASCII này. 9999 sẽ hợp lý hơn, với chi phí chỉ 1 ký tự. (mặc dù tại thời điểm đó bạn cũng có thể làm gì 8**5để có được 64kB)
Đa thức

Khá chắc chắn rằng sau đó bạn có thể lưu một ký tự đó bằng cách gán w=v+1và thay thế 3 trường hợp v+1bằng w. Tôi không mã nhiều Python, vì vậy tôi có thể sai.
Đa thức
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.