평범한 추측 게임


13

내가 좋아하는 게임이 있습니다. 유한 크기의 격자에서 발생하지만 구처럼 감싸집니다. 해당 그리드에서 임의의 (정수 전용) 포인트가 선택됩니다. 그런 다음 사용자에게 좌표 입력을 요청하는 프롬프트가 표시됩니다. 내 입력이 임의의 점과 정확히 일치하면 내가 이겼다는 메시지가 나타납니다. 그렇지 않으면 입력과 임의의 점 사이의 포인트 단위 거리를 알 수 있습니다. 예를 들어, 내가 추측 (2,2)하고 임의의 점이에 있으면 (4,3)거리는입니다 sqrt[(3-2)^2 + (4-2)^2] = sqrt[5].

플레이어가 포인트의 올바른 위치에 도달 할 때까지 게임이 계속됩니다.


목표 위에서 설명한 게임의 기능 버전을 만듭니다. 그렇게하려면 전체 프로그램을 작성해야합니다. 프로그램이해야 할 일은 다음과 같습니다.

  1. 보드의 높이와 너비의 두 가지 입력을 요청하십시오. 원점은 보드의 왼쪽 상단에 있습니다. 이 입력은 초과하지 않습니다 1024.
  2. 해당 보드에서 임의의 지점을 선택하십시오. 이것은 추측 할 포인트가 될 것입니다.
  3. 회전을 시뮬레이션하는 입력을 수락하십시오. 입력은 공백으로 구분 된 정수 쌍이거나 두 개의 개별 정수 입력입니다. 이 입력에 응답하여 프로그램은 다음 두 가지 중 하나를 수행합니다.
    1. 입력이 선택된 임의의 점과 일치하면 사용자의 승리를 알리는 메시지를 출력합니다. 나는 "당신이 이겼습니다!"라고 제안합니다.
    2. 그렇지 않으면, 사용자의 입력 지점과 임의의 지점 사이의 거리를 출력하십시오.
    두 경우 모두 회전 카운터를 증가시켜야합니다.
  4. 사용자가 승리를 거두면 사용자가 한 턴 수를 표시합니다. 그런 다음 프로그램이 종료됩니다.

보너스

보너스는이 목록에 표시된 순서대로 적용됩니다

  • 프로그램이 D게임이 발생하는 차원을 설명 하는 입력 정수 를 사용 하는 경우 -150 바이트 예를 들어이면 D = 3임의의 3정수 점을 생성하고 3정수 입력을 받아 해당 점 사이의 거리를 출력합니다.
  • score < 0사용자가 주어진 치수의 그리드와 회전 카운터에서 이전에 추측 한 위치를 표시하는 보드 (ASCII 또는 그림)의 그래픽 표현을 제공하는 경우 -50 % (또는 + 50 % 인 경우 ). (첫 번째 보너스를 받으면이 보너스는 2Dand 1D모드 에만 적용됩니다 . 3D 그래픽 출력을 추가하면 -50 %가 추가로 제공됩니다.)
  • -60 바이트 (게임 시작시 입력에 의해 선택됨, 즉 주어진 0경우 일반 게임 모드 수행, 지정된 1경우이 게임 모드 수행)에서 점이 턴당 1 단위 씩 임의의 직교 방향으로 이동 하는 게임 모드를 제공 할 수있는 경우 -60 바이트

포장에 대한 추가 정보

랩핑은 세 번째 보너스에서 이동 점이 경계를 넘어 이동할 때만 발생합니다. 이 경우 이동 점은 다음과 같이 각 점으로 뒤 틀립니다.

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

이 줄 바꿈 동작은 점의 방향이 바뀌 었다는 사실 외에는 사용자의 추측에 영향을 미치지 않습니다.


리더 보드

이 게시물의 맨 아래에있는 스택 스 니펫은 답변 a) 언어 당 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 카탈로그를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

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

