Inspiriert von den Lego-Übersetzungsverhältnissen von Keith Randall.
Auch ich plane den Bau eines riesigen Lego-Roboters, der in der Lage sein wird, die anderen Roboter in dem noch nie zuvor erwähnten Wettbewerb zu zerstören. * Während des Konstruktionsprozesses des Roboters werde ich viele Getriebezüge verwenden, um die Verbindung herzustellen verschiedene Teile des Roboters. Ich möchte, dass Sie mir das kürzeste Programm schreiben, mit dem ich die komplexen Getriebezüge konstruieren kann, die für eine solch komplexe Aufgabe erforderlich sind. Natürlich verwende ich nur Zahnräder mit den Radien 1, 2, 3 und 5 für beliebige Lego-Einheiten.
Jedes Zahnrad im Getriebezug hat eine bestimmte Ganzzahlkoordinate in einem 2D-Gitter. Der erste Gang befindet sich bei (0,0) und der letzte Gang befindet sich bei nicht negativen Koordinaten. Die Position und Größe des ersten und letzten Gangs werden als Eingabe bereitgestellt. Ihr Programm muss angeben, welche Gänge wohin geschaltet werden, um die Lücken zu füllen.
Zusätzlich muss Ihr Programm die minimal mögliche Anzahl von Zahnrädern im Getriebezug verwenden. Weniger Zahnräder / Zug = mehr Züge ** = größerer und besserer Zerstörungsroboter.
Die Eingabe besteht aus einer Zeile:
X,Y,B,A
X und Y sind die Koordinaten des letzten Gangs. Der erste Gang befindet sich immer bei (0,0). B und A sind die Radien der End- bzw. Anfangsgänge. Um einige Schwierigkeiten hinzuzufügen, müssen Sie sicherstellen, dass sich das Ausgangszahnrad in die richtige Richtung dreht. Wenn A und B dasselbe Vorzeichen haben, muss sich das Ausgangszahnrad in die gleiche Richtung drehen, und es muss eine ungerade Anzahl von Zahnrädern verwendet werden. Wenn sie entgegengesetzte Vorzeichen haben, muss eine gerade Anzahl von Zahnrädern verwendet werden.
Die Ausgabe sollte eine Liste der X-Position, Y-Position und Radien jedes zusätzlichen Zahnrads sein, ein Zahnrad pro Zeile. Wenn es mehrere Lösungen für minimale Zahnräder gibt, drucken Sie nur eine Ihrer Wahl. Die Reihenfolge der Gänge in der Ausgabe spielt keine Rolle.
Beispiele (äquivalentere Lösungen sind möglich):
in
4,0,1,1
out
2,0,1
in
7,7,-2,-2
out
4,3,3
OR
0,7,5
OR
the above reflected over y=x line
in
7,8,-1,2
out
7,0,5
7,6,1
OR
7,0,5
1,8,5
in
7,7,2,-2
out
4,-3,3
7,1,2
12,1,3
12,7,3
OR
any permutation of the above, or reflected over y=x line
Now you're thinking with gear trains!
Hier sind die Lösungen für die obigen Beispiele dargestellt:
Soweit ich weiß, ist kein Problem unmöglich, wenn sich die beiden Eingangsräder nicht überlappen oder direkt verbinden. Damit müssen Sie sich nicht befassen.
Dies ist Code Golf, die kürzeste Antwort gewinnt.
* Eine zukünftige KOTH, irgendjemand?
**CHOO CHOO!!
Antworten:
C #, 660 Bytes
Probieren Sie es online
Das hat sehr viel Spaß gemacht !! Vollständiges Programm, akzeptiert Eingaben von STDIN und gibt sie an STDOUT aus. Ausgang ist die Zahnräder in der Reihenfolge vom Ende bis zum Start. Verwendung:
Führt eine einfache Breitensuche durch, die ein 4-Gang-Problem in weniger als einer Sekunde löst. Der Verzweigungsfaktor ist eigentlich nicht so groß, also sollte er für wesentlich mehr gut sein (nicht wirklich getestet). Leider benutzt es Linq.
Die
Q
Zeichenfolge ist eine Tabelle aller zulässigen Zahnradverbindungen (dh einr=3
und eine Verbindung zu einemr=1
ifdx=4
unddy=0
) in einem Quadranten, die dann gedreht werden, um die anderen zu finden. Jeder Satz von 3 Bytes istdx
,dy
und der Radius - Informationen für eine rechtliche Verbindung. Die Wahl(
als Offset war sehr bewusst: Es hat Spaß gemacht, einmal ein ASCII-Zeichen für nette Eigenschaften auszuwählen, anstatt verzweifelt nach netten Eigenschaften für aufgezwungene ASCII-Zeichen zu suchen.Ich kann die Eingabe wahrscheinlich besser lesen, aber ich hatte noch kein Glück, nicht zuletzt, weil der Linq durch die Notwendigkeit einer Liste bezahlt wird. Ich bin auch sehr enttäuscht über den Rotationscode. Ich habe das Gefühl, dass dies in erheblich weniger Bytes erledigt werden könnte.
Formatierter und kommentierter Code mit
Q
Generator:quelle