Due laser tra due specchi


70

E se avessimo un corridoio composto da due specchi paralleli?

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

Ora, illuminiamo un laser ...

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

Oh guarda. Rimbalzò, verso la fine, lì.

E se disegnassimo due laser MA andando nella direzione opposta?

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

Hmm, non sembravano incontrarsi lì. È conveniente. Cosa succede se entrambi i laser occupano lo stesso spazio?

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

Immagino fosse abbastanza ovvio, eh?


Disegnare questi diagrammi a mano è piuttosto laborioso (fidati di me su questo). Forse un po 'di codice potrebbe farlo per noi?

  • Scrivi del codice per generare due specchi paralleli, con due laser rimbalzanti che si intersecano.
  • Input (tutti i numeri interi):
    • La larghezza del corridoio
    • La lunghezza del corridoio
    • Posizione iniziale del laser a destra (a zero, deve essere inferiore alla larghezza)
    • Posizione iniziale del laser a sinistra (a zero, deve essere inferiore alla larghezza)
  • Processi
    • Se un laser procede correttamente, verrà disegnato uno spazio a destra sulla riga seguente.
    • Se un laser viene lasciato acceso, verrà disegnato uno spazio a sinistra sulla riga seguente.
    • Se un laser non può fare il suo passo di lato, cambierà la sua direzione, ma non la sua posizione.
    • Se entrambi i laser si trovano sullo stesso indice, stampare una X maiuscola su quell'indice.
  • Produzione
    • Una stringa con più righe
    • Ogni riga inizia e termina con un carattere pipe (|)
    • Il laser a destra è indicato da una barra rovesciata (\)
    • Il laser a sinistra è indicato da una barra (/)
    • L'intersezione di due laser è indicata da una X maiuscola.
  • Qualunque lingua
  • Mi piacerebbe vedere i link TIO
  • Tentare di risolverlo nel minor numero di byte

Casi test

larghezza: 6 lunghezza: 10 a destra: 1 a sinistra: 4

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

larghezza: 6 lunghezza: 10 a destra: 0 a sinistra: 1

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

larghezza: 4 lunghezza: 10 a destra: 2 a sinistra: 0

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

larghezza: 20 lunghezza: 5 a destra: 5 a sinistra: 15

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

larghezza: 5 lunghezza: 6 a destra: 2 a sinistra: 2

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

larghezza: 1 lunghezza: 2 a destra: 0 a sinistra: 0

|X|
|X|

6
Bordo suggerito: larghezza: 1, lunghezza: qualunque, destra: 0, sinistra: 0
Arnauld

2
@Arnauld | X | ;)
AJFaraday

Risposte:


12

Stax , 40 byte

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

Esegui ed esegui il debug

Provalo online!

Abbastanza sicuro questo può essere ulteriormente golfato.

L'input viene fornito sotto forma di width [right-going left-going] length(per commento di @EngineerToast).

Equivalente ASCII:

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

1
Potrebbe voler annotare il formato di input comewidth [right-going left-going] length
Engineer Toast

18

JavaScript (ES6), 149 byte

Accetta input nella sintassi del curry (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):''

Provalo online!

Commentate

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

Provalo online!


Non sai giocare \\/a golf \/? Anche se la barra rovesciata viene interpretata due volte, non sfuggirà comunque alla barra.
Jonathan Frech,

@JonathanFrech Hai ragione, pensavo che essere in una stringa nella stringa avrebbe fallito, ma in effetti non sfuggirebbe neanche una volta.
xnor

Oh cavolo, la mia soluzione si è avvicinata dolorosamente a questa idea: lavorare con il modulo 2w ha molto senso in retrospettiva. Molto intelligente!
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]

Provalo online!


Ricorsivo:

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)

Provalo online!


Stampa alternativa ricorsiva:

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)

Provalo online!


Sono di nuovo stupito dalla velocità delle prime risposte alle sfide del code golf. Ben fatto! :)
AJFaraday,

8

C (clang) , 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));}

Provalo online!

