MaxMin Divisor Çiftlerinin (DMDP) Farklılıkları


18

Bölenler hakkında konuşalım ...

Mükemmel kareler bırakarak (bir an için), tüm pozitif tamsayı bölmelerinin 2'sinin ürünü olarak ifade edilebilir . Hızlı örnek 126: İşte tüm bölen126
resim açıklamasını buraya girin

Gördüğünüz gibi tüm bölenler eşleştirilebilir. Bölen Çiftleri olarak adlandıracağımız şeyler :
[1, 126], [2, 63], [3, 42], [6, 21], [7, 18], [9, 14]

Bu meydan okuma için sadece gerekir Bu listenin son çifti (olan merkez çifti resmin):
[9,14]Biz bu çifti arayacak Maksimin Bölen Çifti . Maksimin Bölen Çiftinin fark (DMDP) çiftin iki eleman farkı için bir örnek daha . Bölenler:
[9,14]=5
544

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

ve DMDP (544) = 15 çünkü32-17=15

Mükemmel karelere ne olacak ? Tüm mükemmel karelerde DMDP = 0
var Örneğin 64, bölenlerle alalım

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

Bu durumda görebileceğiniz gibi Maksimin Bölen Çifti olduğu [8,8]sahip olduğu DMDP=0
neredeyse bitti ..

Meydan okuma

Bir tamsayı Verilen n>0, çıkış ya da eşit az kaç tamsayılar 10000 , az DMDP var n

Test Durumları

girdi -> çıktı

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

Bu . Bayt en kısa cevap kazanır .


10000İkinci, değişken bir girdiye sahip olmak daha anlamlı olmaz mıydı ?
Jonathan Allan

1
Evet, bunu düşündüm ama bu meydan okumaya hiçbir şey katmayacaktı. Bu şekilde herkesin zorluğu anlaması daha kolay olduğunu düşünüyorum.

Yanıtlar:


5

JavaScript (ES7), 60 bayt

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

Muhtemelen özyineleme sınırınızı aşıyor, bu nedenle yineleme sürümünü 70 bayt için tercih edebilirsiniz:

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

4

Jöle , 13 bayt

Jonathan Allan'a 1 bayt teşekkürler.

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

Çevrimiçi deneyin!


ÆDạ"Ṛ$Ṃsize bir bayt kaydeder ÆDạ:@¥⁸Ṃ( 15 ạ"ṚṂ... ȷ4RÆDÇ€<⁸Siçin - çok benzer - EDIT: hmm ya da değil mi, :dahil değil ... ne düşünüyorsun?)
Jonathan Allan


Vay canına. nah bunun için gitmek, ben başka bir 2 kurtaran bir bayt kurtardı!
Jonathan Allan

Bir açıklama ekleyebilir misiniz?
Kevin Cruijssen

4

Java 8, 151 111 110 101 bayt

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;}

@Nevay sayesinde -10 bayt .

Açıklama:

Burada deneyin.

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 bayt kaydetmek için kullanabilirsiniz .
Nevay

Kendim denemek için zamanınız yok, ancak iç döngünün x'den başlaması ve geçerli minimum için ekstra bir değişken olması daha kısa olur mu?
JollyJoker

1
101 bayt: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;}
Nevay

@Nevay Tekrar teşekkürler, gerçekten x>=i*ikullanmak için alternatif olarak hatırlamak gerekiyor Math.sqrt, çünkü bu benim kodumu ikinci kez golf.
Kevin Cruijssen

2

R , 73 77 bayt

@Guiseppe'e 4 bayt için teşekkürler

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

Çevrimiçi deneyin!

DMDP'yi hesaplamak için vectorize fonksiyonunu kaybettiniz ve şimdi fonksiyon üzerinde bir aplik kullanıyor. Girdiden daha az olan öğelerin gerçekleri sonuç için toplanır.


Ah, DMDP'nin bu faktör listesinin en küçük farkı olduğunu fark etmedim! Çok hoş. Bence sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())biraz daha kısa
Giuseppe

2

Mathematica, 64 bayt

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

Wolfram Sandbox'ta deneyin

kullanım

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}

açıklama

Divisors~Array~1*^4

Dan bölenler listeleri oluşturun 1için 10000. (bölen listeleri otomatik olarak sıralanır)

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

Elemanların oluşumlarını sayın a, öyle ki ...

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

(input) + (left one of the middle element(s)) > (right one of the middle element(s)) Yalnızca bir orta eleman varsa, sol = sağ.


2

05AB1E , 19 18 17 16 15 12 bayt

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

Çevrimiçi deneyin!

açıklama

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

MATL , 20 bayt

1e4:"@Z\2Y"dJ2/)G<vs

Kod TIO'da zaman aşımına uğradı. Çevrimdışı derleyici ile çalışan bir örnek:

