ความแตกต่างของ MaxMin Divisor Pairs (DMDP)


18

พูดคุยเกี่ยวกับตัวหาร ...

ออกจากสี่เหลี่ยมที่สมบูรณ์แบบ (สักครู่) จำนวนเต็มบวกทั้งหมดสามารถแสดงเป็นผลคูณของตัวหาร 2 ตัวอย่างด่วนสำหรับ126: นี่คือตัวหารทั้งหมดของ126
ป้อนคำอธิบายรูปภาพที่นี่

ในขณะที่คุณสามารถเห็นตัวหารทั้งหมดสามารถจับคู่ได้ นี่คือสิ่งที่เราจะเรียกว่าDivisor Pairs :
[1, 126], [2, 63], [3, 42], [6, 21], [7, 18], [9, 14]

สำหรับความท้าทายนี้เราจะต้องมีเพียงคู่สุดท้ายของรายการนี้ (ซึ่งเป็นคู่ศูนย์ของภาพ):
[9,14]เราจะเรียกคู่นี้MaxMin หารคู่
ความแตกต่างของ MaxMin Divisor Pair (DMDP)คือความแตกต่างของสององค์ประกอบของคู่ซึ่งเป็น[9,14]=5
อีกตัวอย่าง544หนึ่ง ตัวหารคือ:

[1, 2, 4, 8, 16, 17, 32 , 34, 68, 136, 272, 544]

และDMDP (544) = 15 เพราะ32-17=15

แล้วสี่เหลี่ยมที่สมบูรณ์แบบล่ะ? สี่เหลี่ยมที่สมบูรณ์แบบทั้งหมดมีDMDP = 0
ลองยกตัวอย่าง64จากตัวหาร

{1, 2, 4, 8 , 16, 32, 64}

ที่คุณสามารถดูในกรณีนี้MaxMin หารคู่เป็น[8,8]ที่มีDMDP=0
เราจะทำเกือบ ..

ความท้าทาย

ได้รับจำนวนเต็มn>0เอาท์พุทว่าหลายจำนวนเต็มน้อยกว่าหรือเท่ากับ 10000 , มี DMDP น้อยกว่า n

กรณีทดสอบ

อินพุต -> เอาต์พุต

1->100 (those are all the perfect squares)
5->492  
13->1201
369->6175  
777->7264  
2000->8478  
5000->9440  
9000->9888  
10000->10000   
20000->10000

นี่คือ .Shortest คำตอบไบต์ชนะ


มันจะไม่สมเหตุสมผลกว่าหรือที่จะมีตัว10000ที่สองเป็นตัวแปรอินพุท?
Jonathan Allan

1
ใช่ฉันคิดเกี่ยวกับเรื่องนี้ แต่มันจะไม่เพิ่มอะไรให้กับความท้าทาย ด้วยวิธีนี้ฉันคิดว่ามันง่ายสำหรับทุกคนที่จะเข้าใจความท้าทาย

คำตอบ:


5

JavaScript (ES7), 60 ไบต์

f=(n,i=1e4,j=i**.5|0)=>i?i%j?f(n,i,j-1):(i/j-j<n)+f(n,i-1):0

อาจเกินขีด จำกัด การเรียกซ้ำของคุณดังนั้นคุณอาจต้องการเวอร์ชันที่ซ้ำได้ 70 ไบต์:

n=>[...Array(1e4)].map(g=(j=++i**.5|0)=>i%j?g(j-1):k+=i/j-j<n,i=k=0)|k

4

เยลลี่ขนาด 13 ไบต์

1 ไบต์ขอบคุณ Jonathan Allan

ȷ4RÆDạU$Ṃ€<⁸S

ลองออนไลน์!


ÆDạ"Ṛ$Ṃช่วยคุณประหยัด byte มากกว่าÆDạ:@¥⁸Ṃ(ฉันมีạ"ṚṂ... ȷ4RÆDÇ€<⁸Sสำหรับ 15 - คล้ายกันมากเกินไป - แก้ไข: อืมหรือไม่ก็ไม่มี:ส่วนเกี่ยวข้อง ... คุณคิดอย่างไร?)
Jonathan Allan

@JonathanAllan ฉันคิดว่าคุณควรโพสต์13-byter นี้
Leaky Nun

โอ้ว้าว. ไม่เลยคุณไปฉันบันทึกคุณหนึ่งไบต์ที่บันทึกอีก 2!
Jonathan Allan

คุณสามารถเพิ่มคำอธิบายได้ไหม?
Kevin Cruijssen

4

Java 8, 151 111 110 101 ไบต์

