MaxMin除数ペア(DMDP)の違い


18

除数について話しましょう...

(しばらく)完全な二乗を除外すると、すべての正の整数は、それらの約数の2のとして表現できます。簡単な例126:ここにすべての約数があります126
ここに画像の説明を入力してください

ご覧のとおり、すべての除数をペアにすることができます。除数ペアと呼ぶものは次のとおりです。
[1, 126], [2, 63], [3, 42], [6, 21], [7, 18], [9, 14]

このチャレンジでは、このリストの最後のペア(写真の中央のペア)のみが必要です。
[9,14]このペアをMaxMin Divisor Pairと呼びます。MaxMin除数ペア
違い (DMDP)は、のもう[9,14]=5
1つの例であるペアの2つの要素の違いです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

これはです。バイト単位の最短回答が勝ちます。


10000第二の変数として入力する方が意味がありませんか?
ジョナサンアラン

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バイト。

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

オンラインでお試しください!


ÆDạ"Ṛ$ṂバイトをÆDạ:@¥⁸Ṃ1つ節約します(私は15のために-あまりにも似ていạ"ṚṂますȷ4RÆDÇ€<⁸S-編集:うーん、それとも:関与していません...どう思いますか?)
ジョナサンアラン


ああすごい。あなたはそれのために行く、私は別の2を保存する1バイトを保存しました!
ジョナサンアラン

説明を追加してもらえますか?
ケビン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;}

@Nevayのおかげで-10バイト。

説明:

ここで試してみてください。

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バイトを節約できます。
ネベイ

自分で試す時間はありませんが、内側のループをxから始めて、現在の最小値に追加の変数を持たせる方が短いでしょうか?
ジョリージョーカー

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

@Nevay繰り返しますが、本当にx>=i*iを使用するための代替手段として覚えておく必要がありMath.sqrtます。これは、私のコードでこれをゴルフしたのは2回目だからです。
ケビンCruijssen

2

R、73 77バイト

4バイトの@Guiseppeに感謝

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

オンラインでお試しください!

DMDPを計算するためのベクトル化関数を失い、現在、関数にsapplyを使用しています。入力よりも小さいアイテムの真実は、結果に対して合計されます。


ああ、私は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)) 中間要素が1つだけの場合、left = right。



1

MATL、20バイト

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

TIOでコードがタイムアウトします。オフラインコンパイラで実行する例を次に示します。

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


1

Mathematica、119 115バイト

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

私はついにこのことを機能させ、私は過去30分間試みてきました。._。

実行例

あなたのための説明はありません!


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<#]&
ジョンファンミン

また、10^4または1*^4より短い10000、と/@Range@にequaivalentされます~Array~
ジョンファンミン

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分

1

、19バイト

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

タイムアウトになるため、TIOリンクはありません。 このバージョンでは、10000の代わりに100を使用し、数秒で終了します。

説明

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

Japt25 19 17バイト

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

試して


説明

integerの暗黙的な入力U

L²õ

õ1〜100(L)の整数の配列()を生成します。

Èâ          Ã

Xの除数の配列(â)を生成する関数(現在の要素)をそれぞれ渡しますX

®    Ã

Z現在の要素である除数の配列にマッピングします。

aX/Z

絶対差を取得する(a)のZXで割りましたZ

d<U

d結果の配列の要素()のいずれかがより小さいUか?

è

真実の要素をカウントし、暗黙的に結果を出力します。



1

TI-BASIC、46バイト

TI-BASICはトークン化された言語であることに注意してください。また、2行目のEは、2ND +を押して見つかった小さな大文字のEです。

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になります。表示する場合は、さらに2バイト(改行と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 ....)
ミスターXcoder

Mr.Xcoderのコメントに基づく114バイト
-ovs

ovsのコメントに基づく113バイト
ミスターXcoder



0

VB.NET(.NET 4.5)116115バイト

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は^指数として使用します。一方、だから、100005つの文字である、10^4唯一の4です。
  • VBは、関数定義と同じ名前とタイプの自動変数を作成します(私の場合はA)。関数の最後にno 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.