Ich bin auf dieses (Mini-) Spiel gestoßen, bei dem du 4 oder mehr vertikale Rohre hattest, die durch eine Reihe horizontaler Rohre verbunden waren, und du musst eine Kugel oder Wasser in die vertikalen Rohre fallen lassen.
Es gibt zwei Arten, die ich kenne:
- Stellen Sie das Objekt in einen Eimer / Korb unter einem der Ausgänge (raten Sie, in welches Rohr es geworfen werden soll)
- Ratet mal, aus welcher Rohrleitung das Objekt kommen wird.
Musterrohre:
| | |-------|
|-------| |-------|
| |-------| |
|-------|-------|-------|
| |-------| |
|-------| |-------|
|-------| |-------|
| |-------| |
Grundregeln:
- Wenn Sie sich durch ein horizontales Rohr bewegen, wird das Objekt nach Möglichkeit heruntergelassen
- Wenn Sie sich durch ein vertikales Rohr bewegen, verwandelt sich das Objekt nach Möglichkeit in ein horizontales Rohr.
Deine Arbeit
- Schreiben Sie ein Programm, das ein zufälliges Raster von Rohren erzeugt (siehe Beispielrohre).
- Es sollten mindestens 4 vertikale Rohre und eine angemessene Anzahl horizontaler Rohre mindestens 10 vorhanden sein.
- Die Länge der vertikalen Rohre liegt bei Ihnen.
- Zeigen Sie den Weg, den das Objekt genommen hat, um den Boden zu erreichen, und zeigen Sie, wie viele Runden es gebraucht hat, um dorthin zu gelangen.
- (Optional) Eingabe für den Startpunkt der Bestimmung, Rohre mit der Nummer 1..N von links nach rechts.
Anzeige:
| vertical pipe
- horizontal pipe
: vertical pipe used by the object
= horizontal pipe used by the object
V Object starting point
^ Object ending point
Beispiel:
V
: | |-------|
:=======: |-------|
| :=======: |
|-----!-:=======: |
| :=======:-------|
|-------| :=======:
|-------| :=======:
| :=======: |
^
14 turns were taken to get to the end.
Detail
Das Objekt tritt in Rohr 1 ein und beginnt sich nach unten zu bewegen. Es geht nach links in das erste horizontale Rohr.
Zurück nach unten und in das zweite Rohr, gefolgt von einer Kehrtwende in das dritte Rohr.
Am Ende der dritten Pipe sehen Sie ein Ausrufezeichen,
sollte nicht in Ihrem Ergebnis sein, aber ich habe dies verwendet, um Ihnen zu zeigen, dass das Objekt geradeaus hätte fahren können.
Regel Nummer 1 verhindert dies jedoch.
Der Gewinner wird in 3 Wochen durch Abstimmung ermittelt. 24-02-2014 (TT-MM).
Fröhliches Kodieren ^. ^
quelle
Antworten:
Mathematica
Der 2D-Code generiert eine Grafik, die den Wasserweg zeigt. Ich habe die Scheitelpunktnummern zur bequemen Gegenprüfung mit der 3D-Anzeige angezeigt. Normalerweise werden die Eckpunktnummern ausgeblendet.
Eingang:
Tatsächlich enthält das Ergebnis mehrere Objekte. Das erste Objekt
result[[1]]
ist das hier gezeigte 2D-Diagramm.Die 3 dimensionalen Rohre sind
Tube
(3D-Linien) in 3 Räumen gezeichnet. Die anhand der Eckpunkte des 2D-Diagramms entlang einer zufällig generierten dritten Koordinate berechneten Koordinaten (Dies ermöglicht den Pipes, bei jeder Ausführung des Codes unterschiedliche Positionen entlang y einzunehmen.)Die Achsen werden angezeigt, um die Leserin davon zu überzeugen, dass das 3D-Rendering tatsächlich auf dem 2D-Rendering basiert.
Der hier interessierende 3D-Eingang ist:
Die Anzahl oder Zeilen, Spalten und Eingabespalten werden aus dem 2D-Code übernommen. Sie müssen nicht erneut eingegeben werden.
2D Code
In den kommenden Tagen werde ich den Code für 2D und 3D dokumentieren und aufräumen.
3D Code und Ergebnisse
quelle
C #
(über LINQPad im "C # -Programm" -Modus;)
Ich werde Equitable Stroke Control anwenden müssen, was das Golfen angeht, aber das ist mein Ansatz in C # (nun, LINQPad, aber wer möchte schon, dass alle Voraussetzungen erfüllt sind, damit eine vollständige C # -App funktioniert?) .
Gitterdefinitionen sind variabel, mit einer Anzahl von vertikalen Rohren und der Höhe der Gesamtstruktur und werden durch Übergeben eines Startwerts wiederholt zufällig (siehe
PipeGrid
Konstruktor).In Ermangelung einer endgültigen Antwort darauf, in welche Richtung das Objekt fließen würde, wenn eine der beiden Richtungen möglich wäre, habe ich Ihnen gestattet, ein Verhalten aus einer Reihe von Optionen anzugeben (siehe
SolveBehavior
Aufzählung /PipeSolver
Konstruktor).Startvertikale ist definierbar (siehe
PipeSolver.Solve
).Ich habe angenommen, dass die horizontalen Rohre immer zwischen zwei benachbarten vertikalen Rohren liegen, dh kein horizontales Rohr kann ein horizontales Rohr umgehen.
Aktualisieren:
Da ich befürchte, dass meine einfache alte Textausgabe für diesen Beliebtheitskontext ein wenig langweilig sein könnte, biete ich eine erweiterte Version an, die auch den Pfad zeichnet, der als Bild genommen wird. Ich habe es als Auto modelliert, bin durch ein schreckliches Straßennetz gefahren und habe versucht, auf den Grund zu kommen, aber mit dem weltweit schlechtesten GPS, das Sie dazu zwingt, an jeder Kreuzung eine Kurve zu fahren.
Als Bonus wird es auch klarer, die "Wendungen" zu sehen.
Viel Spaß - vroom vroom !!
Beispielergebnisse:
(Verticals: 10, Höhe: 10, Random Seed: 5, Startpipe: 2, Lösungsverhalten: FlipFlop})
quelle
C #
Lustige Zeiten! :-)
Dieser Code stellt sicher, dass an beiden Enden der Rohre mindestens ein gerades Rohr vorhanden ist. Es stellt auch sicher, dass es keine mehrdeutigen Kurven gibt.
Ausgabe:
quelle
Funktion
Als ob Funciton noch nicht zu den sinnlosesten Sprachen der Welt gehörte, ist dies mit Sicherheit das nutzloseste Programm, das ich bisher geschrieben habe.
Da dies in StackExchange aufgrund des zusätzlichen Zeilenabstands hässlich aussieht, sollten Sie Folgendes in der JavaScript-Konsole Ihres Browsers ausführen, um dies zu beheben:
Da Funciton keinen Zufallsgenerator hat, habe ich beschlossen, Sie das Rohrmuster eingeben zu lassen. Da die Mustercodierung nicht offensichtlich ist, ist das zufällige Anschlagen der Zifferntasten auf Ihrer Tastatur so gut wie ein Zufallszahlengenerator.
Es wird erwartet, dass die Eingabe aus drei durch Leerzeichen getrennten Dezimalzahlen besteht. Die erste Zahl ist die Breite (eine weniger als die Anzahl der vertikalen Rohre); Die zweite ist der Index der Startpipe, und die letzte ist eine beliebige Zahl, die das horizontale Pipe-Muster codiert. Sie können es so groß machen, wie Sie möchten. Wenn die Breite negativ ist oder der Pipe-Index außerhalb des Bereichs liegt, wird Folgendes ausgegeben
Impossiburu.
Das Programm stellt automatisch sicher, dass sich niemals zwei horizontale Rohre nebeneinander befinden, was zu mehrdeutigen Kurven führen kann.
Erläuterung
Das Hauptprogramm findet die ersten beiden Leerzeichen und teilt die Zahlen auf. Es durchläuft das dritte (das Rohrmuster)
░
und ruft dann▒
mit dem Ergebnis auf, das die Ausgabe sowie die Anzahl der durchgeführten Umdrehungen zurückgibt. Anschließend wird der Text hinzugefügtn turns were taken to get to the end.
, wobein
die Anzahl der Umdrehungen berechnet wird▒
.░
0
Nimmt eine Zahl und fügt nach jedem1
-bit ein -bit ein, um sicherzustellen, dass nie zwei horizontale Pipes hintereinander stehen.▒
generiert die Ausgabe durch sukzessives Aufrufen▓
und anschließendes Herausschieben der richtigen Anzahl von Bits aus dem Pipe-Muster, bis es Null ist. Es erhöht oder verringert auch die "aktuelle Pipe" entsprechend.▓
Erzeugt eine Zeile der Ausgabe. In jeder Iteration verschiebt es aus einem Bit aus dem Rohrmuster und entscheidet dann , ob der Ausgabe│
(+ 4 Flächen),║
(+ 4 Flächen),├────┤
,╔════╝
oder╚════╗
; In den letzten drei Fällen wird das erste Zeichen aus der nächsten Iteration entfernt. Die letzte Iteration generiert│\r\n
oder║\r\n
entsprechend.Beispielausgabe
Eingang:
Ausgabe:
Eingang:
Ausgabe:
Eingang:
Ausgabe:
quelle
Groovy, 311
Hier ist es formatiert:
Ausgabe aus der Probe:
Andere Ausgabe:
(Ich weiß, ich habe Code-Golf statt Popularität gemacht, aber das ist nur mein Stil)
quelle
JavaScript
Die HTML-Zeichenfläche lauscht auf Klickereignisse, findet die nächste Pipereihe und verwendet diese als Startpunkt. Die Ausgabe wird auf die Zeichenfläche gezeichnet und es gibt auch einen Textbereich, der die vom OP definierte ASCII-Ausgabe enthält.
Der Algorithmus stellt sicher, dass niemals zwei horizontale Verbindungsrohre vorhanden sind. Abgesehen von dieser Einschränkung wird in den Anfangsvariablen eine Wahrscheinlichkeit definiert, mit der zufällig bestimmt wird, ob eine horizontale Rohrleitung auftreten soll oder nicht.
JSFIDDLE
Ausgabe
quelle