n->{int r=0,x=10000,i;for(;x-->0;r-=i-n>>-1)for(i=x;i-->1;)if(x>=i*i&x%i<1){i=x/i-i;break;}return r;}

-10 ไบต์ขอบคุณ@Nevay @Nevay

คำอธิบาย:

ลองที่นี่

n->{               // Method with integer as parameter and return-type
  int r=0,         //  Result-integer
      x=10000,     //  Index-integer starting at 10,000
      i;           //  Another index-integer for the inner loop
  for(;x-->0;      //  Loop (1) from 10,000 down to 0
      r-=i-n>>-1)  //   If the MaxMin-Divisor Pair's difference is lower than the input,
                   //    add 1 to the result (after every iteration)
    for(i=x,       //   Set `i` to `x`
        i-->1;)    //   Inner loop (2) from `i` downwards to 1
      if(x>=i*i    //    If the current square-root of `x` is smaller than or equal to `i`,
         &x%i<1){  //    and if the current `x` is divisible by `i`:
        i=x/i-i;   //     Calculate the MaxMin-Division difference
        break;}    //     And leave the inner loop (2)
                   //   End of inner loop (2) (implicit / single-line body)
                   //  End of loop (1) (implicit / single-line body)
  return r;        //  Return the result
}                  // End of method

1
คุณสามารถใช้for(i=1,i+=Math.sqrt(x);--i>0;)if(...เพื่อบันทึก 1 ไบต์
Nevay

ไม่มีเวลาลองด้วยตัวเอง แต่มันจะสั้นกว่าไหมถ้าการวนซ้ำภายในเริ่มต้นจาก x และมีตัวแปรพิเศษสำหรับค่าต่ำสุดในปัจจุบัน
JollyJoker

1
101 ไบต์:n->{int r=0,x=10000,i;for(;x-->0;r-=i-n>>-1)for(i=x;i-->1;)if(x>=i*i&x%i<1){i=x/i-i;break;}return r;}
2560

@Nevay ขอบคุณอีกครั้งต้องจำไว้ว่าx>=i*iเป็นทางเลือกสำหรับการใช้Math.sqrtงานเนื่องจากนี่เป็นครั้งที่สองที่คุณเล่นกอล์ฟในรหัสของฉัน
Kevin Cruijssen

2

R , 73 77ไบต์

ขอบคุณ @Guiseppe สำหรับ 4 ไบต์

sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())

ลองออนไลน์!

ทำให้ฟังก์ชั่น vectorize สูญเสียการคำนวณ DMDP และตอนนี้ใช้ฟังก์ชันเหนือสิ่งอื่นใด ความจริงสำหรับรายการที่น้อยกว่าอินพุทจะถูกรวมเข้ากับผลลัพธ์


อ่าฉันไม่ได้สังเกตว่า DMDP นั้นต่างจากรายการตัวคูณเล็กน้อย! ดีมาก. ฉันคิดว่าsum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())มันสั้นกว่านี้เล็กน้อย
จูเซปเป้

2

Mathematica, 64 ไบต์

