Problema em espiral numérica


24

Uma espiral numérica é uma grade infinita cujo quadrado superior esquerdo tem o número 1. Aqui estão as cinco primeiras camadas da espiral:

insira a descrição da imagem aqui

Sua tarefa é descobrir o número na linha ye coluna x.


Exemplo:

Input: 2 3
Out  : 8
Input: 1 1
Out  : 1
Input: 4 2
Out  : 15

Nota:

  1. Qualquer linguagem de programação é permitida.
  2. Este é um desafio do , e o código mais curto vence.
  3. Melhor da sorte!

Fonte: https://cses.fi/problemset/task/1071


@WW O que isso significa?
Agile_Eagle 17/08/1918

11
Parece que suas entradas são 1 indexadas (as coordenadas começam em 1,1) (embora isso deva ser intuído nos casos de teste) podemos usar a indexação 0 (as coordenadas começam em 0,0)?
Assistente de trigo

4
Qual o motivo disso?
Wheat Wizard

7
Eu acho absolutamente bom que as coordenadas iniciem em (1, 1), especialmente se o programa for postado dessa maneira no CSES, e o OP não precisar justificar isso. Acho que os golfistas estão se acostumando um pouco a liberdades um tanto arbitrárias.
Lynn

2
@Lynn I second that
Agile_Eagle

Respostas:


19

C (gcc),  44  43 bytes

f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?y-x:x-y)-z;}

Experimente online!

A espiral tem vários "braços":

12345
22345
33345
44445
55555

A posição está localizada no braço máximo ( x , y ) (atribuído à variável ). Então, o maior número no braço n é n 2 , que alterna entre estar na posição inferior esquerda e superior direita no braço. Subtrair x de y fornece a sequência - n + 1 , - n + 2 , , - 1 , 0 , 1 , , n(x,y)max(x,y)znn2xy movendo ao longo do braço n , então escolhemos o sinal apropriado com base na paridade de n , ajustamos por n - 1 para obter uma sequência começando em 0 e subtraí esse valor de n 2 .n+1,n+2,,1,0,1,,n1,n2nnn1n2

Agradecemos ao Sr. Xcoder por salvar um byte.


f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}salva 1 byte.
Mr. Xcoder

@ Mr.Xcoder Truque puro, obrigado!
Maçaneta


3
@RobertS. Sim, é isso que a função que eu defini faz (na seção Código no TIO). Por exemplo, f(1, 1)retorna o valor 1. A seção Rodapé percorre x = 1 a 5 e y = 1 a 5, chama a função para todos esses valores e imprime sua saída em uma grade, para demonstrar que a função está correta para todas as entradas mostradas na pergunta.
Maçaneta

11
@Agile_Eagle A função retorna o número (não pôde gerar a espiral - nem sequer possui loops!).
Maçaneta

7

Python,  54   50  49 bytes

def f(a,b):M=max(a,b);return(a-b)*(-1)**M+M*M-M+1

-4 bytes graças a @ChasBrown

-1 bytes graças a @Shaggy

Experimente Online!

Golfe pela primeira vez! Estou mais do que ciente de que isso não é o ideal, mas tanto faz.

É executado basicamente no mesmo princípio que o código C do @Doorknob.


2
Bem-vindo ao PPCG! Nesse caso, você pode salvar 4 bytes usando a def f(a,b):abordagem, veja aqui .
Chas Brown

@ChasBrown Muito interessante, obrigado!
Don Thousand

@ Shaggy Obrigado! Eu postei alguns desafios, mas nunca fui bom o suficiente para jogar golfe
Don Thousand

Nesse caso, então, seja bem-vindo ao Golf! :) Eu não sou do tipo Python, mas tenho certeza que M**2pode ser substituído por M*M.
Shaggy

@ Shaggy Obrigado! Vai corrigir agora
Don Thousand

7

MATL , 15 bytes

X>ttq*QwoEqGd*+

Experimente online!
Coletar e imprimir como uma matriz

Quão?

Edit: Mesma técnica que a resposta da @ Maçaneta da porta, apenas chegou de maneira diferente.

0,2,4,6,8,nn(n1)(n,n)

(x,y)v=n(n1)+1(x,y)v+xyvx+y

