Hai tia laser giữa hai tấm gương


70

Nếu chúng ta có một hành lang bao gồm hai gương song song thì sao?

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

Bây giờ, chúng tôi chiếu tia laser xuống nó ...

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

Ôi nhìn kìa. Nó nảy lên, về cuối, ở đó.

Điều gì xảy ra nếu chúng ta vẽ hai tia laser NHƯNG đi theo hướng ngược lại?

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

Hmm, họ dường như không gặp nhau ở đó. Thật tiện lợi. Điều gì xảy ra nếu cả hai laser chiếm cùng một không gian?

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

Tôi đoán đó là khá rõ ràng, phải không?


Vẽ các sơ đồ này bằng tay khá tốn công (hãy tin tôi vào điều này). Có lẽ một số mã có thể làm điều đó cho chúng ta?

  • Viết một số mã để xuất ra hai gương song song, với hai tia laser nảy, giao nhau.
  • Đầu vào (tất cả số nguyên):
    • Chiều rộng của hành lang
    • Chiều dài của hành lang
    • Vị trí bắt đầu của laser đi phải (không có chỉ số, phải nhỏ hơn chiều rộng)
    • Vị trí bắt đầu của laser đi bên trái (không có chỉ số, phải nhỏ hơn chiều rộng)
  • Quá trình
    • Nếu một tia laser đi đúng hướng, nó sẽ được vẽ một khoảng trắng ở bên phải trên dòng sau.
    • Nếu một tia laser đi bên trái, nó sẽ được vẽ một khoảng trống ở bên trái trên dòng sau.
    • Nếu tia laser không thể thực hiện bước đi ngang, nó sẽ thay đổi hướng của nó, nhưng không phải là vị trí của nó.
    • Nếu cả hai laser đều ở cùng một chỉ mục, hãy in chữ X viết hoa ở chỉ mục đó.
  • Đầu ra
    • Một chuỗi có nhiều dòng
    • Mỗi dòng bắt đầu và kết thúc bằng một ký tự ống (|)
    • Tia laser bên phải được biểu thị bằng dấu gạch chéo ngược (\)
    • Laser đi bên trái được biểu thị bằng một dấu gạch chéo (/)
    • Giao điểm của hai laser được ký hiệu bằng chữ X viết hoa.
  • Bất kỳ ngôn ngữ
  • Tôi muốn xem các liên kết TIO
  • Cố gắng sửa nó trong số byte nhỏ nhất

Các trường hợp thử nghiệm

chiều rộng: 6 chiều dài: 10 phải: 1 trái: 4

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

chiều rộng: 6 chiều dài: 10 phải: 0 trái: 1

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

chiều rộng: 4 chiều dài: 10 phải: 2 trái: 0

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

chiều rộng: 20 chiều dài: 5 phải: 5 trái: 15

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

chiều rộng: 5 chiều dài: 6 phải: 2 trái: 2

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

chiều rộng: 1 chiều dài: 2 phải: 0 trái: 0

|X|
|X|

6
Trường hợp cạnh được đề xuất: chiều rộng: 1, chiều dài: bất cứ điều gì, phải: 0, trái: 0
Arnauld

2
@Arnauld | X | ;)
AJFaraday

Câu trả lời:


12

Stax , 40 byte

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

Chạy và gỡ lỗi nó

Hãy thử trực tuyến!

Khá chắc chắn rằng điều này có thể được tiếp tục chơi golf.

Đầu vào được đưa ra dưới dạng width [right-going left-going] length(mỗi nhận xét của @EngineerToast).

Tương đương ASCII:

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

1
Có thể muốn lưu ý định dạng đầu vào làwidth [right-going left-going] length
Kỹ sư Toast

18

JavaScript (ES6), 149 byte

Đưa đầu vào theo cú pháp currying (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):''

Hãy thử trực tuyến!

Đã bình luận

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 byte

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

Hãy thử trực tuyến!


Có thể bạn không chơi golf \\/để \/? Mặc dù dấu gạch chéo ngược được diễn giải hai lần, nó vẫn không thoát khỏi dấu gạch chéo.
Jonathan Frech

@JonathanFrech Bạn nói đúng, tôi nghĩ rằng việc ở trong một chuỗi trong chuỗi sẽ thất bại, nhưng nó thực sự không thoát được cả hai lần.
xnor

Ôi trời, giải pháp của tôi rất gần với ý tưởng này - làm việc modulo 2w rất có ý nghĩa khi nhìn lại. Rất thông minh!
Lynn


9

Python 2 , 187 181 179 177 174 172 171 byte

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]

Hãy thử trực tuyến!


Đệ quy:

Python 2 , 172 byte

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)

Hãy thử trực tuyến!


Đệ quy, in thay thế:

Python 2 , 172 byte

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)

Hãy thử trực tuyến!


Tôi một lần nữa ngạc nhiên bởi tốc độ của những câu trả lời đầu tiên về những thử thách golf mã. Đẹp quá :)
AJFaraday

8

C (tiếng kêu) , 240 236 208 byte

