Iterated Divisor Twist


13

คำนิยาม

อนุญาตmและnเป็นจำนวนเต็มบวก เราบอกว่าmเป็นบิดตัวหารของnถ้ามีจำนวนเต็ม1 < a ≤ bเช่นนั้นและn = a*b m = (a - 1)*(b + 1) + 1ถ้าmสามารถหาได้จากnโดยใช้ศูนย์หรือตัวหารมากขึ้นบิดไปแล้วmเป็นลูกหลานnของ โปรดทราบว่าทุกหมายเลขเป็นผู้สืบทอดของตัวเอง

n = 16ตัวอย่างเช่นพิจารณา เราสามารถเลือกa = 2และตั้งแต่b = 8 2*8 = 16แล้วก็

(a - 1)*(b + 1) + 1 = 1*9 + 1 = 10

ซึ่งแสดงให้เห็นว่าเป็นบิดหารของ10 16ด้วยa = 2และb = 5เราก็เห็นว่าเป็นบิดหารของ7 10ดังนั้นเป็นลูกหลานของ716

งาน

รับค่าจำนวนเต็มบวกnคำนวณลูกหลานของnแสดงรายการในลำดับที่เพิ่มขึ้นโดยไม่ซ้ำกัน

กฎระเบียบ

คุณไม่ได้รับอนุญาตให้ใช้การดำเนินการในตัวที่คำนวณตัวหารของตัวเลข

ยอมรับทั้งโปรแกรมและฟังก์ชั่นเต็มรูปแบบและอนุญาตให้ส่งคืนประเภทข้อมูลการเก็บรวบรวม (เช่นชุดบางประเภท) ได้ตราบใดที่มีการเรียงลำดับและไม่ซ้ำกัน จำนวนไบต์ต่ำสุดที่ชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต

กรณีทดสอบ

1 ->  [1]
2 ->  [2] (any prime number returns just itself)
4 ->  [4]
16 -> [7, 10, 16]
28 -> [7, 10, 16, 25, 28]
51 -> [37, 51]
60 -> [7, 10, 11, 13, 15, 16, 17, 18, 23, 25, 28, 29, 30, 32, 43, 46, 49, 53, 55, 56, 60]

@Zgarb หากคุณอนุญาตให้มีเชนของ 0 ตัวหารที่มีการบิดเบือนดังนั้นวิธีการที่ไม่สืบทอดหมายเลขอื่น ๆ ทุกหมายเลข?
rorlork

3
@rcrmn สำหรับฉันห่วงโซ่ของการดำเนินงานศูนย์หมายถึงการดำเนินงานประจำตัว ดังนั้นการอนุญาตให้ตัวหารศูนย์บิดเท่านั้นหมายความว่าทุกหมายเลขเป็นลูกหลานของตัวเอง
Zgarb

@Zgarb โอเคดังนั้นความหมายควรเปลี่ยนเพื่อแสดงว่าเพราะถ้าไม่ใช่เท่าที่ฉันสามารถบอกได้หมายเลขใด ๆ จะถือว่าเป็นลูกหลานของหมายเลขอื่น ฉันไม่รู้ว่าทำไมมันถึงต้องการการสะท้อนกลับ คุณจะอธิบายไหม
rorlork

@rcrmn ฉันเปลี่ยนข้อความเล็กน้อยตอนนี้ชัดเจนขึ้นหรือไม่?
Zgarb

@Zgarb ขออภัย แต่ไม่ใช่ไม่ใช่การดำเนินการคุณกำลังกำหนดความสัมพันธ์ระหว่างตัวเลข หากคุณกำหนดความสัมพันธ์<สำหรับตัวเลขธรรมชาติสำหรับทุก ๆ n คุณจะได้จำนวนน้อยกว่าทุกตัว แต่ไม่ใช่ตัวของมันเอง ฉันคิดว่านี่ควรเป็นสิ่งที่คล้ายกัน ด้วยวิธีนี้ฉันคิดว่ามีเพียง 4 คนเท่านั้นที่จะเป็นผู้สืบทอดของตัวเอง (ไม่แน่ใจเกี่ยวกับเรื่องนั้น)
rorlork

คำตอบ:


9

Python 2, 109 98 85 82 ไบต์

f=lambda n:sorted(set(sum(map(f,{n-x+n/x for x in range(2,n)if(n<x*x)>n%x}),[n])))

