숨바꼭질을 해보자!


12

사용자는 숨기고 컴퓨터는 찾으려고 시도합니다.

먼저, 프로그램은 그리드 크기에 대한 입력을받습니다. 5x5, 10x10, 15x15 등과 같이 그리드는 항상 완벽한 정사각형이 아닙니다.

그리드는 체스 판과 같습니다.

_______________________________
|     |     |     |     |     |
| A1  |     |     |     |     | A
|_____|_____|_____|_____|_____|
|     |     |     |     |     |
|     | B2  |     |     |     | B
|_____|_____|_____|_____|_____|
|     |     |     |     |     |
|     |     | C3  |     |     | C
|_____|_____|_____|_____|_____|
|     |     |     |     |     |
|     |     |     | D4  |     | D
|_____|_____|_____|_____|_____|
|     |     |     |     |     |
|     |     |     |     | E5  | E
|_____|_____|_____|_____|_____|
   1     2     3     4     5

이제 사용자는 B2(컴퓨터에 알리지 않고) 사각형을 선택합니다

컴퓨터가 사각형을 추측하기 시작합니다. 올바른 사각형을 선택하면 사용자가로 응답합니다 y. 그렇지 않으면 타일이 선택한 방향 (N, NE, E, SE, S, SW, W)에서 방향을 입력합니다.

따라서 사용자가 B2컴퓨터를 선택 하고 컴퓨터가 추측 C3하면 사용자가 입력 NW합니다.

다음은 출력 및 입력의 예입니다.

Grid?
5x5

C3?
NW

C2?
N

B2?
y

채점 :

이것은 일반적인 도전과는 조금 다르게 점수가 매겨 질 것입니다.

승자는 올바른 정사각형을 추측하는 데 가장 적은 수의 추측 (평균)을 취하는 프로그램입니다. 평균화 할 테스트 사례는 5x5에서 10x10에 가능한 모든 제곱입니다.

그러나 최대 26 행 (예 : 5x8, 6x2, 20x5 등)의 모든 그리드 패턴에서도 작동해야합니다.

JSFiddle과 같은 테스트 방법을 포함하십시오.

마지막으로 동점 일 경우 가장 짧은 프로그램이 승리합니다.


1
I가 숨어있어 경우 A1컴퓨터의 추측 B9, 적절한 응답이다 NW또는 W?
Greg Martin

@GregMartin NW .... N, W, S, E는 모두 직선이어야하고 다른 행 / 열의 항목은 NW, NE, SW, SE 여야합니다.
JKonowitz

특정 형식의 입력 및 출력에 유연성이 있습니까? 26 개가 넘는 행이 있으면 무엇이라고합니까?
Greg Martin

@GregMartin 출력을 유연하게 할 수 있지만 단순하게 유지하십시오. 정확히 동일 할 필요는 없지만 유사한 스타일을 가져야합니다. 26 이상의 것을 설명 할 필요가 없습니다. 편집하겠습니다.
JKonowitz

"유사한 스타일"이 무엇을 의미하는지 모르겠습니다. 정렬 된 정수 쌍 (행 번호, 열 번호)으로 입력을받을 수 있습니까? (PS : 이러한 유형의 질문은 샌드 박스 에 사전 게시 문제 가 좋은 이유 입니다.)
Greg Martin

답변:


3

파이썬 3.6 , 466 398 392 바이트, 미니 맥스

x, y = 1, 1
w, h = [int(x) for x in input('Grid?\n').split('x')]


def split_factor(a, b):
    N = b-y
    W = a-x
    S = h+~N
    E = w+~W
    return max(1, N, W, S, E, N*W, S*W, S*E, N*E)


def move(a, b):
    *Z, = zip([a, x, a, a+1, x, x, a+1, a+1],
              [y, b, b+1, b, y, b+1, b+1, y],
              [1, a-x, 1, w+x+~a, a-x, a-x, w+x+~a, w+x+~a],
              [b-y, 1, h+y+~b, 1, b-y, h+y+~b, h+y+~b, b-y])
    return Z[['N', 'W', 'S', 'E', 'NW', 'SW', 'SE', 'NE'].index(d)]

