私はあなたのようなコードゴルフパズルを解きましたが、膝に矢を取りました


18

矢で膝にぶつかるのは、今選択し怪我のようです。そのため、次のゴルフチャレンジを提案します。

次のような冒険家がいます。

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

1つの弓(}シンボルとして描画)、1組の壁(#シンボルとして描画)、および1人の冒険者を含むテキストファイルが与えられた場合、ヒットするために矢印を発射する角度と初期速度を計算する最小のコードを記述しますひざの彼。

以下を想定します。

  • ファイル内の各文字は0.5 x 0.5メートルです。
  • 矢印はの中心から発射されます}。つまり、0.25m, 0.25m
  • 重力は 10ms^-2
  • 矢印の重さ 0.1kg
  • 矢印はポイントです。つまり、矢印の座標がブロックの1つに入ったときにのみ衝突が発生します。
  • 最大初期速度は 50m/s
  • 角度は0(真上)から180(真下)までの範囲で指定できます
  • 冒険者の足のどの部分を打つことは、膝への打撃と見なされます。
  • 壁(#キャラクター)は0.5mx 0.5mブロック全体を占有します。
  • 矢印はファイルの「上部」を移動できますが、入力が#文字の天井から始まるのを止めるものは何もありません。
  • 矢印で壁を貫通することはできません。
  • 冒険者の他の部分を打つことは許可されていません!
  • 彼を膝で打つことが不可能な場合は、エラーを表示する必要があります。

入力例:

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

必要な場合はお気軽に質問してください:)


1
矢印は、テキストファイルで描かれた領域の上を「移動」できますか?
JB

2
身長3メートル以上の人を何人知っていますか?:P
ピーターテイラー

@JBは-はい、しかし、の大行で始まる入力を止めるものは何もありません#############...
多項式

2
@PeterTaylor-RPGゲームのユーザーが不釣り合いに巨大であることは誰もが知っています;)
多項式

2
矢印の重さは確かに冗長ですか?
ポールR

回答:


11

Python、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)ルーチンは、y = ax ^ 2 + bx + cK=(a,b,c)表す放物線と(a、b)(c、d)の間のセグメントを表す線セグメントを取ります。障害物()とターゲット()の両方が線分として表されます。すべての距離は2倍にスケーリングされます。L=(a,b,c,d)OT

入力例では、次の軌道が与えられます(デフォルトでは、最低速度1)。

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

Rに最大速度パスを取得できます。

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

よくできました。唯一の不満は、入力サイズの制限が999バイトであるということです。これらのASCII図面の潜在的なサイズを考慮すると、それは非常に簡単です。9999は、1文字のコストでより賢明です。(その時点で8**564kBを取得することもできます)
多項式

かなり確信してあなたがして割り当てることで、その1つの文字を救うことができるw=v+1との3つのインスタンスを置き換えるv+1w。私はPythonをあまりコーディングしないので、間違っているかもしれません。
多項式
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.