ゼロ配当


28

チャレンジの説明

すべての正の整数nには、すべてので始まりすべてで終わる10進数などで111...10...000割り切れる形式の数値が存在します。これは証明するのが非常に簡単です:(すべての)の形で異なる数のセットをとる場合、少なくとも2つは(鳩の巣の原理による)除算後に同じ剰余を与えます。これらの2つの数値の差は、割り切れ、希望する形式になります。あなたの目的は、この番号を見つけるプログラムを書くことです。n10n+1111...1111nn

入力説明

正の整数。

出力の説明

のようなp形式の数。複数ある場合は、それらのいずれかを表示します(最小のものである必要はありません)。111...10...000p ≡ 0 (mod n)

ノート

プログラムは妥当な時間内に答えを出さなければなりません。つまり、総当たり攻撃は許可されていません。

p = 0
while (p != 11..10.00 and p % n != 0)
    p++

どちらでもありません:

do
    p = random_int()
while (p != 11..10.00 and p % n != 0)

の形式で数字を繰り返す11..10..00ことは許可されます。

プログラムは、任意の大きさの入力を処理する必要はありません-上限は、言語の上限になります。

サンプル出力

2: 10
3: 1110
12: 11100
49: 1111111111111111111111111111111111111111110
102: 1111111111111111111111111111111111111111111111110

可能な出力の合理的な上限を設定できますか?(配列またはリストが一部の実装に必要となる可能性があるため、約24億未満(符号付き整数の最大値)で十分です)
Tamoghna Chowdhury

@MartinBüttner最初に満足のいく出力で十分だと思います(合理的な時間枠の制約)
タモフナチョードリー

最後の0は、49テストケースでは必要ありません。
CalculatorFeline

@CatsAreFluffy私はすべての数字が少なくとも含まれてする必要があると思う11と少なくとも0そうでない場合、0任意の入力のためのソリューションです。(ただし、これを明確にするとよいでしょう。)
マーティンエンダー

必要なのは1つだけ1です。
CalculatorFeline

回答:


22

Mathematica、29バイト

