Liệt kê các vectơ N-Dimensional


17

Cho một số nguyên dương k > 1và một số nguyên không âm i, tạo ra một k-tuple (hoặc kvectơ hai chiều) của các số nguyên không âm. Đối với mọi k, bản đồ từ ℕ đến ℕ k , phải là tính từ . Nghĩa là, mỗi đầu vào isẽ tạo ra một bộ dữ liệu khác nhau và mỗi bộ dữ liệu có thể phải được sản xuất bởi một số đầu vào i.

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).

Bạn có thể sử dụng bất kỳ định dạng danh sách phẳng thuận tiện, rõ ràng, cho đầu ra.

Giải pháp của bạn không áp đặt giới hạn nhân tạo kinhưng bạn có thể cho rằng chúng phù hợp với kích thước nguyên gốc của ngôn ngữ của bạn. Ít nhất, bạn phải hỗ trợ các giá trị tối đa 255, tuy nhiên, ngay cả kích thước số nguyên gốc của bạn cũng nhỏ hơn thế.

Đối với bất kỳ 1 < k < 32, mã của bạn sẽ tạo ra kết quả trong vài giây (tất nhiên, nếu câu trả lời của bạn không hỗ trợ lớn do quy tắc trước đó, giới hạn được điều chỉnh tương ứng). Điều này sẽ không có vấn đề: nó có thể để giải quyết thách thức này như vậy mà nó làm việc lên đến 2 128 trong một vài giây, nhưng giới hạn ở đó để tránh câu trả lời mà thực sự lặp từ để tìm kết quả.i < 231i0i

Vui lòng bao gồm trong câu trả lời của bạn một mô tả về ánh xạ đã chọn của bạn và một lời biện minh cho lý do tại sao nó là tính từ chối (điều này không cần phải là một bằng chứng chính thức).

Đây là mã golf, câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.

Những thách thức liên quan

Câu trả lời:


5

Bình thường, 15 12 byte

ms+0_%Q>_zdQ

Bộ kiểm tra

Phép biến đổi của tôi tương tự như một trong số xnor, nhưng trong cơ sở 10. Nó hoạt động bằng cách giải nén đầu vào thành k số riêng biệt:

n = 21003034
k = 3

21003034
 1  3  4    134
2  0  3     203
  0  0        0

Các số được sắp xếp ở vị trí giảm của chữ số ngoài cùng bên phải, sao cho tất cả các thứ tự của bất kỳ nhóm số nào đều có thể.

Cách thức hoạt động của mã là chúng ta đảo ngược đầu vào, sau đó cắt các 0, 1, ... k-1chữ số cuối cùng , sau đó lấy từng kchữ số thứ nhất, đảo ngược lại, dán a 0ở đầu và chuyển đổi thành int.


4

CJam, 20 byte

q~({4b2fmd2/z2fb~p}*

Ánh xạ là tính từ vì nó áp dụng ánh xạ từ câu trả lời này k - 1 lần.

Chương trình đọc đầu vào là i k. Hãy thử trực tuyến trong trình thông dịch CJam .

Ý tưởng

Chúng ta có thể xây dựng một ánh xạ phỏng đoán f: N → N 2 bằng cách định nghĩa f (i) như sau:

  • Chuyển đổi i thành mảng các chữ số nhị phân của nó.

  • Chuẩn bị 0 cho mảng này nếu có số chữ số lẻ.

  • Khử xen kẽ mảng kết quả, hình thành các mảng mới trong quy trình.

  • Chuyển đổi các mảng từ cơ sở 2 sang số nguyên. Xác định f 1 (i)f 2 (i) là kết quả.

Để có được ánh xạ phỏng đoán g: N → N 3 , chúng ta có thể định nghĩa g (n): = (f 1 (i), f 1 (f 2 (i)), f 2 (f 2 (i))) .

Để có được ánh xạ phỏng đoán h: N → N 4 , chúng ta có thể định nghĩa h (i): = (g 1 (i), g 2 (i), f 1 (g 3 (i)), f 2 (g 3 ( i))) .

Tiếp tục quá trình trên, cuối cùng chúng ta đến một bản đồ phỏng đoán N → N k .

q~      e# Read and evaluate all input. This pushes i and k.
({      e# Do k-1 times:
  4b    e#   Convert the integer on the stack (initially i) to base 4.
  2fmd  e#   Replace each base-4 digit d by d/2 and d%2.
  2/    e#   Split into the chunks [d/2 d%2].
  z     e#   Transpose. This collects all quotients in one array and all
        e#   residues in another one.
  2fb   e#   Convert each array from base 2 to integer.
  ~     e#   Dump both integers on the stack.
  p     e#   Print the topmost one.
}*      e#

Ý tưởng của xnor cũng cung cấp 20 byte (hoặc ít hơn nếu bạn chơi golf tốt hơn tôi đã làm): q~2bW%1$Te]/zWf%2fbp(thứ tự đầu vào ngược lại)
Martin Ender

3

CJam, 18 byte

q~({)2bW%_1#p))b}*

Nó sử dụng một công thức ngu ngốc hơn.

Hãy thử nó ở đây .

Giải trình

q~          e# Read input.
({          e# Repeat k-1 times:
    )       e# Increment the current integer (initially i), to make it positive.
    2b      e# Convert to binary.
    W%      e# Reverse the binary.
            e# The result can be any non-empty binary string without trailing 0s.
    _1#     e# Find the position of the first 1, or the number of initial 0s.
    p       e# Print.
    )       e# Extract the final bit, which is always 1.
            e# An array that can be any binary string is left in the stack.
    )       e# Increment the 1 to make it 2.
    b       e# Convert the binary string to a number using base 2.
            e# Only the number of initial 0s doesn't affect the result,
            e# which is exactly what is printed before.
}*          e# The final integer is printed automatically when the program ends.

