Circle Maze Checker

12

Kennst du Holzspielzeug mit kleinen Kugellagern, bei denen es darum geht, sich im Labyrinth zu bewegen? Das ist irgendwie so. Bestimmen Sie anhand eines Labyrinths und einer Reihe von Zügen, wo der Ball landet.

Das Brett wird vertikal gehalten und die Kugel bewegt sich nur durch die Schwerkraft, wenn das Brett gedreht wird. Jede "Bewegung" ist eine Drehung (im Bogenmaß).

Das Labyrinth besteht einfach aus konzentrischen kreisförmigen Wänden, wobei jede Wand genau eine Öffnung in den äußeren Korridor aufweist (angenommen, diese Wände sind Kreise und nicht spitz):

Labyrinth

Wie Sie sehen, beginnt der Ball in der Mitte und versucht auszusteigen. Der Ball wird fallen durch sofort, sobald die korrekte Ausrichtung erreicht wird, auch wenn es auf halben Weg durch eine Drehung. Eine einzelne Drehung kann dazu führen, dass die Kugel durch mehrere Öffnungen fällt. Zum Beispiel ist eine Drehung >= n * 2 * piausreichend, um einem Labyrinth zu entkommen.

Für die Zwecke des Spiels wird ein Ball, der sich im 0.001Bogenmaß der Öffnung befindet, als "fit" betrachtet und fällt zum nächsten Korridor durch.

Eingang:

Die Eingabe erfolgt in zwei Teilen:

  • Das Labyrinth wird durch eine Ganzzahl angegeben, die angibt n, wie viele Wände / Öffnungen sich im Labyrinth befinden. Daran schließen sich nLinien mit jeweils einer Nummer an, die den Übergang zum nächsten Korridor darstellen.

  • Die Züge werden als Ganzzahl angegeben, die angibt m, wie viele Züge ausgeführt wurden, gefolgt von (wiederum in separaten Zeilen) mRotationen des Brettes im Uhrzeigersinn im Bogenmaß (negativ ist gegen den Uhrzeigersinn).

Alle Durchgangspositionen sind 0 rad = upmit positivem Bogenmaß im Uhrzeigersinn angegeben.

Für das obige Beispielbild könnte die Eingabe folgendermaßen aussehen:

7                        // 7 openings
0
0.785398163
3.14159265
1.74532925
4.71238898
4.01425728
0
3                        // 3 moves
-3.92699082
3.14159265
0.81245687

Ausgabe: Geben Sie die Korridornummer aus, in der der Ball endet. Die Korridore sind von der Mitte ausgehend mit einem Index von Null versehen, sodass Sie beginnen 0. Wenn Sie durch eine Öffnung gehen, befinden Sie sich im Korridor 1. Wenn Sie das gesamte Labyrinth verlassen, geben Sie eine beliebige Ganzzahl aus>= n

Für die Probeneingabe gibt es drei Züge. Die erste bewirkt, dass der Ball durch zwei Öffnungen fällt . Der zweite findet keine Öffnung und der dritte findet eine . Der Ball befindet sich jetzt im Korridor 3. Die erwartete Leistung beträgt:

3

Das Verhalten ist für ungültige Eingaben undefiniert. Gültige Eingaben sind wohlgeformt, mit n >= 1und m >= 0.

Das Scoring ist Standard-Code-Golf, die niedrigste Anzahl von Bytes gewinnt. Standardlücken sind verboten. Die Eingabe darf nicht fest codiert sein, sondern kann von Standardeingaben, Argumenten, Konsolen usw. übernommen werden. Die Ausgabe kann auf Konsolen, Dateien usw. erfolgen. Sie muss nur irgendwo sichtbar gemacht werden.

