Spiral Sayı Sorunu


24

Bir sayı spirali, sol üst karesinde 1 sayı olan sonsuz bir ızgaradır. Spiralin ilk beş katmanı:

görüntü tanımını buraya girin

Göreviniz, y satırındaki ve x sütunundaki sayıyı bulmaktır.


Örnek:

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

Not:

  1. Herhangi bir programlama diline izin verilir.
  2. Bu bir mücadelesidir, bu yüzden en kısa kod kazanır.
  3. İyi şanslar!

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


@WW Bu ne anlama geliyor?
Agile_Eagle 17:18

1
Girdileriniz 1 indekslenmiş gibi görünüyor (koordinatlar 1,1'den başlıyor) (bunun test durumlarından sezgisel olmasına rağmen) 0 indeksleme kullanabilir miyiz (koordinatlar 0,0'dan başlar)?
Buğday Sihirbazı

4
Bunun nedeni nedir?
Buğday Sihirbazı

7
Koordinatların (1, 1) 'de başlaması kesinlikle iyi, bence özellikle program CSES' te bu şekilde yayınlanmışsa ve OP 'nin bunu haklı çıkarması gerekmiyor. Bence buradaki golfçüler biraz keyfi özgürlüklere alışmaya biraz alışıyor.
Lynn,

2
@Lynn İkinci ben
Agile_Eagle

Yanıtlar:


19

C (GCC),  44  43 bayt

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

Çevrimiçi deneyin!

Spiral birkaç "kol" a sahiptir:

12345
22345
33345
44445
55555

(x,y)max(x,y)z, n 2 x y - n + 1 , - n + 2 , ... , - 1 , 0 , 1 , ... , n - 1 , n - 2 , n , n , n - 1 , n 2nn2xyn+1,n+2,,1,0,1,,n1,n2nnn1n2

Bayt'ı kurtardığı için Bay Xcoder'a teşekkürler .


f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}1 bayt kaydeder.
Bay Xcoder

@ Mr.Xcoder Düzgün hile, teşekkürler!
Doorknob


3
@RobertS. Evet, tanımladığım fonksiyonun yaptığı şey budur ( TIO'nun Kod bölümünde). Örneğin f(1, 1), değeri döndürür 1. Alt bölüm döngüsü, x = 1 ila 5 ve y = 1 ila 5 ile aracılığıyla, bu gibi tüm değerleri için işlevini çağırır ve fonksiyon söz gösterilen tüm girişler için doğru olduğunu göstermek için, bir ızgara çıktısı basar.
Doorknob

1
@Agile_Eagle İşlev, sayıyı döndürür (spirali çıktılamadı - herhangi bir döngüye bile sahip değil!).
Doorknob

7

Python,  54   50  49 bayt

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

@ChasBrown sayesinde -4 bayt

@Shaggy sayesinde -1 bayt

Çevrimiçi Deneyin!

İlk kez golf! Bunun optimal olmadığını farkettim, ama her neyse.

Temelde @Doorknob C kodu ile aynı prensipte çalışır.


2
PPCG'ye Hoşgeldiniz! Bu durumda, def f(a,b):yaklaşımı kullanarak 4 bayt kaydedebilirsiniz , buraya bakınız .
Chas Brown

@ChasBrown Çok ilginç, teşekkür ederim!
Don Bin

@Shaggy Teşekkürler! Birkaç zorluk çektim, ancak golf
Don

Bu durumda, o zaman Golf'e hoş geldiniz! :) Bir Python adamı değilim ama onunla M**2değiştirilebileceğime eminim M*M.
Shaggy

@Shaggy Teşekkürler! Şimdi düzeltir
Don

7

MATL , 15 bayt

X>ttq*QwoEqGd*+

Çevrimiçi deneyin!
Matris olarak toplayın ve yazdırın

Nasıl?

Düzenleme: @ Doorknob'un cevabıyla aynı teknik, daha yeni farklı şekilde geldi.

Spiralin köşegen elemanları arasındaki fark, aritmetik sekans . Bunun terimlerinin toplamı (olağan AP formülüne göre). 1 ile artan bu toplam, köşegen elemanı pozisyonunda verir .n n ( n - 1 ) ( n , n )0,2,4,6,8,nn(n1)(n,n)

göz önüne alındığında , bu noktanın ait olduğu spiralin "katmanı" olan bu ikisinin maksimum değerini buluruz. Daha sonra, bu katmanın köşegen değerini olarak buluruz . Katmanlara için de bir değer daha sonra, , tek tabakalar için, .v = n ( n - 1 ) + 1 ( x , y ) v + x - y 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

Alternatif 21 byte çözüm:

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

Çevrimiçi deneyin!
Matris olarak toplayın ve yazdırın
Yukarıdan, istediğimiz işlevin olduğunu biliyoruz

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

burada .m=max(x,y)

Bazı temel hesaplamalar, en fazla iki sayı için bir ifadenin

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

Birini diğerine takarak, için alternatif bir form olduğunu bulduk :f

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

burada .k=abs(xy)+x+y

Çözümün uyguladığı işlev budur.


5

Japt , 16 bayt

Doorknob'un çözümünden birkaç bira için uyarlandı.

wV
nU²ÒNr"n-"gUv

Dene


açıklama

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

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

Test odası

Rushabh Mehta’nın cevabının neredeyse bir çevirisi .

Açıklama:
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

Jöle , 13 12 bayt

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

Çevrimiçi deneyin!

Köşegen terimi ile hesaplar ve ile ²_’Ṁdoğru indeks değerine toplar / çıkarır ṀḂḤ’×I.



2

05AB1E , 12 11 bayt

ZÐ<*>ŠGR}¥+

@Emigna değiştiği Èiiçin -1 bayt G.

Arasında Port'un @sundar 'ın Matl cevabı , bu yüzden onu upvote emin olun!

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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
Èiolabilir G.
Emigna

@Emigna Oh akıllı, teşekkürler! : D
Kevin Cruijssen


0

Mathematica 34 bayt

x = {5, 8};

yani:

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

(*

54

*)



0

JavaScript (ES6), 46 bayt

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.