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!




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.


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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.