La sfida è implementare un programma di ray tracing bidimensionale, basato su testo.
Le fonti di luce bianca sono @simboli. R, GE Bsono la luce filtra. /e \sono specchi con una riflettività dell'80%. ?è un sensore di luce. >, <, ^E Vcombinare la luce nella direzione appropriata (ad esempio, se uno rosso e uno verde entrato in una >luce sarebbe emessa verso destra e sarebbe giallo). Altri caratteri non bianchi assorbono tutta la luce. La luce viene emessa dai @simboli in quattro direzioni.
Quando il programma viene eseguito, dovrebbe produrre un output uguale all'input, ma con raggi tracciati. Poiché si tratta di una dimensione bidimensionale e garantisco nell'input che i raggi non attraverseranno mai, non vi sarà alcun problema. Ogni raggio dovrebbe essere rappresentato da una lettera; r = rosso, g = verde, b = blu, c = ciano, m = magenta, y = giallo, w = bianco. Non ci saranno mai colori ternari, mai. L'involucro è importante per differenziarlo dall'input. Dopo tale uscita, i valori della luce catturati dai punti interrogativi (in ordine di aspetto, da sinistra a destra dall'alto verso il basso) dovrebbero essere emessi come percentuali e colori. Ad esempio, questo input:
/ @
-
\R> ?
@B/
Dovrebbe dare l'output:
/wwwwwwwwwwwwwwwwww@w
w -
w\R>mmmmmmmmmmmmmmmmm?
w b
@B/
#1: 72% Magenta
Un altro punto importante da notare: quando due colori vengono combinati usando un "prisma" (le frecce) la forza della luce combinata diventa la forza media dei due. L'output deve essere esattamente come specificato (ad es. #X: [x] [x] x% Color ).
Se la tua lingua non è in grado di leggere da STDIN e scrivere su STDOUT, crea una funzione (anonimo o lambda quando disponibile) che accetta l'input come argomento e restituisce il risultato.
Le direttive per il compilatore, le strutture richieste o consigliate per tutti o la maggior parte dei programmi creati nella lingua, ecc. Possono essere omesse. Ad esempio, #includee le usingdirettive (ma non #define) possono essere rimosse in linguaggi di tipo C, #/usr/bin/perl -optionsin Perl e
Module Module1
Sub Main()
End Sub
End Module
in VB.NET, ad esempio. Se importi spazi dei nomi o aggiungi direttive di inclusione, annotale nella tua risposta.
È abbastanza difficile, adesso? :)
>luce sta catturando e la sta superando. E se la wparte superiore la attraversa R, anche la bparte inferiore. Infine (penso), ti sbagli sul fatto che i raggi non si incrociano. Per fare un esempio di una riga, quale sarebbe l'output corretto @R> B@?
@in basso a sinistra emette luce in tutte e quattro le direzioni, no? Quindi, in particolare, lo emette w. E non ho rotto nessuna spaziatura, almeno come reso in Chromium. Per quanto riguarda il superarlo, la mia modifica potrebbe chiarirlo.