d = ''
while d != 'y':
    print()
    splits = {(a, b): split_factor(a, b) for a in range(x, x+w) for b in range(y, y+h)}
    a, b = min(splits, key=splits.get)
    d = input(f'{a}{"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[b]}?\n')
    x, y, w, h = move(a, b)

입력 및 출력은 예제에 표시된 형식이어야합니다. 이것은 플레이어의 대답 (즉, NW, E, y 등)으로 인해 발생할 수있는 가장 큰 나머지 영역 인 최소 "분할 계수"를 가진 사각형을 찾아 추측합니다. 예, 그것은이 게임에서 항상 남은 영역의 중심이지만 최악의 경우를 최소화하는 이 기술 은 다른 규칙을 가진 비슷한 게임에서 더 일반적으로 작동합니다.

읽을 수없는 버전 :

x=y=d=1
w,h=map(int,input('Grid?\n').split('x'))
while d!='y':print();s={(a,b):max(b-y,h+y+~b)*max(w+x+~a,a-x)for a in range(x,x+w)for b in range(y,y+h)};a,b=min(s,key=s.get);d=input(f'{a}{chr(64+b)}?\n');*z,=zip([a+1,x,a+1,x,a,a,a+1,x],[b+1,b+1,y,y,b+1,y,b,b],[w+x+~a,a-x,w+x+~a,a-x,1,1,w+x+~a,a-x],[h+y+~b,h+y+~b,b-y,b-y,h+y+~b,b-y,1,1]);x,y,w,h=z[~'WENS'.find(d)or-'NWNESWSE'.find(d)//2-5]

2

수학, 테스트 사례에서 최적의 동작, 260 바이트

For[a=f=1;{c,h}=Input@Grid;z=Characters;t=<|Thread[z@#->#2]|>&;r="";v=Floor[+##/2]&;b:=a~v~c;g:=f~v~h,r!="y",r=Input[g Alphabet[][[b]]];{{a,c},{f,h}}={t["NSu",{{a,b-1},{b+1,c},{b,b}}]@#,t["uWX",{{g,g},{f,g-1},{g+1,h}}]@#2}&@@Sort[z@r/.{c_}:>{c,"u"}/."E"->"X"]]

이 프로그램은 위의 코드를 잘라내어 Wolfram Cloud에 붙여 넣어 테스트 할 수 있습니다 . (그러나 빨리 테스트하십시오 : 각 프로그램 실행에 시간 제한이 있다고 생각합니다.) 프로그램의 추측은 2 c대신 모양처럼 C2보이지만 그렇지 않으면 위의 사양에 따라 실행됩니다. 그리드는와 같이 정렬 된 정수 쌍 {26,100}으로 입력되어야하며 프로그램 추측에 대한 응답은 "NE"또는 같은 문자열로 입력되어야합니다 "y".

이 프로그램은 지금까지 입력과 일치하는 가장 작고 가장 큰 행 번호와 열 번호를 추적하고 항상 가능성의 하위 그리드의 중심점을 추측합니다 (NW 반올림). 이 프로그램은 결정론 적이므로 고정 그리드에서 평균적으로 필요한 추측 횟수를 쉽게 계산할 수 있습니다. 10x10 그리드에서 프로그램은 단일 정사각형에 대해 1 추측, 8 정사각형에 대해 2 추측, 64 정사각형에 대해 3 추측, 나머지 27 정사각형에 대해 4 추측, 평균 3.17이 필요합니다. 1-gues, 2-gues 등의 시퀀스가 ​​올바른 추측으로 이어질 수있는 이론적 최소값입니다. 실제로, 프로그램은 비슷한 이유로 모든 크기 표에서 이론상 최소값을 달성해야합니다. (5x5 그리드에서 평균 추측 횟수는 2.6입니다.)

약간의 코드 설명이지만 골프 이외의 다른 방법은 간단합니다. (나는 설명 목적으로 초기화 문 순서를 교환했다. 바이트 수에는 영향을 미치지 않았다.)

1  For[a = f = 1; z = Characters; t = <|Thread[z@# -> #2]|> &;
2      v = Floor[+##/2] &; b := a~v~c; g := f~v~h;
3      r = ""; {c, h} = Input@Grid, 
4    r != "y", 
5    r = Input[g Alphabet[][[b]]];
6      {{a, c}, {f, h}} = {t["NSu", {{a, b - 1}, {b + 1, c}, {b, b}}]@#, 
7        t["uWX", {{g, g}, {f, g - 1}, {g + 1, h}}]@#2} & @@ 
8        Sort[z@r /. {c_} :> {c, "u"} /. "E" -> "X"]
   ]

1-3 줄은 For루프를 초기화합니다.이 루프는 실제로 While위장에 불과 하므로 2 바이트가 적습니다. 가능한 행 번호 및 열 번호 범위는 언제든지 저장되며 {{a, c}, {f, h}}해당 서브 그리드의 중심 추측은 {b, g}2 행에 정의 된 함수에 의해 계산됩니다. 3 행 은 사용자 입력에서 c최대 행 및 최대 열 h을 초기화합니다. 또한 r루프 테스트 변수와 후속 사용자 입력을 초기화 합니다.

라인 4의 테스트가 만족되는 동안 라인 5는 사용자로부터 입력을받으며, 현재 추측에서 프롬프트가 나온다 {b, g}( Alphabet[][[b]]]행 번호를 문자로 변환). 그런 다음 6-8 행은 가능성의 하위 표를 업데이트하므로 암시 적으로 다음 추측을합니다. 예를 들어 t["NSu", {{a, b - 1}, {b + 1, c}, {b, b}}]( t1 행 의 정의가 주어짐 )

<| "N" -> {a, b - 1}, "S" -> {b + 1, c}, "u" -> {b, b}|>

여기서 사용자의 마지막 입력에 따라 최소 행 및 최대 행 번호가 업데이트되는 것을 볼 수 있습니다. 8 행은 가능한 모든 입력을 양식의 정렬 된 문자 쌍으로 변환합니다 { "N" | "S" | "u", "u" | "W" | "X"}. 여기서 "u"올바른 행 또는 열을 "X"나타내며 East를 나타냅니다 ( Sort정상적으로 작동 하도록 허용 함). 사용자가 최종적으로를 입력 "y"하면 이러한 행에 오류가 발생하지만 루프 테스트가 실패하고 오류가 전파되지 않습니다 (프로그램은 단순히 중단됩니다).


0

배치, 분할 및 정복

@echo off
set z = ABCDEFGHIJKLMNOPQRSTUVWXYZ
set /p g = Grid?
set /a w = 0, n = 0, e = %g :x= + 1, s = % + 1
:l
set /a x = (w + e) / 2, y = (n + s) / 2
call set c = %%z :~%y%,1%%
set /p g = %c %%x%?
if %g :w=.% == %g % set /a w = x
if %g :n=.% == %g % set /a n = y
if %g :e=.% == %g % set /a e = x
if %g :s=.% == %g % set /a s = y
if %g :y=.% == %g % goto l

여전히 검색 할 영역의 경계 상자를 만들어 작동합니다. 다음 추측은 항상 상자의 중심입니다. 응답에 포함되지 않은 나침반 점의 경우 상자가 해당 방향으로 줄어 듭니다. 예를 들어의 응답에 N대해 상자의 왼쪽, 오른쪽 및 아래쪽이 추측 된 사각형으로 설정됩니다.

369 바이트에서 나는 누군가를 이길 것으로 기대하지 않으므로 가독성을 위해 공백을 남겨 두었습니다.


글쎄, 분할 및 정복은 일반적으로 큰 테스트 사례에는 유용하지만 더 작은 알고리즘에는 적합하지 않습니다.
Matthew Roh

@SIGSEGV 무슨 뜻인지 잘 모르겠습니다. Greg와 Ben의 대답은 상자 방법의 중심도 사용합니다.
Neil

우리는 여전히 더 나은 알고리즘이 필요합니다.
Matthew Roh

@SIGSEGV 박스 중심 방법이 최적입니다. 더 나은 알고리즘은 없습니다.
TheNumberOne
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.