Sie erhalten eine Reihe von Gewichten, und Ihre Aufgabe besteht darin, mit diesen Gewichten ein kleines, ausgewogenes Mobiltelefon zu bauen.
Die Eingabe ist eine Liste von Ganzzahlgewichten im Bereich von 1 bis einschließlich 9. Möglicherweise sind Duplikate vorhanden.
Die Ausgabe ist ein ASCII-Bild eines Mobiltelefons, das beim Aufhängen ausgeglichen wird. Vielleicht am besten am Beispiel gezeigt:
Eingang
3 8 9 7 5
mögliche Ausgabe
|
+-----+---------+
| |
+--+-+ +----+------+
| | | |
8 ++--+ 7 5
| |
9 3
Sie müssen die angegebenen ASCII-Zeichen verwenden. Die horizontalen und vertikalen Segmente können beliebig lang sein. Kein Teil des Mobiltelefons darf (horizontal oder vertikal) einen anderen nicht verbundenen Teil des Mobiltelefons berühren. Alle Gewichte müssen an einem vertikalen Segment von mindestens 1 Länge aufgehängt sein, und es muss ein vertikales Segment vorhanden sein, an dem das gesamte Mobiltelefon aufgehängt ist.
Die Größe eines Mobil ist die Gesamtzahl der +
, -
und |
Zeichen , es zu bauen erforderlich. Geringere Größen sind besser.
Sie können so viele Verbindungen in ein Segment einfügen, wie Sie möchten. Beispielsweise:
Eingang
2 3 3 5 3 9
mögliche Ausgabe
|
+---+---+-----------+
| | |
+--+-+ 5 9
| | |
2 | 3
|
+++
| |
3 3
Das Gewinnerprogramm ist dasjenige, das den niedrigsten Durchschnitt der Mobilgrößen für einen Testsatz von Eingaben generieren kann. Der eigentliche Test ist sehr geheim, um Hardcodierung zu verhindern, aber es wird ungefähr so aussehen:
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 7 7
3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7
quelle
total_weight_hung_from_point * distance_of_point_from_pivot
auf beiden Seiten des Drehpunkts gleich sein.Antworten:
Python 2.
Ich betrüge ein
wenigBit:Ich baue nur Handys mit einer Horizontalen.
Ich habe das Gefühl , (aber ich habe bewiesen , dass es nicht) , dass das optimale Mobil unter den gegebenen Bedingungen tatsächlich immer nicht nur eine horizontalen hat.Edit: Nicht immer wahr; mit2 2 9 1
Nabb hat in den Kommentaren unten ein Gegenbeispiel gefunden:Ich mache nur dummes Brute-Forcing:
Meine Ergebnisse für Ihre Beispieleingaben; Jedes wurde 5 Sekunden lang ausgeführt (ich bin mir bewusst, dass dies für die Kleinen lächerlich ist - es wäre schneller, alle möglichen Permutationen durchzugehen). Da es ein zufälliges Element gibt, können nachfolgende Durchläufe zu besseren oder schlechteren Ergebnissen führen.
Der Code (ausführlich, da dies kein Code Golf ist):
quelle
1 9 2 8
es erzeugt1-------8+-9--2
; Ich kann mir nichts Besseres vorstellen (aber darauf würde ich mich nicht verlassen) - hast du etwas?2 2 9 1
(2 + 2) * 3 = 9 + 1 * 3 für 16 Größe statt2-9+--2----1
18 Größe . Ich würde vermuten, dass es einen Schwellenwert gibt (vielleicht 5 oder 6) ), wonach eine einzelne horizontale Reihe immer optimal ist.2-2-+9-1
Salden, mit einer Punktzahl von 13(4*2+2*2 = 9*1+1*3)
. Ich halte das also nicht für ein gutes Gegenbeispiel.Nun, das ist eine alte Frage, aber ich habe gerade gesehen, dass sie in der oberen Registerkarte "Fragen" angezeigt wird. Hier ist meine (optimale) Lösung:
Wenn ich mir die Regeln ansehe, bin ich mir ziemlich sicher, dass es nicht betrügt, obwohl es sich so anfühlt. Dadurch werden nur alle angegebenen Zahlen in einer vertikalen Kette ausgegeben, bei einem Gesamtbetrag von 2 * Anzahl_Eingaben (dies ist das Minimum, da jede Zahl unabhängig vom Layout einen Balken darüber haben muss). Hier ist ein Beispiel:
Produziert:
Welches ist natürlich in perfekter Balance.
Eigentlich wollte ich im Geiste dieser Herausforderung etwas mehr ausprobieren, aber es stellte sich schnell heraus, dass es nur auf diese Struktur optimiert wurde
quelle
|
an die Unterseite eines Gewichts anschließen.Hier ist eine Lösung, die die kleinste einreihige Lösung zwingt. Der Code durchläuft alle Permutationen und berechnet für jede den Massenmittelpunkt. Wenn der Schwerpunkt ganzzahlige Koordinaten hat, haben wir eine Lösung gefunden.
Nachdem alle Permutationen ausprobiert wurden, fügen wir der Mischung in unserem aktuellen Satz von Gewichten ein Segment hinzu (entspricht einem Gewicht von Masse 0) und versuchen es erneut.
Führen Sie Folgendes aus, um das Programm auszuführen
python balance.py 1 2 2 4
.was diese besten Lösungen hervorbringt:
quelle
Python 3
Ich glaube, dies ist in keinem der Testfälle schlechter als 1, und das in 5 Sekunden.
Grundsätzlich benutze ich einen Single-Bar-Ansatz. Ich ordne die Eingabe nach dem Zufallsprinzip und setze dann die Gewichte nacheinander auf die Stange. Jedes Element wird entweder in die Position gebracht, die das Übergewicht auf beiden Seiten minimiert, oder aus dieser Perspektive in die zweitbeste Position, wobei die ersteren 75% der Zeit und die letzteren 25% der Zeit verwendet werden. Dann überprüfe ich, ob das Handy am Ende ausgeglichen ist und besser als das bisher beste Handy ist. Ich speichere die beste, halte an und drucke sie nach 5 Sekunden Suche aus.
Ergebnisse in 5-Sekunden-Läufen:
Code:
Die einzige dieser Lösungen, die ich für suboptimal halte, ist die längste mit dieser Lösung, die ich nach 10 Minuten gefunden habe:
quelle