ปัจจัยแอนนาแกรม


19

ในตอนล่าสุดของQI , 5 ทวีคูณแรกของ 142857 ถูกอธิบายว่าเป็นภาพของตัวเลขดั้งเดิม แน่นอนว่าใครก็ตามที่มีความรู้มากกว่าจำนวนที่ผ่านมานั้นจะรู้ว่าตัวเลขเหล่านั้นเป็นวัฏจักรจริง ๆ ไม่ใช่แค่แอนนาแกรม แต่นั่นทำให้ฉันคิด

โปรดเขียนโปรแกรมหรือฟังก์ชั่นที่แสดงผลตัวเลขหกหลักหรือน้อยกว่าทั้งหมดซึ่งมีปัจจัยที่เหมาะสมที่เป็นแอนนาแกรมของตัวเอง รายการควรเริ่มต้นด้วยหมายเลขต่อไปนี้:

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)

หากคุณต้องการคุณสามารถค้นหาตัวเลขที่มีแอนนาแกรมซึ่งเป็นปัจจัยที่เหมาะสมของตัวเลข แต่ระวังที่จะไม่รวมศูนย์นำหน้าจากแอนนาแกรมของคุณ

นี่คือโค้ดกอล์ฟดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ที่ไม่มีช่องโหว่มาตรฐานชนะ


หากให้เวลาเพียงพอโปรแกรมของเราสามารถแสดงหมายเลขที่มีมากกว่า 6 หลักได้หรือไม่
บลู

1
คุณช่วยโพสต์รายการได้ไหม
xnor

@muddyfish ใช่มันน่าจะยอมรับได้ตราบใดที่มันไม่ตัดตัวเลขหรือเอาท์พุทตัวเลขที่ไม่ถูกต้องออกไป
Neil

@ xnor ฉันยังไม่ได้ใส่ใจกับการคำนวณรายการทั้งหมด แต่ฉันไม่ได้คาดหวังว่าจะมีข้อพิพาทใด ๆ
Neil

1
ฉันสร้างpastebinของผลลัพธ์ (หวังว่าถูกต้อง)
เกร็กมาร์ติน

คำตอบ:


6

Mathematica (สภาพแวดล้อม REPL), 75 74 ไบต์

ขอบคุณ ngenisis ที่ทำให้สิ่งนี้กระชับโดย byte!

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

Sort/@IntegerDigits@Divisors@#สร้างรายการที่เรียงลำดับตัวเลขสำหรับตัวหารทุกตัวของอาร์กิวเมนต์ หมายเลขอินพุตเป็นตัวหารดังนั้นรายการที่เรียงลำดับของตัวเลขจึงเป็นหมายเลขสุดท้าย Most@#~MemberQ~Lastตรวจพบว่ารายการที่เรียงลำดับตัวเลขล่าสุดปรากฏในรายการก่อนองค์ประกอบสุดท้ายหรือไม่ และSelect[Range[10!],...]เก็บรักษาเฉพาะจำนวนเต็มเหล่านั้นมากถึง 3,628,800 ที่ผ่านการทดสอบนี้ (ที่ถูกเลือกเนื่องจากมีขนาดสั้นกว่า 10 6ไบต์) มันใช้เวลาประมาณ 5 นาทีในคอมพิวเตอร์ของฉันซึ่งให้รายชื่อหมายเลข 494 ตัวที่ใหญ่ที่สุดคือ 3,427,191; มี 362 หมายเลขไม่เกิน 10 6รายการที่มากที่สุดคือ 989,901


ไม่ใช่ว่าอยากรู้อยากเห็น: 857142 และ 571428 เป็นตัวเลขสองตัวพร้อมกับตัวหารแอนนาแกรมที่เหมาะสมสองตัว
Neil

อันที่จริง 857,142 มีสาม anagrams หารที่เหมาะสมมันไม่ได้?
Neil

ดูเหมือนว่าคุณพูดถูก!
เกร็กมาร์ติน

