Masalah Jumlah Spiral

24

Bilangan spiral adalah kisi tak terbatas yang kuadrat kiri atas memiliki angka 1. Berikut adalah lima lapisan pertama spiral:

masukkan deskripsi gambar di sini

Tugas Anda adalah mencari tahu angka dalam baris y dan kolom x.


Contoh:

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

catatan:

  1. Bahasa pemrograman apa pun diizinkan.
  2. Ini adalah tantangan sehingga kode terpendek menang.
  3. Semoga berhasil!

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

Agile_Eagle
sumber
@WW Apa artinya itu?
Agile_Eagle
1
Sepertinya input Anda 1 diindeks (koordinat mulai dari 1,1) (walaupun ini harus diintuidasi dari kasus uji) dapatkah kita menggunakan 0 pengindeksan (koordinat mulai dari 0,0)?
Wheat Wizard
4
Apa alasannya?
Wheat Wizard
7
Saya pikir itu benar-benar baik untuk memulai koordinat (1, 1), terutama jika program diposting seperti itu di CSES, dan OP tidak perlu membenarkan ini. Saya pikir pegolf di sini semakin terbiasa dengan kebebasan yang agak sewenang-wenang.
Lynn
2
@ Lynn Saya yang kedua
Agile_Eagle

Jawaban:

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;}

Cobalah online!

Spiral memiliki beberapa "lengan":

12345
22345
33345
44445
55555

Posisi terletak di lengan (ditugaskan ke variabel ). Kemudian, angka terbesar pada lengan adalah , yang bergantian antara berada di posisi kiri bawah dan kanan atas pada lengan. Mengurangkan dari memberikan urutan bergerak sepanjang lengan , jadi kami memilih tanda yang sesuai berdasarkan paritas , sesuaikan dengan untuk mendapatkan urutan mulai dari 0, dan kurangi nilai ini dari .(x,y)n n 2 x y - n + 1 , - n + 2 , , - 1 , 0 , 1 , , n - 1 , n - 2 n n n - 1 n 2max(x,y)znn2xyn+1,n+2,,1,0,1,,n1,n2nnn1n2

Terima kasih kepada Tn. Xcoder untuk menghemat satu byte.

Gagang pintu
sumber
f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}menghemat 1 byte.
Tn. Xcoder
@ Mr.Xcoder Trik yang rapi, terima kasih!
Gagang pintu
3
@RobertS. Ya, itulah fungsi yang saya definisikan (di bagian Kode pada TIO). Misalnya, f(1, 1)mengembalikan nilai 1. Bagian Footer loop melalui x = 1 hingga 5 dan y = 1 hingga 5, memanggil fungsi untuk semua nilai tersebut, dan mencetak outputnya dalam kisi, untuk menunjukkan bahwa fungsi ini benar untuk semua input yang ditunjukkan dalam pertanyaan.
Gagang Pintu
1
@ Agile_Eagle Fungsi mengembalikan angka (tidak bisa menampilkan spiral - bahkan tidak memiliki loop!).
Gagang Pintu
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 terima kasih kepada @ChasBrown

-1 byte, terima kasih kepada @Shaggy

Cobalah secara Online!

Pertama kali bermain golf! Saya lebih dari sadar ini tidak optimal, tetapi apa pun.

Pada dasarnya berjalan pada prinsip yang sama dengan kode @Doorknob C.

Don Thousand
sumber
2
Selamat datang di PPCG! Dalam hal ini Anda dapat menyimpan 4 byte menggunakan def f(a,b):pendekatan, lihat di sini .
Chas Brown
@ ChasBrown Sangat menarik, terima kasih!
Don Thousand
@Shaggy Terima kasih! Saya telah memposting beberapa tantangan, tetapi tidak pernah cukup bagus untuk bermain golf
Don Thousand
Kalau begitu, selamat datang di Golf! :) Saya bukan orang Python tapi saya cukup yakin M**2bisa diganti dengan M*M.
Shaggy
@Shaggy Terima kasih! Akan diperbaiki sekarang
Don Thousand
7