헤더에 여러 개의 숫자를 포함 시키려면 (예 : 점수가 두 파일의 합이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

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

언어 이름을 링크로 만들면 스 니펫에 표시됩니다.

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


7
작은 nitpick : 아마도 구가 아닌 원환 체처럼 감싸는 것을 의미합니다. 불연속성을 만들지 않고 2D 그리드를 구에 래핑하는 것은 불가능합니다.
Alistair Buxton

2
또한 보드가 줄 바꿈되면 가장자리를 교차하여 추측과 대상 사이의 경로가 더 짧을 수 있습니다.
Alistair Buxton 5

1
@NBZ 예, 가능합니다.
코너 O'Brien

1
@NBZ 1 단위 단일 방향.
코너 O'Brien

2
1. 토폴로지가 무엇인지 여전히 잘 모르겠습니다. 보드 인 경우, 명확한 일을 돕기 위해 10x10임의의 요점은, (9,4)그리고 내 생각 (2,2)의 거리 sqrt(13)sqrt(53)? (미래를 위해 참고 : 이상한 일을하는 경우 테스트 케이스를 제공하는 것이 거의 불가능하므로 임의성을 포함하지 마십시오). 2. 세번째 보너스에서, 포인트가 이동하기 전후에 거리를 계산하고 출력해야합니까?
피터 테일러

답변:


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
그리고 Dennis는 모두를 능가했습니다. 다시.
Seadrus

1
실수로 점수를 -152 대신 152로 업데이트하여 리더 보드에 마지막으로 올렸습니다
Moose

7

피스, 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 )
  • 번째 두 번째 정수 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 바이트 보너스)에서 움직일 수 있음
Jakube

거룩한 몰리, 그것은 긴 pyth 코드입니다. 그래도 골프는 아닙니다. 예를 들어 제거 할 수있는 두 개의 공백이 있습니다. 또한 : J=YmOvwvw대신 VvwaYOvw;JY2 바이트 더 짧은 대신 사용할 수 있습니다 . 다른 코드는 살펴 보지 않았지만 거기에서 몇 가지 사항을 줄일 수도 있습니다.
Jakube

@Jakube, 나는 힌트가 현재 지점이 어디인지 알려주고 있다고 가정했다
JNF

3

파이썬 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는 인수 수에서 암시 됨). stdin에서 공백으로 구분 된 숫자로 추측합니다.

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

이 코드는 Pip의 어레이 프로그래밍 기능을 최대한 활용합니다. cmdline args의 배열은에 저장됩니다 g. randrange 연산자를 RRover 로 매핑하여 추측 할 포인트를 생성하고 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

거리가 0이 아닌 경우 루프 내부에서 거리를 인쇄합니다. 그것이 0이라면, 우리는 목표 지점에 도달했습니다. 루프가 정지되고 프로그램이 승리 메시지와 회전 수를 출력합니다.

예제 실행 :

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

확인:

이것은 ⎕IO←0많은 APL에서 디폴트 인 인덱스 오리진 0 ( ) 에서 실행됩니다 .
부울 모드를 오른쪽 인수 ( M)로, 치수 크기를 왼쪽 인수 ( S)로 사용합니다.
차원 수는 D입니다 (예 : D←3OP에 따라 호출하기 전에 설정해야 함 ).
P←?S차원 경계의 각 불구하고 목표 범위 1에서 임의의 점을 얻는다
{... }⍣≢C←0결과가 다른 때까지 기능을 반복에서 C처음 얻을 수있는 0
?2임의의 숫자 0 또는 1 개
¯1 1[... ]두 숫자의 목록에서 인덱스
모드로 곱; 0모드가 크기와 일치하는 0
D↑패드 가있는 경우0
(?D)⌽ (치수-1의 번호를 통해 0) 임의로 순환리스트
P+현재 목표
S|세계 크기 계수를 조정하여
P←새 목표점
C+←1증분 카운터
P≢G←⎕:입력 추측을 저장 하고, 목표점과 다른 경우 ...
P-G각 차원의 거리를
2*⍨제곱으로
+/합하면 0 을 반환 하는
.5*⍨제곱근
⎕←인쇄
0⊣(즉, 초기 값과 동일하므로 반복)
C... 추측 횟수를 리턴합니다 (0과 다르면 루핑을 중지하고 마지막 값을 리턴 함).


@Dennis 실제로, 나는 그것을 기능으로 만들었을 때 그것을 깨뜨 렸으므로 이제는 다시 프로그램입니다. OP가 허용하는 인덱스 원점 0으로 전환하여 "프로그래밍"만큼 많은 바이트를 절약했습니다.
Adám

1
확인. 호기심에서 : 이것은 어떤 방언입니까? 첫 번째 줄이 무엇을해야할지 모르겠습니다.
Dennis

@ 데니스 디아 로그. 이것은 전통적인 함수이며 첫 번째 줄은 라인 [0]입니다. 예를 들어 함수 헤더입니다. 그러나 왼쪽 인수 fn-name 오른쪽 인수가 있지만 결과가 없기 때문에 비정상적으로 보입니다.
Adám
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.