ส่งคืนตัวเลขที่ n ของลำดับของอนุกรม aliquot


20

0. คำจำกัดความ

ลำดับคือรายการของตัวเลข ชุดคือผลรวมของรายการหมายเลขที่ ชุดจำนวนธรรมชาติประกอบด้วย "จำนวนเต็มไม่เป็นลบมากกว่าศูนย์" ทั้งหมด หาร (ในบริบทนี้) ของจำนวนธรรมชาติเจเป็นจำนวนธรรมชาติฉันเช่นว่าเจ ÷ ฉันยังเป็นจำนวนธรรมชาติ



1. PREAMBLE

สองคำถามอื่น ๆ บนเว็บไซต์นี้กล่าวถึงแนวคิดของการหารหรือลำดับของตัวหารของจำนวนธรรมชาติซึ่งน้อยกว่า การหาตัวเลขที่เป็นมิตรนั้นเกี่ยวข้องกับการคำนวณผลรวมของตัวหารเหล่านี้เรียกว่าผลรวมของ aliquot หรือ aliquot หมายเลขธรรมชาติทุกตัวมีผลรวมของส่วนลงตัวเองแม้ว่าค่าของผลรวมส่วนแบ่งของจำนวนนั้นไม่จำเป็นต้องไม่ซ้ำกันกับจำนวนนั้น ( Exempli gratiaทุกหมายเลขเฉพาะมีผลรวมส่วนลงตัวจำนวน 1)

2. ความท้าทาย

กำหนดจำนวนตามธรรมชาติnส่งคืนnตัวเลขหลักที่ลำดับของผลรวมของส่วนลงตัว หลายซีรีส์แรกในลำดับเริ่มต้นด้วยซีรีย์ 1 คือ:

{0, 1, 1, 3, 1, 6, 1, 7, 4, 8, 1, 16, 1, 10, 9, 15, 1, 21, 1, 22, 11, 14, 1, 36, 6, 16, 13}

ตัดแบ่งลักษณะเหล่านี้:

0113161748116110915121122111413661613

การป้อนข้อมูลอาจเป็นศูนย์ดัชนีหรือหนึ่งดัชนีตามการตั้งค่าของคุณ การแก้ปัญหาจะต้องเป็นโปรแกรมหรือฟังก์ชั่นที่สามารถส่งคืนตัวเลขที่ 10,000 (ป้อนได้ถึง9999หรือ10000) โซลูชั่นการทำงานที่สั้นที่สุดชนะ

3. กรณีทดสอบ

คู่ที่ถูกต้องของอินพุต - เอาท์พุตควรรวมถึง แต่ไม่ จำกัด เฉพาะดังต่อไปนี้:

   0 or     1    ->    0
   4 or     5    ->    1
  12 or    13    ->    6
9999 or 10000    ->    7

หมายเลขก่อนหน้า "หรือ" ถูกทำดัชนี 0; หมายเลขต่อไปนี้คือ 1-indexed
กรณีทดสอบเพิ่มเติมอาจมีให้ตามคำขอ

4. การอ้างอิง

OEIS มีรายการตัวเลขและจำนวนเงินส่วนแบ่ง


2
ความท้าทายแรกที่ดี btw :)
Martin Ender

1
ถ้าภาษาไม่สามารถจัดการสตริง 10k chars ได้ ?? (เช่นขีด จำกัด Oracle SQL 4k อันยิ่งใหญ่ ) เป็นคำตอบที่ถูกต้องถ้าเป็นขีด จำกัด ภาษา?
Giacomo Garabello

@ มาร์ตินเดอร์ขอบคุณ! และขอบคุณสำหรับลิงค์นั้น มันเป็นความสว่าง มีอะไรบ้างไหมที่อธิบายวิธีปฏิบัติต่อคำตอบในภาษาที่มีข้อ จำกัด ? ฉันไม่พบอะไรเลย แต่ฉันรู้ว่านั่นไม่ได้หมายความว่าไม่ได้อยู่ที่นั่น :)
Joe

ฉันอาจจะหนาอย่างสมบูรณ์ แต่ตัวเลขในซีรีส์นั้นคำนวณอย่างไร
Tom Carpenter

