Programmiergarten
Als professioneller Softwareentwickler können Sie es nicht riskieren, sich dem harten, nicht künstlichen Sonnenlicht auszusetzen, aber Sie haben auch ein Faible für Blumen und möchten Ihren Garten das ganze Jahr über in gutem Zustand halten.
Zu diesem Zweck wird jeden Monat ein Gärtner eingestellt, der das Blumenbeet am Fuße Ihres Hauses aufräumt. Sie müssen jedoch sicherstellen, dass der Gärtner seine Arbeit ordnungsgemäß erledigt, und eine angemessene Bezahlung für den hart arbeitenden Gefährten ausarbeiten. Natürlich ist eine Softwarelösung am besten.
Eingang
Ihr Programm erhält eine Eingabe, die das Blumenbeet beschreibt, wie es aktuell erscheint, sowie Details zu Elementen, die entfernt werden müssen. Das Programm muss den Garten ohne Unordnung ausgeben und eine Aufschlüsselung der Gärtnerlöhne ausdrucken. Die Eingabe kann entweder über STDIN oder als einzelnes Befehlszeilenargument erfolgen.
Die erste Eingabezeile hat das Format
width height unwanted_item_type_count
Wo width
ist die Breite des Blumenbeets, height
ist die Höhe des Blumenbeets (beide in ASCII-Zeichen) und unwanted_item_type_count
gibt an, wie viele Zeilen mit einer Beschreibung eines Objekttyps folgen, der aus dem Garten entfernt werden soll.
Jede Zeile für jeden unerwünschten Elementtyp hat das Format
width height string_representation name fee_per_item
Dabei width
ist die Breite des Elements, height
die Höhe des Elements (beide in ASCII-Zeichen), string_representation
die Zeichenfolgendarstellung des Elements ohne Zeilenumbrüche, name
ein Bezeichner für den Elementtyp (Leerzeichen werden durch Unterstriche ersetzt) und fee_per_item
ist, wie viel der Gärtner für die Entfernung jeder Art von Gegenständen bezahlt werden muss.
Beispielsweise
3 2 .R.\|/ rouge_flower 3
Stellt einen Elementtypnamen dar rouge_flower
, dessen Entfernung 3 kostet, und sieht folgendermaßen aus:
.R.
\|/
Die Elemente enthalten keine Leerzeichen und kein Element darf einen Rahmen haben, der ausschließlich aus Punkten besteht, und die Zeichenfolgendarstellung hat auch die genaue beschriebene Größe. Daher sind alle folgenden Eingaben ungültig:
3 1 ( ) space 0
1 1 . dot 0
2 1 .! bang 0
3 2 .@.\|/. plant 0
Beachten Sie, dass 0 eine gültige Gebühr ist (Gebühren sind immer ganze Zahlen größer als -1).
Beachten Sie auch, dass das Blumenbeet überwiegend aus Punkten ( .
) und nicht aus Leerzeichen besteht und Sie Leerzeichen sicher als Begrenzung für alle Eingaben verwenden können. Das Blumenbeet wird immer von Punkten begrenzt.
Nachdem die unerwünschten Elementtypen aufgelistet wurden, wird die ASCII-Darstellung des Blumenbeets mit der angegebenen Breite und Höhe angezeigt.
Ausgabe
Die Ausgabe sollte nach STDOUT erfolgen oder eine geeignete Alternative, wenn Ihre Sprache dies nicht unterstützt.
Die Ausgabe beginnt mit einem Ausdruck des Blumenbeets, wobei jedoch alle unerwünschten Elemente entfernt (durch Punkte ersetzt) werden, sodass Sie sehen können, wie sie angezeigt werden sollen, und überprüfen, ob der Gärtner seine Arbeit erledigt hat. Jeder Gegenstand im Blumenbeet wird von einem Punktrechteck umgeben und ist ein zusammenhängender Gegenstand (dh es gibt keine Trennpunkte innerhalb des Gegenstandes). Beispielsweise
.....
.#.#.
.....
zeigt 2 separate Artikel
.....
.\@/.
.....
zeigt 1 Artikel
......
.#....
....|.
....|.
.o--/.
......
ist ungültig, da der Stein (#) zwar angepasst werden kann, die Schlange (Sie konnten nicht sagen, dass es eine Schlange war?) dies nicht kann, da der Stein die erforderliche Umgebung von Punkten beeinträchtigt.
...
\@.
...
Dies ist auch ungültig, da sich die Schnecke am Rand des Blumenbeets befindet und der Rand in einer gültigen Eingabe immer durch Punkte begrenzt sein muss.
Danach sollte eine Auflistung aller Arten von unerwünschten Artikeln mit Angabe der Anzahl, der Kosten pro Artikel und der Kosten für alle Artikel (Anzahl * Kosten pro Artikel) in folgendem Format vorliegen:
<count> <name> at <cost_per_item> costs <cost>
Danach sollte es eine einzelne Zeile geben, die die Gesamtkosten (die Summe der Kosten für unerwünschte Artikel) ergibt:
total cost <total_cost>
Beispiel
Für diesen gegebenen Eingang
25 18 3
4 2 .\/.\\// weeds 5
2 1 \@ snails 2
1 1 # stones 1
.........................
.\@/.................\@..
............\/...........
......O....\\//..^|^.....
.#...\|/.........^|^.....
..................|......
.................\|/.....
..\@.....\/...........#..
........\\//....#........
....*....................
...\|/......\/......\@/..
...........\\//..........
..................*......
.......\@/.......\|/.....
...O.....................
..\|/.......*............
.......#...\|/....\@.....
.........................
Das Programm sollte diese Ausgabe erzeugen
.........................
.\@/.....................
.........................
......O..........^|^.....
.....\|/.........^|^.....
..................|......
.................\|/.....
.........................
.........................
....*....................
...\|/..............\@/..
.........................
..................*......
.......\@/.......\|/.....
...O.....................
..\|/.......*............
...........\|/...........
.........................
3 weeds at 5 costs 15
3 snails at 2 costs 6
4 stones at 1 costs 4
total cost 25
Die Ausgabe muss durch einen Zeilenumbruch abgeschlossen werden.
Dies ist Code-Golf, möge der kürzeste Code gewinnen.
Zusätzlicher Testfall
Bearbeiten: Früher enthielt dies Unicode, was im Blumenbeet nicht erlaubt ist, viel zu modern. Dies wurde behoben, tut mir leid.
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
.........................
........@................
....$..\|/...........@...
............|.......\|/..
...#.......\@/...........
.........................
.........................
......@.......@......@...
.....\|/....\\|//...\|/..
.............\|/.........
.#....................#..
.........$.......|.......
...\/.......\/..\@/..\/..
..\\//.....\\//.....\\//.
.........................
Erwartete Ausgabe:
.........................
........@................
.......\|/...........@...
....................\|/..
.........................
.........................
.........................
......@..............@...
.....\|/............\|/..
.........................
.........................
.........................
...\/.......\/.......\/..
..\\//.....\\//.....\\//.
.........................
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
\@
und@/
zum Beispiel ... Oder müssen sie ewig nach Westen zeigen?Antworten:
Perl - 636
Es gibt definitiv noch mehr Möglichkeiten zum Golfen. Und wahrscheinlich auch bessere Möglichkeiten.
635 Zeichen + 1, damit die
-C
Flagge die Euro handhabt.Wenn Sie die Eingabe in gespeichert haben
input.txt
, können Sie sie ausführen mit:Hier ist die deparsed Version. Ich ging durch und fügte einige Kommentare hinzu, um die Dinge zu erklären. Vielleicht werde ich die Variablennamen irgendwann lesbarer machen. Es kann einige Randfälle geben, mit denen dies nicht funktioniert, aber es funktioniert zumindest mit den Beispielen.
Fühlen Sie sich frei, Verbesserungen vorzuschlagen!
quelle
-C
Flagge. Ich werde es sowieso dort belassen, um kompatibel zu sein, da es nur einen Unterschied von 1 Zeichen gibt.Python 3, 459 Bytes
Angenommen, die Eingabe wird als Liste von Zeichenfolgen angegeben.
quelle
~H
Trick; Ich kann das jetzt nicht testen, aber ich werde es später heute versuchen.ValueError: not enough values to unpack (expected 3, got 1)
, Python 3.6.6); Können Sie einen TIO-Link oder eine Beschreibung zur Ausführung bereitstellen? Ich denke, es könnte die Regeln biegen, wenn man annimmt, dass sich die Eingabe in einer Zeile befindet, aber ich war mir darüber in der Frage nicht ganz im Klaren, also werde ich mich nicht beschweren.