Số ma thuật có độ dài nhất định


13

Chương trình của bạn phải lấy một đầu vào ( ncho mục đích mô tả) và xuất ra tất cả các hoán vị của một số có các nchữ số dài không có chữ số lặp lại, trong đó mỗi chữ số trước và bao gồm chỉ số của nó đều chia hết cho vị trí của số đó .

Bạn có thể đọc về số ma thuật ở đây .

Quy tắc:

  • 1 <= n <= 10
  • Không có chữ số có thể được lặp lại
  • Số 0 đứng đầu phải có mặt (nếu có)
  • Chữ số thứ nhất đến xthứ nhất của số (bắt đầu bằng ký tự đầu tiên là 1) phải chia hết cho x, tức là 30685, 3chia hết cho 1, 30chia hết cho 2, 306chia hết cho 3, 3068chia hết cho 4 và chia hết cho 306855 .
  • Chương trình phải lấy một số nguyên làm đầu vào (thông qua dòng lệnh, làm đối số hàm, v.v.) và in tất cả các hoán vị thỏa mãn quy tắc.
  • Đầu ra phải được phân tách bằng 1 hoặc nhiều ký tự khoảng trắng
  • Hoán vị có thể bắt đầu và bằng không (vì vậy chúng không phải là số ma thuật về mặt kỹ thuật).
  • Thứ tự đầu ra không quan trọng
  • Bạn không cần xử lý đầu vào bất ngờ
  • Các ký tự nhỏ nhất trong byte thắng

Ví dụ

Cho 1:

0
1
2
3
4
5
6
7
8
9

Cho 2:

02
04
06
08
10
12
14
16
18
20
24
26
28
30
32
34
36
38
40
42
46
48
50
52
54
56
58
60
62
64
68
70
72
74
76
78
80
82
84
86
90
92
94
96
98

Cho 10:

3816547290

Tín dụng cho Pizza Hut & John H. Conway cho câu đố gốc (Lựa chọn A). Cảm ơn @Mego và @ sp3000 cho các liên kết của họ .



6
@DavisDude "Liên quan" không có nghĩa là "trùng lặp". Mục đích của việc đăng một liên kết có liên quan là để thách thức đó hiển thị dưới dạng "Liên kết" trong thanh bên.
Martin Ender

1
Đọc liên quan: số đa hình
Sp3000

3
Có phải hàng đầu 0 cần được bao gồm các số đầu ra có chúng không?
xnor

4
Bạn đề cập đến in ấnkhoảng trắng khi xuất ra, nhưng đối với một hàm, dạng đầu ra tự nhiên nhất có thể sẽ trả về một danh sách. Điều đó có được phép không?
Dennis

Câu trả lời:


4

Thạch , 20 17 16 byte

QḣQV%S
ØDṗçÐḟRj⁷

Điều này rất chậm và tốn nhiều bộ nhớ ... Hãy thử trực tuyến!

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

ØDṗçÐḟRj⁷  Main link. Input: n (integer)

ØD         Yield d := '0123456789'.
  ṗ        Compute the nth Cartesian power of d.
      R    Range; yield [1, ..., n].
    Ðḟ     Filter false; keep strings of digits for which the following yields 0.
   ç         Apply the helper link to each digit string and the range to the right.
       j⁷  Join the kept strings, separating by linefeeds.


QḣQḌ%S     Helper link. Arguments: s (digit string), r (range from 1 to n)

Q          Unique; deduplicate s.
 ḣ         Head; get the prefixes of length 1, ..., n or less.
           If s had duplicates, the final prefixes fill be equal to each other.
  Q        Unique; deduplicate the array of prefixes.
   V       Eval all prefixes.
    %      Compute the residues of the kth prefixes modulo k.
           If s and the array of prefixes have different lengths (i.e., if the
           digits are not unique), some right arguments of % won't have corr. left
           arguments. In this case, % is not applied, and the unaltered right
           argument is the (positive) result.
     S     Add all residues/indices. This sum is zero iff all digits are unique
           and the kth prefixes are divisible by k.

3
Nếu điều này chậm ... câu trả lời của tôi là một con sên buồn ngủ
Luis Mendo

6

JavaScript (Firefox 30-57), 77 byte

f=n=>n?[for(s of f(n-1))for(c of"0123456789")if(s.search(c)+(s+c)%n<0)s+c]:[""]

Chỉnh sửa: Đã lưu 1 byte nhờ @ edc65.


Một viên ngọc! chỉ cần lưu 1 byte với...of"012...
edc65

@ edc65 Ugh, tôi không thể tin rằng tôi đã bỏ qua điều đó.
Neil

3

Bình thường, 19 byte

jf!s%VsM._TS;.PjkUT

Trình diễn

