フラットな推測ゲーム


13

私がプレイしたいゲームがあります。有限サイズのグリッドで発生します(ただし、球のようにラップされています)。そのグリッドでは、ランダムな(整数のみの)ポイントが選択されます。次に、ユーザーである私は、座標入力を求められます。入力がランダムポイントと正確に一致する場合、勝ったと言われます。それ以外の場合、入力とランダムポイント間のポイント単位の距離が通知されます。たとえば、私が推測(2,2)し、ランダムなポイントがにあった(4,3)場合、距離はになりますsqrt[(3-2)^2 + (4-2)^2] = sqrt[5]

プレイヤーがポイントの正しい場所に到着するまで、ゲームは続行します。


目的上記のゲームの機能バージョンを作成します。そのためには、完全なプログラムを作成する必要があります。プログラムで行うべきことは次のとおりです。

  1. ボードの高さと幅の2つの入力を要求します。原点は、ボードの左上にあります。これらの入力はを超えません1024
  2. そのボード上のランダムポイントを選択します。これが推測されるポイントになります。
  3. ターンをシミュレートする入力を受け入れます。入力は、スペースで区切られた整数のペアまたは2つの個別の整数入力のいずれかになります。この入力に応じて、プログラムは次の2つのいずれかを実行します。
    1. 入力が選択したランダムポイントと一致する場合、ユーザーの勝利を示すメッセージを出力します。「あなたが勝ちました!」と提案します。
    2. それ以外の場合は、ユーザーの入力ポイントとランダムポイントの間の距離を出力します。
    いずれの場合も、ターンカウンターを増やす必要があります。
  4. ユーザーが勝利を収めたら、ユーザーが取ったターン数を表示します。その後、プログラムは終了します。

ボーナス

ボーナスは、このリストに表示される順序で適用されます

  • プログラムがD、ゲームが行われる次元を記述する入力整数を取る場合、-150バイト。たとえば、の場合D = 33整数のランダムポイントを作成し、3整数入力を取得して、それらのポイント間の距離を出力します。
  • -50%(または+ 50%の場合score < 0)ユーザーが以前に与えられた寸法とターンカウンターのグリッドで推測した場所を示すボード(ASCIIまたは画像)のグラフィック表現を提供する場合。(最初のボーナスに行くと、このボーナスはモード2D1Dモードにのみ適用されます。3Dグラフィカル出力を追加すると、-50%が追加されます。)
  • -60バイト(最初に入力によって選択された、つまり、与えられたとき0に通常のゲームモードを実行し、与えられたときに1このゲームモードを実行する)ゲームポイントを提供できる場合

ラッピングの詳細

ラッピングは、3番目のボーナスで移動ポイントが境界のいずれかを横切って移動する場合にのみ発生します。この場合、移動ポイントは次のようにそれぞれのポイントにワープされます。

...              ...
..R (move right) R..
...              ...

この折り返し動作は、ポイントが方向を変えたという事実に加えて、ユーザーの推測には影響しません。


リーダーボード

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からカタログを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、スニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


7
マイナーピック:おそらく、球ではなくトーラスのようにラップすることを意味します。不連続を作成せずに2Dグリッドを球にラップすることは不可能です。
アリステアバクストン

2
また、ボードがラップする場合、エッジを横切ることにより、推測とターゲットの間に短いパスが存在する可能性があります。
アリステアバクストン

1
@NBZはい、できます。
コナーオブライエン

1
@NBZ 1はそれを単一方向に結合します。
コナーオブライエン

2
1.トポロジが何であるかまだわかりません。ボードがある場合は、明確な物事を支援するために、10x10ランダムな点であり、(9,4)、と私は推測し(2,2)、距離ですsqrt(13)sqrt(53)?(今後の注意:変なことをしている場合は、ランダム性を含めないでください。テストケースを提供することがほぼ不可能になるためです)。2. 3番目のボーナスでは、ポイントが移動する前または後に距離を計算して出力する必要がありますか?
ピーターテイラー

回答:


8

CJam、-113 -139 -152 -157 -159バイト

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

プログラムは 長さ 51バイトで、-150バイト-60バイトのボーナスを獲得できます

