Tiền tố chia hết

Nov 02 2020

Cảm hứng

Cho một số nguyên dương \$1 \le n \le 9\$, xuất ra tất cả số dương \$n\$-digit số nguyên \$i\$ mà điều sau là đúng:

  • Mỗi chữ số từ \$1\$đến \$n\$xuất hiện chính xác một lần trong \$i\$. Do đó, \$i\$Các chữ số của là một hoán vị của các chữ số từ \$1\$đến \$n\$.
  • \$i\$chia hết cho \$n\$
  • Xóa chữ số ngoài cùng bên phải khỏi \$i\$mang lại một số nguyên khác \$i_{\text{trunc}(1)}\$cái nào chia hết cho \$n-1\$
  • Xóa chữ số ngoài cùng bên phải khỏi \$i_{\text{trunc}(1)}\$mang lại một số nguyên khác \$i_{\text{trunc}(2)}\$cái nào chia hết cho \$n-2\$
  • Và cứ tiếp tục như vậy cho đến khi \$i_{\text{trunc}(n-1)}\$, chia hết cho 1.

Ví dụ, cho \$n = 3\$, một số nguyên như vậy là \$321\$, như \$321\$chia hết cho \$3\$, \$32\$bởi \$2\$\$3\$ bởi 1.

Đối với \$n = 4, 5, 7\$, không có số nguyên nào như vậy. Trong trường hợp này, bạn có thể ra bất cứ điều gì mà không thể nhầm lẫn với một đầu ra có thể (ví dụ như 0, [], không có gì, vv). Đối với \$n = 3, 6\$, bạn có thể xuất ra hai số ở bất kỳ định dạng nào trong đó hai số được phân tách rõ ràng với nhau.

Đây là mã-gôn nên mã ngắn nhất tính bằng byte sẽ thắng.

Nếu bạn sử dụng phương pháp bảng tra cứu, điểm hạnh phúc \${}^\dagger\$ được trao nếu bạn cũng bao gồm một phiên bản tính toán đầu ra chính xác.

\${}^\dagger\$Điểm Brownie có thể có hoặc không ở dạng ủng hộ

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

Những trường hợp này là đầy đủ, vì vậy bạn sẽ không bao giờ nhận được (hoặc phải xử lý) một đầu vào không có ở đây.

n -> i
1 -> [1]
2 -> [12]
3 -> [123, 321]
4 -> []
5 -> []
6 -> [123654, 321654]
7 -> []
8 -> [38165472]
9 -> [381654729]

Trả lời

5 ovs Nov 02 2020 at 19:28

05AB1E , 8 byte

LœJʒηāÖP

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

Đã nhận xét :

L         # push [1..n]
 œ        # push all permutations
  J       # join each permutation into a number
   ʒ      # filter those numbers on:
    η     #   each prefix ...
      Ö   #   ... is divisible ...
     ā    #   ... by its index
       P  #   take the product (all)
5 xnor Nov 02 2020 at 21:12

Python 2 , 68 byte

lambda n:[`s`[:n]for s in 321654,381654729,123654][380712>>n*2&3::2]

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

Xuất ra một danh sách một chuỗi.


71 byte

lambda n:[0,1,12,[123,321],0,0,[123654,321654],0,38165472,381654729][n]

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

Chỉ là một hardcode nhàm chán. Kết quả một số duy nhất hoặc một danh sách hai số hoặc 0 cho kết quả không.

Không có phương pháp nào khác mà tôi đã thử có vẻ ngắn hơn phương pháp này. Ví dụ: một ý tưởng là tạo các số dưới dạng tiền tố của một số duy nhất, tạo ra như thế 123654/10**(6-i).

Một phương thức đối tượng cho cùng độ dài. Thật không may, chúng tôi không thể sử dụng ngắn hơn nhiều .popvì nó làm cho hàm không thể sử dụng lại được vì nó sửa đổi danh sách với mỗi lần gọi.

[0,1,12,[123,321],0,0,[123654,321654],0,38165472,381654729].__getitem__

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

Đặt tên cho hằng số dài nhất cũng cho cùng độ dài:

lambda n,c=381654729:[0,1,12,[123,321],0,0,[123654,321654],0,c/10,c][n]

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

4 xash Nov 02 2020 at 18:43

J , 42 37 byte

Tính toán các con số.

