Yếu tố đảo chữ


19

Trong một tập gần đây của QI , 5 bội số đầu tiên của 142857 đã được mô tả là đảo chữ số gốc. Tất nhiên, bất cứ ai có nhiều kiến ​​thức vượt qua về con số đó sẽ biết rằng những con số đó thực sự là chu kỳ, không chỉ là đảo chữ. Nhưng điều đó làm tôi suy nghĩ.

Vui lòng viết chương trình hoặc hàm xuất ra tất cả các số có sáu chữ số trở xuống có một yếu tố phù hợp là chính đảo chữ cái. Danh sách nên bắt đầu với các số sau:

3105    (divisible by 1035)
7128    (divisible by 1782)
7425    (divisible by 2475)
8316    (divisible by 1386)
8712    (divisible by 2178)
9513    (divisible by 1359)
9801    (divisible by 1089)

Nếu bạn thích, bạn có thể tìm thấy các số có đảo chữ là một yếu tố thích hợp của số đó, nhưng hãy cẩn thận để loại trừ các số 0 đứng đầu khỏi đảo chữ cái của bạn.

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte không phá vỡ sơ hở tiêu chuẩn.


Nếu có đủ thời gian, các chương trình của chúng tôi có thể xuất số có nhiều hơn 6 chữ số không?
Màu xanh

1
Bạn có thể vui lòng gửi danh sách?
xnor

@muddyfish Có, điều đó sẽ được chấp nhận, miễn là nó không bỏ sót bất kỳ số nào hoặc xuất ra các số không chính xác khi nó đi.
Neil

@xnor Tôi thực sự chưa bận tâm đến việc tính toán toàn bộ danh sách, mặc dù tôi không mong đợi bất kỳ tranh chấp nào về nó.
Neil

1
Tôi đã tạo ra một pastebin của đầu ra (hy vọng chính xác) của tôi.
Greg Martin

Câu trả lời:


6

Toán học (môi trường REPL), 75 74 byte

Cảm ơn ngenisis đã thắt chặt điều này bằng một byte!