Tóm lại, nó ánh xạ một số nguyên dương tới:

  1. Số lượng các số 0 ở cuối.
  2. Số nguyên ban đầu với các số 0 ở cuối bị xóa, đảo ngược và dấu (ban đầu ban đầu) 1 bị xóa.

3

Con trăn 2, 62

lambda z,k:[int('0'+bin(z)[~i:1:-k][::-1],2)for i in range(k)]

Mã này là xấu xí và có thể chơi golf, nhưng ý tưởng rất đơn giản.

Gói kmở rộng nhị phân thành một bằng cách đọc từng kchữ số với các độ lệch khác nhau. Ví dụ: với k=3, 357ánh xạ đầu vào tới (3,0,7):

101100101 <- 357
  1  0  1 -> 5
 0  0  0  -> 0
1  1  1   -> 7

Nén các số lại với nhau để đảo ngược nó, vì vậy đó là một sự lựa chọn. Khi làm như vậy, hãy nghĩ đến việc mở rộng nhị phân là có vô số số 0 đứng đầu.


3

J, 38 28 27 byte

(({.,g^:_1@}.)g=:_ q:>:)~<:

Đây là một động từ ngầm, dyadic lấy ik làm đối số trái và phải. Dùng thử trực tuyến với J.js .

Ý tưởng

Chúng tôi xác định bản đồ f: N → N k bởi f (i): = (α 1 , ... α k-1 , p 1 α k ... p 2 α k + 1 ... - 1) , nơi ⟨p n là chuỗi các số nguyên tố và i + 1 = p 1 α 1 p 2 α 2 ... .

Đến cơ bản Arithmetic lý, bản đồ g: N → N W xác định bởi g (i): = (α 1 , α 2 , ...) (số mũ của các nguyên tố của i + 1 ) là song ánh.

f (i) = (g 1 (i), Mạnh g k - 1 (i), g -1 (g k (i), g k + 1 (i), Nott)) , bản đồ f có tính chất như là tốt.

                            Left argument: i -- Right argument: k
                         <: Decerement k.
(                      )~   Reverse the order of the arguments and apply the
                            dyadic verb inside the parentheses to k-1 and i.
              g=:            Define a monadic helper verb g:
                     >:       Increment its right argument.
                 _ q:         Calculate the exponents of the prime factorization.
                             (implicit) Apply g to i.
(            )               Apply the dyadic verb inside the parentheses to k-1
                             and (g i).
           }.                 Drop the first k-1 elements of (g i)...
          @                   and...
     g^:_1                    apply the inverse of g to the result.
  {.                          Take the first k-1 elements of (g i).
    ,                         Append the rightmost result to the leftmost one.

Tại sao chức năng của bạn là sinh học?
xnor

@xnor Ít nhất là một trong những lời giải thích của tôi đã không, vì tôi đã trao đổi một vài chỉ số do nhầm lẫn. Tôi đã thêm một bản phác thảo bằng chứng.
Dennis

1

Con trăn 2, 72

q=lambda z:z and z%2+2*q(z/4)
g=lambda z,k:1/k*[z]or[q(z)]+g(q(z/2),k-1)

Hàm này qhoạt động trên các số nhị phân bằng cách lấy mỗi bit thứ hai bắt đầu từ cuối. Kết quả là q(z), q(z>>1)cho hai số có chữ số nhị phân xen kẽ để cung cấp z. Ví dụ, 594 chia thành 12 và 17.

1001010010   <- 594
 0 1 1 0 0   ->  12
1 0 0 0 1    ->  17

Đây là một lựa chọn vì chúng ta có thể nén các số lại với nhau để lấy lại số ban đầu.

Hàm gnày áp dụng k-1thời gian kết thúc này, mở rộng từ một phần tử thành một cặp thành gấp ba ... thành một k-tuple. Mỗi lần, phần tử cuối cùng được mở rộng thành hai phần tử. Điều này được thực hiện đệ quy bằng cách ánh xạ đầu vào thành một cặp thông qua phần tử, lấy phần tử đầu tiên của cặp cho mục nhập đầu tiên của đầu ra và áp dụng đệ quy hàm k-1cho phần tử thứ hai để tạo các mục còn lại.


Tôi nhận ra rằng tôi đang làm cho cách này quá phức tạp ...
xnor
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.