2つのミラー間の2つのレーザー


70

2つの平行なミラーで構成される廊下がある場合はどうなりますか?

|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |

今、私たちはそれをレーザーで照らします...

|  \       |
|   \      |
|    \     |
|     \    |
|      \   |
|       \  |
|        \ |
|         \|
|         /|
|        / |

ああ、見て。終わりに向かって、そこに跳ね返りました。

2つのレーザーを描画しますが、反対方向に進むとどうなりますか?

|  \    /  |
|   \  /   |
|    \/    |
|    /\    |
|   /  \   |
|  /    \  |
| /      \ |
|/        \|
|\        /|
| \      / |

うーん、彼らはそこに会うようには見えなかった。それは便利です。両方のレーザーが同じスペースを占有するとどうなりますか?

|  \     / |
|   \   /  |
|    \ /   |
|     X    |
|    / \   |
|   /   \  |
|  /     \ |
| /       \|
|/        /|
|\       / |

それはかなり明白だったと思う?


これらの図を手で描くのはかなり面倒です(これを信じてください)。おそらくいくつかのコードが私たちのためにそれを行うことができますか?

  • 2つのバウンスする交差するレーザーを使用して、2つの平行ミラーを出力するコードを作成します。
  • 入力(すべて整数):
    • 廊下の幅
    • 廊下の長さ
    • 右向きレーザーの開始位置(ゼロインデックス、幅未満でなければなりません)
    • 左方向レーザーの開始位置(ゼロインデックス、幅未満でなければなりません)
  • 処理する
    • レーザーが正しければ、次の行の右側に1スペース描画されます。
    • レーザーが進行中のままの場合、次の行の左に1スペース描画されます。
    • レーザーが横方向に移動できない場合、レーザーの方向は変わりますが、位置は変わりません。
    • 両方のレーザーが同じインデックスにある場合、そのインデックスに大文字のXを印刷します。
  • 出力
    • 複数行の文字列
    • 各行はパイプ文字(|)で始まり、終わる
    • 右方向のレーザーはバックスラッシュ(\)で示されます
    • 左向きのレーザーはスラッシュ(/)で示されます
    • 2つのレーザーの交差点は、大文字のXで示されます。
  • どんな言語でも
  • TIOリンクを見たい
  • 最小バイト数で修正しようとしています

テストケース

幅:6長さ:10右向き:1左向き:4

| \  / |
|  \/  |
|  /\  |
| /  \ |
|/    \|
|\    /|
| \  / |
|  \/  |
|  /\  |
| /  \ |

幅:6長さ:10右向き:0左向き:1

|\/    |
|/\    |
|\ \   |
| \ \  |
|  \ \ |
|   \ \|
|    \/|
|    /\|
|   / /|
|  / / |

幅:4長さ:10右向き:2左向き:0

|/ \ |
|\  \|
| \ /|
|  X |
| / \|
|/  /|
|\ / |
| X  |
|/ \ |
|\  \|

幅:20長さ:5右向き:5左向き:15

|     \         /    |
|      \       /     |
|       \     /      |
|        \   /       |
|         \ /        |

幅:5長さ:6右向き:2左向き:2

|  X  |
| / \ |
|/   \|
|\   /|
| \ / |
|  X  |

幅:1長さ:2右向き:0左向き:0

|X|
|X|

6
推奨されるエッジケース:幅:1、長さ:何でも、右:0、左:0
Arnauld

2
@Arnauld | X | ;)
AJFaraday

回答:


12

スタックス、40 バイト