0({:#~0=[:+/#\|])@|:i.@!10&#.\@A.1+i.

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

  • 1+i. 1… n
  • i.@!…@A. tất cả các hoán vị có thể có của 1… n
  • 10&#.\ chuyển đổi mọi tiền tố của một hoán vị thành một số
  • 0(…)@|: chuyển ma trận và…
  • #\|] 1… n sửa đổi các tiền tố, ví dụ: 1 2 3 | 1 12 123
  • 0=[:+/tính tổng kết quả; nó là 0?
  • {:#~ sau đó lấy tiền tố cuối cùng của hoán vị (chính hoán vị)
3 user Nov 02 2020 at 22:36

Scala, 81 80 byte

| =>1.to(|).mkString.permutations.filter{i=>1 to|forall(r=>i.take(r).toInt%r<1)}

Hãy thử nó trong Scastie

Giải trình:

| =>                          //n, the input
  1.to(|)                     //Range to n
    .mkString                 //Turn it into a string
    .permutations             //Get all permutations
    .filter{ i =>             //Filter them
      1 to | forall(r =>      //For every r from 1 to n
        i.take(r).toInt       //The number made from i's first r digits
          % r < 1             //Should be divisible by r
      )
    }
2 Neil Nov 02 2020 at 19:50

Than củi , 25 byte

NθΦEXχθIι⬤…·¹θ›№ιIλ﹪I…ιλλ

Hãy thử nó trực tuyến! Liên kết là phiên bản dài của mã. Quá chậm đối n>5với TIO. Giải trình:

Nθ

Đầu vào n.

ΦEXχθIι

Liệt kê tất cả các số nguyên ilên đến 10ⁿ, sao cho ...

⬤…·¹θ

... cho mỗi số nguyên ltừ 1để n...

›№ιIλ﹪I…ιλλ

llà một chữ số của iltiền tố-ký tự của ilà chia hết cho l.

Phiên bản 28 byte nhanh hơn một chút:

NθΦEX⊕θθ⍘ι⊕θ⬤…·¹θ›№ιIλ﹪I…ιλλ

Hãy thử nó trực tuyến! Liên kết là phiên bản dài của mã. Giải thích: Tạo các chữ số trong cơ số n+1thay vì cơ số 10, do đó có thể hoàn thành n=6trên TIO.

Phiên bản 29 byte nhanh nhất sử dụng bảng tra cứu nén:

§⪪”)‴a3HSGS⸿Dπ¬Z⦄O<ε≔<πUθ8”0N

Hãy thử nó trực tuyến! Liên kết là phiên bản dài của mã.

2 J42161217 Nov 02 2020 at 18:38

Ngôn ngữ Wolfram (Mathematica) , 78 byte

(f=FromDigits)/@Select[Permutations@Range[s=#],f@#[[;;k]]~Mod~k~Sum~{k,s}<1&]&

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

-8 byte từ @att

2 Razetime Nov 03 2020 at 03:47

Husk , 15 byte

mdföΛIṠz¦ŀmdḣPḣ

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

Almos thte giống như câu hỏi khác, ngoại trừ các tham số.

2 Noodle9 Nov 02 2020 at 18:44

C (gcc) -lm, 67 101 96 byte

Đã thêm 34 byte để sửa một lỗi được xnor vui lòng chỉ ra .
Đã tiết kiệm 5 byte nhờ vào trần mèo !!!

f(n){write(1,"321654",n-3&&n-6?0:n);n=n<4?123/exp10(3-n):n>7?381654729/exp10(9-n):n-6?0:123654;}

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

Giải pháp dựa trên tra cứu tổng thể. Nếu có hai giải pháp: kết xuất một tới stdoutvà trả về giải pháp kia. Nếu chỉ có một câu trả lời, nó chỉ được trả về. Trả lại \$0\$ nếu không có câu trả lời.

Phần thưởng cho điểm bánh hạnh nhân

C (gcc) , 232 212 byte

Đã tiết kiệm một con số khổng lồ 20 byte nhờ con mèo trần !!!

p;m;j;char b[9],c[9];d;i;f(n){for(d=0,i=n;i;)d+=9*d+i--;for(sprintf(c,"%d",d);d/++i;)if(sprintf(b,"%d",i),qsort(b,n,1,L"\xf06be0f\xd02917beǃ"),!strcmp(b,c)){for(p=0,m=n,j=i;j;j/=10)p|=j%m--;p||printf("%d ",i);}}

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

Tính toán các số chính xác thông qua phép tính và xuất chúng ra stdout. Kết quả không có gì nếu không có câu trả lời. Hết thời gian trên TIO cho \$n=9\$nhưng tất cả chúng trong 3m36.499smáy tính xách tay của tôi.

2 JonathanAllan Nov 02 2020 at 18:44

Thạch ,  11  10 byte

-1 cảm ơn coinheringaahing kỳ lạ !

Đây là một phương pháp ngây thơ, có thể có một phương pháp ngắn gọn hơn.

Œ!JḍḌƤẠƲƇḌ

Đang chấp nhận một liên kết đơn nguyên \$n\$kết quả 0nếu không tìm thấy hoặc danh sách các số hợp lệ.

Hãy thử nó trực tuyến! Hoặc xem bộ thử nghiệm .

Làm sao?

Œ!JḍḌƤẠƲƇḌ - Link: n
Œ!         - all permutations of [1..n]
        Ƈ  - filter keep those (p for p in Œ!) for which:
       Ʋ   -   last four links as a monad f(p):
  J        -     range of length = [1..n]
     Ƥ     -     apply to prefixes (of p):
    Ḍ      -       un-decimal
   ḍ       -     divides? (vectorises)
      Ạ    -     all truthy?
         Ḍ - un-decimal
1 KjetilS. Nov 02 2020 at 20:41

Perl 5 , 64 byte

sub{grep"@_"==y///c,1,12,123,321,123654,321654,$x=38165472,$x.9}

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

1 Arnauld Nov 02 2020 at 22:55

JavaScript (V8) , 97 byte

Một hàm đệ quy tính toán và in các số nguyên phù hợp.

f=(n,s='987654321'.slice(-n),d,p)=>p%d?0:s?[...s].map(v=>f(n,s.replace(v,''),-~d,[p]+v)):print(p)

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


JavaScript (ES6), 59 byte

Mã hóa cứng rõ ràng là ngắn hơn.

n=>[,1,12,[321,123],,,[321654,123654],,q=38165472,q+[9]][n]

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

att Nov 03 2020 at 02:48

Ngôn ngữ Wolfram (Mathematica) , 71 byte

f[s_:0,l_:0]=0!=##2&&l∣s&&If[l<#,##~f[10s+i,l+1]~i~Do~{i,#},Print@s]&

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

Gọi là f[][n]. In kết quả.

EngineerToast Nov 03 2020 at 13:32

Excel, 64 byte

=CHOOSE(A1,1,12,"123,321",,,"123654,321654",,38165472,381654729)

Đầu vào là trong A1. Câu trả lời được mã hóa cứng sẽ ngắn hơn so với tính toán.