Zwei Laser zwischen zwei Spiegeln

70

Was ist, wenn wir einen Korridor haben, der aus zwei parallelen Spiegeln besteht?

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

Jetzt strahlen wir einen Laser runter ...

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

Oh schau. Es prallte dort gegen Ende ab.

Was ist, wenn wir zwei Laser zeichnen, die sich jedoch in die entgegengesetzte Richtung bewegen?

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

Hmm, sie schienen sich dort nicht zu treffen. Das ist praktisch. Was passiert, wenn beide Laser den gleichen Raum einnehmen?

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

Ich denke, das war ziemlich offensichtlich, oder?


Das Zeichnen dieser Diagramme von Hand ist ziemlich mühsam (vertrau mir dabei). Vielleicht könnte ein Code das für uns tun?

  • Schreiben Sie Code, um zwei parallele Spiegel mit zwei sich überschneidenden, springenden Lasern auszugeben.
  • Eingabe (alle ganzen Zahlen):
    • Die Breite des Korridors
    • Die Länge des Korridors
    • Startposition des rechtslaufenden Lasers (nullindexiert, muss kleiner als die Breite sein)
    • Startposition des linkslaufenden Lasers (Null-Index, muss kleiner als die Breite sein)
  • Prozess
    • Wenn ein Laser richtig ausgerichtet ist, wird er in der folgenden Zeile um ein Feld nach rechts gezeichnet.
    • Wenn ein Laser weiterläuft, wird er in der folgenden Zeile um eine Stelle nach links gezeichnet.
    • Wenn ein Laser seinen Seitenschritt nicht ausführen kann, ändert er seine Richtung, aber nicht seine Position.
    • Wenn sich beide Laser auf demselben Index befinden, drucken Sie an diesem Index ein X in Großbuchstaben.
  • Ausgabe
    • Eine Zeichenfolge mit mehreren Zeilen
    • Jede Zeile beginnt und endet mit einem Pipe-Zeichen (|)
    • Rechtslaser werden durch einen Backslash (\) gekennzeichnet
    • Linkslaufende Laser werden durch einen Schrägstrich (/) gekennzeichnet
    • Der Schnittpunkt zweier Laser ist mit einem Großbuchstaben X gekennzeichnet.
  • Jede Sprache
  • Ich würde gerne TIO- Links sehen
  • Versuchen Sie, es in der kleinsten Anzahl von Bytes zu beheben

Testfälle

Breite: 6 Länge: 10 Rechtslauf: 1 Linkslauf: 4

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

Breite: 6 Länge: 10 Rechtslauf: 0 Linkslauf: 1

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

Breite: 4 Länge: 10 Rechtslauf: 2 Linkslauf: 0

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

Breite: 20 Länge: 5 Rechtslauf: 5 Linkslauf: 15

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

Breite: 5 Länge: 6 Rechtslauf: 2 Linkslauf: 2

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

Breite: 1 Länge: 2 Rechtslauf: 0 Linkslauf: 0

|X|
|X|
AJFaraday
quelle
6
Vorgeschlagener Randfall: Breite: 1, Länge: beliebig, rechts: 0, links: 0
Arnauld
2
@Arnauld | X | ;)
AJFaraday

Antworten:

12

Stax , 40 Bytes

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

Führen Sie es aus und debuggen Sie es

Probieren Sie es online!

Ich bin mir ziemlich sicher, dass dies weiter Golf spielen kann.

Die Eingabe erfolgt in Form von width [right-going left-going] length(per Kommentar von @EngineerToast).

ASCII-Äquivalent:

xHXdmzx);hi+x%Y92&;Hi-x%cy=41*47+&2ME:R\{|+m'||S
Weijun Zhou
quelle
1
Möglicherweise möchten Sie das Eingabeformat als "width [right-going left-going] length
Engineer Toast" am
18

JavaScript (ES6), 149 Byte

Übernimmt Eingaben in der Currying-Syntax (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):''

Probieren Sie es online!

Kommentiert

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
Arnauld
quelle
11

Python 2 , 119 Bytes

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

Probieren Sie es online!

xnor
quelle
Können Sie nicht Golf \\/zu \/? Auch wenn der Backslash zweimal interpretiert wird, bleibt er dem Slash erhalten.
Jonathan Frech
@JonathanFrech Du hast Recht, ich dachte, dass es scheitern würde, wenn man in einem String-in-String steckt, aber es kommt in der Tat auch nicht davon.
XNOR
Oh je, meine Lösung ist dieser Idee schmerzlich nahe gekommen - die Arbeit mit modulo 2w ist im Nachhinein sehr sinnvoll. Sehr schlau!
Lynn
9

Python 2 , 187 181 179 177 174 172 171 Bytes

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]

Probieren Sie es online!


Rekursiv:

Python 2 , 172 Bytes

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)

Probieren Sie es online!


Rekursiver Alternativdruck:

Python 2 , 172 Bytes

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)

Probieren Sie es online!

TFeld
quelle
Ich bin wieder einmal erstaunt über die Geschwindigkeit der ersten Antworten auf Code-Golf-Herausforderungen. Schön! :)
AJFaraday
8

C (Klappern) , 240 236 208 Bytes

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

Probieren Sie es online!

f () nimmt folgende Parameter an:

x= Breite,
y= Länge,
r= Anfangsposition der Startlinie rechts = Anfangsposition der Startlinie
llinks

-4 Bytes. Credits Kevin Cruijssen. Vielen Dank