MATL , 15 byte

X>ttq*QwoEqGd*+

Cobalah online!
Kumpulkan dan cetak sebagai matriks

Bagaimana?

Sunting: Teknik yang sama dengan jawaban @ Doorknob, baru tiba dengan berbeda.

Perbedaan antara elemen diagonal spiral adalah urutan aritmatika . Jumlah dari syarat ini adalah (dengan rumus AP biasa). Jumlah ini, bertambah 1, memberikan elemen diagonal pada posisi .n n ( n - 1 ) ( n , n )0,2,4,6,8,nn(n1)(n,n)

Mengingat , kami menemukan maksimum dari keduanya, yang merupakan "lapisan" dari spiral yang dimiliki titik ini. Kemudian, kami menemukan nilai diagonal dari lapisan itu sebagai . Untuk layer genap, nilai at adalah , untuk layer ganjil .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 solusi 21 byte:

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

Cobalah online!
Mengumpulkan dan mencetak sebagai matriks
Dari hal di atas, kita tahu bahwa fungsi yang kita inginkan adalah

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

di mana .m=max(x,y)

Beberapa perhitungan dasar akan menunjukkan bahwa satu ekspresi untuk maks dua angka adalah

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

Memasukkan satu ke yang lain, kami menemukan bahwa satu bentuk alternatif untuk adalah:f

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

di mana .k=abs(xy)+x+y

Ini adalah fungsi yang diterapkan oleh solusi.

sundar - Pasang kembali Monica
sumber
5

Japt , 16 byte

Diadaptasi dari solusi Doorknob selama beberapa gelas bir.

wV
nU²ÒNr"n-"gUv

Cobalah


Penjelasan

                  :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
Shaggy
sumber
3

Pyth, 20 byte

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

Suite uji

Terjemahan Rushabh Mehta yang hampir secara literal menjawab .

Penjelasan:
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
hakr14
sumber
2

Jelly , 13 byte

»Ḃ-*×_‘+»×’$¥

Cobalah online!

Menggunakan metode Doorknob . Terlalu lama.

Tuan Xcoder
sumber
Alternatif:»Ḃ-*×_‘+»²_»ʋ
Tn. Xcoder
2

Jelly , 13 12 byte

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

Cobalah online!

Menghitung istilah diagonal dengan ²_’Ṁdan menambah / mengurangi nilai indeks yang benar dengan ṀḂḤ’×I.

dylnan
sumber
2

Brain-Flak , 76 byte

((({}<>))<>[(({}))]<{({}[()])<>}>)<>{}((){({}[()])({})<><([{}])><>}{}<>{}<>)

Cobalah online!

Nitrodon
sumber
2

05AB1E , 12 11 byte

ZÐ<*>ŠGR}¥+

-1 byte berkat @Emigna berubah Èimenjadi G.

Port of @sundar 's MATL answer , jadi pastikan untuk mengunggah dia!

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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]
Kevin Cruijssen
sumber
1
Èibisa jadi G.
Emigna
@ Emigna Oh pintar, terima kasih! : D
Kevin Cruijssen
0

Pascal (FPC) , 90 byte

uses math;var x,y,z:word;begin read(x,y);z:=max(x,y);write(z*z-z+1+(1and z*2-1)*(y-x))end.

Cobalah online!

Port of Doorknob menjawab , tetapi jawaban sundar memberi saya ide z mod 2*2-1yang kemudian saya ubah 1and z*2-1untuk menghilangkan ruang.

AlexRacer
sumber
0

Mathematica 34 byte

x = {5, 8};

begitu:

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

(*

54

*)

David G. Stork
sumber
0

Julia 1.0 , 35 byte

x\y=(m=max(x,y))*~-m+1+(-1)^m*(x-y)

Cobalah online!

sundar - Pasang kembali Monica
sumber
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
James
sumber