#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));}

Hãy thử trực tuyến!

f () nhận các tham số như sau:

x= width,
y= length,
r= Ban đầu vị trí bắt đầu dòng bên phải
l= Vị trí bắt đầu dòng bên trái

-4 byte. tín dụng Kevin Cruijssen. Cảm ơn


1
Bạn có thể chơi golf 3 byte bằng cách thay đổi whilethành a forđể loại bỏ {}và một trong các dấu chấm phẩy. Và thêm 1 byte bằng cách thay đổi c&&dthành c&d. Hãy thử trực tuyến 236 byte .
Kevin Cruijssen

Có vẻ như bạn đang dùng thêm hai đầu vào, điều đó không được phép afaik.
OOBalance

1
Bạn không cần phải giải quyết khái quát về thử thách, nhưng thử thách theo quy định. Về đầu vào bổ sung, tôi đã tìm hiểu về meta một chút và tìm thấy điều này: codegolf.meta.stackexchange.com/a/12696/79343 Tôi nghĩ rằng nó cũng phải được viết ở một nơi khác, nhưng tôi không thể tìm thấy nó. Tuy nhiên, đó là tiêu chuẩn.
OOBalance

1
Trong macro g của bạn, bạn có thể chơi golf 2 byte bằng cách thay đổi a == - 1 thành <0.
JohnWells

1
Trên thực tế có nhiều hơn trong macro, a ++, a và a -, a có thể chơi golf 2 byte mỗi cái để ++ a và
--a


5

Than , 56 50 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉnh sửa: Đã lưu 6 byte bằng cách giảm sự phụ thuộc vào xoay vòng. Giải trình:

↷PIθM⊕η→Iθ

In các mặt.

F²«

Vòng qua hai tia laser.

J⊕⎇ιεζ⁰

Di chuyển đến điểm bắt đầu của tia laser.

FIθ«

Vòng qua chiều cao.

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

Vẽ một \hoặc /theo hướng thích hợp, trừ khi hình vuông không trống, trong trường hợp đó vẽ một X.

¿⁼KK|«

Chúng ta đã đánh một bên?

¿ι→←≦¬ι

Nếu vậy thì hãy đi một bước sang một bên và đảo ngược hướng đi.


Điều này vượt ra ngoài giới hạn khi đầu vào là "10 2 4 2"
Martijn Vissers

1
@MartijnVissers Vâng, nếu chiều rộng của bạn là 2, thì vị trí của bạn chỉ có thể là 0 hoặc 1 ...
Neil


3

PHP, 177 169 166 byte

[,$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
";}

yêu cầu PHP 7.1 cho các chỉ mục chuỗi âm, PHP 5.5 trở lên để lập chỉ mục chuỗi ký tự.
đối với PHP <7.1 , xóa ^L, thay thế "X\/"bằng "/X\\", :0bằng +1:1, [$e]với [$e+1], xóa ."|"và chèn |trước dòng mới. (+3 byte)
cho PHP <5.5 , thay thế "/X\\"bằng $pvà chèn $p="/X\\";vào đầu. (+2 byte)

lấy đầu vào từ các đối số dòng lệnh. Chạy với -nrhoặc thử chúng trực tuyến .


Thật không may khi onlinephpfifts.com không lưu phiên bản PHP chính xác trong liên kết chia sẻ ...
Arnauld

3

Python 3 , 162 byte

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))

Hãy thử trực tuyến!


Tôi thích định dạng trong bộ thử nghiệm của bạn, hiển thị đáng tin cậy các đầu vào so với đầu ra ... Một cái đẹp;)
AJFaraday

3

Ruby , 117 byte

->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+?|}}

Hãy thử trực tuyến!

Lambda ẩn danh lấy đầu vào là chiều rộng w, chiều cao hvà một loạt các điểm bắt đầu a.


Bạn đã làm cho ngày của tôi bằng cách biến nó thành một mảng có thể mở rộng, không chỉ là 2 điểm bắt đầu.
AJFaraday

2

PowerShell , 243 233 222 205 byte

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)|"}

Hãy thử trực tuyến!

Ôi trời. những khối logic đó lớn và bẩn và chủ yếu là trùng lặp. Bước tiếp theo sẽ là viết lại chúng để chúng không cần câu lệnh khác.


1

Python 2, 165 164 byte

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

Lưu một byte nhờ Jonathan Frech.
Hãy thử trực tuyến!


1
\\/tương đương với \/.
Jonathan Frech

1

K (ngn / k) , 58 byte

{" \\/X|"4,'(+/3!1 2*(x#'e+2*|e:=2*x)(2*x)!z+(!y;-!y)),'4}

Hãy thử trực tuyến!

Hàm ẩn danh chấp nhận ba đối số: xchiều rộng, ychiều dài, zmột cặp vị trí bắt đầu cho các laser



1

Kotlin , 322 311 302 byte

Thay đổi cách tôi đặt hướng laser trong chuỗi cho 11 byte. Đã chuyển nhượng ra khỏi khi cho 9 byte.

{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}()}

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.