Nを分割しない最小の数を見つける


50

この課題は、それはすべてのタイトルに基本的だという単純な十分です:あなたは正の整数で与えられているNを、あなたはの除数ではない最小の正の整数を返す必要がありNを

例:N = 24の約数は1, 2, 3, 4, 6, 8, 12, 24です。そのリストにない最小の正の整数は5であるため、ソリューションが見つけるべき結果です。

これは、OEISシーケンスA007978です。

ルール

プログラムまたは関数を作成し、入力を受け取り出力を提供する当社の標準的な方法を使用できます。

任意のプログラミング言語を使用できますが、これらの抜け穴はデフォルトでは禁止されています。

これはであるため、バイト単位で測定された最短の有効な回答が勝ちます。

テストケース

最初の100の用語は次のとおりです。

2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 
3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 
2, 3, 2, 4, 2, 3, 2, 3, 2, 7, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 
3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3

特に、入力12に対して回答が機能することを確認してください。その場合、結果は入力よりも大きくなります。

そして、いくつかのより大きなテストケースの場合:

N          f(N)
1234567    2
12252240   19
232792560  23

サンプル出力文字列を数値のベクトルに変換し、それを24列に渡ってフォーマットすると、奇数偏差を除いて非常に反復的であることがわかりました。
発癌性

それは理にかなっています、24は0 mod 2、3、および4であるため、数値が4を超える列のみが違います。幅120ではさらに反復的です
CalculatorFeline

回答:


18

Mathematica、19バイト(UTF-8エンコーディング)

1//.x_/;x∣#:>x+1&

ゼロ以外の整数引数を取り、正の整数を返す名前のない関数。約半分の垂直バーは実際には3バイト文字U + 2223であり、これはMathematicaの可分性の関係を示しています。説明:

1                   Starting with 1,
 //.                apply the following rule until it stops mattering:
    x_                if you see a number x
      /;x∣#           such that x divides the function argument,
           :>x+1      replace it with x+1.
                &   Cool, that's a function.

追加して編集:ngenisis //.は、デフォルトで最大65536回反復することを指摘しています。そのため、この実装は、1から65538までの整数の最小公倍数よりも小さいすべての入力数(特に、最大28436桁のすべての数)で機能しますが、技術的にはすべての数ではありません。一つは、置き換えることができx//.yReplaceRepeated[x,y,MaxIterations->∞]この欠陥を修正するが、明らかに34追加バイトのコストで。


使用しないループに非常に興味深い方法ForWhileなどが
ngenisis

5
このサイトから学んだ!私はここにいることでMathematicaについてもっと学ぶことを間違いなく楽しんでいます(タイムシートでそれを正当化できますか...)。
グレッグマーティン

3
これはMathematicaのO_Oようには見えません
ママ楽しいロール

2
大文字と括弧の欠如に
グレッグマーティン


14

Pyth、3バイト

f%Q

基本的に、(where は反復変数)がtrueになるfまでコードをループします。%QTQ % TT

こちらからオンラインでお試しください。


2
問題を見た、この答えをした、それを投稿するためにここに来て、あなたのものを見つけた。よくやった!
isaacg

私はこれを書いて、自分自身について素晴らしいと感じました:.V1In%Qb0bBあなたの答えを見ました、そしてもうそれほど素晴らしいと感じません。
ジョンレッド

@JohnRed Lol、Pythのビルトインに慣れる必要があると思います。
-busukxuan

14

JavaScript(ES6)、25 23バイト

f=(n,k)=>n%k?k:f(n,-~k)

注:ここで興味深いのは、kパラメーターが最初の反復でnihiloで初期化されることです。これは作品のためn % undefinedであるNaN(予想通りfalsy)と-~undefined等しいです1。次の反復で-~kは、はと本質的に同等k+1です。

テスト


まさに私が得たもの。より短いものが可能な場合、私は驚きます
-ETHproductions

@ETHproductions考え直してみると、短いものがあります。:
アーナルド

5
あの それは...ええと...すごい。
ETHproductions

13

Python、43 36 35バイト

f=lambda n,d=2:d*(n%d>0)or f(n,d+1)


11

R、28バイト

