Ein flaches Ratespiel

13

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:

  1. 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.
  2. Wähle einen zufälligen Punkt auf diesem Brett aus. Dies wird der Punkt sein, den man erraten muss.
  3. Ü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:
    1. 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!".
    2. Andernfalls geben Sie den Abstand zwischen dem Eingabepunkt des Benutzers und dem Zufallspunkt aus.
    In beiden Fällen müssen Sie den Umdrehungszähler erhöhen.
  4. 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. Wenn D = 3Sie beispielsweise einen zufälligen Punkt aus 3ganzen Zahlen erstellen , 3ganzzahlige 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 Modi 2Dund 1D. 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 angegeben 1, 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 Nist 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

Conor O'Brien
quelle
7
Kleiner Nitpick: Du meinst wahrscheinlich, es wickelt sich wie ein Torus, nicht wie eine Kugel. Es ist unmöglich, ein 2D-Gitter auf eine Kugel zu wickeln, ohne Diskontinuitäten zu erzeugen.
Alistair Buxton
2
Auch wenn das Brett umwickelt ist, kann es durch Überqueren einer Kante zu einem kürzeren Weg zwischen Vermutung und Ziel kommen.
Alistair Buxton
1
@NBZ Ja, das kannst du.
Conor O'Brien
1
@NBZ 1 Einheit es eine einzelne Richtung.
Conor O'Brien
2
1. Ich bin mir immer noch nicht sicher, wie die Topologie ist. Um die Dinge klarer zu machen, wenn die Tafel ist 10x10, ist der Zufallspunkt (9,4)und ich denke (2,2), ist der Abstand sqrt(13)oder sqrt(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?
Peter Taylor

Antworten:

8

CJam, -113 -139 -152 -157 -159 Bytes

l~]:B:mr{_ea:i~mr0a*W2mr#+*.+B:,.=_[l~].-:mh_p}g],(

Das 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

$ cjam game.cjam 0 3; echo
2 2 2
1 1 1
1.4142135623730951
1 1 0
1.7320508075688774
1 0 1
1.0
0 0 1
0.0
4
$ cjam game.cjam 1 3; echo
2 2 2
0 0 0
1.0
0 0 0
0.0
2

Wie es funktioniert

l~]       e# Read a line from STDIN, evaluate it and collect the result.
:B        e# Save the resulting array in B. The result is [B1 ... Bd],
          e# where Bk is the board size in dimension k.
