두 거울 사이에 두 개의 레이저


70

두 개의 평행 거울로 구성된 복도가 있다면 어떨까요?

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

자, 우리는 레이저를 아래로 비 춥니 다 ...

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

오, 봐 그것은 끝까지 튀었다.

두 개의 레이저를 그리지 만 반대 방향으로 가면 어떻게 될까요?

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

흠, 그들은 만나지 않는 것 같았습니다. 편리합니다. 두 레이저가 동일한 공간을 차지하면 어떻게됩니까?

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

꽤 분명한 것 같아요?


이 도표를 손으로 그리는 것은 상당히 힘들다 (나를 믿어 라). 아마도 어떤 코드는 우리를 위해 그것을 할 수 있습니까?

  • 두 개의 튀는 교차 레이저와 함께 두 개의 병렬 미러를 출력하는 코드를 작성하십시오.
  • 입력 (모든 정수) :
    • 복도의 폭
    • 복도의 길이
    • 오른쪽으로가는 레이저의 시작 위치 (제로 인덱스, 너비보다 작아야 함)
    • 왼쪽으로가는 레이저의 시작 위치 (제로 인덱스, 너비보다 작아야 함)
  • 방법
    • 레이저가 올바르게 진행되면 다음 줄에서 오른쪽으로 한 칸씩 그려집니다.
    • 레이저를 계속 사용하면 다음 줄에서 왼쪽으로 한 칸씩 그려집니다.
    • 레이저가 옆으로 나아갈 수 없으면 방향은 바뀌지 만 위치는 바뀌지 않습니다.
    • 두 레이저의 색인이 모두 같은 경우 대문자 X를 해당 색인에 인쇄하십시오.
  • 산출
    • 여러 줄의 문자열
    • 각 줄은 파이프 문자 (|)로 시작하고 끝납니다.
    • 오른쪽 레이저는 백 슬래시 (\)로 표시됩니다.
    • 왼쪽으로가는 레이저는 슬래시 (/)로 표시됩니다.
    • 두 레이저의 교차점은 대문자 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

Stax , 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

자바 스크립트 (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

파이썬 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

온라인으로 사용해보십시오!


당신이하지 골프 수 \\/\/? 백 슬래시는 두 번 해석되지만 여전히 슬래시를 벗어나지 않습니다.
Jonathan Frech

@JonathanFrech 당신이 맞아요, 문자열에 빠질 것이라고 생각했지만 실제로는 탈출하지 않았습니다.
xnor

어이, 내 솔루션은이 아이디어에 고통 스럽습니다. 모듈로 2w를 작동시키는 것은 회고 적으로 많은 의미가 있습니다. 매우 영리한!
Lynn


9

파이썬 (2) , 187 (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]

온라인으로 사용해보십시오!


재귀 :

파이썬 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)

온라인으로 사용해보십시오!


재귀, 대체 인쇄 :

파이썬 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를 a for로 변경하여 3 바이트를 골프화 할 수 있습니다 {}. 로 변경 c&&d하여 1 바이트 더 c&d. 온라인으로 236 바이트를 사용해보십시오 .
Kevin Cruijssen

두 개의 추가 입력을받는 것 같습니다. 이는 허용되지 않습니다.
OOBalance

1
도전 과제의 일반화를 해결하는 것이 아니라 지정된 도전 과제를 해결해야합니다. 추가 입력에 관해서는, 나는 메타 주위에 조금 파고 이걸 발견 : codegolf.meta.stackexchange.com/a/12696/79343 나는 그것이 다른 곳도까지 작성해야합니다 생각하고 있어요,하지만 난 기압을 찾을 수 없습니다. 그러나 그것은 표준입니다.
OOBalance

1
g 매크로에서 a ==-1을 a <0으로 변경하여 2 바이트를 골프화 할 수 있습니다.
JohnWells

1
실제로 매크로 a ++, a 및
a--


5

, 56 50 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 편집 : 피벗에 대한 의존도를 줄임으로써 6 바이트를 절약했습니다. 설명:

↷PIθM⊕η→Iθ

면을 인쇄하십시오.

F²«

두 레이저를 반복합니다.

J⊕⎇ιεζ⁰

레이저의 시작 부분으로 이동하십시오.

FIθ«

높이를 반복합니다.

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

무승부 \또는 /사각형이 비어 있지 않는 경우에 그릴, 적절한 방향으로 X.

¿⁼KK|«

우리는 측면을 쳤습니까?

¿ι→←≦¬ι

그렇다면 옆으로 한 걸음 나아가서 이동 방향을 반대로하십시오.


입력이 "10 2 4 2"인 경우 경계를 벗어납니다.
Martijn Vissers

1
@MartijnVissers 네, 만약 당신의 너비가 2라면, 당신의 위치는 0 또는 1 일 수 있습니다 ...
Neil


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

파이썬 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))

온라인으로 사용해보십시오!


나는 테스트 스위트의 형식을 좋아한다. 출력에 대한 입력을 확실하게 보여준다 ... Nice one;)
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

파이썬 2 165 164 바이트

w,h,x,y=input()
a,b,s=1,-1,' \/'
exec"""l=[' ']*w
l[x],l[y]=s[a],s[b]if x-y else'X'
if-1<x+a<w:x+=a
else:a=-a
if-1<y+b<w:y+=b
else:b=-b
print'|%s|'%''.join(l)
"""*h

Jonathan Frech 덕분에 바이트를 절약했습니다.
온라인으로 사용해보십시오!


1
\\/와 같습니다 \/.
Jonathan Frech



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.