⌊10^(9EulerPhi@#)/9⌋10^#&

マーティン・ブットナーによるコード。

入力ではn、これは9*ϕ(n)1の後にnゼロが続く数値を出力します。ここϕで、はオイラートーティエント関数です。関数ではphi、これはPythonで次のように表現できます。

lambda n:'1'*9*phi(n)+'0'*n

n!代わりに階乗を使用することで十分ですがϕ(n)、その多くを印刷することは妥当な実行時間を持ちません。

主張: ゼロが9*ϕ(n)続くものnはの倍数ですn

証明:まず、聞かせてのは、ケースのためにこれを証明するnの倍数でない23または5。1で構成される数ϕ(n)が `nの倍数であることを示します。

1で構成される数はにk等しくなり(10^k-1)/9ます。以来nの倍数ではない3、これは、の倍数であるn限りとして10^k-1の要因であるn、または同等になら10^k = 1 (mod n)。この定式化によりk、1の数で機能する場合、の倍数も機能することが明らかになりkます。

そこで、我々は探しているkの倍数になるように順序k乗法群の法nラグランジュの定理、そのような順序は、グループの大きさの約数です。グループの要素はから1までの数であるnためn、そのサイズはオイラーのtotient関数 ϕ(n)です。したがって、を示しました10^ϕ(n) = 1 (mod n)。したがって、1で構成される数ϕ(n)は `nの倍数です。

さて、の潜在的な要因任せ3ではn。これ10^ϕ(n)-1はの倍数であることがわかっていますnが、(10^ϕ(n)-1)/9そうでない場合があります。しかし、(10^(9*ϕ(n))-1)/9は1 9で構成されるため、の倍数であるため9*ϕ(n)、その桁数の合計はの倍数になり9ます。そして、指数kに定数を掛けると、可分性が保持されることに注意しました。

さて、もしnの要因がある2のと5のを、私たちは、出力の最後にゼロを追加する必要があります。nゼロを使用するだけで十分です(実際に使用log_2(n)します)。したがって、入力nがとして分割される場合、1がの倍数で、乗算でが倍数になるようにn = 2^a * 5^b * mすれば十分です。また、はの倍数なので、1 を使用するだけで十分です。したがって、1の後にゼロが続くように機能します。9*ϕ(m)n10^n2^a * 5^bnm9*ϕ(n)9*ϕ(n)n


12
これが私の許可なしに投稿されたと誰も考えないようにするために:xnorは独自にメソッドと証明を思い付き、組み込みEulerPhi関数を持っているのでMathematica実装を提供しました。実際の実装に衝撃を与えるものは何もないので、これは完全に彼自身の仕事だと思います。
マーティンエンダー

9

Python 2、44バイト

f=lambda n,j=1:j/9*j*(j/9*j%n<1)or f(n,j*10)

jが1000のような10のべき乗である場合、フロア分割j/9は111のような1で構成される数を与えます。したがって、j/9*j1の後に111000のような等しい数の0が続きます。

この関数は、この形式の数値を再帰的にテストし、目的の数値の倍数である数値が見つかるまで、10の累乗を試行します。


1
ああ、良い点、我々は唯一^ N0 ^ nは... 1チェックする必要があります
マーティン・エンダー

@MartinBüttner簡単であれば、0の数を入力値に修正するだけで十分です。しかし、それだけ多くのゼロを印刷することが効率的であると見なされるかどうかはわかりません。
XNOR

1 ^ n0 ^ nのチェックが機能するのはなぜですか?
リン

5
@Lynnゼロを追加しても問題はありません。1の数は無限に多く、ある数には1とゼロの両方が十分にあります。
-xnor

5

Pyth、11バイト

.W%HQsjZ`TT

テストスイート

基本的には、数字が入力で割り切れるまで、前に1を、後ろに0を何度も繰り返します。

説明:

.W%HQsjZ`TT
                Implicit: Q = eval(input()), T = 10
.W              while loop:
  %HQ           while the current value mod Q is not zero
      jZ`T      Join the string "10" with the current value as the separator.
     s          Convert that to an integer.
          T     Starting value 10.

4

Haskell、51バイト

\k->[b|a<-[1..],b<-[div(10^a)9*10^a],b`mod`k<1]!!0

xnorのアプローチを使用します。nimiがバイトを節約しました!


3

CJam、28 25 19バイト

フォームの数だけを見る必要があるというxnorの観察で6バイトを保存しました。1n0n

ri:X,:)Asfe*{iX%!}=

ここでテストしてください。

説明

ri:X    e# Read input, convert to integer, store in X.
,:)     e# Get range [1 ... X].
As      e# Push "10". 
fe*     e# For each N in the range, repeat the characters in "10" that many times,
        e# so we get ["10" "1100" "111000" ...].
{iX%!}= e# Select the first element from the list which is divided by X.

2

Mathematica、140 55バイト

NestWhile["1"<>#<>"0"&,"1",FromDigits@#~Mod~x>0&/.x->#]

xnorの1 ^ n0 ^ nトリックのおかげで多くのバイトが削除されました。

最小値、140 156バイト これにより、可能な最小のソリューションが得られます。

NestWhile["1"<>#&,ToString[10^(Length@NestWhileList[If[EvenQ@#,If[10~Mod~#>0,#/2,#/10],#/5]&,#,Divisors@#~ContainsAny~{2, 5}&],FromDigits@#~Mod~m>0&/.m->#]&

必要なゼロの数を計算し1、動作するまですべての可能なカウントをチェックします。0なしで数値を出力できますが<>"0"、最後の直前に追加することで修正できます&


2

Haskell、37バイト

f n=[d|d<-"10",i<-[1..n*9],gcd n i<2]

これは、使用しています事実、それは持って働くこと9*phi(n)のもの、phiオイラートーティエント関数であるが。ここでは、を使用gcdしてフィルター処理を実装iし、範囲1and にある、それに対して比較的素数の値ごとに1桁を生成し9*nます。また、この多くのゼロを使用するだけで十分です。


2

JavaScript(ES6)、65バイト

2バイト保存されたthx @Neilを編集

有効数字17桁のjavascript数値型の制限内で機能します。(非常に限られている)

a=>{for(n='';!(m=n+=1)[17];)for(;!(m+=0)[17];)if(!(m%a))return+m}  

少ないゴルフ

function (a) {
    for (n = ''; !(m = n += '1')[17]; )
        for (; !(m += '0')[17]; )
            if (!(m % a))
                 return +m;
}

1
どうしてfor(m=n;
ニール

@Neilは、少なくとも1つのゼロが必要だからです。おそらくもっと短い方法を見つけることができます...(編集のためのthx)
-edc65

ああ、それは質問では明確ではありませんでしたが、サンプル出力にはすべて少なくとも1つのゼロがあることがわかりました。その場合でも、を使用してバイトを保存できますfor(m=n;!m[16];)if(!((m+=0)%a))
ニール

1
@Neilまたは2バイト。Thx
edc65

1

Perl 5、26バイト

のバイトを含む-n-M5.01無料)

($.="1$.0")%$_?redo:say$.


0

bc、58バイト

define f(n){for(x=1;m=10^x/9*10^x;++x)if(m%n==0)return m;}

サンプル結果

200: 111000
201: 111111111111111111111111111111111000000000000000000000000000000000
202: 11110000
203: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000
204: 111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000
205: 1111100000
206: 11111111111111111111111111111111110000000000000000000000000000000000
207: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
208: 111111000000
209: 111111111111111111000000000000000000
210: 111111000000
211: 111111111111111111111111111111000000000000000000000000000000
212: 11111111111110000000000000
213: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
214: 1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000
215: 111111111111111111111000000000000000000000
216: 111111111111111111111111111000000000000000000000000000
217: 111111111111111111111111111111000000000000000000000000000000
218: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
219: 111111111111111111111111000000000000000000000000

0

dc、27バイト

Odsm[O*lmdO*sm+O*dln%0<f]sf

これはf、変数で引数を受け取る関数を定義しますn。プログラムとして使用し?sn lfx p、stdinから読み取り、関数を呼び出し、結果をstdoutに出力します。変数mとスタックの最上部は、再利用するOdsm前に(を繰り返して)10にリセットする必要がありますf

結果:

200: 111000
201: 111111111111111111111111111111111000000000000000000000000000000000
202: 11110000
203: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000
204: 111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000
205: 1111100000
206: 11111111111111111111111111111111110000000000000000000000000000000000
207: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
208: 111111000000
209: 111111111111111111000000000000000000
210: 111111000000
211: 111111111111111111111111111111000000000000000000000000000000
212: 11111111111110000000000000
213: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
214: 1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000
215: 111111111111111111111000000000000000000000
216: 111111111111111111111111111000000000000000000000000000
217: 111111111111111111111111111111000000000000000000000000000000
218: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
219: 111111111111111111111111000000000000000000000000
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.