X>        % Get the maximum of the input coordinates, say n
ttq*      % Duplicate that and multiply by n-1
Q         % Add 1 to that. This is the diagonal value v at layer n
wo        % Bring the original n on top and check if it's odd (1 or 0)
Eq        % Change 1 or 0 to 1 or -1
Gd        % Push input (x, y) again, get y - x
*         % Multiply by 1 or -1
          % For odd layers, no change. For even layers, y-x becomes x-y
+         % Add that to the diagonal value v
          % Implicit output

Solução alternativa de 21 bytes:

Pdt|Gs+ttqq*4/QJb^b*+

Experimente online!
Coletar e imprimir como uma matriz
Do exposto, sabemos que a função que queremos é

f=m(m1)+1+(1)m(xy)

m=max(x,y)

Alguns cálculos básicos mostram que uma expressão para no máximo dois números é

m=max(x,y)=x+y+abs(xy)2

f

f=(xy)ik+14((k2)k)+1

k=abs(xy)+x+y

Essa é a função que a solução implementa.


5

Japonês , 16 bytes

Adaptado da solução da Maçaneta da porta com algumas cervejas.

wV
nU²ÒNr"n-"gUv

Tente


Explicação

                  :Implicit input of integers U=x and V=y
wV                :Maximum of U & V
\n                :Reassign to U
 U²               :U squared
   Ò              :-~
      "n-"        :Literal string
           Uv     :Is U divisible by 2? Return 0 or 1
          g       :Get the character in the string at that index
    Nr            :Reduce the array of inputs by that, where n is inverse subtraction (XnY = Y-X)
n                 :Subtract U from the result of the above

3

Pitão, 20 bytes

A~Qh.MZQh-+*-GH^_1Q*

Suíte de teste

Uma tradução quase literal da resposta de Rushabh Mehta .

Explicação:
A~Qh.MZQh-+*-GH^_1Q*    | Full code
A~Qh.MZQh-+*-GH^_1Q*QQQ | Code with implicit variables filled
                        | Assign Q as the evaluated input (implicit)
A                       | Assign [G,H] as
 ~Q                     |  Q, then assign Q as
   h.MZQ                |   Q's maximal value.
                        | Print (implicit)
        h-+*-GH^_1Q*QQQ |  (G-H)*(-1)^Q+Q*Q-Q+1


2

Geléia , 13 12 bytes

ṀḂḤ’×I+²_’ṀƲ

Experimente online!

Calcula o termo diagonal com ²_’Ṁe adiciona / subtrai ao valor correto do índice com ṀḂḤ’×I.



2

05AB1E , 12 11 bytes

ZÐ<*>ŠGR}¥+

-1 byte, graças à mudança de @EmignaÈi para G.

Resposta do Porto da MATL de @sundar , por isso não deixe de votar nele!

Experimente online ou verifique todos os casos de teste .

Explicação:

Z              # Get the maximum of the (implicit) input-coordinate
               #  i.e. [4,5] → 5
 Ð             # Triplicate this maximum
  <            # Decrease it by 1
               #  i.e. 5 - 1 → 4
   *           # Multiply it
               #  i.e. 5 * 4 → 20
    >          # Increase it by 1
               #  i.e. 20 + 1 → 21
     Š         # Triple swap the top threes values on the stack (a,b,c to c,a,b)
               #  i.e. [4,5], 5, 21 → 21, [4,5], 5
      G }      # Loop n amount of times
       R       #  Reverse the input-coordinate each iteration
               #   i.e. 5 and [4,5] → [5,4]→[4,5]→[5,4]→[4,5] → [5,4]
         ¥     # Calculate the delta of the coordinate
               #  [5,4] → [1]
          +    # And add it to the earlier calculate value (output the result implicitly)
               #  21 + [1] → [22]

11
Èipoderia ser G.
Emigna

@ Emigna Oh inteligente, obrigado! : D
Kevin Cruijssen


0

Mathematica 34 bytes

x = {5, 8};

então:

m = Max[x];
Subtract @@ x (-1)^m + m^2 - m + 1

(*

54

*)



0

JavaScript (ES6), 46 bytes

f=(r,c,x)=>r<c?f(c,r,1):r%2-!x?r*r-c+1:--r*r+c

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.