Problem
Stellen Sie sich 7 Eimer hintereinander vor. Jeder Eimer kann höchstens 2 Äpfel enthalten. Es gibt 13 Äpfel mit den Bezeichnungen 1 bis 13. Sie sind auf die 7 Eimer verteilt. Beispielsweise,
{5,4}, {8,10}, {2,9}, {13,3}, {11,7}, {6,0}, {12,1}
Wobei 0 den leeren Raum darstellt. Die Reihenfolge, in der die Äpfel in jedem Eimer erscheinen, ist nicht relevant (z. B. entspricht {5,4} {4,5}).
Sie können jeden Apfel von einem Eimer in einen benachbarten Eimer verschieben, sofern im Ziel-Eimer Platz für einen anderen Apfel ist. Jede Bewegung wird durch die Nummer des Apfels beschrieben, den Sie bewegen möchten (was eindeutig ist, da nur ein Leerzeichen vorhanden ist). Zum Beispiel den Zug anwenden
7
zu der obigen Anordnung würde führen
{5,4}, {8,10}, {2,9}, {13,3}, {11,0}, {6,7}, {12,1}
Zielsetzung
Schreiben Sie ein Programm, das eine Anordnung aus STDIN liest und in die folgende Anordnung sortiert
{1,2}, {3,4}, {5,6}, {7,8}, {9,10}, {11,12}, {13,0}
mit so wenig Zügen wie möglich. Auch hier ist die Reihenfolge, in der die Äpfel in jedem Eimer erscheinen, nicht relevant. Die Reihenfolge der Eimer spielt eine Rolle. Es sollte die Bewegungen ausgeben, die zum Sortieren jeder durch Kommas getrennten Anordnung verwendet werden. Beispielsweise,
13, 7, 6, ...
Ihre Punktzahl entspricht der Summe der Anzahl der Züge, die zur Lösung der folgenden Vorkehrungen erforderlich sind:
{8, 2}, {11, 13}, {3, 12}, {6, 10}, {4, 0}, {1, 7}, {9, 5}
{3, 1}, {6, 9}, {7, 8}, {2, 11}, {10, 5}, {13, 4}, {12, 0}
{0, 2}, {4, 13}, {1, 10}, {11, 6}, {7, 12}, {8, 5}, {9, 3}
{6, 9}, {2, 10}, {7, 4}, {1, 8}, {12, 0}, {5, 11}, {3, 13}
{4, 5}, {10, 3}, {6, 9}, {8, 13}, {0, 2}, {1, 7}, {12, 11}
{4, 2}, {10, 5}, {0, 7}, {9, 8}, {3, 13}, {1, 11}, {6, 12}
{9, 3}, {5, 4}, {0, 6}, {1, 7}, {12, 11}, {10, 2}, {8, 13}
{3, 4}, {10, 9}, {8, 12}, {2, 6}, {5, 1}, {11, 13}, {7, 0}
{10, 0}, {12, 2}, {3, 5}, {9, 11}, {1, 13}, {4, 8}, {7, 6}
{6, 1}, {3, 5}, {11, 12}, {2, 10}, {7, 4}, {13, 8}, {0, 9}
Ja, jede dieser Vereinbarungen hat eine Lösung.
Regeln
- Ihre Lösung muss in Polynomzeit in der Anzahl der Buckets pro Zug ausgeführt werden. Es geht darum, clevere Heuristiken zu verwenden.
- Alle Algorithmen müssen deterministisch sein.
- Bei einem Gleichstand gewinnt die kürzeste Byteanzahl.
quelle
Antworten:
Punktzahl: 448
Meine Idee ist es, sie fortlaufend zu sortieren, beginnend mit 1. Dies gibt uns die schöne Eigenschaft, dass wir genau wissen, welche der beiden Äpfel wir bewegen müssen, wenn wir den Platz in den vorherigen / nächsten Korb verschieben möchten - die max / min eins. Hier ist die Testaufschlüsselung:
Der Code kann viel mehr gespielt werden, aber eine bessere Qualität des Codes führt zu zusätzlichen Antworten.
C ++ (501 Bytes)
Weitere Verbesserungen können darin bestehen, zu C zu wechseln und zu versuchen, die Punktzahl zu senken, indem von den großen Werten abwärts ausgegangen wird (und schließlich beide Lösungen kombiniert werden).
quelle
C
426448Dies sortiert Äpfel nacheinander von 1 bis 13, ähnlich wie bei Yasen , es sei denn, es besteht die Möglichkeit, eine größere Zahl nach oben oder eine kleinere Zahl nach unten zu verschieben.
Leider verbessert dies nur die Leistung beim ersten Testproblem, aber es ist eine kleine Verbesserung.Ich habe beim Ausführen der Testprobleme einen Fehler gemacht. Es scheint, als hätte ich Yasens Methode einfach neu implementiert.Es werden Eingaben ohne Klammern oder Kommas vorgenommen, z
Hier ist der Golfcode, der bei 423 Bytes eingeht und ein paar unnötige Zeilenumbrüche zählt (könnte wahrscheinlich mehr Golf spielen, aber ich erwarte, dass diese Punktzahl übertroffen wird):
Und der Code ohne Wolf, der auch die Partitur druckt:
quelle
Python 3 - 121
Dies implementiert eine Tiefensuche mit zunehmender Tiefe, bis eine Lösung gefunden wird. Es verwendet ein Wörterbuch, um besuchte Zustände zu speichern, so dass es sie nur mit einem Fenster mit höherer Tiefe wieder besucht. Bei der Entscheidung, welche Zustände überprüft werden sollen, wird die Anzahl der falsch platzierten Elemente als Heuristik verwendet und nur die bestmöglichen Zustände aufgerufen. Da die Reihenfolge der Elemente in ihrem Bucket keine Rolle spielt, wird immer eine Reihenfolge innerhalb der Buckets beibehalten. Dies erleichtert die Überprüfung, ob ein Element falsch platziert ist.
Die Eingabe ist ein Array von Ints, wobei das erste Int die Anzahl der Buckets ist.
Zum Beispiel für # 8 (dieser dauert sehr lange, bis er auf meinem Computer ausgeführt wird, die anderen sind in Sekunden fertig):
Hier sind die Ergebnisse des Testsatzes: # 1: 12, # 2: 12, # 3: 12, # 4: 12, # 5: 11, # 6: 11, # 7: 10, # 8: 14, # 9: 13, # 10: 14
Hier ist der Code:
quelle