@TomCarpenter: สำหรับองค์ประกอบแรกให้ใช้ตัวหารทั้งหมดของ 1 ที่น้อยกว่า 1 และเพิ่มเข้าด้วยกัน (1 เป็นตัวหารเดียวของ 1 ดังนั้นองค์ประกอบแรกจะกลายเป็นศูนย์) องค์ประกอบที่สองตัวหารของ 2 ที่น้อยกว่า 2 (เพียง 1 ตรงนี้) ประการที่สามตัวหารของ 3 (ยังเป็นเพียง 1); และอื่น ๆ ตัวหารของ 4 คือ {1, 2}, และ 1 + 2 == 3, ดังนั้นองค์ประกอบที่สี่คือ 3 มันใช้เวลาสักครู่ในการคิดออกเช่นกัน;)
Joe

คำตอบ:


6

05AB1E , 14 11 10 ไบต์

คำนวณ n = 9999 ในเวลาประมาณ 15 วินาที รหัส:

ÌL€Ñ€¨OJ¹è

คำอธิบาย:

Ì           # Increment implicit input by 2
 L          # Generate the list [1 .. input + 2]
  ۄ        # For each, get the divisors
    ۬      # For each, pop the last one out
      O     # Sum all the arrays in the array
       J    # Join them all together
        ¹è  # Get the nth element

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .


6

Mathematica, 51 ไบต์