とても簡単で、空想もありません。stdinから入力を受け取り、モジュロがゼロ以外になるTまで値をインクリメントします。iT

i=scan()
while(!i%%T)T=T+1
T

もう少し空想的なものが必要な場合は、29バイトの場合は次のようになります

i=scan()
match(0,!i%%1:(i+1))

説明:

i=scan()istdinから読み取ります。

1:(i+1):からすべての整数を生成1するi+1+1の例のための会計12)。

i%%1:(i+1) :リスト内のすべての数で入力をモジュロします。

!i%%1:(i+1):結果のリストを無効にします。これは、暗黙的な論理型、に変換0されるFALSEとゼロ以外ですTRUE。否定した後、TRUE値はFALSE逆になります。現在、元々ゼロ以外の値はすべてとしてコード化されていFALSEます。

match(0,!i%%1:(i+1))0リスト内のの最初のインスタンスのインデックスを返します。0is FALSEですのでFALSE、これはリストの最初のインデックスを返します。これはモジュロ演算の最初の非ゼロ値です。元のリストはで始まっている1ため、インデックスは最小の非除数の値に等しくなります。


ニース、単にを使用することを提案したかったのwhich.minですが、その編集を見てmatch、同様の仕事をしているようです。
JAD

2
また、ループTを使用する前に定義する必要性を省いて、を使用する便利なトリックもありwhileます。
JAD

@JarkoDubbeldamありがとう!ベクトル化されたアプローチをアプローチよりも短くする方法を見つけることはできませんwhile。これは、大きなNに対して非常にメモリ集約型であるため問題ありませんT。(そしてもちろんF、必要なときにも使用できます0。)
rturnbull

1:(i + 1)の代わりに0:i + 1を使用することで2バイトを節約できますが、%%演算子でどのように再生されるかわかりません。
アントワーヌ嚢

@ antoine-sac残念ながら、%%に優先します+。したがって、括弧は必要です:(0:i+1)と同じバイト数で1:(i+1)。私は実際に前者を元々持っていましたが、読みやすくするために後者に変更しました。
rturnbull

10

Haskell、26バイト

f n=until((>0).mod n)(+1)1

誰もが忘れるuntil


9

Brachylog、10バイト

