Giardino dei programmatori
Essendo uno sviluppatore di software professionale, non puoi rischiare di esporsi alla dura luce non artificiale del sole, ma hai anche un debole per i fiori e vuoi mantenere il tuo giardino in forma tutto l'anno.
A tal fine, un giardiniere viene assunto ogni mese per riordinare l'aiuola ai piedi della tua casa. Tuttavia, è necessario assicurarsi che il giardiniere stia svolgendo correttamente il proprio lavoro e elaborare un pagamento adeguato per il duro lavoratore. Naturalmente una soluzione software è la migliore.
Ingresso
Il tuo programma riceverà input che descrivono l'aiuola come appare attuale e i dettagli degli elementi che devono essere rimossi. Il programma deve produrre il giardino privo del disordine e stampare una ripartizione della retribuzione dei giardinieri. L'input può provenire da STDIN o come singolo argomento della riga di comando.
La prima riga di input è del formato
width height unwanted_item_type_count
dove widthè la larghezza dell'aiuola, heightè l'altezza dell'aiuola (entrambi in caratteri ASCII) e unwanted_item_type_countti dice quante righe seguiranno contenenti una descrizione di un tipo di oggetto da rimuovere dal giardino.
Ogni riga per ogni tipo di elemento indesiderato è nel formato
width height string_representation name fee_per_item
dove widthè la larghezza dell'elemento, heightè l'altezza dell'elemento (entrambi in caratteri ASCII), string_representationè la rappresentazione in forma di stringa dell'articolo senza interruzioni di riga, nameè un identificatore per il tipo di elemento (gli spazi verranno sostituiti con caratteri di sottolineatura) e fee_per_itemè quanto deve pagare il giardiniere per la rimozione di ogni tipo di oggetto.
Per esempio
3 2 .R.\|/ rouge_flower 3
Rappresenta un tipo di elemento di nome rouge_flower, che costa 3 da rimuovere e si presenta così:
.R.
\|/
Gli elementi non conterranno spazi e nessun articolo può avere un bordo costituito interamente da punti e la rappresentazione della stringa avrà anche la dimensione esatta descritta. Pertanto, tutti i seguenti sono input non validi:
3 1 ( ) space 0
1 1 . dot 0
2 1 .! bang 0
3 2 .@.\|/. plant 0
Si noti che 0 è tuttavia una commissione valida (le commissioni saranno sempre numeri interi superiori a -1).
Nota anche che l'aiuola è prevalentemente costituita da punti ( .) piuttosto che da spazi, e puoi tranquillamente usare gli spazi bianchi come delimitazione per tutti gli input. L'aiuola è sempre delimitata dai punti stessi.
Dopo aver elencato i tipi di oggetti indesiderati, arriva la rappresentazione ASCII dell'aiuola di data larghezza e altezza.
Produzione
L'output dovrebbe essere su STDOUT, o alternativa adatta se la tua lingua non lo supporta.
L'output inizia con una stampa dell'aiuola, ma con tutti gli elementi indesiderati rimossi (sostituiti con punti), quindi puoi vedere come dovrebbe apparire e verificare che il giardiniere abbia fatto il suo lavoro. Ogni oggetto nell'aiuola sarà circondato da un rettangolo di punti e sarà un oggetto contiguo (cioè non ci saranno punti di separazione all'interno dell'elemento). Per esempio
.....
.#.#.
.....
mostra 2 elementi separati
.....
.\@/.
.....
mostra 1 oggetto
......
.#....
....|.
....|.
.o--/.
......
non è valido, poiché mentre la pietra (#) può essere abbinata, il serpente (non si può dire che fosse un serpente?) non può perché la pietra interferisce con il necessario circondamento di punti.
...
\@.
...
Anche questo non è valido, poiché la lumaca si trova sul bordo dell'aiuola e il bordo deve sempre essere delimitato da punti in un input valido.
Successivamente, dovrebbe essere presente un elenco di ciascun tipo di articolo indesiderato, che fornisce il conteggio, il costo per articolo e i costi per tutti gli articoli (conteggio * costo per articolo), nel formato:
<count> <name> at <cost_per_item> costs <cost>
Dopo questo, dovrebbe esserci una sola riga che fornisce il costo totale (la somma dei costi per gli articoli indesiderati):
total cost <total_cost>
Esempio
Per questo dato input
25 18 3
4 2 .\/.\\// weeds 5
2 1 \@ snails 2
1 1 # stones 1
.........................
.\@/.................\@..
............\/...........
......O....\\//..^|^.....
.#...\|/.........^|^.....
..................|......
.................\|/.....
..\@.....\/...........#..
........\\//....#........
....*....................
...\|/......\/......\@/..
...........\\//..........
..................*......
.......\@/.......\|/.....
...O.....................
..\|/.......*............
.......#...\|/....\@.....
.........................
Il programma dovrebbe produrre questo output
.........................
.\@/.....................
.........................
......O..........^|^.....
.....\|/.........^|^.....
..................|......
.................\|/.....
.........................
.........................
....*....................
...\|/..............\@/..
.........................
..................*......
.......\@/.......\|/.....
...O.....................
..\|/.......*............
...........\|/...........
.........................
3 weeds at 5 costs 15
3 snails at 2 costs 6
4 stones at 1 costs 4
total cost 25
L'output deve essere terminato da un'interruzione di riga.
Questo è code-golf, può vincere il codice più corto.
Caso di prova aggiuntivo
Modifica: usato per contenere Unicode, che non è consentito nell'aiuola, troppo moderno. Questo è stato corretto, mi dispiace per quello.
25 15 5
5 3 ..@..\\|//.\|/. overgrown_plants 3
5 3 @-o....|...\|/. semi-articulated_plant 4
3 2 .|.\@/ mutant_plants 5
1 1 $ dollars 0
1 1 # stones 1
.........................
........@................
....$..\|/...........@...
............|.......\|/..
...#.......\@/...........
.........................
.........................
......@.......@......@...
.....\|/....\\|//...\|/..
.............\|/.........
.#....................#..
.........$.......|.......
...\/.......\/..\@/..\/..
..\\//.....\\//.....\\//.
.........................
Uscita prevista:
.........................
........@................
.......\|/...........@...
....................\|/..
.........................
.........................
.........................
......@..............@...
.....\|/............\|/..
.........................
.........................
.........................
...\/.......\/.......\/..
..\\//.....\\//.....\\//.
.........................
1 overgrown_plants at 3 costs 3
0 semi-articulated_plants at 4 costs 0
2 mutant_plants at 5 costs 10
2 dollars at 0 costs 0
3 stones at 1 costs 3
total cost 16
\@e @/per esempio .. O sono tenuti a puntare eternamente a ovest?