:mr       e# Pseudo-randomly select a non-negative integer below Bk,
          e# for each k between 1 and d.
{         e# Do:
  _       e#   Copy the item on the stack. The original becomes a dummy value
          e#   that will be used to count the number of turns.
  ea      e#   Push the array of command-line arguments.
  :i~     e#   Cast each to integer and dump them on the stack.
          e#   This pushes m (game mode) and d (number of dimensions).
  mr      e#   Pseudo-randomly select a non-negative integer below d.
  0a*     e#   Push an array of that many zeroes.
  W2mr#   e#   Elevate -1 to 0 or 1 (selected pseudo-randomly).
  +       e#   Append the result (1 or -1) to the array of zeroes.
  *       e#   Repeat the array m times.
  .+      e#   Perform vectorized addition to move the point.
  B:,.=   e#   Take the k-th coordinate modulo Bk.
  _[l~]   e#   Push a copy and an evaluated line from STDIN.
  .-:mh   e#   Compute their Euclidean distance.
  _p      e#   Print a copy.
}g        e# While the distance is non-zero, repeat the loop.
],(       e# Get the size of the stack and subtract 1.
          e# This pushes the number of turns.
Dennis
quelle
2
Und Dennis hat alle übertroffen. Nochmal.
Seadrus
1
Sie haben die Punktzahl versehentlich auf 152 anstatt auf -152 Punkte aktualisiert und stehen damit zuletzt auf der Bestenliste
Elch
7

Pyth, 91 (–150–60) = –119

VvwaYOvw;JY#IqQ1=dOlY XYd@S[0 @Jd +@Yd?O2_1 1)1)=T[)VYaT^-Nvw2)=ZhZ=b@sT2Iqb0Bb;p"Won in "Z

Alte Lösung: (54-150 = -96)

JYVQaYOvw;#=J[)VYaJ^-Nvw2)=ZhZ=b@sJ2Iqb0Bb;p"Won in "Z

Alle Eingaben erfolgen in einer neuen Zeile.

  • Erste Ganzzahl steht für den Spielemodus ( entweder 1oder0 )
  • Erste zweite ganze ZahlD repräsentiert die Dimensionen des Spiels.
  • Nächster D Eingaben geben die Feldgröße an
  • Alle DEingaben von diesem Punkt an sind Vermutungen

Probespiel (Hinweise erscheinen nicht im eigentlichen Programm):

  #Hint: Gamemode (1 or 0)
1
  #Hint: Dimensions
3
  #Hint: X-size
4
  #Hint: Y-size
4
  #Hint: Z-size
4
  #Hint: Guesses
  #Hint:[3, 2, 1]
3
2
2
1.0
  #Hint:[3, 2, 1]
3
2
1
1.0
  #Hint:[2, 2, 1]
2
2
1
1.0
  #Hint:[3, 2, 1]
3
2
1
Won in 4
Elch
quelle
Sollte der zweite Zug nicht gewinnen?
JNF
@JNF der Punkt kann sich im Gamemode 1 bewegen (-60 Bytes Bonus)
Jakube
Holy Moly, das ist ein langer Pyth-Code. Nicht wirklich golfen. Zum Beispiel sehe ich zwei Leerzeichen, die entfernt werden können. Außerdem: Sie können J=YmOvwvwstatt dessen verwenden VvwaYOvw;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.
Jakube
@ Jakube, ich nahm an, der Hinweis sagt uns, wo der Punkt gerade ist
JNF
3

Python 2, 210 - 150 = 60

from random import*
q,r,o=map,raw_input,int
a=q(randrange,q(o,r().split(' ')))
m=q(o,r().split(' '))
t=1
while m!=a:print sum([(c-d)**2for c,d in zip(m,a)])**.5;m=q(o,r().split(' '));t+=1
print'You won in %d'%t

Erste Herausforderung nur soweit. Probieren Sie es online aus

Mego
quelle
3

Pip, 43 42 Bytes - 150 = -108

Nimmt die Board-Dimensionen als Befehlszeilenargumente (wobei D aus der Anzahl der Argumente hervorgeht). Nimmt Vermutungen als durch Leerzeichen getrennte Zahlen auf stdin.

YRR_MgWd:++i&RT$+(y-(q^s))**2Pd"Won in ".i

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 werden RRüber gund zerren die resultierende Liste in die yVariable. Dann kommt die main while-Schleife, in der die Bedingung wie folgt lautet:

d:++i&RT$+(y-(q^s))**2

  ++i&                  Increment i, the guess counter; the result is always > 0, so the
                          short-circuiting & operator evaluates the next expression:
              q         Read a line from stdin
               ^s       Split on spaces
           y-(   )      Subtract from our chosen point itemwise
          (       )**2  Square, itemwise
        $+              Fold on +, summing the list of squares
      RT                Square root
d:                      Assign this distance to d

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:

C:\Users\dlosc> pip.py -f guessing.pip 10 5 6 4
5 2 3 2
3.1622776601683795
6 2 3 2
4.123105625617661
3 2 3 2
1.4142135623730951
3 1 3 2
2.23606797749979
3 2 2 2
1.7320508075688772
2 2 3 2
1
2 2 3 1
1.4142135623730951
2 3 3 2
Won in 8
DLosc
quelle
2

R, 134-150 = -16 Bytes

function(...){G=sapply(list(...),sample,1)
C=0
repeat{g=scan()
C=C+1
if(any(G!=g))cat(sqrt(sum((G-g)^2)))else{cat("Won in",C);break}}}
Flodel
quelle
2

Haskell, 240-150 = 90

import System.Random
r x=randomRIO(0,x-1)
m=map read.words
g=getLine
main=do g;(fmap m g::IO[Int])>>=mapM r>>=b 1
b c v=do i<-fmap(sqrt.fromIntegral.sum.map(^2).zipWith(-)v.m)g;if i==0 then putStrLn$"Won in "++show c else do print i;b(c+1)v
Damien
quelle
1

Dyalog APL , 77 71 - 210 = -139

S F M
P←?S
{P←S|P+(?D)⌽D↑Mׯ1 1[?2]
C+←1
P≢G←⎕:0⊣⎕←.5*⍨+/2*⍨P-G
C}⍣≢C←0

In 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 (zB D←3) vor dem Aufruf gemäß OP eingestellt werden müssen.
P←?SDas Ziel erhält einen zufälligen Punkt im Bereich 1, obwohl jede Dimension begrenzt ist
{. }⍣≢C←0Wiederholen Sie die Funktion, bis sich das Ergebnis von unterscheidet. Dabei Cwird zunächst die 0
?2Zufallszahl 0 oder 1
¯1 1[angezeigt. Der ]Index aus der Liste mit zwei Zahlen wird
nach Modus multipliziert. Legt fest, 0ob der Modus ein 0
D↑Pad mit 0s ist, um der Anzahl der Dimensionen zu entsprechen. Die
(?D)⌽Liste wird zufällig gedreht (0 bis Anzahl der Dimensionen - 1).
P+ anpassen aktuelles Ziel
S|Modul Welt Größe
P←Speicher neuen Zielpunkt
C+←1Zähler erhöhen
P≢G←⎕:Eingang erraten, und wenn es anders als Zielpunkt ist dann ...
P-GDistanzen in jeder Dimension
2*⍨Squared
+/sie summieren
.5*⍨Quadratwurzeldruck
⎕← dass
0⊣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)

Adam
quelle
@Dennis Eigentlich habe ich es kaputt gemacht, als ich es zu einer Funktion gemacht habe, also ist es jetzt wieder ein Programm. Ich habe so viele Bytes gespart, wie "Programmity" mich durch das Umschalten auf Indexursprung 0 gekostet hat, was OP erlaubt.
Adám
1
IN ORDNUNG. Aus Neugier: Welcher Dialekt ist das? Ich habe keine Ahnung, was die erste Zeile tun soll ...
Dennis
@ Tennis Dyalog. Dies ist eine herkömmliche Funktion. Die erste Zeile ist Zeile [0], dh der Funktionsheader. Sie sieht jedoch ungewöhnlich aus, da sie left-arg fn-name right-arg, aber kein Ergebnis enthält.
Adám