ตั้งแต่(a-1)*(b+1)+1 == a*b-(b-a)และb >= aลูกหลานจะน้อยกว่าหรือเท่ากับจำนวนเดิมเสมอ ดังนั้นเราสามารถเริ่มต้นด้วยหมายเลขเริ่มต้นและสร้างลูกหลานที่เล็กกว่าอย่างเคร่งครัดจนกว่าจะไม่มีใครเหลือ

เงื่อนไข(n<x*x)>n%xการตรวจสอบสิ่งที่สองในหนึ่ง - นั่นและn<x*xn%x == 0

(ขอบคุณ @xnor ที่สละ 3 ไบต์ออกจากเคสหลัก)

Pyth, 32 ไบต์

LS{s+]]bmydm+-bk/bkf><b*TT%bTr2b

การแปลโดยตรงจากด้านบนยกเว้นความจริงที่ว่าพี ธ ดูเหมือนจะหายใจไม่ออกเมื่อพยายามหาผลรวม ( s) ในรายการว่าง

นี่เป็นการกำหนดฟังก์ชั่นyที่สามารถเรียกได้โดยการต่อท้ายy<number>เมื่อสิ้นสุด (เช่นลองออนไลน์ ):

LS{s+]]bmydm+-bk/bkf><b*TT%bTr2by60

CJam, 47 45 ไบต์

{{:X_,2>{__*X>X@%>},{_X\/\-X+}%{F}%~}:F~]_&$}

นอกจากนี้ยังใช้วิธีการเดียวกันด้วยการปรับเปลี่ยนเล็กน้อย ฉันต้องการลองใช้ CJam เพื่อเปรียบเทียบ แต่โชคไม่ดีที่ฉันแย่กว่า CJAM ที่ Pyth / Python มากดังนั้นจึงอาจมีพื้นที่มากมายสำหรับการปรับปรุง

ด้านบนเป็นบล็อก (โดยทั่วไปแล้วเป็นเวอร์ชั่นของฟังก์ชันที่ไม่มีชื่อของ CJam) ที่รับค่า int และส่งกลับรายการ คุณสามารถทดสอบได้ ( ลองออนไลน์ ):

{{:X_,2>{__*X>X@%>},{_X\/\-X+}%{F}%~}:F~]_&$}:G; 60 Gp

ฉันไม่ใช่ผู้เชี่ยวชาญของงูหลาม แต่มีเหตุผลที่คุณต้องการset()อยู่หรือเปล่า คุณไม่สามารถส่งคืนรายการที่เรียงลำดับได้หรือไม่
Alex A.

@Alex set()คือการลบรายการที่ซ้ำกัน :)
Sp3000

ตกลง. เรียบร้อย เยี่ยมมาก!
Alex A.

คุณสามารถทำ[n]+sum(...,[])เช่นนั้นได้sum(...,[n])ไหม?
xnor

@xnor Ah ใช่ฉันทำได้ ฉันไม่เคยใช้อะไรเลย แต่[]เป็นกรณีพื้นฐานสำหรับการรวมรายการดังนั้นฉันลืมไปโดยสิ้นเชิง!
Sp3000

6

Java, 148 146 104 ไบต์

รุ่น Golfed:

import java.util.*;Set s=new TreeSet();void f(int n){s.add(n);for(int a=1;++a*a<n;)if(n%a<1)f(n+a-n/a);}

รุ่นยาว:

import java.util.*;
Set s = new TreeSet();
void f(int n) {
    s.add(n);
    for (int a = 1; ++a*a < n;)
        if (n%a < 1)
            f(n + a - n/a);
}

ดังนั้นฉันการเปิดตัวของฉันใน PPCG กับโปรแกรมนี้ซึ่งใช้TreeSet(ซึ่งโดยอัตโนมัติเรียงลำดับตัวเลขที่โชคดี) และการเรียกซ้ำคล้ายกับโปรแกรม Geobits' แต่ในลักษณะที่แตกต่างกันสำหรับการตรวจสอบหลายรายการnแล้วใช้พวกเขาใน ฟังก์ชั่นถัดไป ฉันจะบอกว่านี่เป็นคะแนนที่ค่อนข้างยุติธรรมสำหรับตัวจับเวลาครั้งแรก (โดยเฉพาะกับ Java ซึ่งดูเหมือนจะไม่เป็นภาษาที่เหมาะที่สุดสำหรับสิ่งนี้และความช่วยเหลือของ Geobits)


ยินดีต้อนรับสู่ PPCG! คุณสามารถบันทึกคู่โดยเปลี่ยนa*bเป็นnบรรทัดที่ 9
Geobits

