แยกตัวประกอบมัน! …ไม่ดี


15

เด็กอยากรู้อยากเห็นการใช้โปรแกรมที่สามารถ factorize p1^e1 * p2^e2 * ... * pn^enตัวเลขหรือการแสดงออกในรูปแบบต่อไปนี้: ยกกำลังเท่ากับ1ละเว้นเช่น360 = 2^3 * 3^2 * 5

เด็กพิมพ์ผลลัพธ์นี้ลงในโปรแกรมเป็นอินพุตใหม่ แต่เธอไม่เข้าใจ^สัญญาณดังนั้นบางครั้งเธอก็ข้ามหนึ่งหรือหลายอย่างที่ต่อกันกับไพร์มเบสพื้นฐานและเลขชี้กำลัง เช่น(360 =) 2^3 * 3^2 * 5 => 2^3 * 32 * 5 (= 1280)

เนื่องจากข้อผิดพลาดเหล่านี้เธออาจได้รับการแยกตัวประกอบที่แตกต่างกันซึ่งเธอสามารถป้อนข้อมูลอีกครั้ง (ด้วยการข้าม 0 หรือมากกว่า^) เธอทำซ้ำกระบวนการจนกว่าการแยกตัวประกอบจะไม่เปลี่ยนแปลงอีกต่อไป (อาจจะไม่มีอีก^ต่อไปหรือคัดลอกผลลัพธ์อย่างถูกต้อง)

คุณควรเขียนโปรแกรมหรือฟังก์ชั่นที่ให้จำนวนเต็มn( n>1) เอาท์พุทตัวเลขที่เป็นไปได้ทั้งหมดในลำดับที่เพิ่มขึ้นซึ่งการแยกตัวประกอบอาจเป็นสิ่งที่เด็กจบลงด้วย (รวมถึงn) เช่นสำหรับการป้อนข้อมูล16ปัจจัยสุดท้ายที่เป็นไปได้คือ(16 =) 2^4, (24 =) 2^3 * 3, (23*3 =) 3 * 23

รายละเอียดการป้อนข้อมูล:

  • อินพุตเป็นจำนวนเต็มเดียวที่ใหญ่กว่า 1
  • จะไม่มีการป้อนข้อมูลใดที่สร้างหมายเลขเอาต์พุตมากกว่า 2^31-1
  • จะไม่มีการป้อนข้อมูลใดที่สร้างมากกว่า1000จำนวนเอาต์พุต

รายละเอียดผลลัพธ์:

  • รายการจำนวนเต็มในรูปแบบที่สะดวกสำหรับภาษาของคุณ

ตัวอย่าง:

อินพุต => เอาท์พุท

11    => 11
16    => 16 24 69
360   => 140 360 770 1035 1219 1280 2875 3680
605   => 560 605 840 2415
2048  => 211 2048
58564 => 230 456 1311 2508 9975 12768 13794 20748 58564 114114 322102

นี่คือรหัส - กอล์ฟเพื่อให้โปรแกรมสั้นที่สุดชนะ


เราไม่มีตัวประกอบแล้วหรือยัง?
เครื่องมือเพิ่มประสิทธิภาพ

5
@Optimizer มันแตกต่างกันมาก
Randomra

1
หมายเลขสุดท้ายสำหรับ 360 ควรเป็น 3 6 80: 2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange

@blutorange ขอบคุณแก้ไขแล้ว
randomra

คำตอบ:


5

CJam - 66