IntegerDigits@Divisors@#คุณสามารถบันทึกไบต์โดยใช้
ngenisis

3

เยลลี่ 12 ไบต์

ÆḌṢ€ċṢ
ȷ6ÇÐf

ลองออนไลน์! (ใช้ตัวเลขห้าหลักหรือน้อยกว่าเนื่องจากการ จำกัด เวลาของ TIO)

ยืนยันผ่านระบบ

$ 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

มันทำงานอย่างไร

ȷ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
เนื่องจากความคิดเห็นนี้คุณสามารถทำช้าลงเป็นÆḌṢ€ċṢµȷ#เวลา 10 ใช้เวลา ~ 27 นาทีเพื่อทำงานบน i7 core (ไม่ได้อยู่ในยูนิกซ์, ไม่ดีtime); 6671928ผลที่ใหญ่ที่สุดคือ
Jonathan Allan

ฉันเริ่มที่จะคิดว่าคุณปรับเปลี่ยน Jelly ตามคำถามต่อ😏
Albert Renshaw

3

Brachylogขนาด 12 ไบต์

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

ลองออนไลน์!

สิ่งนี้อาจหมดเวลาก่อนที่จะพิมพ์อะไรก็ได้ (และหากไม่เป็นเช่นนั้นจะพิมพ์เฉพาะ 3105)

คำอธิบาย

พิมพ์ตัวเลขเหล่านี้ไปเรื่อย ๆ ตามที่ผู้เขียนบอกว่าเป็นที่ยอมรับได้ว่าโปรแกรมจะพิมพ์ตัวเลขที่มีขนาดใหญ่กว่า 6 หลัก

นี่เป็นวิธีที่ช้าเกินไป; คุณสามารถใช้โปรแกรมนี้ (และการเปลี่ยนแปลง8300ใด ๆN) ที่จะเริ่มต้นการพิมพ์จากหมายเลข stricly 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

ตามที่ @ ais523 ชี้ให้เห็นว่าเราจำเป็นต้องตัดเพื่อหลีกเลี่ยงการพิมพ์จำนวนหลายครั้งหากปัจจัยหลายอย่างมีการเรียงสับเปลี่ยนของมัน


ฉันมีคำตอบที่คล้ายกันมากที่บันทึกไว้เป็นแบบร่าง น่าเสียดายที่ฉันไม่คิดว่ามันใช้งานได้เพราะจะพิมพ์ตัวเลขเช่น 857142 มากกว่าหนึ่งครั้งและผู้เขียนบอกว่าไม่ได้รับอนุญาต ฉันคิดว่าโปรแกรมต้องการการตัดที่ไหนสักแห่งน่าจะเพิ่มตัวละครสามตัว

อันที่จริงการเพิ่ม 4 ตัวอักษร ... ขอบคุณลืมไปแล้ว
ลดขนาด

3

JavaScript (ES6), 10396 94 ไบต์

ฟังก์ชันที่ไม่ระบุชื่อที่ส่งคืนอาร์เรย์ของจำนวนเต็มที่ตรงกัน

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

จัดรูปแบบและแสดงความคิดเห็น

_ =>                                // 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
  )                                 //

สถิติตัวหาร

สำหรับจำนวนเต็ม 6 หลักแต่ละอัตราส่วนจาก2ถึง9ระหว่างจำนวนเต็มที่ตรงกัน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

ทดสอบ

การทดสอบด้านล่างนี้ จำกัด อยู่ในช่วง[1 ... 39999]ดังนั้นจึงใช้เวลาไม่นาน


รุ่นได้เร็วขึ้นมาก _=>[...Array(1e6).keys()].filter(n=>n&&![...Array(9)].every(_=>n%++i||(F=i=>[...i+''].sort()+'')(n/i)!=F(n),i=1))แต่ค่อนข้างยาว:
Neil

