Nhận dạng nếp gấp


18

Bài tập

Xác định một mod-Fold là một hàm có dạng f (x) = x% a 1  % a 2  % bit% a k , trong đó a i là các số nguyên dương và k 0 . (Ở đây, % là toán tử modulo liên kết trái.)

Cho một danh sách n số nguyên y 0 , Nhận, y n − 1 , xác định xem có tồn tại một mod- f để mỗi y i  = f (i) không .

Bạn có thể chọn và sửa bất kỳ hai đầu ra YN cho chức năng / chương trình của mình. Nếu tồn tại một f như vậy , bạn phải luôn trả về / in chính xác Y ; nếu không, bạn luôn phải trả lại / in chính xác N . (Đây có thể là true/ false, hoặc 1/ 0, hoặc false/ true, v.v.) Đề cập những điều này trong câu trả lời của bạn.

Đệ trình ngắn nhất tính bằng byte thắng.

Thí dụ

Xác định f (x) = x% 7% 3 . Giá trị của nó bắt đầu:

|   x  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ...
| f(x) | 0 | 1 | 2 | 0 | 1 | 2 | 0 | 0 | 1 | 2 | ...

Do đó, được đưa ra 0 1 2 0 1 2 0 0 1 2làm đầu vào cho giải pháp của chúng tôi, chúng tôi sẽ in Y , vì f này tạo ra chuỗi đó. Tuy nhiên, được đưa ra 0 1 0 1 2làm đầu vào, chúng tôi sẽ in N , vì không có f nào tạo ra chuỗi đó.

Các trường hợp thử nghiệm

Các công thức được đưa ra khi đầu ra là Y chỉ để tham khảo; bạn không cần phải in chúng

0 1 2 3 4 5              Y    (x)
1                        N
0 0 0                    Y    (x%1)
0 1 2 0 1 2 0 0 1 2      Y    (x%7%3)
0 0 1                    N
0 1 2 3 4 5 6 0 0 1 2    Y    (x%8%7)
0 1 2 0 1 2 0 1 2 3      N
0 2 1 0 2 1 0 2 1        N
0 1 0 0 0 1 0 0 0 0 1    Y    (x%9%4%3%2)

Có bất kỳ giới hạn thời gian hoặc bộ nhớ?
Dennis

2
Thay vào đó tôi có thể xuất giá trị trung thực và giá trị falsey không?
Leaky Nun

2
@Leaky Tôi muốn bạn không. Tôi không phải là một fan hâm mộ lớn của sự thật-falsey; Tôi rõ ràng đang thử điều này như một sự thay thế khách quan hơn mà vẫn mang lại cho bạn sự tự do.
Lynn

@Lynn chỉ là tôi hoặc bạn vẫn chưa sửa nó?
Leaky Nun

Về các hạn chế về bộ nhớ / thời gian: Tôi không nghĩ rằng tôi sẽ thêm bất kỳ thử thách nào vào chính nó, nhưng tôi có thể chạy một phần thưởng cho câu trả lời ngắn nhất bằng byte có thể trả lời từng trường hợp thử nghiệm của tôi trong một khoảng thời gian hợp lý.
Lynn

Câu trả lời:


7

Bình thường, 14 byte

}Qm%M+RdUQy_Sl

Trả về True/False. Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

}Qm%M+RdUQy_SlQ   implicit Q (=input) at the end
             lQ   length of input list
            S     create the list [1, 2, ..., len]
           _      reverse => [len, ..., 2, 1]
          y       generate all subsets (these are all possible mod-folds)
  m               map each subset d to:
        UQ           take the range [0, 1, ..., len-1]
     +Rd             transform each number into a list by prepending it to d
                     e.g. if mod-fold = [7,3], than it creates:
                        [[0,7,3], [1,7,3], [2,7,3], [3,7,3], ...]
   %M                fold each list by the modulo operator
                  this gives all possible truthy sequences of length len
}Q                so checking if Q appears in the list returns True or False

Bình thường, 11 byte

q%M.e+k_tx0

Dựa trên ý tưởng của @ ferrsum . Tôi thực sự đã nghĩ đến việc sử dụng các chỉ số 0 cho thế hệ tập hợp con, nhưng không nhận ra rằng tất cả các chỉ số bằng 0 phải là giải pháp.


4

Python 3, 239 218 byte

from itertools import*
lambda z:z in[[eval(''.join([str(l)]+['%'+str(i[::-1][k])for k in range(len(i))]))for l in range(len(z))]for i in(i for j in(combinations(range(1,len(z)+1),i+1)for i in range(len(z)))for i in j)]

Một hàm ẩn danh nhận đầu vào của danh sách zvà trả về Truehoặc Falsecho YN.

