Numero problema a spirale


24

Una spirale numerica è una griglia infinita il cui quadrato in alto a sinistra ha il numero 1. Ecco i primi cinque strati della spirale:

inserisci qui la descrizione dell'immagine

Il tuo compito è scoprire il numero nella riga y e nella colonna x.


Esempio:

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

Nota:

  1. È consentito qualsiasi linguaggio di programmazione.
  2. Questo è un sfida di , quindi vince il codice più breve.
  3. Buona fortuna!

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


@WW Cosa significa?
Agile_Eagle,

1
Sembra che i tuoi input siano 1 indicizzati (le coordinate iniziano da 1,1) (anche se questo deve essere intuito dai casi di test) possiamo usare l'indicizzazione 0 (le coordinate iniziano da 0,0)?
Mago del grano

4
Qual è il ragionamento per questo?
Mago del grano

7
Penso che vada assolutamente bene che le coordinate inizino a (1, 1), specialmente se il programma è pubblicato in questo modo su CSES e l'OP non ha bisogno di giustificarlo. Penso che i golfisti qui si stiano abituando un po 'troppo alle libertà in qualche modo arbitrarie.
Lynn,

2
@Lynn I secondo che
Agile_Eagle il

Risposte:


19

C (gcc),  44  43 byte

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

Provalo online!

La spirale ha diverse "braccia":

12345
22345
33345
44445
55555

La posizione si trova sul braccio massimo ( x , y ) (assegnato alla variabile ). Quindi, il numero più grande sul braccio n è n 2 , che si alterna tra l'essere nella posizione in basso a sinistra e in alto a destra sul braccio. Sottraendo x da y si ottiene la sequenza - n + 1 , - n + 2 , , - 1 , 0 , 1 , , -(x,y)max(x,y)znn2xy muovendosi lungo il braccio n , quindi scegliamo il segno appropriato in base alla parità di n , regoliamo di n - 1 per ottenere una sequenza che inizia da 0 e sottraggiamo questo valore da n 2 .n+1,n+2,,1,0,1,,n1,n2nnn1n2

Grazie a Mr. Xcoder per aver salvato un 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 Trucco pulito, grazie!
Maniglia della porta


3
@RobertS. Sì, questo è ciò che fa la funzione che ho definito (nella sezione Codice su TIO). Ad esempio, f(1, 1)restituisce il valore 1. La sezione Piè di pagina scorre da x = 1 a 5 e y = 1 a 5, chiama la funzione per tutti questi valori e stampa il suo output in una griglia, per dimostrare che la funzione è corretta per tutti gli input mostrati nella domanda.
Maniglia della porta

1
@Agile_Eagle La funzione restituisce il numero (non è in grado di emettere la spirale - non ha nemmeno alcun loop!).
Maniglia della porta

7

Python,  54   50  49 byte

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

-4 byte grazie a @ChasBrown

-1 byte grazie a @Shaggy

Provalo online!

Prima volta a giocare a golf! Sono più che consapevole che questo non è ottimale, ma comunque.

Funziona essenzialmente sullo stesso principio del codice C @Doorknob.


2
Benvenuti in PPCG! In questo caso puoi salvare 4 byte usando l' def f(a,b):approccio, vedi qui .
Chas Brown,

@ChasBrown Molto interessante, grazie!
Don Mille

@Shaggy Grazie! Ho pubblicato alcune sfide, ma non sono mai stato abbastanza bravo a giocare a golf
Don Thousand

In tal caso, benvenuti a Golf! :) Non sono un tipo Python ma sono abbastanza sicuro che M**2possa essere sostituito M*M.
Shaggy,

@Shaggy Grazie! Risolverà adesso
Don Mille

7

MATL , 15 byte

X>ttq*QwoEqGd*+

Provalo online!
Colleziona e stampa come una matrice

Come?

Modifica: stessa tecnica della risposta di @ Doorknob, appena arrivata in modo diverso.

La differenza tra gli elementi diagonali della spirale è la sequenza aritmetica . La somma di n termini di questo è n ( n - 1 ) (con la solita formula AP). Questa somma, incrementata di 1, fornisce l'elemento diagonale in posizione ( n , n ) .0,2,4,6,8,nn(n1)(n,n)

Dato , troviamo il massimo di questi due, che è lo "strato" della spirale a cui appartiene questo punto. Quindi, troviamo il valore diagonale di quel livello come v = n ( n - 1 ) + 1 . Per i livelli pari, il valore in ( x , y ) è quindi v + x - y , per i livelli dispari v - x + y .(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

Soluzione alternativa a 21 byte:

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

Provalo online!
Raccogli e stampa come matrice
Da quanto sopra, sappiamo che la funzione che vogliamo è

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

dove .m=max(x,y)

Alcuni calcoli di base mostreranno che è un'espressione per un massimo di due numeri

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

f

f=(X-y)ioK+14((K-2)K)+1

K=un'BS(X-y)+X+y

Questa è la funzione implementata dalla soluzione.


5

Japt , 16 byte

Adattato dalla soluzione di Doorknob su alcune birre.

wV
nU²ÒNr"n-"gUv

Provalo


Spiegazione

                  :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

Pyth, 20 byte

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

Suite di test

Una traduzione quasi letterale di Rushabh Mehta risposta s' .

Spiegazione:
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

Gelatina , 13 12 byte

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

Provalo online!

Calcola il termine diagonale con ²_’Ṁe aggiunge / sottrae al valore di indice corretto con ṀḂḤ’×I.



2

05AB1E , 12 11 byte

ZÐ<*>ŠGR}¥+

-1 byte grazie a @Emigna che cambia Èiin G.

La risposta MATL di Port of @sundar , quindi assicurati di votarlo!

Provalo online o verifica tutti i casi di test .

Spiegazione:

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]

1
Èipotrebbe essere G.
Emigna,

@Emigna Oh intelligente, grazie! : D
Kevin Cruijssen,


0

Mathematica 34 byte

x = {5, 8};

così:

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

(*

54

*)



0

JavaScript (ES6), 46 byte

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.