Mathematica, comportamento ideal em casos de teste, 260 bytes
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"]]
Este programa pode ser testado cortando e colando o código acima na Wolfram Cloud . (Teste rapidamente, no entanto: acho que há um limite de tempo para cada execução do programa.) As suposições do programa parecem em 2 c
vez de C2
, mas, caso contrário, são executadas de acordo com as especificações acima. A grade deve ser inserida como um par ordenado de números inteiros, como {26,100}
, e as respostas às suposições do programa devem ser inseridas como cadeias, como "NE"
ou "y"
.
O programa controla o menor e o maior número de linhas e colunas que são consistentes com as entradas até o momento e sempre adivinha o ponto central da sub-grade de possibilidades (arredondamento NW). O programa é determinístico, por isso é fácil calcular o número de suposições necessárias em média em uma grade fixa. Em uma grade de 10x10, o programa requer 1 palpite para um único quadrado, 2 palpites para oito quadrados, 3 palpites para 64 quadrados e 4 palpites para os 27 quadrados restantes, para uma média de 3,17; e esse é o mínimo teórico, considerando quantas seqüências de 1 palpite, 2 palpites etc. podem levar a suposições corretas. De fato, o programa deve atingir o mínimo teórico em qualquer grade de tamanho por razões semelhantes. (Em uma grade de 5x5, o número médio de suposições é 2,6.)
Uma pequena explicação sobre o código, embora seja bastante simples, além do golfe. (Troquei a ordem de algumas instruções de inicialização para fins expositivos - sem efeito na contagem de bytes).
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"]
]
As linhas 1-3 inicializam o For
loop, que na verdade é apenas um While
loop disfarçado, portanto, ei, menos dois bytes. Os possíveis intervalos de número de linha e número de coluna a qualquer momento são armazenados {{a, c}, {f, h}}
e a suposição centralizada nessa subgrelha é calculada pelas funções {b, g}
definidas na linha 2. A linha 3 inicializa a linha c
e a coluna máx. h
Da entrada do usuário e também inicializa r
qual é a variável testada em loop e também as entradas subseqüentes do usuário.
Enquanto o teste na linha 4 é satisfeito, a linha 5 recebe informações do usuário, de onde o prompt vem da suposição atual {b, g}
( Alphabet[][[b]]]
converte o número da linha em uma letra). As linhas 6-8 atualizam a sub-grade de possibilidades (e, portanto, implicitamente a próxima estimativa). Por exemplo, t["NSu", {{a, b - 1}, {b + 1, c}, {b, b}}]
(dada a definição de t
na linha 1) se expande para
<| "N" -> {a, b - 1}, "S" -> {b + 1, c}, "u" -> {b, b}|>
onde você pode ver os números da linha mínima e da linha máxima sendo atualizados de acordo com a última entrada do usuário. A linha 8 converte qualquer entrada possível em um par ordenado de caracteres do formulário { "N" | "S" | "u", "u" | "W" | "X"}
; aqui "u"
significa uma linha ou coluna correta e "X"
significa Leste (apenas para permitir um Sort
bom funcionamento). Quando o usuário finalmente insere "y"
, essas linhas geram um erro, mas o teste de loop falha e o erro nunca é propagado (o programa simplesmente pára de qualquer maneira).
A1
e o computador adivinhaB9
, a resposta é adequadaNW
ouW
?