Es gibt ein Spiel, das ich gerne spiele. Es passiert auf einem Gitter von endlicher Größe (aber es ist wie eine Kugel gewickelt). In diesem Raster wird ein zufälliger Punkt (nur Ganzzahl) ausgewählt. Dann werde ich als Benutzer zur Eingabe einer Koordinate aufgefordert. Wenn meine Eingabe genau mit dem Zufallspunkt übereinstimmt, wird mir mitgeteilt, dass ich gewonnen habe. Ansonsten wird mir der punktweise Abstand zwischen meiner Eingabe und dem zufälligen Punkt mitgeteilt. Wenn ich zum Beispiel raten würde (2,2)
und der zufällige Punkt (4,3)
wäre, dann wäre der Abstand sqrt[(3-2)^2 + (4-2)^2] = sqrt[5]
.
Das Spiel wird fortgesetzt, bis der Spieler an der richtigen Stelle ankommt.
Ziel Erstellen Sie eine funktionsfähige Version des oben beschriebenen Spiels. Sie müssen dazu ein vollständiges Programm erstellen. Folgendes sollte Ihr Programm tun:
- Fordern Sie zwei Eingaben an: die Höhe und die Breite der Platine. Der Ursprung befindet sich oben links auf der Tafel. Diese Eingaben werden nicht überschreiten
1024
. - Wähle einen zufälligen Punkt auf diesem Brett aus. Dies wird der Punkt sein, den man erraten muss.
- Übernehmen Sie die Eingabe, die eine Kurve simuliert. Die Eingabe ist entweder ein durch Leerzeichen getrenntes Ganzzahlpaar oder zwei separate Ganzzahleingaben. In Reaktion auf diese Eingabe führt das Programm eine der folgenden zwei Aktionen aus:
- Wenn die Eingabe mit dem ausgewählten Zufallspunkt übereinstimmt, wird eine Nachricht ausgegeben, die den Sieg des Benutzers signalisiert. Ich würde vorschlagen "Du hast gewonnen!".
- Andernfalls geben Sie den Abstand zwischen dem Eingabepunkt des Benutzers und dem Zufallspunkt aus.
- Sobald der Benutzer den Sieg errungen hat, wird die Anzahl der Umdrehungen angezeigt, die der Benutzer ausgeführt hat. Das Programm wird dann beendet.
Boni
Boni werden in der Reihenfolge angewendet, in der sie in dieser Liste aufgeführt sind
- -150 Byte, wenn Ihr Programm eine Ganzzahl eingibt
D
, die die Dimension beschreibt, in der das Spiel stattfindet. WennD = 3
Sie beispielsweise einen zufälligen Punkt aus3
ganzen Zahlen erstellen ,3
ganzzahlige Eingaben vornehmen und den Abstand zwischen diesen Punkten ausgeben. - -50% (oder + 50% falls
score < 0
), wenn Sie eine grafische Darstellung der Karte (ASCII oder Bild) bereitstellen, die zeigt, wo der Benutzer das Raster vorgegebener Abmessungen und den Umdrehungszähler zuvor erraten hat. (Wenn Sie sich für den ersten Bonus entscheiden, gilt dieser Bonus nur für die Modi2D
und1D
. Wenn Sie eine grafische 3D-Ausgabe hinzufügen, erhalten Sie zusätzlich -50%.) - -60 Bytes, wenn Sie einen Gamemode bereitstellen können (der von einer Eingabe am Anfang ausgewählt wurde; wenn angegeben
0
, führen Sie den regulären Gamemode aus; wenn angegeben1
, führen Sie diesen Gamemode aus), in dem sich der Punkt pro Runde um 1 Einheit in einer zufälligen orthogonalen Richtung bewegt
Mehr zum Wickeln
Einwickeln erfolgt nur, wenn sich der sich bewegende Punkt im dritten Bonus über eine der Grenzen bewegt. In diesem Fall wird der sich bewegende Punkt wie folgt auf den entsprechenden Punkt verschoben:
... ...
..R (move right) R..
... ...
Dieses Umbruchverhalten hat keine Auswirkung auf die Vermutung des Benutzers, abgesehen von der Tatsache, dass der Punkt die Richtung geändert hat.
Bestenliste
Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
# Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
10x10
, ist der Zufallspunkt(9,4)
und ich denke(2,2)
, ist der Abstandsqrt(13)
odersqrt(53)
? (Hinweis für die Zukunft: Wenn Sie etwas Seltsames tun, schließen Sie nicht die Zufälligkeit ein, da es so gut wie unmöglich ist, Testfälle bereitzustellen.) 2. Soll im dritten Bonus die Distanz berechnet und ausgegeben werden, bevor oder nachdem sich der Punkt bewegt hat?Antworten:
CJam,
-113-139-152-157-159 BytesDas Programm ist 51 Bytes lang und qualifiziert sich für die Boni -150 Bytes und -60 Bytes .
Der Spielmodus und die Anzahl der Dimensionen werden als Befehlszeilenargument gelesen, die Größe in jeder Dimension von STDIN. Da die Siegesnachricht willkürlich ist , wird das Programm gedruckt
0.0
(Entfernung zum Ziel), um anzuzeigen, dass das Spiel beendet ist.Testläufe
Wie es funktioniert
quelle
Pyth, 91 (–150–60) = –119
Alte Lösung: (54-150 = -96)
Alle Eingaben erfolgen in einer neuen Zeile.
1
oder0
)Erstezweite ganze ZahlD
repräsentiert die Dimensionen des Spiels.D
Eingaben geben die Feldgröße anD
Eingaben von diesem Punkt an sind VermutungenProbespiel (Hinweise erscheinen nicht im eigentlichen Programm):
quelle
J=YmOvwvw
statt dessen verwendenVvwaYOvw;JY
, was 2 Bytes kürzer ist. Ich habe mir den anderen Code nicht angesehen, aber ich denke, Sie können dort auch ein paar Dinge verkürzen.Python 2, 210 - 150 = 60
Erste Herausforderung nur soweit. Probieren Sie es online aus
quelle
Pip,
4342 Bytes - 150 = -108Nimmt die Board-Dimensionen als Befehlszeilenargumente (wobei D aus der Anzahl der Argumente hervorgeht). Nimmt Vermutungen als durch Leerzeichen getrennte Zahlen auf stdin.
Dieser Code nutzt die Array-Programmierfunktionen von Pip. Das Array von cmdline-Argumenten wird in gespeichert
g
. Wir erzeugen , um den Punkt durch Abbilden des Randrange Bediener erraten werdenRR
überg
und zerren die resultierende Liste in diey
Variable. Dann kommt die main while-Schleife, in der die Bedingung wie folgt lautet:Wenn der Abstand ungleich Null war, wird er auf der Innenseite der Schleife gedruckt. Wenn es Null war, haben wir den Zielpunkt erreicht. Die Schleife wird angehalten und das Programm gibt die Gewinnmeldung und die Anzahl der Umdrehungen aus.
Beispiellauf:
quelle
R, 134-150 = -16 Bytes
quelle
Haskell, 240-150 = 90
quelle
Dyalog APL ,
7771 - 210 = -139In Ordnung:
Beachten Sie, dass dies im Indexursprung 0 (
⎕IO←0
) ausgeführt wird, der in vielen APLs Standard ist.Nimmt den Booleschen Modus als rechtes Argument (
M
) und die Dimensionsgrößen als linkes Argument (S
).Anzahl der Dimensionen ist
D
, die (zBD←3
) vor dem Aufruf gemäß OP eingestellt werden müssen.P←?S
Das Ziel erhält einen zufälligen Punkt im Bereich 1, obwohl jede Dimension begrenzt ist{
.}⍣≢C←0
Wiederholen Sie die Funktion, bis sich das Ergebnis von unterscheidet. DabeiC
wird zunächst die0
?2
Zufallszahl 0 oder 1¯1 1[
angezeigt. Der]
Index aus der Liste mit zwei Zahlen wirdM×
nach Modus multipliziert. Legt fest,0
ob der Modus ein0
D↑
Pad mit0
s ist, um der Anzahl der Dimensionen zu entsprechen. Die(?D)⌽
Liste wird zufällig gedreht (0 bis Anzahl der Dimensionen - 1).P+
anpassen aktuelles ZielS|
Modul Welt GrößeP←
Speicher neuen ZielpunktC+←1
Zähler erhöhenP≢G←⎕:
Eingang erraten, und wenn es anders als Zielpunkt ist dann ...P-G
Distanzen in jeder Dimension2*⍨
Squared+/
sie summieren.5*⍨
Quadratwurzeldruck⎕←
dass0⊣
return 0 (dh identisch mit Anfangswert, so wiederholen)C
... sonst, Gibt die Anzahl der Vermutungen zurück (die sich von 0 unterscheiden, die Schleife stoppen und den letzten Wert zurückgeben)quelle