鏡の部屋


18

(この課題は非常に似ていますが、この現在の課題には追加の複雑さがあります。)


壁が平面鏡でメッキされている2次元の部屋を想像してください。

突然、一片の壁が欠けている部屋に光線が当たります!光ビームは部屋の周りを踊り、壁の鏡に反射され、最終的に再び部屋を出ます。

ロジック

W、H、X、YZの 5つの変数が与えられます。
さて、彼らはどういう意味ですか?

W、Hは部屋のサイズ(壁を含む)で、Wは幅、Hは高さです。
X、Yは、壁に穴がある座標です。これは常に壁タイルに配置されていると想定できます。座標は0から始まり、X軸は右を指し、Y軸は下を指します。
Zは、光が部屋に入ること方向を表す単一文字である、のいずれか\、または /

部屋は、次のキャラクターで構成する必要があります。

  • | 水平壁用
  • - 垂直壁用
  • + コーナー用

例:(W = 7、H = 4)

+-----+
|     |
|     |
+-----+

これで部屋ができたので、壁のタイルの1つを破壊して、光のビームが部屋に落ちるようにします。光のビームは斜めの線で、\/文字で表されます。

X = 2、Y = 0の壁タイルを\光線に置き換えてみましょう。

+-\---+
|     |
|     |
+-----+

入ってくる光は、鏡の壁に当たるまで部屋を斜めに進みます。壁にぶつかると、壁の軸に沿って方向が反転し、ビームが進みます。

+-\---+
|\ \/\|
| \/\/|
+-----+

この例では、光ビームは壁の角に当たるポイントに到達します。これにより、ビームは完全に反転し、最後まで戻り、最終的に部屋を出ます。

あなたのタスク

部屋を再び出るか、無限ループになるまで、部屋と光線の全経路を印刷するプログラムを作成します。

入力

入力は合理的な形式で受信できますが、4つの整数W、H、X、Yおよび文字Zを含める必要があります(例:)[10, 8, 0, 3, \]

あなたはそれを仮定するかもしれません:

  • W、H> = 3
  • X、Yは常に壁にあります
  • Zには値\とのみを含めることができます/

出力

文字列を返すか、直接出力するかを決定できますstdout
部屋の壁と光線(上記のASCII文字で定義)を含める必要があります。

ルール

  • 標準的な抜け穴は禁止されています。
  • これはなので、どの言語でもバイト単位の最短コードが優先されます。
  • このチャレンジの公開前に作成されたすべてのコーディング言語が許可されています。

入力: [5, 4, 2, 0, /]

+-/-+
|/ /|
|\/ |
+---+

入力: [20, 3, 0, 1, \]

+------------------+
\/\/\/\/\/\/\/\/\/\|
+------------------+

入力:([10, 8, 0, 3, \] 再び部屋を出ない無限ループの例)

+--------+
|/\/\/\/\|
|\/\/\/\/|
\/\/\/\/\|
|\/\/\/\/|
|/\/\/\/\|
|\/\/\/\/|
+--------+

幸運を!

回答:


5

、55バイト

BNNJNNPψ↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1W¬℅KK«¹F³¿∧κ℅KK«↷κ¶↷κ

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:理由はわかりませんが、そのコードは現在機能していません。ここでは「の代わりに微調整バージョンがね。元のコードの説明:

BNN

外箱を描きます。

JNNPψ

エントリポイントにカーソルを移動し、このポイントでボックスに穴を開けて、これが背景になります。

↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1P

適切な方向に回転して、最初の線分を印刷します。

W¬℅KK«¹

カーソルが穴の上にある間に、次の線分を描画します。

F³¿∧κ℅KK«↷κ¶↷κ

次の線分を描画する穴を探します。これは、同じコードを3回繰り返すことで機能します。初めて、何も起こりません。2回目、カーソルが穴の上にない場合、カーソルは右に45°回転し、右に1ステップ進み、右に45°回転します。これには、1つの軸に反映する効果があります。3回目は、カーソルがまだ穴の上にない場合、右に90°回転し、右に1ステップ進み、右に90°回転します。これには、他の軸への反射を変更する効果があります。まだ穴がない場合は、コーナーまたは無限ループに到達しているため、外側のループは停止します。


1
人々があなたのコードの動作をテストできるようにするには、詳細なバージョンを別途用意して、オンラインでゴルフされたコードへのリンクを作成すると役立ちます。
-trichoplax



@trichoplax TIOリンクは実際に出力にゴルフのコードを表示します。ここからコピーして貼り付けます...-
ニール

1
@trichoplax使用すると-v -sl、実際に印刷されるのは翻訳された簡潔なコードであり、実行されます。もちろん、元の冗長コードは技術的には正しいものの、正しい簡潔なコードを生成するデバーボシファイヤに依存します。そうしないと、生成されたコードは失敗します。
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.