Раніше я розгадував головоломки з кодом, як ти, але тоді я взяв стрілку в коліно


18

Отримати удари в коліно стрілками, здається, наразі вибір травми . Як такий, я пропоную наступне завдання з гольфу.

У вас є авантюрист, який виглядає приблизно так:

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

Давши текстовий файл, що містить один лук (намальований як }символ), набір стін (намальований як #символи) та один авантюрист, напишіть найменший код, який обчислює кут та початкову швидкість, з якою ви повинні стріляти, щоб вдарити. його в коліні.

Припустимо наступне:

  • Кожен символ у файлі становить 0,5 х 0,5 метра.
  • Стрілка прострілюється з центру }, тобто зсуву0.25m, 0.25m
  • Гравітація є 10ms^-2
  • Стрілка важить 0.1kg
  • Стрілка - точка, тобто зіткнення виникають лише тоді, коли координата стрілки потрапляє в один з блоків.
  • Максимальна початкова швидкість - 50m/s
  • Кут може бути від 0 (прямо вгору) до 180 (прямо вниз)
  • Удар будь-якою частиною ноги авантюриста вважається ударом по коліну.
  • Стіна ( #персонаж) займає один цілий блок 0,5мм 0,5м.
  • Стрілка може переміщатися над «верхом» файлу, але немає нічого, що не зупинить вхід із початку стелі #символів.
  • Ви не можете проникнути в стіни стрілами.
  • Попадання будь-якої іншої частини авантюриста не дозволяється!
  • Вам слід відобразити помилку, якщо вдарити його в коліні неможливо.

Приклад введення:

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

Сміливо задайте питання, якщо вам потрібно :)


1
Чи може стрілка подорожувати «над» областю, зображеною текстовим файлом?
JB

2
Скільки людей ви знаєте, хто старше 3 м? : P
Пітер Тейлор

@JB - Так, але немає нічого, щоб зупинити введення, починаючи з великої лінії #############...
Поліном

2
@PeterTaylor - Всім відомо, що людей в іграх RPG непропорційно величезно;)
Поліном

2
Вага стріли зайвий, напевно?
Пол Р

Відповіді:


11

Пітон, 599 символів

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'

X(K,L)Процедура займає параболу , K=(a,b,c)що представляє у = ах ^ 2 + BX + C і відрізок прямої , L=(a,b,c,d)що представляє відрізок між (A, B) і (C, D) . І перешкоди ( O), і ціль ( T) відображаються як відрізки рядків. Усі відстані масштабуються в 2 рази.

Приклад введення дає таку траєкторію (за замовчуванням мінімальна швидкість одна):

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

ви можете повернути назад, Rщоб отримати максимальну швидкість шляху:

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

Хороша робота. Єдина скарга на те, що обмеження розміру вводу становить 999 байт. Це може бути легко більше, враховуючи потенційний розмір цих креслень ASCII. 9999 було б більш розумним, ціною лише 1 символу. (хоча в цей момент ви можете також 8**5отримати 64 КБ)
Поліном

Досить , що ви могли б зберегти , що один символ шляхом призначення w=v+1і замін 3 примірників v+1з w. Я не кодую багато Python, тому я можу помилитися.
Поліном
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.