ria{_{:XmF{1=1>},La\{a1$\f++}/La-{XI{~#}%:*/I{si}%:**}fI}%|}1e3*$p

ลองที่http://cjam.aditsu.net/

คำอธิบาย:

ria                       read token, convert to integer and wrap in array
{…}1e3*                   repeat 1000 times
    _                     duplicate array
    {…}%                  transform each array item (number) using the block
        :X                store the number in X
        mF                factorize with exponents
        {1=1>},           keep only the factors with exponent > 1
        La\{a1$\f++}/     get all the subsets (*)
        La-               remove the empty subset
        {…}fI             for I = each subset of prime factors with exponent > 1
            XI{~#}%:*/    divide X by all the factors in I
            I{si}%:**     multiply with the primes from I
                          concatenated with their exponents
    |                     add the new numbers to the array, removing duplicates
$                         sort
p                         print the final array

(*) ขอบคุณ Martin


รหัส cjam จาก cjam god
kaine

^สามารถลบจำนวนใดก็ได้ในขั้นตอนเดียว ดังนั้นก็ควรจะสามารถที่จะสร้าง58564 = 2^2 * 11^4 2508 = 22 * 114
Randomra

@randomra คุณควรเพิ่มตัวอย่างสำหรับสิ่งประเภทนี้
aditsu ออกเพราะ SE นั้นชั่วร้าย

@randomra น่าจะดีกว่าตอนนี้
aditsu ออกเพราะ SE นั้นชั่วร้าย

ที่ดี! เพิ่มตัวอย่าง ขออภัยที่ข้ามไป
randomra

4

ทับทิม, 219

ในการเริ่มต้นนี้:

s=->(x){A=[];def k(x)A<<x
y=Prime.prime_division x;n=0..y.size-1
n.each{|i|n.to_a.combination(i+1).each{|c|c.each{|z|v=y.dup
v[z][1]>1?v[z]=[v[z].join.to_i,1]:next
k v.inject(1){|s,b|s*b[0]**b[1]}}}}end;k x;A.uniq.sort}

สร้างฟังก์ชั่นที่คืนค่า Array ของตัวเลข

https://ideone.com/iOMGny

ใช้มันแบบนี้:

#usage

#load from the standard library
require"prime"

#read from stdin and print to stdout
p s.call $<.read.to_i

สนุกมากเลยที่เขียนสิ่งนี้ทั้งหมดบนโทรศัพท์มือถือ ...


3

Perl, 193 ไบต์

sub R{my($k,$v,@z)=@_;map{$k**$v*$_,$v>1?($k.$v)*$_:()}@z?R(@z):1}
@q=(0+<>);
while($x=pop@q){
my%f;@r=sort{$a<=>$b}@r,$x;
for(2..$x){$x/=$_,$f{$_}++while$x%$_<1}
$_~~@r||push@q,$_ for R%f
}
print"@r"

มีการเพิ่มบรรทัดใหม่เพื่อให้สามารถอ่านได้

ห่วงสำหรับตัวประกอบจำนวนถัดไป ( $x) เป็นแฮ ( %f) ของจำนวนเฉพาะและอำนาจ ฟังก์ชัน recursive ( R) ใช้แฮชนี้เพื่อสร้างตัวเลขทั้งหมดที่สามารถทำได้โดยลบ^สัญญาณ ตัวเลขเหล่านี้ถูกเพิ่มเข้าไปในคิว ( @q) และกระบวนการทำซ้ำโดยวงนอกขณะวนซ้ำ แต่ละหมายเลขจากคิวจะถูกเก็บไว้ในอาร์เรย์ที่ไม่ซ้ำกันและเรียงลำดับ ( @r) สำหรับการพิมพ์


3

Pyth, 46 45 44

Su{smmu*/N^T/PdTv+`T`/PdTkdyft/PdT{PdGU^T3]Q

ลองที่นี่

แก้ไข^ข้อบกพร่องหลายรายการ ตัวอย่างเช่น

Input:  58564
Output: [230, 456, 1311, 2508, 9975, 12768, 13794, 20748, 58564, 114114, 322102]

โปรดทราบว่ารหัสนี้อาศัยข้อบกพร่องสองประการกับคอมไพเลอร์อย่างเป็นทางการที่ถูกผลักหลังจากถามคำถาม อย่างไรก็ตามมันไม่ได้ใช้คุณสมบัติภาษาใหม่ใด ๆ


คุณจะได้อะไรสำหรับ 58564
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

[230, 456, 1311, 58564, 322102] ซึ่งผิด
isaacg

@aditsu แก้ไขปัญหา
isaacg

เนื่องจาก Pyth ไม่ได้จัดทำเป็นเอกสารอย่างเข้มงวด (จากสิ่งที่ฉันพบ) มันยากที่จะแยกแยะระหว่างการแก้ไขข้อบกพร่องและคุณสมบัติใหม่ดังนั้นฉันจึงตัดสินใจไม่เลือกรายการนี้เป็นคำตอบที่ชนะ
randomra

@randomra ฉันเข้าใจการตัดสินใจของคุณไม่ยอมรับคำตอบนี้ อย่างไรก็ตามฉันแค่อยากจะพูดถึงสิ่งที่แก้ไขข้อผิดพลาดคือการใช้การลด ( u) ภายในการลดอื่นเป็นไปไม่ได้ ฉันเปลี่ยน 2 เป็น 3 ในตำแหน่งที่เหมาะสมเพื่อให้การลดจะใช้ 3 อินพุตแทน 2 นั่นคือทั้งหมด
isaacg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.