AKTUALISIERTE WERTUNG : Da diese Herausforderung schwieriger ist als erwartet, habe ich die Bewertung angepasst. Ein Programm, das eine einzelne Spiegeleingabe lösen kann, ist eine gültige Antwort. Anspruchsvollere Programme erhalten einen Bonus auf ihre Punktzahl.
Bei PPCG gab es mehrere Rätsel, um einen Laserpfad in einer Schachtel mit Spiegeln zu finden. In diesem Puzzle musst du eine Schachtel mit Spiegeln erstellen , die mit einer Reihe von Laserzielen übereinstimmen.
Sie erhalten eine Box und eine Spezifikation, in die Laser ein- und aussteigen sollen. Ihr Programm muss genau N doppelseitige Spiegel in der Box platzieren, um die Spezifikation zu erfüllen. Die Spiegel müssen um 45 Grad abgewinkelt sein, können jedoch vorwärts oder rückwärts geneigt sein.
Eingang
Ihr Programm sollte ein Box-Grid über STDIN, ein Befehlszeilenargument oder eine Datei in den folgenden Formatbeispielen akzeptieren:
+--G--+ +abcde+
G | f/////d
| /| a// c
+-----+ f |
+-b-e-+
Die Buchstabenpaare ([a-zA-Z] können verwendet werden) geben die Eingabe / Ausgabe von bis zu 52 Lasern an. In der Box wird N sein/
Spiegel. Die Boxmaße betragen 3 <= B, H <= 200. Die Box besteht aus+|-
Zeichen. Es kann eine beliebige Anzahl von Spiegeln in der Box geben, einschließlich Null.
Ausgabe
Die Ausgabe sollte mit der Eingabe übereinstimmen, außer dass die /
Zeichen verschoben und / oder in \
Zeichen geändert werden können . Ihr Programm sollte eine korrekte Mirror-Box-Zeichenfolge an STDOUT oder eine Datei senden, wobei die neue Zeile optional nachgestellt wird. Wenn keine Platzierung von Spiegeln die Eingangsspezifikation erfüllen kann, wird ausgegeben Impossible\n
. Beispiele für mögliche Lösungen:
+--G--+ +abcde+
G / | f \ \ d
| | a/ \ c
+-----+ f / //|
+-b-e-+
Testbeispiel
Eingang:
+abcdefghijklmnopqrstuvwxyA-+
|/////////////// |
|/////////////// |
| |
+-Abcdefghijklmnopqrstuvwxya+
Beispielausgabe:
+abcdefghijklmnopqrstuvwxyA-+
|\ \|
|/ / |
|\\\\\\\\\\\\\\\\\\\\\\\\\\ |
+-Abcdefghijklmnopqrstuvwxya+
Wertung (AKTUALISIERT)
Dies ist Code-Golf mit Boni. Sie sollten mit Ihrer Antwort angeben, wie viele Spiegel Ihr Programm lösen kann (N). Ihre Punktzahl ist die Länge Ihres Programms in Bytes geteilt durch N. Dies ermöglicht den Teilnehmern an einem einfachen Programm, belohnt jedoch ambitioniertere Programmierer mit einem Bonus.
Standardlücken sind nicht erlaubt.
* 2^30
KomponenteAntworten:
C # -
897862 BytesEs wurde ein schwerwiegender Fehler gefunden, bei dem Spiegel an Stellen platziert wurden, an denen sie nicht vorhanden sind. Jetzt klappt es hoffentlich! Habe auch ein bisschen Golf gespielt, konnte die while-Schleife nicht mehr hinterlassen ... beschämend.
Vollständiges Programm, nimmt Eingaben von STDIN entgegen und gibt sie an STDOUT aus.
Das hat sehr viel Spaß gemacht, es ist gut mit dem 7 mal 5 Problem umgegangen (und als Sie einen der Spiegel entfernt haben, was es unmöglich machte), hat es ungefähr 1 Stunde gedauert, um die 30 mal 5 zu lösen.
7 von 5 Beispiel:
Unmögliche Version:
Etwas anderes (das Programm schaut nicht auf das ursprüngliche Spiegel-Layout):
30 mal 5 Lösung:
Es überprüft nacheinander jede Laserquelle, erstellt eine gültige Route (sofern dies möglich ist) und wechselt dann zur nächsten. Es ist eine ziemlich einfache Tiefensuche, die wissen muss, auf welche Laserquelle (Ziel) sie schaut, wie viele Spiegel es noch gibt, in welche Richtung es sich bewegt und in welche Zelle es sich bewegt Es wurde bereits besucht (damit es keinen Spiegel an eine Stelle setzt, an der es bereits war). Die letzten 3 werden zum Zusammenstellen des Pfads für das aktuelle Ziel und zum Zurücksetzen verwendet, wenn sich das Ziel ändert. Sobald alle Laser miteinander verbunden sind, wird der Vorgang fortgesetzt und alle nicht benötigten Lücken werden ausgefüllt (ein weiterer Grund, warum er wissen muss, wo er besucht wird).
Wenn Routen erstellt werden, wird das Einfügen eines Spiegels vorgezogen, und wenn dies der Fall ist, wird ein Spiegel "\" vorgezogen. Dies ist am besten im obigen Beispiel "etwas anderes" zu sehen, in dem die erste Zelle unter dem Spiegel übersprungen wird top-most 'a', dann füllt es kontinuierlich ein "\" aus, wenn es eine Lösung mit einem finden kann, andernfalls ein "/" (wenn das Überspringen der ersten Zelle dazu führte, dass es keine Lösung finden konnte, dann würde es dies tun zurückverfolgen und stattdessen versuchen, dort einen Spiegel anzubringen).
quelle
Python,
671654 BytesKeine Lösung, sondern ein Versuch, lesen Sie weiter unten.
Ich habe dies nicht bis zum Äußersten golfen, da ich mit der Lösung nicht zufrieden bin.
V
Validiert eine gegebene Lösung, indem das FeldF
für jedes ZeichenC
durchlaufen wird, das es an der Seitenlinie findet. Lösungen werden zufällig generiert. Es ist hässlich, es funktioniert für entry1, nimmt aber viel Zeit für die anderen Einträge in Anspruch. Da es zufällig nach Lösungen sucht, halte ich dies nicht für eine tatsächliche Lösung für das gegebene Problem. aber es könnte anderen helfen.Lauf:
echo "entry1.txt" | python script.py
quelle