àù@○⌡┼PY¼îαφu^·A☺°É⌠■╟¡Åt^◘v(µ╩Ñ♣t{╓○xß╦

実行してデバッグする

オンラインでお試しください!

これをさらにゴルフにかけることができると確信しています。

入力はwidth [right-going left-going] length(@EngineerToastによるコメントごと)の形式で提供されます。

同等のASCII:

xHXdmzx);hi+x%Y92&;Hi-x%cy=41*47+&2ME:R\{|+m'||S

1
入力形式を次のように書きたい場合がありますwidth [right-going left-going] length
Engineer Toast

18

JavaScript(ES6)、149バイト

カリー化構文の入力を受け取ります(w)(h)([a,b])

w=>h=>g=(p,d=[1,-1],s=Array(w).fill` `)=>h--?`|${p=p.map((x,i)=>~(k=d[i],s[x]='/X\\'[x-p[i^1]?k+1:1],x+=k)&&x<w?x:x+(d[i]=-k)),s.join``}|
`+g(p,d):''

オンラインでお試しください!

コメント済み

w => h =>                  // w = width, h = height
  g = (                    // g = recursive function taking:
    p,                     //   p[] = array holding the point coordinates
    d = [1, -1],           //   d[] = directions
    s = Array(w).fill` `   //   s = array of w spaces (we can't use a string because it's
  ) =>                     //       immutable in JS)
    h-- ?                  // if we haven't reached the last row yet:
      `|${                 //   append the left pipe
      p = p.map((x, i) =>  //   for each x at position i in p[]:
        ~(k = d[i],        //     k = direction for this point
          s[x] = '/X\\'[   //     insert either '/', 'X' or '\' at position x in s
            x - p[i ^ 1] ? //     if p[0] != p[1]:
              k + 1        //       use the direction
            :              //     else:
              1            //       force 'X'
          ], x += k        //     add k to x
        ) &&               //     if the result is not equal to -1
        x < w ?            //     and is less than w:
          x                //       use the current value of x
        :                  //     else:
          x + (d[i] = -k)  //       change the direction and restore the initial value of x
      ),                   //   end of map()
      s.join``}|\n` +      //   join and append s; append the right bar and a linefeed
      g(p, d)              //   followed by the result of a recursive call
    :                      // else:
      ''                   //   stop recursion

11

Python 2、119バイト

w,l,a,b=input()
exec"print'|%s|'%''.join(' \/X'[sum(i==k%(2*w)for k in[a,~b]+[~a,b]*2)]for i in range(w));a+=1;b-=1;"*l

オンラインでお試しください!


ゴルフあなたことができない\\/ために\/?バックスラッシュは2回解釈されますが、それでもスラッシュはエスケープされません。
ジョナサンフレッチ

@JonathanFrechそうですね、string-in-stringにいることは失敗すると思いましたが、実際にはどちらの時間も逃げません。
xnor

おっと、私の解決策はこの考えに痛々しいほど近づきました-モジュロ2wの動作は振り返ってみるとかなり理にかなっています。非常に賢い!
リン


9

パイソン2187の 181 179 177 174 172 171バイト

def f(w,l,a,b,A=1,B=-1):
 while l:l-=1;print'|%s|'%''.join(' \X/'[[0,A,B,2][(i==a)+2*(i==b)]]for i in range(w));a,A=[a,a+A,-A,A][-1<a+A<w::2];b,B=[b,b+B,-B,B][-1<b+B<w::2]

オンラインでお試しください!


再帰的:

Python 2、172バイト

def f(w,l,a,b,A=1,B=-1):
 if not-1<a<w:A=-A;a+=A
 if not-1<b<w:B=-B;b+=B
 if l:print'|%s|'%''.join(' \X/'[[0,A,B,2][(i==a)+2*(i==b)]]for i in range(w));f(w,l-1,a+A,b+B,A,B)

オンラインでお試しください!


再帰的な代替印刷:

Python 2、172バイト

def f(w,l,a,b,A=1,B=-1):
 if not-1<a<w:A=-A;a+=A
 if not-1<b<w:B=-B;b+=B
 if l:L=[' ']*w;L[a]=' \/'[A];L[b]=[' \/'[B],'X'][a==b];print'|%s|'%''.join(L);f(w,l-1,a+A,b+B,A,B)

オンラインでお試しください!


コードゴルフの課題に対する最初の回答の速さに再び驚かされます。良いですね!:)
AJFaraday

8

C(打ち鳴らす)240の 236 208バイト

#define g(a,b) b?a++,a==x&&(a=x-1,b=0):a--,a==-1&&(a=0,b=1)
i,m,n,o,p,t[]={47,92};f(x,y,r,l){for(m=1,n=0;y--;puts("|"),g(r,m),g(l,n))for(printf("|"),i=0;i<x;o=i==r,p=i++==l,putchar(o*p?88:o?t[m]:p?t[n]:32));}

オンラインでお試しください!

f()は次のようにパラメーターを取ります。

x=幅、
y=長さ、
r=最初は右向きの行の開始位置
l=最初は左向きの行の開始位置

-4バイト。クレジットはKevin Cruijssenです。ありがとう


1
をに変更しwhileてセミコロンの1つforを削除する{}と、3バイトをゴルフできます。に変更c&&dして、もう1バイトc&dオンラインで236バイト試してください。
ケビンCruijssen

あなたは2つの余分な入力を取っているように見えますが、それは許可されていません。
OOBalance

1
チャレンジの一般化を解決するのではなく、指定されたチャレンジを解決することになっています。余分な入力に関しては、私はメタの周りにビットを掘ってこれを見つけた:codegolf.meta.stackexchange.com/a/12696/79343私はあまりにも、それはどこか別の場所まで書き込まなければならないと思っていますが、私は、ATMそれを見つけることができません。しかし、それは標準です。
OOBalance

1
gマクロでは、a ==-1をa <0に変更することで2バイトをゴルフできます。
ジョンウェルズ

1
そして-A-++をするために、缶ゴルフそれぞれ2バイト-実際にはマクロ、++、Aとにより得た
JohnWells


5

56 50バイト

↷PIθM⊕η→IθF²«J⊕⎇ιεζ⁰FIθ«✳§⟦↘↙⟧ι∨⁼KKψX¿⁼KK|«¿ι→←≦¬ι

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:ピボットへの依存を減らすことで6バイトを節約しました。説明:

↷PIθM⊕η→Iθ

側面を印刷します。

F²«

2つのレーザーをループします。

J⊕⎇ιεζ⁰

レーザーの開始点に移動します。

FIθ«

高さをループします。

✳§⟦↘↙⟧ι∨⁼KKψX

正方形が空でない限り、\または/を適切な方向に描画しXます。その場合、を描画します。

¿⁼KK|«

私たちは側を打ったことがありますか?

¿ι→←≦¬ι

その場合は、横に1ステップ進み、進行方向を逆にします。


入力が「10 2 4 2」であるとき、これは境界の外に出る
マルタインVissers

1
@MartijnVissersええ、はい、幅が2の場合、位置は0または1にしかできません...-
ニール


3

PHP、177169166バイト

[,$w,$h,$a,$b]=$argv;for($e=-$d=1;$h--;$s[$a+=$d]^L?:$a+=$d=-$d,$s[$b+=$e]^L?:$b+=$e=-$e){$s=str_pad("",$w)."|";$s[$b]="X\/"[$e];$s[$a]="X\/"[$a-$b?$d:0];echo"|$s
";}

負の文字列インデックスにはPHP 7.1、文字列リテラルのインデックスにはPHP 5.5以降が必要です。
以下のためのPHP <7.1、取り外し^L交換してください、"X\/""/X\\":0+1:1[$e][$e+1]、削除."|"や挿入|改行の前に。(3バイト)
のためのPHP <5.5、交換する"/X\\"$pして挿入します$p="/X\\";先頭に。(+2バイト)

コマンドライン引数から入力を受け取ります。で実行する-nr、オンラインで試してください


onlinephpfunctions.comが正しいPHPバージョンを共有リンクに保存しないのは残念です...
Arnauld

3

Python 3、162バイト

from numpy import*
def f(w,h,u,v):
 v=w+w-v-1;T=eye(w);M=vstack([T,2*T[::-1]]*2*h)
 for r in M[u:u+h,:]+M[v:v+h,:]:print('|%s|'%''.join(' \/X'[int(i)]for i in r))

オンラインでお試しください!


私はテストスイートのフォーマットが好きで、出力に対して入力を確実に表示します...素敵なもの;)
AJFaraday

3

ルビー、117バイト

->w,h,a{a[1]-=w;(1..h).map{s=' '*w;a.map!{|x|d=x<0?-1:1;s[x]='X\\/'[s[x][/ /]?d:0];x+=d;x==w ?-1:x<-w ?0:x};?|+s+?|}}

オンラインでお試しください!

入力を幅w、高さh、開始点の配列としてとる匿名ラムダa


あなたは、たった2つの出発点ではなく、拡張可能な配列にすることで私の一日を作りました。
-AJFaraday

2

PowerShellの243の 233 222 205バイト

param($w,$h,$a,$b)$l,$r,$s=1,-1,' \/'
1..$h|%{$p,$p[$b],$p[$a]=[char[]](' '*$w),$s[$r],($s[$l],"x")[!($a-$b)]
if($a+$l-in($z=0..($w-1))){$a+=$l}else{$l*=-1}if($b+$r-in$z){$b+=$r}else{$r*=-1}"|$(-join$p)|"}

オンラインでお試しください!

やばい。これらの論理ブロックは大きくて汚れており、ほとんどが重複しています。次のステップは、elseステートメントを必要としないようにそれらを書き換えることです。





1

コトリン322 311 302バイト

11バイトの文字列にレーザー方向を配置する方法を変更しました。9バイトの場合に割り当てを移動しました。

{w:Int,h:Int,r:Int,l:Int->{var a=""
var f=r
var d=1>0
var s=l
var t=!d
for(o in 1..h){a+="|"
for(c in 0..w-1)a+=when{c==f&&c==s->"X"
c==f&&d||c==s&&t->"\\"
c==f||c==s->"/"
else->" "}
a+="|\n"
if(d){if(++f==w){--f
d=!d}}else if(--f<0){f=0
d=!d}
if(t){if(++s==w){--s
t=!t}}else if(--s<0){s=0
t=!t}}
a}()}

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.