Pesquisa de sequência numérica "caracol"

8

Você recebe inteiros Ne M, 1 <= N,M <= 10^6e índices ie j. Seu trabalho é encontrar o número inteiro na posição [i][j]. A sequência é assim (pois N=M=5, i=1, j=3o resultado é 23):

 1  2  3  4  5
16 17 18 19  6
15 24 25 20  7
14 23 22 21  8
13 12 11 10  9

O menor código vence. Boa sorte!

user32839
fonte
Assim como isso.
Martin Ender
1
Você pode esclarecer se M é a largura ou a altura.
Martin Ender
@ MartinBüttner: Eu acho que N corresponde a ie M a j. Então você só precisa especificar que o caracol começa i=j=0e continua na j=0direção.
M.Herzkamp
6
Nosso código precisa ser concluído em uma quantidade razoável de tempo com uma quantidade razoável de memória para os limites fornecidos? Definitivamente, posso escrever um código válido para esses parâmetros, que apenas gera espiral e procura o valor, mas na verdade não tenho 4 TB de memória por aí.
Martin Ender

Respostas:

6

Mathematica, 63 55 bytes

f=If[#5<1,#+#4,f[#+#2,#3-1,#2,#5-1,#2-1-#4]]&;g=1~f~##&

Isso define uma função gque pode ser chamada como

g[5, 5, 1, 3]

Estou usando uma abordagem recursiva. Ele usa até 2 (N + M) iterações, dependendo de quão baixo da espiral o resultado é encontrado. Ele lida com todas as entradas (até g[10^6,10^6,5^5-1,5^5], o que requer mais iterações) em alguns segundos, mas para entradas maiores, você precisará aumentar o limite de iteração padrão, como

$IterationLimit = 10000000;

Basicamente, se ké o número inicial da espiral, estou verificando se o jíndice está 0, nesse caso, posso apenas retornar k + i. Caso contrário, jogo fora a linha superior, giro a espiral em 90 graus (no sentido anti-horário), incremento de kacordo e olho a espiral restante. Podemos passar para a próxima espiral com o seguinte mapeamento de parâmetros:

  • k n + 1 = k n + m n
  • M n + 1 = N n - 1
  • N n + 1 = M n
  • i n + 1 = j n - 1
  • j n + 1 = n m - i n - 1

Isso pressupõe que M é a largura e N é a altura.

Martin Ender
fonte
51 bytes:If[#5<1,#+#4,#0[#+#2,#3-1,#2,#5-1,#2-1-#4]]&[1,##]&
LegionMammal978
3

Pitão, 25 bytes

D(GHYZ)R?+G(tHGtZt-GY)ZhY

Isso define uma função (,. Exemplo de uso:

D(GHYZ)R?+G(tHGtZt-GY)ZhY(5 5 1 3

impressões 23.

Isso é algoritmicamente idêntico à resposta do Mathematica de Martin Büttner, embora tenha sido desenvolvida de forma independente. Até onde eu sei, essa é a única maneira de fazê-lo.

Observe que o Pyth não pode lidar com toda a faixa de entrada da minha máquina, ele sobrecarregará a pilha e morrerá com um segfault em entradas grandes.

isaacg
fonte
1

Haskell, 44

z j i m n|j==0=i+1|0<1=z(n-i-1)(j-1)n(m-1)+n

isso usa a abordagem recursiva regular

orgulhoso haskeller
fonte