Một giải pháp vũ phu. Giải thích để làm theo. Cảm hứng cảm ơn FryAmTheEggman


22 byte

juf!%sThH{I#sm+LdTGQ]k

Trình diễn

Các số được xây dựng và lưu trữ dưới dạng chuỗi và chỉ được chuyển đổi thành số nguyên để kiểm tra tính chia hết.

Giải trình:

juf!%sThH{I#sm+LdTGQ]k
 u                 Q]k    Apply the following input many times, starting with ['']
             m    G       For each string at the previous step,
              +LdT        Append each digit to it
            s             Concatenate
         {I#              Filter out strings with repeats
  f                       Filter on
     sT                   The integer
    %  hH                 Mod the 1 indexed iteration number
   !                      Is zero.
j                         Join on newlines.

Tôi tò mò: bạn phải học Pyth như thế nào? / s
DavisDude

2
@DavisDude Tôi nghĩ nó dễ hơn những gì mọi người nghĩ khi họ nhìn thấy nó. Phần đáng sợ nhất đang bắt đầu. Khi bạn đã vào, bạn đang ở.
FliiFe

1
Nó khá dễ, imho, vì chế độ gỡ lỗi giúp bạn bao nhiêu. Các tài liệu cũng khá tốt, và giải thích những gì bạn cần biết.
Ven

Chỉ để tham khảo, tôi sử dụng thêm ._một số thứ khác và một số thứ khác, nhưng nó chậm hơn cho các đầu vào lớn:jjLkf!s.e%ib10hk._T.PUT
FryAmTheEggman

3

MATL , 30 byte

4Y2Z^!"@Sd@!U10G:q^/kPG:\~h?@!

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

Nó rất chậm. Đối với input 3nó mất một vài giây trong trình biên dịch trực tuyến. Để xem các số xuất hiện từng cái một, bao gồm một Dở cuối mã .

Giải trình

4Y2       % predefined literal: string '0123456789'
Z^        % implicit input. Cartesian power: 2D char array. Each number is a row
!         % transpose
"         % for each column
  @       %   push current column
  Sd      %   sort and compute consecutive differences (*)
  @!U     %   push current column. Convert to number
  10G:q^  %   array [1 10 100 ... 10^(n-1)], where n is the input
  /k      %   divide element-wise. Round down
  P       %   reverse array
  G:      %   array [1 2 ... n]
  \~      %   modulo operation, element-wise. Negate: gives 1 if divisible (**)
  h       %   concatenate (*) and (**). Truthy if all elements are nonzero
  ?       %   if so
    @!    %     current number as a row array of char (string)
          %   implicitly end if
          % implicitly end if
          % implicitly display stack contents

Có gì đó không đúng với mã của bạn; Nó dừng sản xuất đầu ra cho tôi sau 5 và với 5 số cuối cùng (số duy nhất tôi bận tâm kiểm tra) là không chính xác. 986 không chia hết cho 3
DavisDude

Cập nhật: cho 2 nó bỏ qua 10, 12, 32, 34, 54, 56, 76, 78
DavisDude

Tôi nghĩ rằng bạn đã hiểu nhầm lời nhắc. Nhìn vào 3tôi có thể thấy bạn có một vài chỉ dẫn (ví dụ 026). Ngoài ra một lời giải thích sẽ được đánh giá cao
DavisDude

Điều này vẫn không hoạt động- 3 bỏ qua 021, 024, v.v. Số chính xác đầu tiên là 063.
DavisDude

@DavisDude Đã chỉnh sửa, bây giờ tôi đã đọc thử thách cẩn thận hơn
Luis Mendo

1

Ruby, 87 byte

Giải pháp đệ quy cơ bản.

f=->n,x="",j=1{j>n ?puts(x):([*?0..?9]-x.chars).map{|i|f[n,x+i,j+1]if((x+i).to_i)%j<1}}

Nếu bạn được phép trả về danh sách hoán vị thay vì in, 85 byte:

f=->n,x="",j=1{j>n ?x:([*?0..?9]-x.chars).map{|i|f[n,x+i,j+1]if((x+i).to_i)%j<1}-[p]}

1

Python, 132 byte

lambda n:[x for x in map(("{:0%s}"%n).format,(range(10**n)))if all(int(x[:i])%i<1and len(set(x))==len(x)for i in range(1,len(x)+1))]

Giảm 26 byte bằng cách loại bỏ itertools, nhờ Sp3000 vì đã khiến tôi nhận ra mình không nên sử dụng nó.

Giảm 2 byte bằng cách sử dụng một sự hiểu biết danh sách hơn là filter, một lần nữa cảm ơn Sp3000 cho tiền boa.

Dùng thử trực tuyến: Python 2 , Python 3

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.