Array[##&@@IntegerDigits[Tr@Divisors@#-#]&,#][[#]]&

ฟังก์ชั่นที่ไม่มีชื่อซึ่งใช้และส่งกลับจำนวนเต็มและใช้การจัดทำดัชนีแบบ 1 จัดการอินพุต10000ทันที

คำอธิบาย

นี่คือการใช้คำจำกัดความตรงไปตรงมาทำให้การใช้ความจริงที่ว่าnตัวหารผลรวมแรกเพียงพอที่จะกำหนดnตัวเลขหลัก ตามปกติแล้วลำดับการอ่านของ Mathematica ที่ตีกอล์ฟนั้นค่อนข้างตลก แต่:

Array[...&,#]...&

สิ่งนี้จะสร้างรายการที่มีผลลัพธ์ทั้งหมดของการใช้ฟังก์ชันที่ไม่มีชื่อทางด้านซ้ายกับค่าทั้งหมดiจาก1ถึงnรวม

...Tr@Divisors@#-#...

เราเริ่มต้นด้วยการคำนวณตัวหารของiข้อสรุปพวกเขาด้วยTrและลบตัวเองเพื่อที่จะเป็นเพียงผลรวมของตัวหารน้อยกว่าii

...IntegerDigits[...]...

นี่จะเปลี่ยนผลลัพธ์เป็นรายการของเลขทศนิยม

##&@@...

และนี้เอารายการ "หัว" Arrayเพื่อให้ทุกรายการหลักจะถูกตัดแบ่งโดยอัตโนมัติในผลมาจากการ สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการ##ทำงานให้ดูที่ส่วน "ลำดับของอาร์กิวเมนต์" ในโพสต์นี้

...[[#]]

สุดท้ายเราก็เลือกnตัวเลขหลักจากผลลัพธ์


4

Brachylogขนาด 40 ไบต์

:2-I,?:?:1yrc:Im.;0.
:1e:2f+.
>.>0,?:.%0

นี่คือ 1 การจัดทำดัชนีจะใช้เวลาประมาณ 0.15 วินาทีN = 100, 15 N = 1000วินาที ฉันกำลังใช้งานอยู่N = 10000ฉันจะรายงานเวลาทำงานเมื่อสิ้นสุด (หากการประมาณของฉันถูกต้องควรใช้เวลาประมาณ 8 ชั่วโมง)

แก้ไข : โดยการแก้ไขข้อ จำกัด การแพร่กระจายก่อนกำหนดใน Brachylog ตอนนี้ (ในรหัสที่ยาวกว่า 3 ไบต์) ใช้เวลาประมาณ2.5นาที10000แต่จะส่งกลับout of global stackข้อผิดพลาด

คำอธิบาย

  • ภาคแสดงหลัก: Input = N

    :2-I,                 I = N - 2
         ?:?:1y           Find the N first valid outputs of predicate 1 with input N
               rc         Reverse and concatenate into a single number
                 :Im.     Output is the Ith digit of that number
                     ;    Or (I strictly less than 0)
                      0.  Output is 0
    
  • ภาคที่ 1: คำนวณผลรวมของตัวหาร

    :1e                   Get a number between N and 1
       :2f                Find all valid outputs of predicate 2 with that number as input
          +.              Output is the sum of those outputs
    
  • เพรดิเคต 2: รวมผลลัพธ์ด้วยตัวหารของอินพุต

    >.>0,                 Output is a number between Input and 0
         ?:.%0            Input is divisible by Output
    

1
คุณสามารถจัดสรรสแต็คโกลบอลมากขึ้นด้วย-Gตัวเลือก 128Mเริ่มต้นเพียง คุณสามารถใช้ตัวอย่างเช่น: swipl -G2Gเพื่อใช้ 2 GO
เสื่อ

4

Pyth, 26 21 20 15 ไบต์

@sm`sf!%dTtUdSh

ลองออนไลน์ ชุดทดสอบ

ใช้การจัดทำดัชนีแบบ 0 โปรแกรมคือ O (n²) และเสร็จสมบูรณ์สำหรับn = 9999 ในเวลาประมาณ 14 นาทีบนเครื่อง 2008 ของฉัน


มีอะไรขึ้นกับการค้นหาตัวหารที่ซับซ้อน f!%dTr1dสั้นกว่ามาก (แต่ช้ากว่า)
Jakube

@Jakube อ๊ะแก้ไขรุ่นผิดสำหรับ 20 byte solution
PurkkaKoodari

f!%TYtUTคือสิ่งที่ฉันเคยมี
PurkkaKoodari

@ Jakube ฉันเปลี่ยนเป็น มันยังคงทำงานอยู่สำหรับ n = 9999 ใช้งานเกิน 5 นาทีแล้ว: \
PurkkaKoodari

4

เยลลี่, 13 11 10 ไบต์

2 ไบต์ต้องขอบคุณ @Adnan และอีก 1 คนต้องขอบคุณ @Dennis

ÆDṖSDµ€Fị@

ลองออนไลน์!

ใช้การจัดทำดัชนีแบบอิง 1 เสร็จสิ้นสำหรับn = 10,000 ในไม่เกิน 2 วินาทีทางออนไลน์


ÆDṖSDµ€Fị@บันทึกเป็นไบต์
Dennis

@Dennis นั้นจะใช้กับโซ่แรกทั้งหมดหรือไม่
PurkkaKoodari

@ Pietu1998: ใช่แม่นยำ: โดยทั่วไปในเวลาแจง, ถูกนำไปใช้ chain.pop() if chain else chains.pop()โซ่ที่เพิ่งเริ่มใหม่นั้นว่างเปล่าดังนั้นโซ่สุดท้ายที่เสร็จสิ้นแล้วจะถูกใช้แทน
Lynn

3

PHP, 90 ไบต์

0 จัดทำดัชนีแล้ว

<?php for(;strlen($s)<=$a=$argv[1];$s.=$n)for($n=0,$j=++$i;--$j;)$i%$j||$n+=$j;echo$s[$a];

ไม่ละเอียดหรือด้วยวิธีที่ชาญฉลาดในการเข้าใกล้เลย
นอกจากนี้ตามปกติแล้วจะสร้างประกาศสามฉบับซึ่งจะถูกละเว้น


3

J , 34 ไบต์

{[:;1<@":@(-~>:@#.~/.~&.q:)@+i.@>:

นี่คือดัชนีเป็นศูนย์และใช้สูตรด้านล่างเพื่อคำนวณผลรวมของตัวหาร

สูตร

คำอธิบาย

{[:;1<@":@(-~>:@#.~/.~&.q:)@+i.@>:  Input: n
                                >:  Increment n
                             i.@    Create the range [0, 1, ..., n]
    1                       +       Add one to each to get [1, 2, ..., n+1]
          (               )@        For each value
                        q:            Get the prime factors
                   /.~&.              For each group of equal prime factors
                #.~                     Raise the first to the first power, the second
                                        squared and so on, and sum them
             >:@                        Increment that sum
                      &.q:            Reduce the groups using multiplication
           -~                         Subtract the initial value from that sum
       ":@                            Convert each to a string
     <@                               Box each
 [:;                                Unbox each and concatenate the strings
{                                   Select the character from that string at index n
                                    and return it

2

MATL , 16 15 ไบต์

:"@@q:\~fsV]vG)

การจัดทำดัชนีเป็นแบบ 1

กรณีทดสอบครั้งสุดท้ายหมดเวลาในคอมไพเลอร์ออนไลน์ แต่มันให้ผลลัพธ์ที่ถูกต้องกับคอมไพเลอร์ออฟไลน์ในเวลาประมาณ 15 วินาที

ลองออนไลน์!

:         % Take input n. Push [1 2 ... n]
"         % For each k in [1 2 ... n]
  @       %   Push k
  @q:     %   Push [1 2 ... k-1]
  \       %   Modulo. Zero values correspond to divisors
  ~f      %   Indices of zeros. These are the divisors
  s       %   Sum
  V       %   Convert to string
]         % End for each
v         % Concatenate all stack contents vertically
G)        % Take n-th digit. Implicitly display

2

Haskell, 52 ไบต์

(([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!)

ตัวอย่างการใช้งาน: ->(([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!) 126

มันเป็นการนำไปปฏิบัติโดยตรงของคำจำกัดความ: foreach nsum มันเป็นตัวหารและแปลงเป็นสตริง เชื่อมสตริงดังกล่าวทั้งหมดแล้วเลือกองค์ประกอบที่ดัชนีที่ร้องขอ ความเกียจคร้านของ Haskell ใช้เวลาnจากรายการที่ไม่ จำกัด[1..]เท่าที่จำเป็นเท่านั้น


1

Python 3.5, 103 93 92 ไบต์:

R=range;A=lambda f:''.join([str(sum([j for j in R(1,i)if i/j%1==0]))for i in R(1,f+1)])[f-1]

การใช้วิธีการที่อธิบายไว้ในโพสต์

ลองออนไลน์! (Ideone)

ไม่เสร็จภายใน 5 วินาทีที่กำหนดในคอมไพเลอร์ออนไลน์สำหรับการป้อนข้อมูล10000แต่จะเสร็จสิ้นในเครื่องของฉันสำหรับอินพุตเดียวกันภายในเวลาประมาณ 8.5 วินาที


1

ระดับแปดเสียง 71 ไบต์

อันนี้เป็นอ็อกเทฟเท่านั้น มันจะไม่ทำงานใน MATLAB ฟังก์ชั่นเสมือนจริงจะถูกสร้างขึ้นซึ่งทำงานกับตัวเลข 1 ดัชนี มันอาจจะง่ายขึ้นอีกเล็กน้อย จะมีลักษณะที่เย็นนี้

@(x)c((c=num2str(arrayfun(@(n)sum(b(~rem(n,b=(1:n-1)))),1:x)))~=' ')(x)

คุณสามารถลองออนไลน์ที่นี่

เพียงเรียกใช้คำสั่งด้านบนนำหน้าด้วยa=หรืออะไรก็ตาม (เพื่อให้คุณสามารถใช้ได้หลายครั้ง) จากนั้นทำa(10000)หรืออะไรก็ได้ ใช้เวลาประมาณ 7 วินาทีในการคำนวณว่าตัวเลขที่ 10,000 คือ 7


1

Java 8, 220 ไบต์

import java.util.stream.IntStream;
char a(int n){return IntStream.range(1,n+2).map(i->IntStream.range(1,i).filter(k->i%k==0).sum()).mapToObj(Integer::toString).collect(java.util.stream.Collectors.joining("")).charAt(n);}

มันเร็วอย่างน้อย มันเฉลี่ย 0.3 วินาทีเพื่อให้ได้องค์ประกอบที่ 9999 / 10,000 บนเครื่องของฉัน มันสร้างผลรวมส่วนลงตัวมากเท่ากับดัชนีที่คุณระบุ ซึ่งหมายความว่าสตริงจะยาวกว่าดัชนีของคุณเล็กน้อยในกรณีส่วนใหญ่เนื่องจากผลรวมของ aliquot บางอันมีตัวเลข 2 หลักหรือมากกว่า แต่ส่วนใหญ่จะสร้างสตริงตามความยาวที่เราต้องการเท่านั้น

การใช้งาน:

public static void main(String[] args) {
    System.out.println(a(0));
    System.out.println(a(4));
    System.out.println(a(12));
    System.out.println(a(9999));
}

Ungolfed:

public static void main(String[] args) {
    System.out.println(all(0));
    System.out.println(all(4));
    System.out.println(all(12));
    System.out.println(all(9999));
}

static int aliquotSum(int n) {
    return IntStream.range(1, n).filter(k -> n % k == 0).sum();
}

static IntStream sums(int n) {
    return IntStream.range(1, n + 2).map(i -> aliquotSum(i));
}

static String arraycat(IntStream a) {
    return a.mapToObj(Integer::toString).collect(java.util.stream.Collectors.joining(""));
}

static char all(int index) {
    return arraycat(sums(index)).charAt(index);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.