f () accetta i parametri come segue:

x= larghezza,
y= lunghezza,
r= posizione iniziale della linea inizialmente a destra
l= posizione iniziale della linea inizialmente a sinistra

-4 byte. crediti Kevin Cruijssen. Grazie


1
È possibile giocare a golf 3 byte modificando whilein a forper rimuovere {}e uno dei punti e virgola. E 1 byte in più cambiando c&&din c&d. Provalo online 236 byte .
Kevin Cruijssen,

Sembra che tu stia prendendo due input extra, che non è consentito afaik.
OOBalance,

1
Non dovresti risolvere una generalizzazione della sfida, ma la sfida come specificato. Per quanto riguarda gli input extra, ho scavato un po 'intorno a meta e ho trovato questo: codegolf.meta.stackexchange.com/a/12696/79343 Sto pensando che debba essere scritto anche da qualche altra parte, ma non riesco a trovarlo. È comunque la norma.
OOBalance,

1
Nella tua macro g, puoi golf 2 byte cambiando da == - 1 a <0.
JohnWells,

1
In realtà ho ottenuto di più nella macro, a ++, a e a -, a can golf 2 byte ciascuno a ++ a e --a
JohnWells

7

Tela , 66 40 byte

{²Xø⁶╵[⁷/²2%[↔}∔};x╷?⁷∔⁷+╷}[j}}n⁶[|PJp|p

Provalo qui!


5

Carbone , 56 50 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Modifica: salvato 6 byte riducendo la dipendenza dal pivot. Spiegazione:

↷PIθM⊕η→Iθ

Stampa i lati.

F²«

Passa sopra i due laser.

J⊕⎇ιεζ⁰

Passa all'inizio del laser.

FIθ«

Passa sopra l'altezza.

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

Disegna a \o /nella direzione appropriata, a meno che il quadrato non sia vuoto, nel qual caso disegna a X.

¿⁼KK|«

Abbiamo colpito un lato?

¿ι→←≦¬ι

In tal caso, fai un passo di lato e inverti la direzione di marcia.


Questo va oltre i limiti quando l'ingresso è "10 2 4 2"
Martijn Vissers

1
@MartijnVissers Beh, sì, se la tua larghezza è 2, le tue posizioni possono essere solo 0 o 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
";}

richiede PHP 7.1 per gli indici di stringa negativi, PHP 5.5 o successivo per l'indicizzazione dei valori letterali di stringa.
per PHP <7.1 , rimuovi ^L, sostituisci "X\/"con "/X\\", :0con +1:1, [$e]con [$e+1], rimuovi ."|"e inserisci |prima della nuova riga. (+3 byte)
per PHP <5.5 , sostituire "/X\\"con $pe inserire $p="/X\\";all'inizio. (+2 byte)

accetta input dagli argomenti della riga di comando. Corri con -nro provali online .


È un peccato che onlinephpfunctions.com non salvi la versione corretta di PHP nel link di condivisione ...
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))

Provalo online!


Mi piace la formattazione nella tua suite di test, mostrando in modo affidabile gli input rispetto all'output ... Bello;)
AJFaraday

3

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

Provalo online!

Lambda anonimo prendendo input come larghezza w, altezza he una matrice di punti di partenza a.


In un certo senso hai reso la mia giornata rendendola un array espandibile, non solo 2 punti di partenza.
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)|"}

Provalo online!

Oooof. quei blocchi logici sono grandi e sporchi e per lo più duplicati. Il prossimo passo sarebbe riscriverli in modo che non abbiano bisogno dell'istruzione else.


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

Salvataggio di un byte grazie a Jonathan Frech.
Provalo online!


1
\\/è equivalente a \/.
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}

Provalo online!

funzione anonima che accetta tre argomenti: xla larghezza, yla lunghezza, zuna coppia di posizioni iniziali per i laser



1

Kotlin , 322 311 302 byte

Modificato il modo in cui ho messo la direzione del laser in stringa per 11 byte. Spostamento dell'assegnazione fuori da quando per 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}()}

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.