ゲームモードと次元数はコマンドライン引数として読み取られます。各次元のサイズはSTDINから取得されます。以来勝利メッセージは任意で、プログラムが印刷されます0.0ゲームオーバーであることを示すために(ゴールまでの距離)。

テスト実行

$ 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

使い方

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.

2
そしてデニスは誰よりもゴルフを上回っています。再び。
シードラス

1
あなたは誤ってリーダーボード上の最後のあなたを入れて、152の代わりに、-152にスコアを更新
ムース

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

古いソリューション:(54-150 = -96)

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

すべての入力は新しい行で行われます。

  • 最初の整数は、(ゲームモードを表すのいずれか1または0
  • First Second整数Dは、遊びの次元を表します。
  • 次のD入力はフィールドサイズを表します
  • Dこの時点以降のすべての入力は推測です

サンプルプレイ(ヒントは実際のプログラムには表示されません):

  #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

二手目は勝つべきではありませんか?
JNF

@JNFポイントはゲームモード1で移動できます(-60バイトのボーナス)
ジャクベ

神聖な、それはいくつかの長いpythコードです。しかし、実際にはゴルフではありません。たとえば、削除できる2つのスペースがあります。また、:のJ=YmOvwvw代わりにVvwaYOvw;JY2バイト短くすることもできます。私は他のコードに目を通していませんが、そこにいくつかのことを短くすることもできると思います。
ジャクベ

@ジャクベ、私はヒントが現在どこにあるのかを教えてくれると思っていました
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

これまでの最初の挑戦。オンラインで試す


3

ピップ、43 42バイト-150 = -108

ボードの寸法をコマンドライン引数として取ります(引数の数からDが暗黙指定されます)。標準入力でスペースで区切られた数値として推測を取ります。

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

このコードは、Pipの配列プログラミング機能を非常に活用しています。cmdline argsの配列はに保存されgます。randrange演算子RRをにマッピングすることにより、推測されるポイントを生成しg、結果のリストをy変数にヤンクします。次にメインのwhileループがあります。条件は次のとおりです。

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

距離がゼロ以外の場合、ループの内側に距離が出力されます。ゼロだった場合、ターゲットポイントに到達しています。ループは停止し、プログラムは勝ちメッセージとターン数を出力します。

実行例:

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

2

R、134-150 = -16バイト

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}}}

2

ハスケル、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

1

Dyalog APL77 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

OK:

⎕IO←0これは、多くのAPLでデフォルトであるインデックス原点0()で実行されることに注意してください。
ブール値モードを右引数(M)、寸法サイズを左引数(S)として取ります。
次元数はでDD←3OPごとに呼び出す前に設定する必要があります(例:)。
P←?S目標は、ディメンションの境界の各ものの範囲1にランダムポイントを取得
{... }⍣≢C←0結果が異なるまで、機能を繰り返すC最初に取得した、0
?2乱数0又は1
¯1 1[... ]2つの数のリストからインデックスを
モードによって乗算。0モードがs で0
D↑パッドされている場合0、次元数に一致
(?D)⌽するようにリストをランダムに回転します(0から次元数-1)
P+現在の目標の
S|ワールドサイズモジュラスを調整し
P←新しい目標点
C+←1増分カウンター
P≢G←⎕:入力の推測を保存し、それが目標点と異なる場合...
P-G各次元の
2*⍨二乗の距離は平方根プリントを
+/合計し、0 を返します(つまり、初期値と同一なので繰り返します)...推測の数を返します(0とは異なり、ループを停止し、最後の値を返します)
.5*⍨
⎕←
0⊣
C


@Dennis実際、私はそれを関数にしたときにそれを壊したので、今では再びプログラムになっています。OPで許可されているインデックスオリジン0に切り替えることで、「プログラム」にかかるバイト数を節約できました。
アダム

1
OK。好奇心から:これはどの方言ですか?最初の行が何をするのかわからない
デニス

@Dennis Dyalog。これは伝統的な関数で、最初の行は行[0]、つまり関数ヘッダーですが、left-arg fn-name right-argがあり、結果はないため、異常に見えます。
アダム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.