分割可能ストリーク


31

我々は、整除ストリーク定義できるk数をn整数最小非負見つけることによりk、このようなn+k割り切れないがk+1

チャレンジ

選択した言語で、入力のDivisibility Streakを出力または返すプログラムまたは関数を作成します。

例:

n=13:
13 is divisible by 1 
14 is divisible by 2 
15 is divisible by 3 
16 is divisible by 4 
17 is not divisible by 5

の分割ストリーク134

n=120:
120 is divisible by 1 
121 is not divisible by 2 

の分割ストリーク1201

テストケース:

n      DS
2      1
3      2
4      1
5      2
6      1
7      3
8      1
9      2
10     1
2521   10

より多くのテストケースはここで見つけることができます

ノート

ルール

  • 入力が1より大きいと仮定できます。

得点

:最低スコアの提出が勝ちます。


「最小の正の整数」を「最小の非負の整数」に変更することをお勧めします。チャレンジはまったく変更されませんが、現在の説明では、1で割り切れるかどうかをチェックする必要がないことを意味します(技術的には必要ありません)。それとも、説明から1チェックで分割可能性を削除できます。
-TehPers

最小の正の整数は1であり、k + 12 kは最小の正の整数です。ちょっとしたごめんなさい。
-TehPers

kこれは、分割しない最小のものを見つけることと同じではありませんn-1か?
パエロエベルマン

@PaŭloEbermannTake n=7どこでk=3n-1で割り切れkます。
オリバー

ああ、私は逃した+1
パエロエベルマン

回答:



17

Java 8、44 42 41 39バイト

取り消し線44はまだ通常の44です;(

n->{int r=0;for(;~-n%--r<1;);return~r;}

@LeakyNunのおかげで-2バイト。@TheLethalCoderの
おかげで-1バイト。@Nevayの おかげで-2バイト。

説明:

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

n->{                 // Method with integer as parameter and return-type
  int r=0;           //  Result-integer (starting at 0)
  for(;~-n%--r<1;);  //  Loop as long as `n-1` is divisible by `r-1`
                     //   (after we've first decreased `r` by 1 every iteration)
  return~r;          //  Return `-r-1` as result integer
}                    // End of method


1
41バイト LeakyNunの提案から1バイト削りました。
TheLethalCoder





4

JavaScript(ES6)、28バイト

n=>g=(x=2)=>++n%x?--x:g(++x)

試して

o.innerText=(f=

n=>g=(x=2)=>++n%x?--x:g(++x)

)(i.value=2521)();oninput=_=>o.innerText=f(+i.value)()
<input id=i><pre id=o>





3

Cubix、17バイト

)uUqI1%?;)qUO(;/@

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

立方体

    ) u
    U q
