サークル迷路チェッカー


12

オブジェクトが迷路内を移動する小さなボールベアリングを備えた木製のおもちゃを知っていますか?これはちょっとそうです。迷路と一連の動きを考慮して、ボールがどこに到達するかを決定します。

ボードは垂直に保持されており、ボールはボードが回転したときに重力によってのみ移動します。各「移動」は回転(ラジアン単位)です。

迷路は単純に同心の円形の壁であり、各壁には、これと同様に、外側の廊下にちょうど1つの開口部があります(これらの壁は円形で、尖っていません):

ラビリンス

ご覧のとおり、ボールは真ん中から始まり、外に出ようとしています。ボールは、回転の途中であっても、正しい方向に達するとすぐに落下します。1回転すると、ボールが複数の開口部から落下する場合があります。たとえば、>= n * 2 * pi迷路から抜け出すには回転で十分です。

ゲームの目的上0.001、開口部のラジアン内にあるボールは「フィット」と見なされ、次の廊下にドロップスルーします。

入力:

入力は2つの部分に分かれています。

  • 迷路はn、迷路内にいくつの壁/開口部があるかを表す整数によって与えられます。これに続いnて、次の回廊への通路がどこにあるかを表すそれぞれに1つの数字が付いた行が続きます。

  • 動きは、mどれだけの動きが行われたかを表す整数として与えられ、その後、ボードのm時計回りの回転がラジアン単位で続きます(マイナスは反時計回り)。

すべての通過位置はとして与えられ0 rad = up、正のラジアンは時計回りに移動します。

上記のサンプル画像の場合、入力は次のようになります。

7                        // 7 openings
0
0.785398163
3.14159265
1.74532925
4.71238898
4.01425728
0
3                        // 3 moves
-3.92699082
3.14159265
0.81245687

出力: ボールが終了するコリドー番号を出力します。コリドーには、中心から始まるゼロインデックスが付けられているため、から開始し0ます。1つの開口部を通過すると、廊下にい1ます。迷路全体をエスケープする場合は、任意の整数を出力します>= n

サンプルの入力には、3つの動きがあります。1つ目は、ボールを2つの開口部から落下させます。第二は、開口部、及び第三の発見を見つけることができなかったものを。ボールは廊下3にあるため、予想される出力は次のとおりです。

3

無効な入力に対する動作は未定義です。有効な入力は、と、よく形成されているn >= 1とm >= 0。

スコアリングは標準コードのゴルフであり、バイト数が最も少なくなります。標準的な抜け穴は禁止されています。入力はハードコーディングされてはなりませんが、標準入力、引数、コンソールなどから取得できます。出力はコンソール、ファイル、何でも可能です。


「無効な入力に対する動作は未定義です。」<<-これはすべてのパズルに入れる必要があります!
— TheDoctor

その仮想的なケースでは、必要に応じて可変精度でπを計算し、ボールが落下したかどうかを判断するのに十分になるまで精度を上げることもできます。フィット(または少なくとも現在の言い回し)の許容誤差に問題があるのは、A)連続フィットが相互に0.001に近いため、許容誤差を考慮に入れた場合にボールが2レベルしか落ちない場合ですB)ボールが穴から0.001以内にある場合、その穴にジャンプします(言葉遣いに何かを読みたい場合)。
— Wrzlprmft 14年

@Wrzlprmftボールはホールにジャンプしません。しきい値は、穴がボールよりわずかに広いことを意味すると考えてください。まだ1つ先の同じ場所にドロップスルーします。しきい値が1であると想像した場合、落下したときにボールを穴の中心にジャンプさせずに、大きな穴で作業することになります。
— ジオビット14年

入力がなぜこのような不便な形式なのですか?私はそれを読むのに必要なものよりも短いプログラム全体をゴルフしたと確信しています:/
— Tal

回答:


2

Perl、211 191

読みやすくするために改行とインデントを使用:

$p=atan2 0,-1;
@n=map~~<>,1..<>;
<>;
while(<>){
    $_=atan2(sin,cos)for@n;
    $y=abs($n[$-]+$_)<$p-.001
        ?$_
        :($_<=>0)*$p-$n[$-];
    $_+=$y for@n;
    $p-.001<abs$n[$-]&&++$-==@n&&last;
    $_-=$y;
    .001<abs&&redo
}
print$-

入力内の移動の数は破棄され、stdinのeofは移動の終了を示します。


5

JavaScript 200

function f(i){with(Math)for(m=i.split('\n'),o=m.slice(1,t=+m[0]+1),m=m.slice(t+1),c=PI,p=2*c,r=0,s=1e-3;m.length;c%=p)abs(c-o[r])<s?r++:abs(t=m[0])<s?m.shift(c+=t):(b=t<0?-s:s,c+=p-b,m[0]-=b);return r}

編集:これはこのソルバーが動作することを証明するアニメーションの例です:http: //jsfiddle.net/F74AP/4/

アニメ化

関数は、入力文字列を渡して呼び出す必要があります。
OPで指定された例の呼び出しは次のとおりです。

f("7\n0\n0.785398163\n3.14159265\n1.74532925\n4.71238898\n4.01425728\n0\n3\n-3.92699082\n3.14159265\n0.81245687");

3意図したとおりに戻ります。


2
チャレンジから、「...入力はハードコーディングしてはいけません...」。誤解しない限り、それを読む必要があり、完全なプログラムも必要です。これは単なる関数のように見えます。
— レインボルト14

2
私は理解していません、値はハードコードされていません!「...入力はハードコーディングしてはなりませんが、標準入力、引数、コンソールなどから取得できます。」完全なプログラムについては、どこで指定されているかわかりませんが、とにかく、IMOはこれが完全なJSソリューションです。
— マイケルM. 14

完全なプログラムを指定しなかったので、機能のみに問題はありません。ただし、入力は改行で区切られて指定されており、まだネイティブ配列に配置されていません。それは満たすのが簡単なはずです。
— ジオビット14

1
@Geobits、後で修正し、このフィドルを見てみましょう: jsfiddle.net/F74AP/1
— マイケル・M.

1
@Geobits、そう!単純な符号エラー...修正済み;-)
— マイケルM. 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.