ขอบคุณสำหรับการต้อนรับและข้อเสนอแนะ! ใช่ฉันใช้เวลาสักครู่เพื่อตรวจสอบสิ่งเล็ก ๆ เหล่านี้ ทุก ๆ ไบต์มีค่า! ขอบคุณอีกครั้ง!
TNT

นอกจากนี้คุณยังสามารถบันทึกอีกสองคนโดยการวางภายในc=n+a-b add()หรือคุณสามารถกำจัดcทั้งหมดและใช้n+a-bในทั้งสองแห่งสำหรับสองไบต์เดียวกันนั้น
Geobits

พูดถึงสิ่งที่ฉันไม่คิดว่าฉันต้องใช้addสองครั้ง รอสักครู่ ...
TNT

แต่การวนซ้ำครั้งที่สองไม่จำเป็นในภาพรวม หากคุณมีaที่คุณรู้ว่าแบ่งnเรียบร้อยแล้วคุณไม่ควรที่จะหาห่วงก็เพียงb n/aณ จุดนั้นมันเริ่มเข้าใกล้ฉันมากขึ้น)
Geobits

4

Java, 157 121

นี่คือฟังก์ชั่นวนซ้ำที่รับค่าผู้สืบทอดของผู้สืบทอดแต่ละnราย ส่งคืน a TreeSetซึ่งเรียงลำดับตามค่าเริ่มต้น

import java.util.*;Set t(int n){Set o=new TreeSet();for(int i=1;++i*i<n;)o.addAll(n%i<1?t(n+i-n/i):o);o.add(n);return o;}

ด้วยการขึ้นบรรทัดใหม่:

import java.util.*;
Set t(int n){
    Set o=new TreeSet();
    for(int i=1;++i*i<n;)
        o.addAll(n%i<1?t(n+i-n/i):o);
    o.add(n);
    return o;
}

2

อ็อกเทฟ, 107 96

function r=d(n)r=[n];a=find(!mod(n,2:sqrt(n-1)))+1;for(m=(a+n-n./a))r=unique([d(m) r]);end;end

พริตตี้พิมพ์:

function r=d(n)
  r=[n];                          # include N in our list
  a=find(!mod(n,2:sqrt(n-1)))+1;  # gets a list of factors of a, up to (not including) sqrt(N)
  for(m=(a+n-n./a))               # each element of m is a twist
    r=unique([d(m) r]);           # recurse, sort, and find unique values
  end;
end

1
มันเป็นความเข้าใจของฉันว่าคู่สามารถจบบล็อกที่มีเพียงendมากกว่าและendfor endfunctionนั่นจะช่วยให้คุณประหยัด 11 ไบต์
Alex A.

เฮ้คุณพูดถูก! ไม่ใช่วิธีที่ฉันเรียนรู้ภาษาและไม่เคยรู้เลยว่าสามารถทำได้ ทำไมคุณถึงเป็นคนแรกที่ชี้เรื่องนี้หลังจากฉันเล่นกอล์ฟหลายสนามด้วยกัน?
dcsohl

ฉันเพิ่งรู้ว่าเพราะฉันเพิ่งเงยหน้าขึ้นมองหลังจากเห็นมันในสนามกอล์ฟของคนอื่นในคำถามอื่น ฉันไม่เคยใช้ Octave มานานแล้วนับตั้งแต่ฉันใช้ Matlab ฉันเดาว่ามีผู้ใช้ Octave ที่ใช้งาน PPCG อยู่ไม่มากนัก แต่ฉันก็คิดผิด
Alex A.

ขอบคุณมากสำหรับการชี้ให้เห็น
dcsohl

ความสุขของฉันดีใจที่ฉันสามารถช่วย ทางออกที่ดี
Alex A.

1

Haskell, 102 100 ไบต์

import Data.List
d[]=[]
d(h:t)=h:d(t++[a*b-b+a|b<-[2..h],a<-[2..b],a*b==h])
p n=sort$nub$take n$d[n]

การใช้งาน: p 16ผลลัพธ์ใด[7,10,16]

ฟังก์ชั่นdซ้ำคำนวณลูกหลานทุกคน แต่ไม่ได้ตรวจสอบสำหรับรายการที่ซ้ำกันจำนวนมากปรากฏมากกว่าหนึ่งครั้งเช่นd [4]ส่งกลับรายการที่ไม่มีที่สิ้นสุดของ4s ฟังก์ชั่นpใช้nองค์ประกอบแรกจากรายการนี้ลบรายการที่ซ้ำกันและเรียงลำดับรายการ voila


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