Count[Divisors~Array~1*^4,a_/;#+a[[i=⌈Tr[1^a]/2⌉]]>a[[-i]]]&

ลองใช้กับ Wolfram Sandbox

การใช้

f = Count[Divisors~Array~1*^4,a_/;#+a[[i=⌈Tr[1^a]/2⌉]]>a[[-i]]]&

 

f[1]
100
f /@ {1, 5, 13, 369, 777, 2000, 5000, 9000, 10000, 20000}
{100, 492, 1201, 6175, 7264, 8478, 9440, 9888, 10000, 10000}

คำอธิบาย

Divisors~Array~1*^4

สร้างรายการของตัวหารจากไป1 10000(รายการตัวหารจะถูกจัดเรียงโดยอัตโนมัติ)

Count[ ..., a_/; ... ]

นับจำนวนการเกิดขององค์ประกอบaเช่น ...

#+a[[i=⌈Tr[1^a]/2⌉]]>a[[-i]]]

(input) + (left one of the middle element(s)) > (right one of the middle element(s)) หากมีเพียงองค์ประกอบกลางเดียวให้ซ้าย = ขวา


2

05AB1E , 19 18 17 16 15 12 ไบต์

4°ƒNÑÂα{нI‹O

ลองออนไลน์!

คำอธิบาย

4°ƒ            # for N in [0 ... 10**4] do:
   NÑ          # push divisors of N 
     Â         # bifurcate
      α        # element-wise absolute difference
       {       # sort
        н      # pop the head (smallest difference)
         I‹    # is it smaller than the input?
           O   # sum the stack


1

R , 91 ไบต์

function(n)sum(sapply(1:1e4,function(x,d=(1:x)[x%%1:x<1])diff(d[median(seq(d))+.5*0:1]))<n)

ใช้วิธีที่แตกต่าง (แย่กว่า) ในการคำนวณ DMDP มากกว่าวิธีแก้ปัญหาของ MickyTโดยใช้การทำดัชนีอาร์เรย์และdiffคำนวณ อนิจจา.

ลองออนไลน์!


1

Mathematica, 119 115 ไบต์

(n=#;Tr[1^Select[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),#<n&]])&

ผม ในที่สุดก็สามารถทำงานได้และฉันก็พยายามมาครึ่งชั่วโมงแล้ว ._

ตัวอย่างการวิ่ง

no description for you!


Casesเป็นไบต์สั้น:4 Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&ดูเคล็ดลับนี้
ngenisis

1
@ngenisis จริงแม้จะสั้นกว่าCount CasesCount[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+‌​(1+Length@Divisors@#‌​)/2]]&/@Range@10000)‌​,n_/;n<#]&
JungHwan Min

นอกจากนี้10^4หรือ1*^4สั้นกว่า10000และ/@Range@เป็น equaivalent ~Array~ไป
JungHwan Min

1

Mathematica, 78 ไบต์

(s=#;Tr[1^Select[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],#<s&]])&

Casesเป็นไบต์สั้น:4 Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&ดูเคล็ดลับนี้
ngenisis

1
@ngenisis Countยิ่งสั้นลง:Count[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^‌​4}],s_/;s<#]&
JungHwan Min

1

Husk , 19 ไบต์

#ȯV<⁰Sz≠↔§f`¦ḣḣ□100

ไม่มีลิงก์ TIO เนื่องจากหมดเวลา รุ่นนี้ใช้ 100 แทนที่ 10,000 และเสร็จสิ้นในไม่กี่วินาที

คำอธิบาย

Husk ยังไม่มีตัวหารหรือสนับสนุนสัญลักษณ์ทางวิทยาศาสตร์

#ȯV<⁰Sz≠↔§f`¦ḣḣ□100  Input is n (accessed with ⁰).
               □100  Square of 100: 10000
              ḣ      Inclusive range from 1.
#                    Count number of elements for which
 ȯ                   this composition of 3 functions gives truthy result:
                       Argument k, say k = 12.
         §f`¦ḣ         Divisors of k:
             ḣ           Range: [1,2,3,..,12]
         §f              Filter by
           `¦            divides k: [1,2,3,4,6,12]
     Sz≠↔              Absolute differences of divisor pairs:
        ↔                Reverse: [12,6,4,3,2,1]
     Sz                  Zip with divisor list
       ≠                 using absolute difference: [11,4,1,1,4,11]
  V<⁰                  Is any of these less than n?

1

Japt , 25 19 17 ไบต์

L²õÈâ ®aX/ZÃd<UÃè

ทดสอบมัน


คำอธิบาย

Uการป้อนข้อมูลโดยนัยของจำนวนเต็ม

L²õ

สร้างอาร์เรย์ของจำนวนเต็ม ( õ) จาก 1 ถึง 100 ( L) ยกกำลังสอง

Èâ          Ã

ผ่านแต่ละผ่านฟังก์ชั่น (ซึ่งXเป็นองค์ประกอบในปัจจุบัน) ที่สร้างอาร์เรย์ของตัวหารด้วย ( â) Xของ

®    Ã

แผนที่เหนืออาร์เรย์ของตัวหารซึ่งZเป็นองค์ประกอบปัจจุบัน

aX/Z

ได้รับความแตกต่างสัมบูรณ์ ( a) ของZและหารด้วยXZ

d<U

มีองค์ประกอบใด ๆ ( d) ในอาร์เรย์ผลลัพธ์น้อยกว่าUหรือไม่

è

นับองค์ประกอบที่เป็นความจริงและส่งออกผลลัพธ์โดยปริยาย



1

TI-BASIC ขนาด 46 ไบต์

โปรดทราบว่า TI-BASIC เป็นภาษาโทเค็น นอกจากนี้ E ในบรรทัดที่ 2 ยังเป็นตัวพิมพ์ใหญ่ E ซึ่งพบได้โดยกด 2ND +,

Input A
DelVar DFor(B,1,E4
For(C,1,√(B
If not(fPart(B/C
B/C-C<A
End
D+Ans→D
End

ผลลัพธ์จะเป็น D และ Ans ทันทีหลังจากเรียกใช้งานโปรแกรม ถ้ามันจะถูกแสดงการเพิ่มอีกสองไบต์ (ขึ้นบรรทัดใหม่และAns) จะพอเพียง


0

Python 2 , 134 ไบต์

lambda i:len(filter(lambda n:n<i,[reduce(lambda x,y:y-x,[[x,n/x]for x in range(1,int(n**.5+1))if n%x<1][-1])for n in range(1,10001)]))

ลองออนไลน์!

Eugh ... ต้องทำมากดีกว่า


125 ไบต์ (-9 ไบต์)โดยใช้วิธีการปัจจุบันของคุณ แต่แทนที่len(filter(lambda n:n<i,...))ด้วยsum(n<i for n in ....)
Mr. Xcoder

114 ไบต์ขึ้นอยู่กับความคิดเห็นของ Mr.Xcoder '
ovs

113 ไบต์ขึ้นอยู่กับความคิดเห็นของ ovs
Mr. Xcoder


0

PHP, 94 + 1 ไบต์

for(;$n++<1e4;$c+=$d<$argn)if(($i=$n**.5)>~~$i){while($n%++$i);for($d=1;$n%--$i;)$d++;}echo$c;

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์


0

VB.NET (.NET 4.5) 116 115 ไบต์

Function A(n)
For i=1To 10^4
Dim s As Byte=Math.Sqrt(i)
While i Mod s>0
s-=1
End While
A-=i/s-s<n
Next
End Function

คำอธิบาย:

ฟังก์ชั่นที่ใช้ nเป็นพารามิเตอร์และส่งคืนผลลัพธ์

เริ่มต้นที่สแควร์รูทและมองหาจำนวนเต็มที่ใกล้ที่สุดที่แบ่งเท่า ๆ กัน (จะเล็กกว่าMaxMin Divisor Pair) จากนั้นรับคู่ที่ใหญ่กว่า (i/s ) ค้นหาความแตกต่างและเปรียบเทียบกับอินพุต


กลยุทธ์การเล่นกอล์ฟที่ใช้:

  • Dim มีราคาแพงดังนั้นตัวแปรที่ฉันประกาศน้อยกว่าก็ดีกว่า
  • ฉันเริ่มค้นหาที่สแควร์รูท แต่ต้องการดูที่จำนวนเต็มเท่านั้น โดยการประกาศsว่าเป็นประเภทที่สมบูรณ์มันก็เหวี่ยงกับพื้นสำหรับฉัน
  • VB ใช้^เป็นเลขชี้กำลัง ดังนั้นในขณะที่10000เป็น 5 ตัวอักษร10^4เป็นเพียง 4
  • VB สร้างตัวแปรอัตโนมัติที่มีชื่อและประเภทเดียวกับคำนิยามฟังก์ชัน (ในกรณีของฉัน A) ในตอนท้ายของฟังก์ชั่นถ้าไม่มีreturnค่าของตัวแปรฟังก์ชั่นจะถูกส่งกลับแทน ดังนั้นฉันจึงบันทึกอักขระโดยไม่ประกาศตัวแปรแยกต่างหากและไม่ใช้คำสั่ง return
  • VB มีการพิมพ์ / การพิมพ์และการให้อภัยอย่างมาก iจะถือว่าเป็นIntegerเพราะฉันได้รับมอบหมายจำนวนเต็มตามตัวอักษร Aสันนิษฐานว่าObjectแต่ทันทีที่ฉันเพิ่มจำนวนเต็มมันจะทำงานเหมือนIntegerแต่ทันทีที่ฉันเพิ่มจำนวนเต็มมันจะทำงานเหมือน
  • แทนที่จะifตรวจสอบความแตกต่างว่าเป็นที่น่าพอใจให้เพิ่มไปยังผลลัพธ์โดยตรงโดยการส่งบูลีนไปยังจำนวนเต็ม อย่างไรก็ตาม VB ใช้-1สำหรับTrueดังนั้นลบเพื่อให้ได้เครื่องหมายที่ถูกต้อง
  • ในทางเทคนิคเราModไม่0ต้องการ การมอดุลัสของจำนวนลบใน VB.NET จะให้ผลลบ แต่ทุกอย่างเป็นบวกดังนั้นฉันสามารถบันทึกไบต์ด้วยการเปลี่ยนเข้าสู่<>>
  • จำนวนที่มากที่สุดในการตรวจสอบคือ 10000 สแควร์รูทของนั่นคือ 100 ดังนั้นฉันจะต้องByteเก็บไว้เท่านั้นโดยบันทึกเป็นไบต์ในการประกาศโดยใช้ชนิดที่มีชื่อที่สั้นกว่า

ลองออนไลน์!


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