ปัญหาหมุนวน


24

Spiral number คือกริดที่ไม่มีที่สิ้นสุดซึ่งจตุรัสซ้ายบนมีหมายเลข 1 นี่คือห้าชั้นแรกของ Spiral:

ป้อนคำอธิบายรูปภาพที่นี่

งานของคุณคือค้นหาตัวเลขในแถว y และคอลัมน์ x


ตัวอย่าง:

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

บันทึก:

  1. อนุญาตให้ใช้ภาษาโปรแกรมใดก็ได้
  2. นี่เป็นความท้าทายของนักรหัสที่สั้นที่สุด
  3. ขอให้โชคดี!

ที่มา: https://cses.fi/problemset/task/1071


@WW นั่นหมายความว่าอย่างไร
Agile_Eagle

1
ดูเหมือนว่าอินพุตของคุณจะได้รับการจัดทำดัชนี 1 (พิกัดเริ่มต้นที่ 1,1) (แม้ว่าจะต้องมีการแจ้งให้ทราบล่วงหน้าจากกรณีทดสอบ) เราสามารถใช้การจัดทำดัชนี 0 (พิกัดเริ่มต้นที่ 0,0) ได้หรือไม่
ข้าวสาลีตัวช่วยสร้าง

4
อะไรคือเหตุผลสำหรับสิ่งนี้?
ข้าวสาลีตัวช่วยสร้าง

7
ฉันคิดว่ามันดีสำหรับพิกัดที่จะเริ่มต้นที่ (1, 1) โดยเฉพาะอย่างยิ่งถ้าโปรแกรมถูกโพสต์ใน CSES และ OP ไม่จำเป็นต้องพิสูจน์สิ่งนี้ ฉันคิดว่านักกอล์ฟที่นี่เริ่มคุ้นเคยกับเสรีภาพที่ค่อนข้าง จำกัด
Lynn

2
@Lynn ฉันสอง
Agile_Eagle

คำตอบ:


19

C (gcc),  44  43 ไบต์

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

ลองออนไลน์!

เกลียวมี "แขน" หลายอัน:

12345
22345
33345
44445
55555

ตำแหน่งตั้งอยู่บนแขน (กำหนดให้กับตัวแปร) จากนั้นจำนวนที่มากที่สุดบนแขนคือซึ่งสลับระหว่างการอยู่ในตำแหน่งด้านล่างซ้ายและขวาบนของแขน การลบจากให้ลำดับเคลื่อนที่ไปตามแขนดังนั้นเราเลือกเครื่องหมายที่เหมาะสมตาม ความเท่าเทียมกันของปรับโดยที่จะได้รับตามลำดับเริ่มต้นที่ 0, และลบค่านี้จาก 2สูงสุด( x , y )(x,y)max(x,y)zn 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

ขอบคุณMr. Xcoder ที่ช่วยประหยัดไบต์


f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}บันทึก 1 ไบต์
นาย Xcoder

@ Mr.Xcoder เคล็ดลับเรียบร้อยขอบคุณ!
Doorknob


3
@RobertS ใช่นั่นคือสิ่งที่ฟังก์ชั่นที่ฉันกำหนดไว้ทำ (ในส่วนรหัสใน TIO) ยกตัวอย่างเช่นผลตอบแทนที่คุ้มค่าf(1, 1) ท้ายส่วน loops ผ่าน x = 1 ถึง 5 และ Y = 1 ถึง 5 เรียกฟังก์ชันสำหรับค่าดังกล่าวทั้งหมดและพิมพ์ผลลัพธ์ที่ได้ในตารางเพื่อแสดงให้เห็นว่าการทำงานที่ถูกต้องสำหรับปัจจัยการผลิตทั้งหมดที่แสดงในคำถาม 1
Doorknob

1
@Agile_Eagle ฟังก์ชั่นจะคืนค่าหมายเลข (มันไม่สามารถส่งออกเป็นเกลียว - มันไม่ได้มีลูปใด ๆ !)
Doorknob

7

งูหลาม 54   50  49 ไบต์

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