Geographisches Positionierungs System
quelle
1
Sie können 3 Bytes Golf spielen, indem Sie das whilezu a ändern for, um das {}und eines der Semikolons zu entfernen . Und 1 weiteres Byte durch Ändern c&&dvon c&d. Versuchen Sie es online 236 Bytes .
Kevin Cruijssen
Sieht so aus, als würdest du zwei zusätzliche Eingaben machen, die afaik nicht erlaubt sind.
OOBalance
1
Sie sollten keine Verallgemeinerung der Herausforderung lösen, sondern die Herausforderung wie angegeben. In Bezug auf zusätzliche Eingaben habe ich ein bisschen in Meta gebuddelt und Folgendes gefunden: codegolf.meta.stackexchange.com/a/12696/79343 Ich denke, es muss auch woanders geschrieben sein, aber ich kann es nicht finden atm. Es ist jedoch die Norm.
OOBalance
1
In Ihrem g-Makro können Sie 2 Bytes Golf spielen, indem Sie a == - 1 in a <0 ändern.
JohnWells
1
Eigentlich mehr im Makro, a ++, a und a -, a kann 2 Bytes zu ++ a und --a
JohnWells
5

Kohle , 56 50 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: 6 Bytes gespart, indem die Abhängigkeit vom Pivoting verringert wird. Erläuterung:

↷PIθM⊕η→Iθ

Drucken Sie die Seiten.

F²«

Schleife über die beiden Laser.

J⊕⎇ιεζ⁰

Gehen Sie zum Start des Lasers.

FIθ«

Schlaufe über die Höhe.

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

Zeichnen Sie ein \oder /in die entsprechende Richtung, es sei denn, das Quadrat ist nicht leer. In diesem Fall zeichnen Sie ein X.

¿⁼KK|«

Haben wir eine Seite getroffen?

¿ι→←≦¬ι

Wenn ja, dann machen Sie einen Schritt zur Seite und kehren Sie die Fahrtrichtung um.

Neil
quelle
Dies ist nicht möglich, wenn die Eingabe "10 2 4 2" lautet
Martijn Vissers
1
@ MartijnVissers Nun ja, wenn Ihre Breite 2 ist, dann können Ihre Positionen nur 0 oder 1 sein ...
Neil
5

Java (JDK 10) , 186 Byte

(w,h,r,l)->{var x="";for(int i=0,j,R=1,L=-1;i++<h;l+=L,l+=l<0|l>=w?L=-L:0,r+=R,r+=r<0|r>=w?R=-R:0,x+="|\n")for(j=0,x+="|";j<w;j++)x+="/X\\ ".charAt(j==r?j==l?1:R+1:j==l?L+1:3);return x;}

Probieren Sie es online!

Olivier Grégoire
quelle
3

PHP, 177 169 166 Bytes

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

erfordert PHP 7.1 für negative String-Indizes, PHP 5.5 oder höher für die Indizierung von String-Literalen. Entfernen Sie
für PHP <7.1 , ^Lersetzen Sie es "X\/"durch "/X\\", :0mit +1:1, [$e]mit [$e+1], entfernen Sie es ."|"und fügen Sie es |vor der neuen Zeile ein. (+3 Bytes)
für PHP <5.5 , ersetzen "/X\\"mit $pund $p="/X\\";am Anfang einfügen . (+2 Bytes)

Nimmt Eingaben von Befehlszeilenargumenten entgegen. Laufen Sie mit -nroder probieren Sie sie online aus .

Titus
quelle
Es ist bedauerlich, dass onlinephpfunctions.com nicht die richtige PHP-Version im Sharing-Link speichert ...
Arnauld
3

Python 3 , 162 Bytes

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

Probieren Sie es online!

RootTwo
quelle
Ich mag die Formatierung in Ihrer Testsuite und zeige zuverlässig die Eingaben gegen die Ausgabe ... Schöne;)
AJFaraday
3

Ruby , 117 Bytes

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

Probieren Sie es online!

Anonymes Lambda, das Eingaben wie Breite w, Höhe hund eine Reihe von Startpunkten vornimmt a.

Kirill L.
quelle
Sie haben meinen Tag irgendwie zu einem erweiterbaren Array gemacht, nicht nur zu zwei Ausgangspunkten.
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)|"}

Probieren Sie es online!

Oooof. Diese Logikblöcke sind groß und schmutzig und werden größtenteils dupliziert. Der nächste Schritt wäre, sie neu zu schreiben, damit sie die else-Anweisung nicht benötigen.

Veskah
quelle
1

Python 2, 165 bis 164 Bytes

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

Ein Byte dank Jonathan Frech gespeichert.
Probieren Sie es online!

Mnemonik
quelle
1
\\/ist äquivalent zu \/.
Jonathan Frech
1

K (ngn / k) , 58 Bytes

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

Probieren Sie es online!

Anonyme Funktion, die drei Argumente akzeptiert: xdie Breite, ydie Länge, zein Paar Startpositionen für die Laser

ngn
quelle
1

C (gcc) 169 Bytes

A,B,c;f(w,l,a,b){for(A=1,B=-1;l--;a+=A,a<0|a==w?A=-A,a+=A:0,b+=B,b<0|b==w?B=-B,b+=B:0,puts("|"))for(c=-1;c<w;c++)putchar(c<0?'|':a^c?b^c?32:B>0?92:47:b^c?A>0?92:47:88);}

Probieren Sie es online!

Gastropner
quelle
163 Bytes
Ceilingcat
1

Kotlin , 322 311 302 Bytes

Änderte, wie ich Laserrichtung in Schnur für 11 Bytes setzte. Verschobene Zuweisung aus dem Zeitpunkt für 9 Bytes.

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

Probieren Sie es online!

JohnWells
quelle