Điều này sử dụng một phương pháp tương tự như câu trả lời của @Jakube , và mặc dù về cơ bản nó là một lực lượng vũ phu, chạy rất nhanh.

from itertools import*               Import everything from the Python module for
                                     iterable generation
lambda z                             Anonymous function with input list z
combinations(range(1,len(z)+1),i+1)  Yield all sorted i+1 length subsets of the range
                                     [1,len(z)]...
...for i in range(len(z))            ...for all possible subset lengths
(i for j in(...)for i in j)          Flatten, yielding an iterator containing all possible
                                     mod-fold values as separate lists
...for i in...                       For all possible mod-fold values...
...for k in range(len(i))            ...for all mod-fold values indices k...
...for l in range(len(z))            ...for all function domain values in [0,len(z)-1]...
[str(l)]+['%'+str(i[::-1][k])...]    ...create a list containing each character of the
                                     expression representing the function defined by the
                                     mod-fold values (reversed such that the divisors
                                     decrease in magnitude) applied to the domain value...
 eval(''.join(...))                  ...concatenate to string and evaluate...
 [...]                               ...and pack all the values for that particular
                                     function as a list
 [...]                               Pack all lists representing all functions into a list
 ...:z in...                         If z is in this list, it must be a valid mod-fold, so
                                     return True. Else, return False

Hãy thử nó trên Ideone


4

Python 2, 69 byte

f=lambda a,i=0:i/len(a)or a[i]in[a[i-1]+1,i,0][i<=max(a)::2]*f(a,i+1)

Sử dụng True/ False.

Câu trả lời cho những gì đặc trưng cho một loạt mod có thể gập lại hóa ra ít thú vị hơn so với lúc đầu. Nó là một chuỗi có dạng 0, 1, ..., M - 1, 0, 1, ... x 1 , 0, 1, ..., x 2 , ... sao cho tất cả i, 0 <= x i <M. Một chuỗi như vậy có thể được tạo bởi chuỗi mod của tất cả các chỉ số (dựa trên 0) của các số 0 trong mảng, ngoại trừ chuỗi đầu tiên.


3

Thạch , 19 15 14 byte

LṗLUZ’1¦%/sLe@

Trả về 1 cho sự thật, 0 cho giả. Hãy thử trực tuyến!

Thuật toán là O (n n ) , trong đó n là độ dài của danh sách, làm cho nó quá chậm và tốn nhiều bộ nhớ cho hầu hết các trường hợp thử nghiệm.

Một phiên bản sửa đổi - thay thế phiên bản thứ hai Lbằng một 5- có thể được sử dụng để xác minh tất cả các trường hợp thử nghiệm . Lưu ý rằng phiên bản sửa đổi này sẽ không hoạt động cho các danh sách dài tùy ý.

Làm thế nào nó hoạt động

LṗLUZ’1¦%/sLe@  Main link. Argument: A (array of integers)

L L             Yield the length l of A.
 ṗ              Take the l-th Cartesian power of [1, ..., l], i.e., construct
                all arrays of length l that consist of elements of [1, ..., l].
   U            Upend/reverse each array. This way, the first l arrays start
                with [1, ..., l], as do the next l arrays, etc.
    Z           Zip/transpose the array of arrays.
     ’1¦        Decrement the first array to map [1, ..., l] to [0, ..., l - 1].
        %/      Reduce the array's columns by modulus/residue.
          sL    Split the result into chunks of length l.
            e@  Verify if A belongs to the resulting array.

Bạn có thể thêm một lời giải thích? Là một người chưa sử dụng Jelly (chưa), tôi không biết nó hoạt động như thế nào.
Steven H.

Tôi sẽ thêm một cái ngay khi tôi chơi golf xong. Vẫn còn một vài điều tôi muốn thử đầu tiên.
Dennis

Tôi đã (từ bỏ và) thêm một lời giải thích.
Dennis

3

JavaScript (ES6), 98 byte

a=>a.every((n,i)=>n?n<(l+=p==i)&&n==p++:p=1,l=p=1)

Đã lưu 48 byte bằng cách chuyển sang khám phá của @ Feersum. Bất kỳ giá trị đã cho nào ntrong mảng đều bằng 0, trong trường hợp đó dự đoán tiếp theo plà 1 hoặc bằng với dự đoán tiếp theo, trong trường hợp pnày được tăng lên. Chúng tôi cũng đo chiều dài lcủa chuỗi ban đầu bằng cách so sánh pvới i, vì nphải luôn luôn nhỏ hơn lmọi lúc.


2

Python 2, 103 99 byte

f=lambda l,r:r==x or l and f(l-1,[t%l for t in r])|f(l-1,r)
x=input();l=len(x);print+f(l,range(l))

In 1 cho sự thật và 0 cho giả. Kiểm tra nó trên Ideone .

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.