-4 ไบต์ขอบคุณ @ChasBrown

-1 ไบต์ขอบคุณ @Shaggy

ลองออนไลน์!

เล่นกอล์ฟเป็นครั้งแรก! ฉันรู้มากกว่านี้ไม่ดีที่สุด แต่ไม่ว่าอะไรก็ตาม

ทำงานบนหลักการเดียวกันกับ @Doorknob รหัส C


2
ยินดีต้อนรับสู่ PPCG! ในกรณีนี้คุณสามารถบันทึก 4 ไบต์โดยใช้def f(a,b):วิธีการดูที่นี่
Chas Brown

@ChasBrown น่าสนใจมากขอบคุณ!
Don Thousand

@Shaggy ขอบคุณ! ฉันโพสต์ความท้าทายเล็กน้อย แต่ก็ไม่เคยดีพอที่จะเล่นกอล์ฟ
ดอนพัน

ในกรณีนั้นยินดีต้อนรับสู่ Golf! :) ฉันไม่ได้เป็นคนที่แต่งตัวประหลาดงูหลาม แต่ผมค่อนข้างมั่นใจว่าสามารถถูกแทนที่ด้วยM**2 M*M
Shaggy

@Shaggy ขอบคุณ! จะแก้ไขได้ในขณะนี้
อย่าพัน

7

MATL , 15 ไบต์

X>ttq*QwoEqGd*+

ลองออนไลน์!
รวบรวมและพิมพ์เป็นเมทริกซ์

อย่างไร?

แก้ไข: เทคนิคเดียวกับคำตอบของ @ Doorknob เพิ่งมาถึงที่แตกต่างกัน

แตกต่างระหว่างองค์ประกอบเส้นทแยงมุมของเกลียวเป็นลำดับเลขคณิต\ ผลรวมของเงื่อนไขของนี่คือ (ตามสูตร AP ปกติ) ผลรวมนี้เพิ่มขึ้นโดยที่ 1 ให้องค์ประกอบในแนวทแยงที่ตำแหน่งN)n0,2,4,6,8,n( n , n )n(n1)(n,n)

เมื่อพิจารณาจากเราจะหาค่าสูงสุดของทั้งสองนี้ซึ่งก็คือ "เลเยอร์" ของเกลียวที่จุดนี้เป็นของ จากนั้นเราจะหาค่าเส้นทแยงมุมของชั้นที่เป็น1 แม้ชั้นมูลค่าที่เป็นแล้วสำหรับชั้นคี่Yv = 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

โซลูชันสำรอง 21 ไบต์:

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

ลองออนไลน์!
รวบรวมและพิมพ์เป็นเมทริกซ์
จากด้านบนเรารู้ว่าฟังก์ชันที่เราต้องการคือ

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

ที่y)m=max(x,y)

การคำนวณพื้นฐานบางอย่างจะแสดงว่านิพจน์เดียวสำหรับจำนวนสูงสุดสองหมายเลขคือ

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

เสียบเข้าที่อื่นเราพบว่ารูปแบบอื่นสำหรับคือ:f

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

ที่Yk=abs(xy)+x+y

นี่คือฟังก์ชันที่โซลูชันดำเนินการ


5

Japt , 16 ไบต์

ดัดแปลงมาจากโซลูชันของ Doorknob บนเบียร์สองสามตัว

wV
nU²ÒNr"n-"gUv

ลองมัน


คำอธิบาย

                  :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 ไบต์

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

ชุดทดสอบ

แปลอักษรเกือบRushabh เมธาคำตอบ 's

คำอธิบาย:
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

05AB1E , 12 11 ไบต์

ZÐ<*>ŠGR}¥+

-1 ไบต์ขอบคุณที่@Emignaเปลี่ยนไปÈiG

คำตอบของMATLABจากพอร์ตของ@sundarดังนั้นอย่าลืม upvote เขา!

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

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
ÈiGอาจจะเป็น
Emigna

@ Emigna โอ้ฉลาดมากขอบคุณ! : D
Kevin Cruijssen





โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.