@Neil ข้อเสนอแนะของคุณเป็นแรงบันดาลใจให้ฉันในเวอร์ชันที่อัปเดตซึ่งเร็วกว่ามากและสั้นลง 1 ไบต์ น่าเศร้าต้องใช้ตัวหารทั้งหมดจาก2ถึง9( 8ใช้เพียงสองครั้ง911736และ931176)
Arnauld


2

Perl 6 , 59 ไบต์

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

การแก้ปัญหาแรงเดรัจฉานช้ามาก

มันส่งคืนลำดับที่ขี้เกียจดังนั้นฉันสามารถตรวจสอบผลลัพธ์แรก ๆ ได้ แต่จะไม่สามารถเข้าถึงผลลัพธ์ทั้งหมดในเวลาที่เหมาะสม (ฉันควรทำเครื่องหมายว่าไม่ใช่การแข่งขันหรือไม่)


2

Pure Bash , 128 126 122 121 120 ไบต์

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
}

ลองออนไลน์!

(โปรแกรมนี้เร็วพอสมควร - ใช้เวลาเพียง 14 นาทีในการรันตัวเลข 6 หลักทั้งหมดใน MacBook ของฉันโชคไม่ดีที่ TIO หมดเวลาเพราะมันมีการ จำกัด เวลาวิ่ง 1 นาทีซึ่งเป็นเวลาที่เพียงพอที่จะผ่าน ตัวเลข 5 หลักหรือมากกว่านั้น)

ยูทิลิตี Bash + Unix ขนาด 117 ไบต์

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

นี่จะสั้นกว่ารุ่นทุบตีแท้ๆ แต่ค่อนข้างช้ากว่าเล็กน้อยน่าจะเป็นเพราะส่วนที่ดีในการตีทุกอย่างเกิดขึ้น


1

05AB1E , 15 ไบต์

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

คำอธิบาย:

[               # 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

ลองออนไลน์! (สิ่งนี้จะไม่ทำงานก็จะหมดเวลา)



0

Python 2, 98 ไบต์

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)])

ไม่ควรที่จะเป็น10**6อย่างไร
Neil

ใช่ขอบคุณ.
Trelzevir

1
ฉันคิดว่าx%i==0เป็นx%i<1ไปได้
Yytsi

0

05AB1E , 12 10 ไบต์

หมดเวลากับ TIO เนื่องจากการวนซ้ำไม่สิ้นสุด
บันทึก 2 ไบต์เนื่องจากเราสามารถส่งออกตัวเลขมากกว่า 6 หลักตามความคิดเห็นของ OPs

[NѨ€{N{å–

ลองออนไลน์!

คำอธิบาย

[            # 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

แบตช์ 263 ไบต์

@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%

ช้า. เช่นเดียวกับใช้เวลาในหนึ่งวันกว่าจะเสร็จสิ้นบนพีซีของฉัน คำอธิบาย: cรูทีนย่อยแบ่งอาร์กิวเมนต์สองตัวแรก หากส่วนที่เหลือเป็นศูนย์จะคำนวณแฮชของผลลัพธ์โดยการคำนวณผลรวมของพลังที่ n ของ 8 สำหรับแต่ละหลัก ฟังก์ชั่นแฮชนี้ถูกขโมยไปจากคำตอบทุบตีเท่านั้นที่จะชนกันบนแอนนาแกรม (มันสามารถใช้ได้กับตัวเลขเจ็ดหลัก แต่ฉันไม่มีรายปักษ์ทั้งหมด) อาร์กิวเมนต์ที่สามถูกลบออกและรูทีนย่อยจะออกพร้อมกับผลลัพธ์ที่เป็นจริงหากนี่เป็นศูนย์ nsubroutine เรียกcsubroutine ครั้งเดียวในการคำนวณกัญชาแล้วอีกแปดครั้งเพื่อเปรียบเทียบแฮช; หากพบการชนกันจะพิมพ์nและออกจากรูทีนย่อยก่อน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.