2010-10-25 7 views
19

Ein Helikopter legt zwei Züge mit Fallschirm auf eine gerade, unendliche Bahnlinie.Programmierung von zwei Zügen ohne Positionsdaten oder Kommunikation (Logikpuzzle)

Zwischen den beiden Zügen besteht ein unbestimmter Abstand.

Jeder sieht in dieselbe Richtung, und bei der Landung fällt der an jedem Zug befestigte Fallschirm neben dem Zug auf den Boden und löst sich.

Jeder Zug hat einen Mikrochip, der seine Bewegung steuert. Die Chips sind identisch.

Es gibt keine Möglichkeit für die Züge zu wissen, wo sie sind.

Sie müssen den Code in den Chip schreiben, damit die Züge ineinander stoßen.

Jede Codezeile benötigt zur Ausführung einen einzelnen Taktzyklus.

Sie können die folgenden Befehle verwenden (und nur diese):

  • MF - bewegt den Zug nach vorn
  • MB - bewegt den Zug nach hinten
  • IF (P) - bedingt das ist erfüllt, wenn der Zug ist neben einem Fallschirm. Es gibt kein "dann" zu dieser IF-Anweisung.
  • GOTO
+8

Warum schließen? Es ist eine einfache Frage zur Algorithmus-Konstruktion, die eine klare Antwort hat. – aioobe

+1

Sie können ein weiteres Tag "Interview-Frage" hinzufügen, um mehr Sichtbarkeit zu erhalten – vrbilgi

+6

Nur weil Sie eine Frage über das Programmieren in SO kopieren und einfügen können, bedeutet das nicht, dass die Frage gut ist. Diese Frage benötigt eine bessere Formatierung und wahrscheinlich ein paar Worte vom OP über * warum * die Frage gepostet wurde. –

Antwort

25

jeden Zug Zug langsam vorwärts Machen, bis er einen Fallschirm findet. Wenn der hintere Zug den Fallschirm des vorderen Zuges findet, muss er sich schneller vorwärts bewegen, um den vorderen Zug zu erreichen.

1. MF 
2. IF(P) 
3. GOTO 5 
4. GOTO 1 
5. MF 
6. GOTO 5 

Wenn Sie es weniger Zeit in Anspruch nehmen wollen, um für die Züge einander zu erreichen, auf Kosten der einige zusätzliche Zeilen Code, können Sie die zweite Schleife entrollen.

+0

Wenn das die richtige Syntax für die 'IF'-Anweisung ist, ist dies eine richtige Antwort. Auch wenn die 2. und 3. Anweisungen in derselben Zeile sind, wird es immer noch funktionieren. –

+0

Das ist schwer. Es braucht das Verständnis der einheitlichen Führerwahl. – none

+1

Ich glaube nicht, dass dies eine richtige Antwort ist. Ich denke, dass MF und MB die Geschwindigkeit des Zuges nicht regulieren, sondern nur ein Stück weit bewegen. – Dialecticus

2
label1: MF 
If (P) 
{ 
    // Do nothing (because of no then?) 
} 
ELSE 
{ 
    MF; 
    MB; 
    GOTO label1; 
} 
label 2:MF 
GOTO label2; 

vorwärts gehen 2 mal, rückwärts 1 mal, bis der andere Zug Fallschirm nach vorn wie verrückt treffen (Beule in die andere - es ist immer noch nach vorne dann nach hinten - was bedeutet, es langsamer gehen). Ich benutze MF einmal in Label 2, bedeutet, dass es 2 Taktzyklen dauert, um einen Schritt vorwärts zu gehen. In Label1 dauerte es 5 Taktzyklen, um einen Schritt vorwärts zu gehen. Also, wenn wir mehr MF in label2 verwenden, werden zwei von ihnen schneller aufeinander treffen.
Keine Variable verwendet.

+0

Ich habe Ihren Code formatiert. benutzen Sie bitte den '101010' Button oder setzen Sie den Code beim nächsten Mal um 4 Leerzeichen ein :-) –

+0

Btw verwendet grundsätzlich die gleiche Logik wie @jchls Lösung, nur dass es Blöcke und ELSE verwendet, die in dieser Sprache scheinbar nicht existieren. –

+1

Ja, das sehe ich. Aber ich habe seine Lösung nicht gesehen, wenn ich meine schreibe. Wenn ich die Seite bald genug aktualisiere, werde ich mit seiner Lösung zufrieden sein. Ich benutze Block für leichteres Verständnis und ELSE wegen "nein dann" in der Frage. – Kiennx