Vấn đề xoắn ốc số


24

Một hình xoắn ốc số là một lưới vô hạn có hình vuông phía trên bên trái có số 1. Dưới đây là năm lớp đầu tiên của hình xoắn ốc:

nhập mô tả hình ảnh ở đây

Nhiệm vụ của bạn là tìm ra số trong hàng y và cột x.


Thí dụ:

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

Chú thích:

  1. Bất kỳ ngôn ngữ lập trình đều được cho phép.
  2. Đây là một thử thách mã để chiến thắng mã ngắn nhất.
  3. May mắn nhất!

Nguồn: https://cses.fi/probolset/task/1071


@WW Điều đó có nghĩa là gì?
Agile_Eagle

1
Có vẻ như đầu vào của bạn được lập chỉ mục 1 (tọa độ bắt đầu từ 1,1) (mặc dù điều này phải được trực quan từ các trường hợp kiểm tra) chúng ta có thể sử dụng lập chỉ mục 0 (tọa độ bắt đầu từ 0,0) không?
Thuật sĩ lúa mì

4
Lý do cho điều này là gì?
Thuật sĩ lúa mì

7
Tôi nghĩ rằng tọa độ bắt đầu tại (1, 1) hoàn toàn tốt, đặc biệt nếu chương trình được đăng theo cách đó trên CSES và OP không cần phải chứng minh điều này. Tôi nghĩ rằng những người chơi golf ở đây đang dần quen với những quyền tự do có phần tùy tiện.
Lynn

2
@Lynn Tôi thứ hai đó
Agile_Eagle

Câu trả lời:


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

Hãy thử trực tuyến!

Vòng xoắn ốc có một số "cánh tay":

12345
22345
33345
44445
55555

Vị trí nằm trên nhánh (được gán cho biến ). Sau đó, số lớn nhất trên arm là , số này xen kẽ giữa ở vị trí dưới cùng bên trái và trên cùng bên phải trên cánh tay. Trừ từ cho dãy di chuyển dọc theo cánh tay , vì vậy chúng tôi chọn dấu thích hợp dựa trên tính chẵn lẻ của , điều chỉnh theo để có được chuỗi bắt đầu từ 0 và trừ giá trị này khỏi .(x,y)n n 2 x y - n + 1 , - n + 2 , ... , - 1 , 0 , 1 , ... , n - 1 , n - 2 n n n - 1 n 2tối đa(x,y)znn2xy-n+1,-n+2,Giáo dục,-1,0,1,Giáo dục,n-1,n-2nnn-1n2

Cảm ơn ông Xcoder đã lưu một byte.


f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}tiết kiệm 1 byte.
Ông Xcoder

@ Mr.Xcoder Thủ thuật gọn gàng, cảm ơn!
Doorknob


3
@RobertS. Vâng, đó là những gì chức năng tôi đã xác định (trong phần trên TIO). Ví dụ, f(1, 1)trả về giá trị 1. Phần Footer lặp qua x = 1 đến 5 và y = 1 đến 5, gọi hàm cho tất cả các giá trị đó và in đầu ra của nó trong một lưới, để chứng minh rằng hàm này đúng cho tất cả các đầu vào được hiển thị trong câu hỏi.
Doorknob

1
@Agile_Eagle Hàm này trả về số (nó không thể xuất ra hình xoắn ốc - thậm chí nó không có bất kỳ vòng lặp nào!).
Doorknob

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 nhờ @ChasBrown

-1 byte nhờ @Shaggy

Hãy thử trực tuyến!

Lần đầu chơi golf! Tôi nhận thức rõ hơn điều này là không tối ưu, nhưng bất cứ điều gì.

Về cơ bản chạy trên cùng một nguyên tắc như mã C @Doorknob.


2
Chào mừng đến với PPCG! Trong trường hợp này, bạn có thể lưu 4 byte bằng cách sử dụng def f(a,b):phương pháp này, xem tại đây .
Chas Brown

@ChasBrown Rất thú vị, cảm ơn bạn!
Don Ngàn

@Shaggy Cảm ơn bạn! Tôi đã đăng một vài thử thách, nhưng chưa bao giờ đủ tốt để chơi gôn
Don Thousand

Trong trường hợp đó, chào mừng bạn đến với Golf! :) Tôi không phải là một người Python nhưng tôi khá chắc chắn M**2có thể được thay thế bằng M*M.
Xù xì

@Shaggy Cảm ơn bạn! Sẽ sửa chữa ngay bây giờ
Don Nghìn

7

MATL , 15 byte

X>ttq*QwoEqGd*+

Hãy thử trực tuyến!
Thu thập và in dưới dạng ma trận

Làm sao?

Chỉnh sửa: Kỹ thuật tương tự như câu trả lời của @ Doorknob, chỉ đến khác nhau.

Sự khác biệt giữa các phần tử đường chéo của hình xoắn ốc là dãy số học . Tổng điều khoản này là (theo công thức AP thông thường). Tổng này, tăng thêm 1, cho phần tử đường chéo ở vị trí .n n ( n - 1 ) ( n , n )0,2,4,6,số 8,Giáo dụcnn(n-1)(n,n)

Cho , chúng ta tìm thấy cực đại của hai số này, đó là "lớp" của hình xoắn ốc mà điểm này thuộc về. Sau đó, chúng tôi tìm giá trị đường chéo của lớp đó là . Đối với các lớp chẵn, giá trị tại sau đó là , đối với các lớp lẻ .v = n ( n - 1 ) + 1 ( x , y ) v + x - y v - x + y(x,y)v= =n(n-1)+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

Giải pháp thay thế 21 byte:

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

Hãy thử trực tuyến!
Thu thập và in dưới dạng ma trận
Từ trên, chúng ta biết rằng hàm chúng ta muốn là

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

trong đó .m=max(x,y)

Một số tính toán cơ bản sẽ chỉ ra rằng một biểu thức cho tối đa hai số là

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

Cắm cái này vào cái khác, chúng ta thấy rằng một dạng thay thế cho là:f

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

trong đó .k=abs(xy)+x+y

Đây là chức năng mà giải pháp thực hiện.


5

Japt , 16 byte

Chuyển thể từ giải pháp của Doorknob qua một vài loại bia.

wV
nU²ÒNr"n-"gUv

Thử nó


Giải trình

                  :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

Bình thường, 20 byte

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

Bộ kiểm tra

Một bản dịch gần như bằng chữ của câu trả lời của Rushabh Mehta .

Giải trình:
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 byte

ZÐ<*>ŠGR}¥+

-1 byte nhờ @Emigna thay đổi Èithành G.

Câu trả lời MATL của cảng @sundar , vì vậy hãy đảm bảo nâng cao anh ấy!

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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
Èicó thể G.
Emigna

@Emigna Ôi thông minh, cảm ơn! : D
Kevin Cruijssen


0

Toán học 34 byte

x = {5, 8};

vì thế:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.