Select[Range[10!],Most@#~MemberQ~Last@#&[Sort/@IntegerDigits@Divisors@#]&]

Sort/@IntegerDigits@Divisors@#tạo ra một danh sách các chữ số được sắp xếp cho mọi ước số của đối số; số đầu vào tự nó là một ước số, vì vậy danh sách các chữ số được sắp xếp của nó là số cuối cùng. Most@#~MemberQ~Lastphát hiện xem danh sách các chữ số được sắp xếp cuối cùng đó cũng xuất hiện trong danh sách trước phần tử cuối cùng. Và Select[Range[10!],...]chỉ giữ lại những số nguyên đó lên tới 3.628.800 vượt qua bài kiểm tra này (ràng buộc được chọn vì đó là một byte ngắn hơn 10 6 ). Nó chạy trong khoảng 5 phút trên máy tính của tôi, thu được một danh sách 494 số, trong đó lớn nhất là 3,427,191; có 362 số lên tới 10 6 , số lượng lớn là 989.901.


Chà, điều đó không gây tò mò: 857142 và 571428 là hai số có hai đảo chữ chia đúng.
Neil

Trong thực tế, 857142 có ba đảo chữ chia đúng, phải không?
Neil

có vẻ như bạn đúng!
Greg Martin

Bạn có thể lưu một byte bằng cách sử dụng IntegerDigits@Divisors@#.
ngenisis

3

Thạch , 12 byte

ÆḌṢ€ċṢ
ȷ6ÇÐf

Hãy thử trực tuyến! (sử dụng năm chữ số trở xuống vì giới hạn thời gian của TIO)

Xác minh

$ time jelly eun 'ÆḌṢ€ċṢ¶ȷ6ÇÐf'
[3105, 7128, 7425, 8316, 8712, 9513, 9801, 30105, 31050, 37125, 42741, 44172, 67128, 70416, 71208, 71253, 71280, 71328, 71928, 72108, 72441, 74142, 74250, 74628, 74925, 78912, 79128, 80712, 81816, 82755, 83160, 83181, 83916, 84510, 85725, 86712, 87120, 87132, 87192, 87912, 89154, 90321, 90801, 91152, 91203, 93513, 94041, 94143, 95130, 95193, 95613, 95832, 98010, 98091, 98901, 251748, 257148, 285174, 285714, 300105, 301050, 307125, 310284, 310500, 321705, 341172, 342711, 370521, 371142, 371250, 371628, 371925, 372411, 384102, 403515, 405135, 410256, 411372, 411723, 415368, 415380, 415638, 419076, 419580, 420741, 421056, 423711, 425016, 427113, 427410, 427491, 428571, 430515, 431379, 431568, 435105, 436158, 441072, 441720, 449172, 451035, 451305, 458112, 461538, 463158, 471852, 475281, 501624, 502416, 504216, 512208, 512820, 517428, 517482, 517725, 525771, 527175, 561024, 562104, 568971, 571428, 571482, 581124, 589761, 615384, 619584, 620379, 620568, 623079, 625128, 641088, 667128, 670416, 671208, 671280, 671328, 671928, 672108, 678912, 679128, 681072, 691872, 692037, 692307, 704016, 704136, 704160, 704196, 705213, 705321, 706416, 711342, 711423, 712008, 712080, 712503, 712530, 712800, 713208, 713280, 713328, 713748, 714285, 716283, 717948, 719208, 719253, 719280, 719328, 719928, 720108, 720441, 721068, 721080, 721308, 721602, 723411, 724113, 724410, 724491, 728244, 730812, 731892, 732108, 741042, 741285, 741420, 742284, 742500, 744822, 746280, 746928, 749142, 749250, 749628, 749925, 753081, 754188, 755271, 760212, 761082, 761238, 761904, 771525, 772551, 779148, 783111, 786912, 789120, 789132, 789192, 789312, 790416, 791208, 791280, 791328, 791928, 792108, 798912, 799128, 800712, 806712, 807120, 807132, 807192, 807912, 814752, 816816, 818160, 818916, 820512, 822744, 823716, 824472, 825174, 825714, 827550, 827658, 827955, 829467, 830412, 831117, 831600, 831762, 831810, 831831, 839160, 839181, 839916, 840510, 841023, 841104, 843102, 845100, 845910, 847422, 851148, 851220, 851742, 852471, 857142, 857250, 857628, 857925, 862512, 862758, 862947, 865728, 866712, 867120, 867132, 867192, 867912, 871200, 871320, 871332, 871425, 871920, 871932, 871992, 874125, 879120, 879132, 879192, 879912, 888216, 891054, 891540, 891594, 891723, 892755, 894510, 895725, 899154, 900801, 901152, 903021, 903210, 903231, 904041, 908010, 908091, 908901, 909321, 910203, 911043, 911358, 911520, 911736, 911952, 912030, 912093, 912303, 916083, 920241, 920376, 923076, 923580, 925113, 925614, 930321, 931176, 931203, 933513, 934143, 935130, 935193, 935613, 935832, 940410, 940491, 941430, 941493, 941652, 943137, 943173, 951300, 951588, 951930, 951993, 952380, 956130, 956193, 956613, 958032, 958320, 958332, 958392, 958632, 958716, 959832, 960741, 962037, 962307, 970137, 971028, 980100, 980910, 980991, 989010, 989091, 989901]

real    2m10.819s
user    2m10.683s
sys     0m0.192s

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

ȷ6ÇÐf   Main link. No arguments.

ȷ6      Yield 1e6 = 1,000,000.
  ÇÐf   Filter; keep numbers in [1, ..., 1e6] for which the helper link returns
        a truthy value.


ÆḌṢ€ċṢ  Helper link. Argument: n

ÆḌ      Compute all proper divisors of n.
  Ṣ€    Sort each proper divisor's digits.
     Ṣ  Sort n's digits.
   ċ    Count the occurrences of the result to the right in the result to the left.

1
Do nhận xét này, bạn có thể thực hiện chậm hơn nữa ÆḌṢ€ċṢµȷ#trong 10. Mất ~ 27 phút để chạy trên lõi i7 (không phải trên unix, không đẹp time); kết quả lớn nhất là 6671928.
Jonathan Allan

Tôi bắt đầu nghĩ rằng bạn sửa đổi Jelly theo từng câu hỏi
Albert Renshaw

3

Brachylog , 12 byte

ℕf{k∋p.!}?ẉ⊥

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

Điều này có thể hết thời gian trước khi in bất cứ điều gì mặc dù (và nếu không, nó sẽ chỉ được in 3105).

Giải trình

Điều này in những con số đó vô thời hạn, vì tác giả cho biết có thể chấp nhận rằng chương trình sẽ in những con số lớn hơn 6 chữ số.

Đây là cách quá chậm; bạn có thể sử dụng chương trình này (và thay đổi 8300bằng bất kỳ N) để bắt đầu in từ các số lớn hơn N.

ℕ               Natural number: The Input is a natural number
 f              Factors: compute the factors of the Input
  {     }?      Call a predicate with the main Input as its output and the factors as Input
   k            Knife: remove the last factor(which is the Input itself)
    ∋           In: take one of those factors
     p.         Permute: the Output is a permutation of that factor
       !        Cut: ignore other possible permutations
         ?ẉ     Writeln: write the Input to STDOUT, followed by a line break
           ⊥    False: backtrack to try another value for the Input

Như @ ais523 đã chỉ ra, chúng ta cần cắt giảm để tránh in một số nhiều lần nếu một số yếu tố của nó là hoán vị của nó.


Tôi có một câu trả lời rất giống nó được lưu dưới dạng bản nháp. Thật không may, tôi không nghĩ rằng nó hoạt động bởi vì nó sẽ in các số như 857142 hơn một lần và tác giả nói rằng điều đó không được phép. Tôi nghĩ chương trình cần cắt giảm ở đâu đó, có khả năng thêm ba nhân vật.

Thêm 4 ký tự trong thực tế ... cảm ơn, quên điều đó.
Gây tử vong

3

JavaScript (ES6), 103 ... 96 94 byte

Một hàm ẩn danh trả về mảng các số nguyên phù hợp.

_=>[...Array(1e6).keys(F=i=>[...i+''].sort()+0)].filter(n=>n*(R=i=>F(n/i--)==F(n)||R(i)%i)(9))

Định dạng và nhận xét

_ =>                                // main function, takes no input
  [...Array(1e6).keys(              // define an array of 1,000,000 entries
    F = i => [...i + ''].sort() + 0 // define F: function used to normalize a string by
  )]                                // sorting its characters
  .filter(n =>                      // for each entry in the array:
    n * (                           // force falsy result for n = 0
      R = i =>                      // define R: recursive function used to test if
        F(n / i--) == F(n) ||       // n/i is an anagram of n, with i in [1 … 9]
        R(i) % i                    // F(n/1) == F(n) is always true, which allows to stop
    )                               // the recursion; but we need '%i' to ignore this result
    (9)                             // start recursion with i = 9
  )                                 //

Thống kê số chia

Đối với số nguyên 6 chữ số, mỗi tỷ lệ từ 2để 9giữa một số nguyên phù hợp nvà đảo chữ của nó bắt gặp ít nhất một lần. Nhưng một số trong số họ chỉ xuất hiện một vài lần:

 divisor | occurrences | first occurrence
---------+-------------+---------------------
    2    |    12       | 251748 / 2 = 125874
    3    |    118      | 3105   / 3 = 1035
    4    |    120      | 7128   / 4 = 1782
    5    |    4        | 714285 / 5 = 142857
    6    |    34       | 8316   / 6 = 1386
    7    |    49       | 9513   / 7 = 1359
    8    |    2        | 911736 / 8 = 113967
    9    |    23       | 9801   / 9 = 1089

Kiểm tra

Bài kiểm tra dưới đây được giới hạn trong phạm vi [1 ... 39999]để không mất quá nhiều thời gian để hoàn thành.


Phiên bản nhanh hơn nhiều, nhưng có phần dài hơn : _=>[...Array(1e6).keys()].filter(n=>n&&![...Array(9)].every(_=>n%++i||(F=i=>[...i+''].sort()+'')(n/i)!=F(n),i=1)).
Neil

@Neil Đề xuất của bạn đã truyền cảm hứng cho tôi phiên bản cập nhật nhanh hơn nhiều và ngắn hơn 1 byte. Đáng buồn thay, tất cả các ước từ 2để 9được yêu cầu ( 8được sử dụng chỉ hai lần cho 911736931176).
Arnauld


2

Perl 6 , 59 byte

{grep {grep .comb.Bag===*.comb.Bag,grep $_%%*,2..^$_}

Giải pháp vũ phu cực kỳ chậm.

Nó trả về một chuỗi lười biếng, vì vậy tôi có thể kiểm tra một vài kết quả đầu tiên, nhưng nó sẽ không đạt được tất cả các kết quả trong thời gian hợp lý. (Tôi có nên đánh dấu nó là không cạnh tranh không?)


2

Bash tinh khiết , 128 126 122 121 120 byte

for((;n<6**8;)){
c=0
for((j=++n;j;j/=10)){((c+=8**(j%10)));}
for k in ${a[c]};{((n%k))||{ echo $n;break;};}
a[c]+=\ $n
}

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

(Chương trình này khá nhanh - chỉ mất 14 phút để chạy qua tất cả các số có 6 chữ số trên MacBook của tôi. Thật không may TIO hết thời gian vì nó áp dụng giới hạn thời gian chạy là 1 phút, chỉ đủ thời gian để vượt qua các số có 5 chữ số.)

Tiện ích Bash + Unix, 117 byte

for n in {1..999999}
{
c=$(bc<<<0`sed 's/\(.\)/+8^\1/g'<<<$n`)
for k in ${a[c]};{((n%k))||echo $n;}
a[c]+=\ $n
}|uniq

Đây là ngắn hơn so với phiên bản bash thuần túy, nhưng chậm hơn một chút, có lẽ là do một phần tốt cho tất cả các forking đang diễn ra.


1

05AB1E , 15 byte

[¼¾œJv¾Ñ¨Dyåi¾,

Giải trình:

[               # Start of infinite loop
 ¼              # Increase counter_variable by 1
  ¾œJv          # Loop through all the permutations of counter_variable
      ¾Ñ¨Dyå    # Check if a divisor of counter_variable is a permutation of counter_variable
            i¾, # If so, print counter_variable

Hãy thử trực tuyến! (điều này sẽ không hoạt động, nó sẽ hết thời gian)



0

Python 2, 98 byte

s=sorted;print filter(None,[[x for i in range(x)if s(`x`)==s(`i`)and x%i<1]for x in range(10**6)])

Có nên như 10**6vậy không?
Neil

Vâng, cảm ơn.
Trelzevir

1
Tôi nghĩ rằng x%i==0chỉ có thể được x%i<1.
Yytsi

0

05AB1E , 12 10 byte

Lần ra trên TIO do vòng lặp vô hạn.
Đã lưu 2 byte vì chúng tôi có thể xuất nhiều hơn 6 chữ số theo nhận xét của OP.

[NѨ€{N{å–

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

Giải trình

[            # infinite loop with iteration index N
 NÑ          # get a list of all divisors of N
   ¨         # remove N from that list
    €{       # sort each entry in the list of divisors
      N{     # sort N
        å–   # output N if N is in the list

0

Hàng loạt, 263 byte

@echo off
set e=exit/b
for /l %%n in (1,1,999999)do call:n %%n
%e%
:n
call:c %1 1 0
for /l %%f in (2,1,9)do call:c %1 %%f %c%&&echo %1&&%e%
%e%
:c
set/ar=%1%%%2,d=%1/%2,c=-%3
if %r% gtr 0 %e%1
:l
set/ac+=1^<^<d%%10*3,d/=10
if %d% gtr 0 goto l
%e%%c%

Chậm. Như trong, mất hơn một ngày để hoàn thành trên PC của tôi. Giải thích: cchương trình con chia hai đối số đầu tiên của nó. Nếu phần còn lại bằng 0, thì nó sẽ tính băm của kết quả bằng cách tính tổng lũy ​​thừa thứ n của 8 cho mỗi chữ số. Hàm băm này, bị đánh cắp từ câu trả lời bash, chỉ va chạm trên đảo chữ cái. (Nó sẽ hoạt động với bảy chữ số nhưng tôi không có cả hai tuần.) Đối số thứ ba bị trừ và chương trình con thoát ra với kết quả trung thực nếu điều này bằng không. Chương ntrình con gọi cchương trình con một lần để tính toán hàm băm, sau đó thêm tám lần nữa để so sánh hàm băm; nếu nó tìm thấy một sự va chạm, nó sẽ in nvà thoát khỏi chương trình con sớm.

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.