>> matl 1e4:"@Z\2Y"dJ2/)G<vs
> 13
1201


1

Mathematica, 119115 bayt

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

Ben nihayet çalışan bu şey var ve ben son yarım saat çalışıyorum. ._.

Örnek çalışma

no description for you!


Casesolduğu 4kısa bayt: Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&. Bu ipucuna bakın .
ngenisis

1
@ngenisis aslında Countdaha kısadır Cases. Count[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+‌​(1+Length@Divisors@#‌​)/2]]&/@Range@10000)‌​,n_/;n<#]&
JungHwan Min

Ayrıca, 10^4veya 1*^4daha kısadır 10000ve /@Range@eşittir ~Array~.
JungHwan Min

1

Mathematica, 78 bayt

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

Casesolduğu 4kısa bayt: Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&. Bu ipucuna bakın .
ngenisis

1
@ngenisis Countdaha da kısadır:Count[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^‌​4}],s_/;s<#]&
JungHwan Min

1

Kabuk , 19 bayt

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

Zaman aşımına uğradığı için TIO bağlantısı yok. Bu sürüm 10000 yerine 100 kullanır ve birkaç saniye içinde tamamlanır.

açıklama

Husk'un henüz bilimsel gösterim için yerleşik veya bölme desteği yok.

#ȯ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 bayt

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

Dene


açıklama

Örtük tamsayı girişi U.

L²õ

õ1 ile 100 ( L) arasında bir tamsayı ( ) dizisi oluşturun .

Èâ          Ã

Her birini, Xöğesinin ( â) bölücülerinden ( ) oluşan bir işlevden ( geçerli öğe nerede ) geçirin X.

®    Ã

ZGeçerli öğenin bulunduğu bölen dizisini eşleyin .

aX/Z

İle arasındaki mutlak farkı ( a) alın Zve Xbölün Z.

d<U

dOrtaya çıkan dizideki öğelerden ( ) herhangi biri daha küçük Umü?

è

Doğruluk unsurlarını sayın ve sonucu dolaylı olarak çıktılayın.



1

TI-BASIC, 46 bayt

TI-BASIC'in tokenleştirilmiş bir dil olduğunu unutmayın. Ayrıca, 2. satırdaki E, 2ND +, tuşlarına basılarak bulunan küçük bir başkent E'dir.

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

Sonuç, program yürütüldükten hemen sonra D ve Ans'ta olacaktır. Eğer görüntülenecekse, iki bayt (satırsonu ve Ans) daha eklemek yeterli olacaktır.




0

PHP, 94 + 1 bayt

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

Pipo ile çalıştırın -nRveya çevrimiçi deneyin .


0

VB.NET (.NET 4.5) 116115 bayt

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

Açıklama:

Alan bir işlev nParametre olarak ve sonucu döndüren .

Karekökünden başlar ve eşit olarak bölünen (en küçük olanı olacak) en yakın tamsayıyı arar MaxMin Divisor Pair. Sonra çifti ( i/s) büyütür, farkı bulur ve girişle karşılaştırır.


Kullanılan golf stratejileri:

  • Dim pahalı, bu yüzden daha az değişken daha iyi beyan ederim.
  • Karekökte arama yapmaya başladım, ancak sadece tamsayılara bakmak istiyorum. Bildirereksİntegral tip olarak benim için yere atıyor.
  • VB ^üs olarak kullanır . Yani iken 100005 karakter,10^4 sadece 4.
  • VB, işlev tanımıyla aynı ada ve türe sahip otomatik bir değişken oluşturur (benim durumumda A). Fonksiyonun sonunda, eğer yoksareturn fonksiyon değişkeninin değeri döndürülür. Bu yüzden karakterleri ayrı bir değişken bildirmeden ve bir return deyimi kullanarak kaydetmem.
  • VB çok bağışlayıcı yazım / döküm yapmıştır. bir tamsayı değişmez ideğeri atadığım için varsayılmıştır Integer. Aolduğu varsayılır, Objectancak bir tamsayı ekler eklemez, bir gibi davranır Integer.
  • Farkın iftatmin edici olup olmadığını kontrol etmek yerine , boole değerini bir tamsayıya dökerek doğrudan sonuca ekleyin. Ancak, VB kullanır -1için Truebu kadar doğru bir işaret almak için çıkarma.
  • Teknik Modolarak olmak istemiyoruz 0. VB.NET'te negatif bir sayının modülünü almak negatif bir sonuç verecektir. Ben çevirerek bir bayt kaydedebilmek için Fakat, her şey pozitiftir <>içine> .
  • Kontrol edilecek en büyük sayı 10000'dir. Bunun karekökü 100'dür. Bu yüzden, sadece Bytedaha kısa adlı bir tür kullanarak bildirimde baytları kaydederek bunu saklamak için ihtiyacım var .

Çevrimiçi deneyin!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.