Snail Snail Tìm kiếm chuỗi số


8

Bạn được cung cấp số nguyên NM, 1 <= N,M <= 10^6và chỉ mục ij. Công việc của bạn là tìm số nguyên tại vị trí [i][j]. Trình tự trông như thế này (cho N=M=5, i=1, j=3kết quả là 23):

 1  2  3  4  5
16 17 18 19  6
15 24 25 20  7
14 23 22 21  8
13 12 11 10  9

Mã ngắn nhất sẽ thắng. Chúc may mắn!




1
Bạn có thể muốn làm rõ nếu M là chiều rộng hoặc chiều cao.
Martin Ender

@ MartinBüttner: Tôi nghĩ N tương ứng với i và M với j. Sau đó, bạn chỉ cần xác định, rằng ốc bắt đầu i=j=0và tiếp tục j=0theo hướng.
M.Herzkamp

6
Mã của chúng ta có cần phải hoàn thành trong một khoảng thời gian hợp lý với một lượng bộ nhớ hợp lý cho các giới hạn nhất định không? Tôi chắc chắn có thể viết mã hợp lệ cho các tham số đó, nó chỉ tạo ra xoắn ốc và tìm kiếm giá trị, nhưng tôi thực sự không có 4 TB bộ nhớ nằm xung quanh.
Martin Ender

Câu trả lời:


6

Toán học, 63 55 byte

f=If[#5<1,#+#4,f[#+#2,#3-1,#2,#5-1,#2-1-#4]]&;g=1~f~##&

Điều này xác định một chức năng gcó thể được gọi là như

g[5, 5, 1, 3]

Tôi đang sử dụng một phương pháp đệ quy. Nó sử dụng tối đa 2 lần lặp (N + M) , tùy thuộc vào mức độ kết quả của vòng xoắn được tìm thấy. Nó xử lý tất cả các đầu vào (tối đa g[10^6,10^6,5^5-1,5^5], yêu cầu nhiều lần lặp nhất) trong vòng vài giây, nhưng đối với các đầu vào lớn hơn, bạn sẽ cần tăng giới hạn lặp mặc định như

$IterationLimit = 10000000;

Về cơ bản, nếu klà số bắt đầu của hình xoắn ốc, tôi sẽ kiểm tra xem jchỉ mục có 0trong trường hợp nào tôi có thể quay lại không k + i. Mặt khác, tôi vứt bỏ hàng trên cùng, xoay vòng xoắn 90 độ (ngược chiều kim đồng hồ), tăng dần cho kphù hợp và thay vào đó nhìn vào hình xoắn ốc còn lại. Chúng ta có thể di chuyển đến vòng xoắn tiếp theo với ánh xạ các tham số sau:

  • k n + 1 = k n + m n
  • M n + 1 = N n - 1
  • N n + 1 = M n
  • i n + 1 = j n - 1
  • j n + 1 = n m - i n - 1

Điều này giả định rằng M là chiều rộng và N là chiều cao.


51 byte:If[#5<1,#+#4,#0[#+#2,#3-1,#2,#5-1,#2-1-#4]]&[1,##]&
LegionMammal978

3

Bình thường, 25 byte

D(GHYZ)R?+G(tHGtZt-GY)ZhY

Điều này xác định một chức năng , (. Ví dụ sử dụng:

D(GHYZ)R?+G(tHGtZt-GY)ZhY(5 5 1 3

bản in 23.

Đây là thuật toán giống hệt với câu trả lời Mathicala của Martin Büttner, mặc dù nó được phát triển độc lập. Theo như tôi có thể nói, đó là cách tốt nhất để làm điều đó.

Lưu ý rằng Pyth không thể xử lý toàn bộ phạm vi đầu vào trên máy của tôi, nó sẽ tràn vào ngăn xếp và chết với một segfault trên các đầu vào lớn.


1

Haskell, 44

z j i m n|j==0=i+1|0<1=z(n-i-1)(j-1)n(m-1)+n

cái này sử dụng cách tiếp cận đệ quy thường xuyên

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.