~{=#>:A'*}

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

これはFatalizeの元のソリューションと非常によく似ています(ただし、それよりも短い)。Fatalizeはその後、別の方法でこのアルゴリズムと結びつく別のアルゴリズムに切り替えたため、自分で説明する必要があります。

~{=#>:A'*}
~{       }    inverse of the following function:
  =           try possible values for the input, if it's unbound
   #>         the input is a positive integer
     :A'*     there is no A for which the input times A is the output

「入力」と「出力」を交換することにより、関数を反転させると、かなり合理的なアルゴリズムが得られます(ちょうど厄介な方法で表現されます)。入力を生成するために何も乗算できないもの」。Brachylogは、すべての入力が既知でない限り、浮動小数点計算を行いません。そのため、整数Aのみを考慮します。


1
それをすることを考えたことがありません、それはきちんとしています!
1


8

COW、174バイト

oomMOOMMMmoOmoOmoOMMMmOomOoMoOMMMmoOmoOmoOMMMmOoMOOmoO
MOomoOMoOmOoMOOmoOmoomoOMOOmOoMoOmoOMOomoomOomOoMOOmOo
moomoOMOomoomoOmoOMOOmOomOomOomOoOOMOOOMOomOOmoomOomOo
mOomOomOomoo

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

このコードは部分的にのみ私自身のものです-それは私がBrainfuckから移植しモジュラスアルゴリズムを実装しています。 残りのコードは私自身のものです。ただし、モジュラスアルゴリズムを記述しなかったため、どのように機能するかを真に調査しておらず、コードのその部分を文書化することはできません。代わりに、通常の内訳を示し、続いてコードが機能する理由をさらに詳しく説明します。

コードの内訳

oom                          ;Read input into [0].
MOO                          ;Loop while [0].  We never change [0], so the program only terminates forcibly after a print.
  MMMmoOmoOmoOMMMmOomOo      ; Copy [0] to [3] and navigate to [1].
  MoOMMMmoOmoOmoOMMM         ; Increment [1], and copy it to [4]
  mOo                        ; Navigate back to [3].
  MOO                        ; Modulus algorithm.  Direct port of brainfuck algorithm.
    moOMOomoOMoOmOo
    MOO
      moO
    moo
    moO
    MOO
      mOoMoOmoOMOo
    moo
    mOomOo
    MOO
      mOo
    moo
    moOMOo
  moo                        ; End modulus algorithm.
  moOmoO                     ; Navigate to [5].  This contains our modulus.
  MOO                        ; Only perform these operations if [5] is non-zero -- i.e. [0] % [1] != 0
    mOomOomOomOoOOMOOOMOomOO ;  Navigate to [1], print its contents, then error out.
  moo                        ; End condition
  mOomOomOomOomOo            ; Since we're still running, [0] % [1] == 0, so navigate back to [0] and try again.
moo                          ;End main loop.

説明

コードは最初に整数を[0]に読み込みます。メインループの各反復(2行目から26行目)は[1]をインクリメントし、必要なすべてをモジュラスアルゴリズムにコピーします。モジュラスアルゴリズムは結果を[5]に吐き出します。[5]に値が含まれている場合、[1]は印刷する必要がある番号です。印刷して、プログラムを強制終了します。

COWはBrainfuckの派生物であるため、Brainfuckの動作と比較的似た機能を果たします。テープの無限のストリップ、現在のテープ値がゼロでないときに、左または右に移動したり、増減したり、「ループ」できます。Brainfuckに加えて、COWにはいくつかの便利な機能が付属しています。

(0) moo -- Equivalent to ]
(1) mOo -- Equivalent to <
(2) moO -- Equivalent to >
(3) mOO -- No equivalent.  Evaluate current tape value as instruction from this list.
(4) Moo -- If tape is 0, equivalent to ,; if tape is non-zero, equivalent to .
(5) MOo -- Equivalent to -
(6) MoO -- Equivalent to +
(7) MOO -- Equivalent to [
(8) OOO -- No equivalent.  Set tape (positive or negative) to 0
(9) MMM -- No equivalent.  If register is empty, copy tape to register.  If register is non-empty, paste register to tape and clear register.
(10) OOM -- No equivalent.  Print an integer from tape to STDOUT
(11) oom -- No equivalent.  Read an integer from STDIN and store it on tape

ここで実際に重要な点は、命令3ですmOO。インタープリターは現在のテープ値を読み取り、そのテープ値に基づいて命令を実行します。値が0未満、11より大きい、または3に等しい場合、インタープリターはプログラムを終了します。非除数が見つかったら、これをメインループ(およびプログラム全体)の迅速かつダーティな強制終了として使用できます。しなければならないのは、数字を出力し、[1](with OOO)をクリアしMOo、で-1にデクリメントしてからmOO、プログラムを終了する命令-1を実行することです。

このプログラムのテープ自体は次のように機能します。

[0]  -- Read-in integer from STDIN.
[1]  -- Current divisor to test
[2]  -- Placeholder for modulus algorithm
[3]  -- Temporary copy of [0] for use for modulus algorithm
[4]  -- Temporary copy of [1] for use for modulus algorithm
[5]  -- Placeholder for modulus algorithm.  Location of remainder at end of loop.
[6]  -- Placeholder for modulus algorithm
[7]  -- Placeholder for modulus algorithm

モジュラスアルゴリズムは、操作の終了時に[2]、[3]、[6]、および[7]を自然にクリアします。[4]の内容は、4行目のレジスタペーストで上書きされます。[0]が[1]で割り切れる場合、[5]はゼロになるため、クリアする必要はありません。[5]がゼロ以外の場合、23行目で強制終了するので、心配する必要はありません。



7

ゼリー、5バイト

1%@#Ḣ

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

説明:

1%@#Ḣ
1  #      Find the first … numbers, counting up from 1, such that
 %@       dividing those numbers into … gives a truthy remainder
    Ḣ     then return the first

これは恐ろしい虐待です#。このプログラムには多くの演算子がありますが、多数のオペランドが欠落しています。なんらかの理由で明示的に指定し#たい1場合(そうでない場合は、デフォルトで入力を試みます)ただし、プログラムで指定されていない他のすべては、プログラムの入力にデフォルト設定されます。(たとえば、入力として24を指定すると、このプログラムは24を分割しない最初の24の数字を見つけて、最初の24を返します;無駄になりますが、動作します。)


ゼリー!Pythが今日あなたを打ち負かします!:D
ジョンレッド


7

C、32 35バイト

i;f(x){for(i=1;x%++i<1;);return i;}

編集:i=1ループに追加

使用法

main(c,v)char**v;{printf("%d",f(atoi(*++v)));}

フルプログラムバージョン、64バイト:

main(c,v)char**v;{*++v;for(c=1;atoi(*v)%++c<1;);printf("%d",c);}

6

C#、39 37バイト

n=>{int i=0;while(n%++i<1);return i;}

Martinのおかげで2バイト節約できました!


while(!(n%++ i));が好き もちろん、これはコードゴルフであり、1バイトは1バイトです。
ジョンハミルトン

それは動作しますか?私は0が自動的にfalseに評価されていることを知りませんでした
アルフィーGoodacre

ああ、私はそれをC ++で試しましたが、C#では動作しません。
ジョンハミルトン

6

Perl、19バイト

18バイトのコード+ -pフラグ。

$_=$_%++$.?$.:redo

実行するには:

perl -pE '$_=$_%++$.?$.:redo' <<< 12252240

非常に詳しくない説明を:
- $.デフォルト値は(ここでは標準入力)最後にアクセスファイルハンドルの現在の行番号である特別な変数であるので、入力の最初の行を読んだ後、それは1に設定しています
- $_入力を保持し、暗黙的に印刷されます最後に(-pフラグのおかげで)。
- redo(そのコンテキストで)プログラムがループ内にあると見なし、現在の反復をやり直します($.増分されたために異なるだけです)。
- $.分割しない最小の数値(に格納されている)が見つかった場合$_、それを設定$_します。それ以外の場合は、次の数値を試行します(ありがとうredo)。


6

オクターブ / MATLAB、26 24バイト

@(n)find(mod(n,1:n+1),1)

find(...,1)1最初の引数のベクトルの最初の非ゼロ要素のインデックス(ベース)を返します。最初の引数は、でテストを開始[n mod 1, n mod 2, n mod 3, n mod 4,...,n mod (n+1)]する+1ため、インデックスに追加する必要があることを意味し1ます。-2バイトをありがとう@Giuseppe。

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


@(n)find(mod(n,1:n+1),1)短いですよね?
ジュゼッペ

本当にありがとうございます!
flawr

5

ゼリー、6バイト

%R;‘TḢ

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

説明:

                                               Assume 24 is our N
 R      Generate all numbers from 1 to N         [1, 2, 3, 4 .., 24]
  ;‘    Attach N+1 to that list (for cases 1,2)  [1, 2, 3, 4 .., 25]
%       And modulo-divide our input by it
        Yields a list with the remainder         [0, 0, 0, 0, 4 ...]
    T   Return all thruthy indexes               [5, 7, ...]
     Ḣ  Takes the first element of that list -->  5

Jellyはわかりませんが、範囲を生成する前にNを増やして1バイト節約できますか?
エミグナ

@Emigna私もゼリーを知りません;)私は方法がわかりません:それを先にインクリメントすると、N + 1に対するモジュロテストも行われるか、剰余が増加します[1, 1, 1, 1, 5, ...]
-steenbergh

ああ、分かった。N%range(1、N + 1)を実行することは可能かもしれないと思っていましたが、両方のインスタンスでNを増やした場合、それは良くありません。
エミグナ




4

Python 2.7.9、32バイト

f=lambda n,d=1:n%d>0or-~f(n,d+1)

Ideoneでテストする

潜在的な非除数を再帰的にカウントアップしdます。出力よりも再帰的に結果をインクリメントするほうが短いdです。のオフセットは1のブール値によって実現されますTrue。これはに等しくなります1が、d==1常に除数であるため、出力は常に数値に変換されます。

Python 2.7.9はallowを許可するために使用されます0or。2.7.10以降のバージョンで0orは、8進数の開始として構文解析が試行され、構文エラーが発生します。Ideoneでこれを参照してください


3

実際には、7バイト

;÷@uR-m

オンラインでお試しください!(注:これは非常に遅いソリューションであり、大規模なテストケースでは時間がかかります)

説明:

;÷@uR-m
;÷       duplicate N, divisors
  @uR    range(1, N+2)
     -   set difference (values in [1, N+1] that are not divisors of N)
      m  minimum

3

Haskell、29バイト

f n=[k|k<-[2..],mod n k>0]!!0

[k|k<-[2..]]は、単に無限リストを作成します[2,3,4,5,...]。この条件でmod n k>0k、リスト内で分割しないもののみを許可しますn。追加!!0だけでは、最初のエントリ(インデックスのエントリが返されます0)、そのリストを形成します。

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


3

Dyalog APL、8 バイト

1⍳⍨0≠⍳|⊢

1⍳⍨ 最初のTrueの位置

0≠ の非ゼロ値

⍳|で割ったときの1 ... Nの除算剰余

N

TryAPLオンライン!

注:これは1と2で機能し1⍳⍨ます。何も見つからない場合は1 +引数の長さを返すためです。


3

ジュリア、28バイト

N->findfirst(x->N%x>0,1:N+2)

注:1:N+2メモリを割り当てないため、大きなNsのメモリの問題はありません
-@flawrがN+2いくつかのバイトを保存します
-@Martinの提案は1バイトを保存しました


3

QBIC、14バイト

:[a+1|~a%b|_Xb

説明:

:      Read the first cmd line param as a number, called 'a'
[a+1|  FOR (b=1 ; b <= a+1; b++) <-- a+1 for cases a = 1 or 2
~a%b   IF A modulo B ( == 0, implicit)
|_Xb   THEN exit the program, printing b
       [IF and FOR implicitly closed by QBIC]

3

PHP、30バイト

for(;$argv[1]%++$i<1;);echo$i;

-rオプション(thxから@ ais523)を使用してコンソールから実行する場合

php -r 'for(;$argv[1]%++$i<1;);echo$i;' 232792560

32バイト

<?for(;$argv[1]%++$i<1;);echo$i;

1バイトを削除してくれた@manatworkに感謝

33バイト(オリジナル)

<?for(;$argv[1]%++$i==0;);echo$i;

3
IIRC <?は、バイトカウントの一部である必要はありません(PHPにはコマンドラインモードが必要ないためです)。

3
古いトリック:の<1代わりに比較します==0
マナトワーク

ダン。に到達しましたfor(;!($argv[1]%$i);$i++);echo$i;。あなたのものは私の自然な進化です。これは私の賛成です!
イスマエルミゲル

3

Cubix14 12バイト

I2/L/);?%<@O

MickyTのおかげで2バイト節約されました。

それを試してみてください

説明

キューブ形式のコードは次のとおりです。

    I 2
    / L
/ ) ; ? % < @ O
. . . . . . . .
    . .
    . .

基本的に、これは単に入力を受け取り、カウンターを開始します。次に、入力の要因ではない値が見つかるまで、カウンタの各連続値をチェックします。


I2/L/);?%<@O数バイト少ないです。同じ一般的なプロセス、異なるパス
MickyT


2

クラゲ12 10バイト

p\~~|1
 >i

STDINから入力を受け取り、STDOUTに出力します。 オンラインでお試しください!

Martin Enderが2バイト節約しました、ありがとう!

説明

 \~~|
 >i

この部分は、定義で入力値を使用する1つの関数です。

   ~|

この~-cellには関数が指定されているため、引数を反転します。バイナリ関数「左引数modulo(|)右引数」を生成します。Jellyfishの組み込みモジュロ関数は、逆の順序で引数を取ります。

  ~~|
  i

この~-cellには値と関数が指定されているため、部分的に適用されます。バイナリ関数「input(i)modulo right argument」を生成します。その関数fを呼び出しましょう。

 \~~|
 >i

\それは反復しないようにβ細胞は、二つの機能を与えられる。それは単項関数「インクリメント(生成>)関数までfが以前の値と現在の値に適用truthy(ゼロでない)結果を与え、その後、現在の値を返すを」。これは、引数が入力を分割しなくなるまで増分されることを意味します。

p\~~|1
 >i

最後に、この関数を初期値に適用し1、結果を出力しpます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.