Intro
Considera una griglia di personaggi f A\/come
f f f
A
A / \
\ / A
A \/
/
\/
dove:
frappresenta un rubinetto che versa un flusso di acqua verso il bassoAbiforcò il flusso d'acqua sopra così esattamente la metà va a sinistra e esattamente la metà va a destra\sposta il flusso di acqua in alto a destra di un'unità/sposta il flusso di acqua in alto a sinistra di un'unità- le combinazioni
\/creano un trogolo con capacità infinita che raccoglie i corsi d'acqua sopra di esso [space]è uno spazio vuoto che l'acqua può attraversare
Da questo possiamo immaginare il percorso che l'acqua ( *) prenderebbe quando esce dai rubinetti e cade nelle vasche o fuori dall'area della griglia:
f f f <-- first second and third faucets
* * *A*
* *A*/ \*
\*/ * *A <-- a '*' is not drawn to the right of this A because it would be out of the 9×7 bounds
* *A*\/ <-- upper trough
**/ *
\/ * <-- lower trough
Supponendo che i 3 rubinetti emettano la stessa quantità di acqua uno alla volta, possiamo vederlo
- Tutta l'acqua del primo rubinetto va nella vasca inferiore.
- La metà dell'acqua del secondo rubinetto va nella vasca inferiore e l'altra metà viene divisa tra la vasca inferiore e cade dalla griglia.
- Un quarto dell'acqua del terzo rubinetto va nella vasca inferiore, un quarto cade dal fondo della griglia, un quarto va nella vasca superiore e un quarto cade dalla griglia a destra.
Da questo possiamo dire che (1 + 3/4 + 1/4 + 1/4) / 3 = 75%l'acqua viene catturata dai trogoli e (1/4 + 1/4 + 1/4) / 3 = 25%cade dalla griglia.
Le sfide
È possibile completare una o tutte queste sfide relative a questa configurazione del flusso d'acqua ASCII. Sono tutti code-golf, la risposta più breve per ogni sfida è il vincitore. La risposta accettata sarà la persona che completa il maggior numero di sfide, con la lunghezza totale del codice come pareggio.
Sfida 1
Scrivi un programma che genera la frazione di acqua che scorre in canali per una data griglia. L'output dell'esempio sopra sarebbe semplicemente 0.75.
Sfida 2
Scrivi un programma che, data una griglia, disegna *i punti nei punti in cui scorre l'acqua come ho fatto sopra. Non devi sovrascrivere nulla oltre ai caratteri dello spazio e la griglia non dovrebbe cambiare dimensione. Quindi per qualcosa del genere
f
/A
nulla deve essere fatto poiché, sebbene l'acqua scorra su entrambi i lati della A, non può essere trascinata a sinistra senza rimuovere la / e non può essere disegnata a destra senza allargare la griglia 2 × 2.
Sfida 3 (aggiornato)
Scrivi un programma che accetta due numeri interi non negativi, il totale T e l'importo per mantenere K (T> = K). Genera e disegna una griglia con esattamente unaf tale in modo che quando quel rubinetto fuoriesca T unità di acqua, esattamente K fluirà nelle vasche. Se è impossibile farlo in una griglia finita per una particolare coppia (T, K), quindi produrre "Impossibile".
Chiarimenti (si applicano a tutte le sfide)
- L'input può essere tramite stdin, o un file, o anche una chiamata di funzione sulla rappresentazione di stringa della griglia. Rendi ovvio come eseguire input diversi.
- L'output deve andare su stdout.
\AedA/eAAsono depressioni anche come ci si aspetterebbe.- Una griglia w by h sarà sempre un rettangolo ben formattato di caratteri w * h senza contare le nuove righe. Non ci saranno spazi finali mancanti e nessuna occorrenza di
*. - Le dimensioni della griglia possono essere piccole quanto 1 × 1 e arbitrariamente grandi. (Arbitrariamente entro limiti ragionevoli, int.maxValue o simili è un limite accettabile. Lo stesso vale per T e K.)
- Un flusso sopra un
fflusso scorre attraverso di esso. - I rubinetti possono essere ovunque, non solo nella riga superiore.
Adivide sempre la quantità di acqua versata su di essa esattamente a metà.
Nota: cose come /Ae //sono perfettamente valide. L'acqua fa liberamente fluire tra i personaggi (anche se per sfida 2 non c'è spazio sufficiente per disegnarlo).
Quindi, nel setup
ff
/A
Il fflusso sinistro scorre verso il basso, colpisce /e si sposta a sinistra. Il fflusso destro scorre verso il basso, colpisce il A, metà va a destra e metà va a sinistra tra iA e il /.
per esempio
ff
**
*/A*
** *
** *
/Ase l'acqua cade sul A. Per tutte le sfide, sarebbe bene chiarire se si \Atratta di una depressione. Per la terza sfida, Asi suppone che 3 unità che cadono su si dividano 1.5 / 1.5(quindi l'input è davvero un singolo numero razionale) oppure 2 / 1, in quale caso da quale parte riceve il 2?
Aallora entrambe le parti ottengono 1.5. Spetta al programmatore assicurarsi che la precisione del galleggiante non sia un problema.)
fsecondi