I 1 % ? ; ) q U
O ( ; / @ . . .
    . .
    . .
  • I1 入力と除数でスタックをセットアップします
  • %? modとテストを行う
    • ;)qU)uqU0の場合、結果を削除し、入力と除数をインクリメントします。戻るパスについて少し説明します%
    • /;(O@ 0でない場合、結果をドロップし、除数をデクリメントし、出力して終了します

実行を見る






2

dc、28バイト

1si[1+dli1+dsi%0=M]dsMxli1-p

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

増分と最終減分があるため、これは本当に最適ではないと感じますが、それを改善する方法は実際にはわかりません。基本的にはi、値mod iがゼロのままである限り、カウンターと開始値をインクリメントし、それが真でない場合は、1を減算しiて印刷します。



2

J、17バイト

[:{.@I.>:@i.|i.+]

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

ここにはまだゴルフの余地があると思います。

説明(変更なし)

[: {.@I. >:@i. | i. + ]
                 i. + ]  Range [n,2n)
                 i.       Range [0,n)
                    +     Added to each
                      ]   n
         >:@i. | i. + ]  Divisibility test
         >:@i.            Range [1,n+1)
               |          Modulo (in J, the arguments are reversed)
                 i. + ]   Range [n,2n)
    {.@I.                Get the index of the first non-divisible
       I.                 Indices of non-zero values
    {.                    Head

キャップ([:)は、Jが最後の動詞({.@I.)をフックの一部として扱わないようにするためにあります。

この答えについて奇妙なことの唯一の種類は、I.実際にその数値の値と同じ回数だけ、非ゼロの各数値のインデックスを複製することです。例えば

   I. 0 1 0 2 3
1 3 3 4 4 4

しかし、とにかく最初のインデックスが必要なので、それは問題ではありません(そしてi.、昇順の範囲を与えるため、最初のインデックスが最小値になることを知っています)。

最後に、ここでは、最大でのみの除算をチェックすることが有効であるという非常に短い証拠を示しnます。

私たちは、と割り切れるのチェックを開始する1 | nことにより、我々は割り切れるをチェックする得ればそう連勝を想定して、はるかにそれを行くn私たちが持っているn | 2n - 1(真ではありませんています2n - 1 ≡ n - 1 (mod n))。したがって、ストリークはそこで終了します。



2

x86マシンコード、16バイト

49                 dec    ecx        ; decrement argument
31 FF              xor    edi, edi   ; zero counter

                Loop:
47                 inc    edi        ; increment counter
89 C8              mov    eax, ecx   ; copy argument to EAX for division
99                 cdq               ; use 1-byte CDQ with unsigned to zero EDX
F7 FF              idiv   edi        ; EDX:EAX / counter
85 D2              test   edx, edx   ; test remainder
74 F6              jz     Loop       ; keep looping if remainder == 0

4F                 dec    edi        ; decrement counter
97                 xchg   eax, edi   ; move counter into EAX for return
C3                 ret               ;  (use 1-byte XCHG instead of 2-byte MOV)

上記の関数はnECXレジスタ内で単一のパラメーターを取ります。分割可能ストリークを計算し、それをレジスタk経由で返しますEAX。32ビットfastcall呼び出し規約に準拠していますため、MicrosoftまたはGnuコンパイラーを使用してCコードから簡単にことができます。

ロジックは非常に単純です。1から始まる反復テストを実行するだけです。ここでは、他のほとんどの回答と機能的には同じですが、サイズが手動で最適化されています。含むそこに素敵な1バイト命令のたくさん、INCDECCDQ、およびXCHG。除算用のハードコードされたオペランドは少し痛いですが、それほどひどくはありません。

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



1

SOGL V0.12、8つのバイト

]e.-ē⁴I\

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

まったく異なる種類の課題のために作られた言語にとっては悪くない。

説明:

]         do .. while top of the stack is truthy
 e          push the variable E contents, by default user input
  .-        subtract the input from it
    ē       push the value of the variable E and then increase the variable
     ⁴      duplicate the item below one in the stack
      I     increase it
       \    test if divides
            if it does divide, then the loop restarts, if not, outputs POP which is `e-input`

1

Mathematica、40バイト

Min@Complement[Range@#,Divisors[#-1]-1]&

オンラインでお試しください!(数学)

数学的なアプローチでは、n-1がk + 1で割り切れる場合にのみ、n + kはk + 1で割り切れます。また、n-1はnで割り切れないためRange@#、十分な数です。

当初はを使用する予定Min@Complement[Range@#,Divisors[#-1]]-1&でしたが、これも機能します。


TIOからの送信を使用すると、キャプチャが表示されるのはなぜですか?
-user202729

1
入力した(コピーして貼り付けた)のが速すぎたためです。TIOについてではありません。
リーキー修道女

1

ジュリア0.6.0 (47バイト)(38バイト)

n->(i=1;while isinteger(n/i) i+=1;n+=1 end;i-1)

n->(i=1;while n%i<1 i+=1;n+=1end;i-1)

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

Mr.Xcoderのおかげで9バイト削減


2
通常、「Try it online」リンクを使用すると、ヘッダー、フッター、および引数の組み合わせを定義して実際にコードを試すことができます。つまり、再生ボタンを押すと出力が得られます。
ピーターテイラー

@PeterTaylor純粋な推測では、このように実行してみましたが、驚いたことに動作しました。OPをテスト可能なバージョンで編集することをお勧めします。
ミスターXcoder

46バイト(1スペースを削除):n->(i=1;while isinteger(n/i) i+=1;n+=1end;i-1)
Mr. Xcoder

別の純粋な推測では、38バイトまでゴルフすることが許可されています。n->(i=1;while n%i<1 i+=1;n+=1end;i-1)
Xcoder氏

@PeterTaylor忘れてしまいました!
-Goysa


1

バッチ、70バイト

@set/an=%1-1,i=0
:l
@set/ai+=1,r=n%%~i
@if %r%==0 goto l
@echo %i%

これがしていることはiLCM(1..i)分裂する最大のものを見つけることn-1です。



1

Aceto28 27バイト

[;`%
I)@]
iIk2I(D(
rk[(&Xpu

終了する必要がなければ、1バイト節約できます。

説明:

3つのスタックを使用します。左のスタックは2から始まるカウンターを保持し、右のスタックは指定された数(またはその増分)を保持し、中央のスタックはモジュロ演算を行うために使用されます。もちろん、すべてを1つのスタックで実行できますが、この方法では、外側のスタックを「スティッキー」に設定し(ポップされた値は実際には削除されません)、多くの複製操作を保存できます。メソッドの詳細は次のとおりです。

整数を読み取り、それをインクリメントし、現在のスタックをスティッキーにし、左側のスタックに(および自分自身で)「移動」します。

iI
rk[

スタックをもう1つ左に移動し、リテラル2をプッシュして、このスタックもスティッキーにします。コード内のこの位置を覚えて(@)、値と自分自身を再び中央のスタックに「移動」します。

  @]
  k2
   (

ここでテストします:上位2つの数値のモジュロは0ではありませんか?その場合、最後にジャンプします。そうでない場合は、1スタック右に移動し、値を増やして中央にプッシュします。次に、左のスタックに移動し、それもインクリメントして、前に設定したマークに戻ります。

[;`%
I)
    I(
    &

モジュロの結果がゼロでない場合、IPの移動位置を反転し、左に1スタック(カウンターのある場所)に移動し、デクリメントして値を出力し、終了します。

      D(
     Xpu


1

F#、86バイト 84バイト

let s n = 
    let rec c n1 d r=if n1%d=0 then c(n1+1)(d+1)(r+1)else r
    c n 1 0

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

編集:オリバーから-2文字


PPCGへようこそ!あなたのプログラムは標準入力を取りますか?オンラインF#インタープリターを備えたTIOを使用できます。また、で空白を削除できr = ifますか?
オリバー

1
@Oliverありがとう、リンクをTIOに変更したので、実際に引数を渡してテストすることができます。:)
ヴラディスラフ・カピン

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