Jardin du programmeur
En tant que développeur de logiciels professionnel, vous ne pouvez pas risquer de vous exposer à la dure lumière non artificielle du soleil, mais vous avez également un faible pour les fleurs et souhaitez garder votre jardin en bon état toute l'année.
À cette fin, un jardinier est embauché chaque mois pour ranger le parterre de fleurs au pied de votre maison. Cependant, vous devez vous assurer que le jardinier fait correctement son travail et établir un paiement approprié pour le travailleur acharné. Naturellement, une solution logicielle est la meilleure.
Contribution
Votre programme sera alimenté en entrée décrivant le parterre de fleurs tel qu'il apparaît actuellement et les détails des éléments qui doivent être supprimés. Le programme doit produire le jardin sans encombrement et imprimer une ventilation du salaire des jardiniers. L'entrée peut provenir de STDIN ou d'un argument de ligne de commande unique.
La première ligne d'entrée est au format
width height unwanted_item_type_count
où width
est la largeur du parterre de fleurs, height
est la hauteur du parterre de fleurs (les deux en caractères ASCII), et unwanted_item_type_count
vous indique combien de lignes suivront contenant une description d'un type d'élément à retirer du jardin.
Chaque ligne pour chaque type d'élément indésirable est au format
width height string_representation name fee_per_item
où width
est la largeur de l'élément, height
est la hauteur de l'élément (les deux en caractères ASCII), string_representation
est la représentation sous forme de chaîne de l'élément sans les sauts de ligne, name
est un identifiant pour le type d'élément (les espaces seront remplacés par des traits de soulignement), et fee_per_item
est combien le jardinier doit être payé pour l'enlèvement de chaque type d'article.
Par exemple
3 2 .R.\|/ rouge_flower 3
Représente un type d'élément de nom rouge_flower
, qui coûte 3 à supprimer, et ressemble à ceci:
.R.
\|/
Les éléments ne contiendront pas d'espaces, et aucun élément ne peut avoir une bordure entièrement composée de points, et la représentation sous forme de chaîne aura également la taille exacte décrite. Ainsi, tous les éléments suivants sont des entrées non valides:
3 1 ( ) space 0
1 1 . dot 0
2 1 .! bang 0
3 2 .@.\|/. plant 0
Notez que 0 est cependant un tarif valide (les tarifs seront toujours des entiers supérieurs à -1).
Notez également que le parterre de fleurs est principalement composé de points ( .
) plutôt que d'espaces, et vous pouvez utiliser en toute sécurité des espaces blancs comme délimitation pour toutes les entrées. Le parterre est toujours délimité par des points lui-même.
Après la liste des types d'éléments indésirables, vient la représentation ASCII du parterre de largeur et de hauteur données.
Production
La sortie doit être vers STDOUT, ou une alternative appropriée si votre langue ne la prend pas en charge.
La sortie commence par une impression du parterre de fleurs, mais avec tous les éléments indésirables supprimés (remplacés par des points), vous pouvez donc voir comment cela devrait apparaître et vérifier que le jardinier a fait son travail. Chaque élément du parterre de fleurs sera entouré d'un rectangle de points et sera un élément contigu (c'est-à-dire qu'il n'y aura pas de points de séparation à l' intérieur de l'élément). Par exemple
.....
.#.#.
.....
affiche 2 éléments distincts
.....
.\@/.
.....
montre 1 article
......
.#....
....|.
....|.
.o--/.
......
n'est pas valide, car alors que la pierre (#) peut être appariée, le serpent (vous ne pouviez pas dire que c'était un serpent?) ne peut pas car la pierre interfère avec l'entourage requis des points.
...
\@.
...
Ceci est également invalide, car l'escargot est sur le bord du parterre de fleurs, et le bord doit toujours être délimité par des points dans une entrée valide.
Après cela, il devrait y avoir une liste de chaque type d'élément indésirable, indiquant le nombre, le coût par élément et les coûts pour tous les éléments (nombre * coût par élément), au format:
<count> <name> at <cost_per_item> costs <cost>
Après cela, il devrait y avoir une seule ligne indiquant le coût total (la somme des coûts des articles indésirables):
total cost <total_cost>
Exemple
Pour cette entrée donnée
25 18 3
4 2 .\/.\\// weeds 5
2 1 \@ snails 2
1 1 # stones 1
.........................
.\@/.................\@..
............\/...........
......O....\\//..^|^.....
.#...\|/.........^|^.....
..................|......
.................\|/.....
..\@.....\/...........#..
........\\//....#........
....*....................
...\|/......\/......\@/..
...........\\//..........
..................*......
.......\@/.......\|/.....
...O.....................
..\|/.......*............
.......#...\|/....\@.....
.........................
Le programme devrait produire cette sortie
.........................
.\@/.....................
.........................
......O..........^|^.....
.....\|/.........^|^.....
..................|......
.................\|/.....
.........................
.........................
....*....................
...\|/..............\@/..
.........................
..................*......
.......\@/.......\|/.....
...O.....................
..\|/.......*............
...........\|/...........
.........................
3 weeds at 5 costs 15
3 snails at 2 costs 6
4 stones at 1 costs 4
total cost 25
La sortie doit être terminée par un saut de ligne.
C'est le code-golf, que le code le plus court l'emporte.
Cas de test supplémentaire
Edit: il contenait auparavant Unicode, qui n'est pas autorisé dans le parterre de fleurs, beaucoup trop moderne. Cela a été corrigé, désolé.
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
.........................
........@................
....$..\|/...........@...
............|.......\|/..
...#.......\@/...........
.........................
.........................
......@.......@......@...
.....\|/....\\|//...\|/..
.............\|/.........
.#....................#..
.........$.......|.......
...\/.......\/..\@/..\/..
..\\//.....\\//.....\\//.
.........................
Production attendue:
.........................
........@................
.......\|/...........@...
....................\|/..
.........................
.........................
.........................
......@..............@...
.....\|/............\|/..
.........................
.........................
.........................
...\/.......\/.......\/..
..\\//.....\\//.....\\//.
.........................
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
\@
et@/
par exemple .. Ou sont-ils tenus de pointer éternellement vers l'ouest?Réponses:
Perl - 636
Il y a certainement encore du golf à faire. Et probablement de meilleures façons de le faire aussi.
635 caractères + 1 pour
-C
drapeau pour gérer les euros.Si l'entrée est stockée dans,
input.txt
vous pouvez l'exécuter avec:Voici la version analysée. J'ai parcouru et ajouté quelques commentaires pour aider à expliquer les choses. Je vais peut-être rendre les noms des variables plus lisibles un jour. Il peut y avoir des cas marginaux avec lesquels cela ne fonctionne pas, mais cela fonctionne avec les exemples au moins.
N'hésitez pas à suggérer des améliorations!
la source
-C
drapeau avant ça. Je vais le laisser là pour être compatible de toute façon car il n'y a qu'une différence de 1 caractère.Python 3, 459 octets
Suppose que l'entrée sera donnée sous forme de liste de chaînes.
la source
~H
astuce; Je ne peux pas tester cela maintenant, mais j'essaierai de le faire plus tard dans la journée.ValueError: not enough values to unpack (expected 3, got 1)
, python 3.6.6); pouvez-vous fournir un lien TIO ou une description sur la façon de l'exécuter. Je pense que cela pourrait contourner les règles en supposant que l'entrée est sur une seule ligne, mais je n'étais pas tout à fait clair à ce sujet dans la question, donc je ne me plaindrai pas.