Zwei Roboter auf einer Linie

8

Sie kennen wahrscheinlich das Problem mit den zwei Robotern, die auf einer Linie fallen, wenn Sie sie programmieren müssen.

  

Zwei Roboter werden von einem Flugzeug abgeworfen und landen auf einer einzigen Linie (mit diskreten Positionen) mit einem Fallschirm, der am Landepunkt zurückgelassen wird. Die Roboter sind beide nach Norden gerichtet, sie sind eine unbekannte Entfernung voneinander entfernt, und einer ist direkt östlich des anderen gelandet.

     

Die Roboter sollen jetzt so programmiert werden, dass sie sich treffen. Sie können angewiesen werden, sich nach links oder rechts zu einer benachbarten Position zu bewegen und zu prüfen, ob sich an der aktuellen Position ein Fallschirm befindet. Wenn der andere Roboter getroffen wird, bleiben beide Roboter stehen und leben glücklich bis ans Ende.

     

Die Fallschirmprüfung kann eine beliebige Anzahl von Anweisungen bedingt ausführen, und jeder Block von Anweisungen kann unbedingt wiederholt werden. Notieren Sie sich ein Programm, das beide Roboter gleichzeitig verfolgen können und das garantiert, dass sie sich treffen.

Sie müssen einen generischen Algorithmus (etwas pleonastisch) erstellen, der für beide Roboter gilt und garantiert, dass die Roboter sich treffen. Sie lassen ihren Fallschirm an der Stelle, wo sie fallen gelassen werden, und sie können prüfen, ob in der aktuellen Position ein Fallschirm ist.

Die ursprüngliche Aussage ist hier: Ссылка Es gibt auch eine Lösung, die ich nicht verstehe. Wenn jemand einen Sinn daraus machen kann, bitte hilf mir mit ein wenig Erklärung. Jede andere Lösung würde sehr geschätzt werden.

Mein erster Gedanke zu diesem Problem wäre, den Roboter so zu programmieren, dass er nach dem Zufallsprinzip zuerst nach rechts oder links geht und dann so etwas wie eine exponentielle Suche macht: zuerst zwei Positionen nach rechts, dann vier nach links usw. von diesen "Ausflügen" in rechts oder links findet der Roboter den zweiten Fallschirm (der von dem anderen Roboter benutzt wurde), der Roboter sucht nur in dieser Richtung. Macht das irgendeinen Sinn?

Vielen Dank!

    
Zack 31.08.2014, 21:31
quelle

5 Antworten

10

Deine "First-Thought" -Lösung sollte auch funktionieren, aber es wird eine Weile dauern, bis sich die Roboter treffen als die Lösung, die du bei Wikibooks zitiert hast . Zur Erinnerung, die Wikibooks Lösung ist:

  • 10 Geh nach rechts
  • 20 Gehe nach links
  • 30 Geh nach rechts
  • 40 Wenn nicht Fallschirm GOTO 10
  • 50 Geh nach rechts
  • 60 GOTO 50

Falls Sie die Syntax nicht kennen, versucht der Autor BASIC nachzuahmen, wobei die Zahlen 10-60 Zeilennummern und die GOTOs Code-Sprünge sind.

In den Zeilen 10-40 bewegen sich beide Roboter langsam nach rechts. Die Schritte "rechts, links, rechts" verlangsamen die Bewegung nach rechts. Es hätte genauso gut "richtig, warte" sein können. Linie 40 prüft auf den Fallschirm. Als beide Roboter auf der Linie landeten, war genau einer von ihnen links von dem anderen. Der linke Roboter wird schließlich den anderen Fallschirm finden. Das Recht wird niemals. Wenn der linke Roboter den Fallschirm des rechten Roboters findet, gelangt er in die Linien 50-60, wo er sich ohne die Verlangsamung nach rechts bewegt. Jetzt, da der linke Roboter sich schneller nach rechts bewegt als der rechte Roboter, wird die Linke schließlich aufholen.

Persönlich denke ich, dass der von Ihnen gestellte Algorithmus mehr Spaß macht, da beide Roboter sehr viel hin und her pendeln würden. In gewisser Weise ist es ein ähnlicher Algorithmus, aber die Verlangsamung wächst linear mit jedem Schritt.

    
ldgabbay 31.08.2014, 21:56
quelle
19

Mein Programm ist eigentlich kürzer und funktioniert wie ein Zauberspruch:

%Vor%

das funktioniert, weil die zweite Schleife schneller ist als die erste Schleife

Sie können Ihr Programm hier testen: Ссылка

    
user194388 28.10.2015 14:33
quelle
2

Es scheint mir, dass Ihr Algorithmus funktionieren sollte. Die Idee in der veröffentlichten Lösung ist, dass beide Roboter ein Muster von rechts nach links rechts halten, was bedeutet, dass sie in einem bestimmten Tempo vorankommen. Aber wenn der Roboter auf der linken Seite den Fallschirm des anderen findet, beginnt er sich schneller nach rechts zu bewegen, da er nicht als Teil seines Laufmusters einmal nach links tritt, sondern weiter nach rechts geht und schließlich den Roboter auf dem Boden einholt richtig.

    
גלעד ברקן 31.08.2014 21:48
quelle
1

Beide Roboter bewegen sich nach links, bis der rechte Roboter den Fallschirm des linken Roboters findet und in Richtung des linken Roboters sprintet. Dann kollidieren sie.

%Vor%     
Rob Fox 30.10.2015 11:27
quelle
1

Ich habe das gemacht:

%Vor%

Die Idee ist einfach: Wir gehen ein bisschen nach links. Einer der Roboter (der rechte) wird schließlich mit dem Fallschirm zusammenstoßen und dann wird er aus der ersten Schleife springen und in die zweite eintreten, wodurch er zweimal schneller nach links geht.

    
meta 08.11.2015 04:36
quelle

Tags und Links