Geobits
quelle
"Das Verhalten ist für ungültige Eingaben undefiniert." << - Das muss in alle Rätsel gesteckt werden!
TheDoctor
In diesem hypothetischen Fall können Sie π bei Bedarf auch mit variabler Genauigkeit berechnen und die Genauigkeit erhöhen, bis ausreichend ist, um festzustellen, ob ein Ball gefallen ist oder nicht. Ein Problem mit der Toleranz für eine Passung (oder zumindest deren aktuellem Wortlaut) ist, wenn A) aufeinanderfolgende Passungen näher als 0,001 zueinander liegen, so dass der Ball nur um zwei Ebenen fällt, wenn die Toleranz berücksichtigt wird Ball ist innerhalb von 0,001 von einem Loch, es springt zu dem Loch (wenn Sie wirklich etwas in den Wortlaut lesen möchten).
Wrzlprmft
@Wrzlprmft Der Ball springt nicht zum Loch. Stellen Sie sich die Schwelle so vor, dass die Löcher etwas breiter als die Kugel sind. Es fällt immer noch an die gleiche Stelle, nur eine Ebene weiter. Wenn Sie sich die Schwelle vorstellen 1, würden Sie nur mit großen Löchern arbeiten und keine Kugeln in die Mitte des Lochs springen, wenn sie fallen.
Geobits
Warum hat die Eingabe ein so unangenehmes Format? Ich bin mir ziemlich sicher, dass ich ganze Programme gespielt habe, die kürzer sind als das, was ich zum Lesen brauche: /
Tal,

Antworten:

2

Perl 211, 191

Mit Zeilenumbrüchen und Einrückung zur besseren Lesbarkeit:

$p=atan2 0,-1;
@n=map~~<>,1..<>;
<>;
while(<>){
    $_=atan2(sin,cos)for@n;
    $y=abs($n[$-]+$_)<$p-.001
        ?$_
        :($_<=>0)*$p-$n[$-];
    $_+=$y for@n;
    $p-.001<abs$n[$-]&&++$-==@n&&last;
    $_-=$y;
    .001<abs&&redo
}
print$-

Die Anzahl der Züge in der Eingabe wird verworfen, das eof von stdin zeigt das Ende der Züge an.

user2846289
quelle
5

JavaScript 200

function f(i){with(Math)for(m=i.split('\n'),o=m.slice(1,t=+m[0]+1),m=m.slice(t+1),c=PI,p=2*c,r=0,s=1e-3;m.length;c%=p)abs(c-o[r])<s?r++:abs(t=m[0])<s?m.shift(c+=t):(b=t<0?-s:s,c+=p-b,m[0]-=b);return r}

EDIT : Hier ist ein animiertes Beispiel, das beweist, dass dieser Solver funktioniert: http://jsfiddle.net/F74AP/4/

animiert

Die Funktion muss aufgerufen werden, indem die Eingabezeichenfolge übergeben wird.
Hier ist der Aufruf des vom OP gegebenen Beispiels:

f("7\n0\n0.785398163\n3.14159265\n1.74532925\n4.71238898\n4.01425728\n0\n3\n-3.92699082\n3.14159265\n0.81245687");

Es kehrt 3wie vorgesehen zurück.

Michael M.
quelle
2
Aus der Herausforderung "... Eingaben dürfen nicht hart codiert werden ..." . Wenn ich mich nicht irre, heißt das, dass Sie es einlesen müssen und dass Sie auch ein vollständiges Programm haben müssen. Das sieht nur nach einer Funktion aus.
Rainbolt
2
Ich verstehe nicht, die Werte sind nicht fest codiert! Msgstr "... Die Eingabe muss nicht fest codiert sein, sondern kann aus Standardeingaben, Argumenten, Konsolen usw. entnommen werden. " In Bezug auf das gesamte Programm sehe ich nicht, wo es angegeben ist, und IMO ist dies eine vollständige JS-Lösung.
Michael M.
Ich habe kein vollständiges Programm angegeben, daher sehe ich kein Problem nur mit einer Funktion. Die Eingabe wird jedoch als durch Zeilenumbrüche getrennt angegeben, die nicht bereits in systemeigenen Arrays angeordnet sind. Das sollte einfach zu befriedigen sein.
Geobits
1
@ Geobits, ich werde es später ändern, schauen Sie sich diese Geige an: jsfiddle.net/F74AP/1
Michael M.
1
@Geobits, richtig! Einfacher Vorzeichenfehler ...
Michael M.