順次分割可能


24

時々、眠りにつくために、できる限り多くカウントしますが、平方フリーでない数値はスキップします。連続していくつかの数字をスキップすると、少しスリル48,49,50があります-たとえば、すべてが平方フリーではありません(48は2 ^ 2、49 x 7 ^ 2、50 x 5 ^ 2で割り切れます)。

これにより、任意の除数のシーケンスで割り切れる隣接する数値の最も初期の例について疑問に思いました。

入力

入力は、a = [a_0, a_1, ...]少なくとも1つの要素を含む厳密に正の整数の順序付きリストです。

出力

出力は、除算、除算、より一般的に除算nするプロパティを持つ最小の正の整数です。そのようなものが存在しない場合、関数/プログラムの動作は定義されていません。a_0na_1n+1a_kn+kn

テストケース

[15] -> 15
[3,4,5] -> 3
[5,4,3] -> 55
[2,3,5,7] -> 158
[4,9,25,49] -> 29348
[11,7,5,3,2] -> 1518

得点

これはです。最短の結果(言語ごと)が自慢できます。通常の抜け穴は除外されます。


回答:




5

MATL、11バイト

`Gf@q+G\a}@

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

`           % Do ....
 Gf         %   Convert input to [1,2,...,]
   @q+      %   Add current iteration index minus one, to get [n, n+1, ....]
      G\    %   Elementwise mod([n,n+1,...],[a_0,a_1,...])
        a   % ...while any of the modular remainders is nonzero.
         }  % Finally:
          @ %   Output the iteration index.

正確に速度が最適化されていません...最大のテストケースはMATLを使用して1分かかり、MATLABでは約0.03秒かかります。MATLのオーバーヘッドが少し増える可能性はわずかです。


ああ、私はn:q`QtG\a]1)12バイト持っていましたn:が、明らかにfここと同じです。私はいつもそれを忘れているので、代わりの11バイトとして追加できます。
ジュゼッペ

1
@Giuseppe Too bad fq`QtG\a}@は、入力の余分なコピーを返します。
-Sanchises

5

JavaScript、42 40バイト

解決策がない(または解決策が大きすぎる)場合、再帰エラーをスローします。

a=>(g=y=>a.some(x=>y++%x)?g(++n):n)(n=1)

Rick Hitchcockからのポインターで2バイト保存


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

数字のコンマ区切りリストを入力します。

o.innerText=(f=
a=>(g=y=>a.some(x=>y++%x)?g(++n):n)(n=1)
)(i.value=[5,4,3]);oninput=_=>o.innerText=f(i.value.split`,`.map(eval))
<input id=i><pre id=o>


良いアプローチですが、たとえば、で再帰制限を超えると失敗します[4,9,25,49]
チャスブラウン

1
@ChasBrown、コードゴルフの目的のために、無限の記憶を想定する場合があります。
シャギー

私は、これは38バイトのために働くだろうと思う: (a,y=n=0)=>a.some(x=>y++%x)?f(a,++n):n
リック・ヒッチコック

ああ、いい人、@ RickHitchcock-ありがとう。f=ただし、忘れないでください。
シャギー

ああ、もちろん。40バイトです。
リックヒッチコック





3

Pyth、11バイト

f!s.e%+kTbQ 

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


f!s.e%+kTbQ         Full program - inputs list from stdin and outputs to stdout
f                   First number T such that
   .e     Q         The enumerated mapping over the Input Q
      +kT           by the function (elem_value+T)
     %   b          mod (elem_index)
 !s                 has a false sum, i.e. has all elements 0

2最後に必要ですか?ここにはもっと多くのものが保存されているはずですが、Pythについては知りません。
シャギー

@Shaggyと@Giuseppe、あなたの両方は正しいです、そしてエンディングをドロップ2すると問題が修正されます
デイブ

2

J、23バイト

[:I.0=]+/@:|"1#]\[:i.*/

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


いいね 入力の積までしかチェックできない数学的事実は何ですか?それ以上の解決策がないことをどのようにして知ることができますか?また、I.1つの結果のみが返されることをどのように知ることができますか?複数ある可能性はありませんか?
ジョナ

1
@ジョナ-それが常に機能するかどうかはわかりません。私が行ったすべてのテストはこれらの制限内でした。
ガレンイワノフ

2

R、51バイト

function(l){while(any((F+1:sum(l|1))%%l))F=F+1
F+1}

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

を使用すると、への暗黙的な変換に関する警告がanyスローされkます。logicalここkでは戻り値です。



@plannapus私はそれが、残念ながら失敗したためと考えl=c(15)ているので、seq(l)==1:lその場合には seqそのような迷惑です!
ジュゼッペ

実際、arfは強制seq_alongが長すぎます。
プランナパス

そのため、これらの警告を取り除くsum代わりにany、参考にしてください。
プランナパス


2

APL(Dyalog Unicode)24 23 22バイト

{∨/×⍺|⍵+⍳⍴⍺:⍺∇⍵+1⋄⍵}∘1

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

技術的には、これは暗黙の関数です。許可されている入力は整数のリストだけなので、そうする必要がありました。使用⎕IO←0(0インデックス付け)

関数nが存在しない場合はタイムアウトすることに注意してください。

それぞれ1バイトの@ngnと@ H.PWizに感謝します。

どうやって?

{∨/×⍺|⍵+⍳≢⍺:⍺∇⍵+1⋄⍵}∘1  Main function. ⍺=input; ⍵=1.
{                   }∘1  Using 1 as right argument and input as left argument:
           :             If
        ⍳≢⍺              The range [0..length(⍺)]
      ⍵+                 +⍵ (this generates the vector ⍵+0, ⍵+1,..., ⍵+length(⍺))
    ⍺|                   Modulo 
   ×                     Signum; returns 1 for positive integers, ¯1 for negative and 0 for 0.
 ∨/                      Logical OR reduction. Yields falsy iff the elements of the previous vector are all falsy.
            ⍺∇⍵+1        Call the function recursively with ⍵+1.
                 ⋄⍵      Else return ⍵.


1

Japt、10バイト

undefined最初にブラウザがクラッシュしない場合、ソリューションが存在しない場合は最終的に出力されます。

@e_X°vZÃ}a

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


説明

               :Implicit input of array U
@       }a     :Loop and output the first integer X that returns true.
 e_    Ã       :For every element Z in U
   X°          :X, postfix increcemnted
     vZ        :Is it divisible by Z?



1

標準ML(MLton)、96バイト

open List;fun$n% =if all hd(tabulate(length%,fn i=>[1>(n+i)mod nth(%,i)]))then n else$(n+1)%;$1;

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

ゴルフをしていない:

open List
fun f n l = 
    if all (fn x=>x)
           (tabulate ( length l
                     , fn i => (n+i) mod nth(l,i) = 0))
    then n 
    else f (n+1) l
val g = f 1

オンラインでお試しください!で始まるn=1、関数は-conditionが満たされるまでfインクリメントし、その場合は返されます。nalln

tabulate(m,g)整数mと関数gを使用してリストを作成します[g 0, g 1, ..., g m]。我々の状態でtabulate入力リストの長さと呼ばれlそしてか否かをチェックする機能iの第要素l分割n+i。これによりブール値のリストが生成されるためall、ID関数でfn x=>xはすべての要素がtrueであるかどうかがチェックされます。

私は4バイトで、この場合、恒等関数を短くする素敵なゴルフのトリックが見つかりました:代わりにラムダの(fn x=>x)、ビルドイン機能はhd、リストの最初の要素を返し、使用され、そして得られたboolsではtabulateに包まれている[]しますシングルトンリストを作成します。


1

PowerShell65 62バイト

for(){$o=1;$i=++$j;$args[0]|%{$o*=!($i++%$_)};if($o){$j;exit}}

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

PowerShellは相当持っていないanyか、some我々はわずかに異なるアプローチを必要とするので、同様または。

これは入力$args[0]を配列として受け取り、無限forループに入ります。我々が設定され、各反復$oするが1(後述)、およびセットが$iあることを++$j。増分$jすることで、提案されたソリューションの最初の数が何であるかを把握し、提案されたソリューション$iの残りの部分で増分します。

私たちは、その後、入力の各要素を送る$args[0]ForEach-Objectループ。内側のループ内$oで、計算の結果にブール乗算します。これにより、値の計算が失敗した場合にに$oなります0。計算は!($i++%$_)、またはモジュロ演算のブール演算ではありません。PowerShellではゼロ以外の値はすべて真実であるため、これにより、残りが偽の値になり$o0ます。

内側のループの外側if $oは0以外であり、機能する増分ソリューションが見つかったため、とを出力$jexitます。


1

tinylisp、108バイト

(load library
(d ?(q((L N)(i L(i(mod N(h L))0(?(t L)(inc N)))1
(d S(q((L N)(i(? L N)N(S L(inc N
(q((L)(S L 1

最後の行は、リストを取得して整数を返す名前のないラムダ関数です。オンラインでお試しください!

非ゴルフ

(load library)

(comment Function to check a candidate n)
(def sequentially-divisible?
 (lambda (divisors start-num)
  (if divisors
   (if (divides? (head divisors) start-num)
    (sequentially-divisible? (tail divisors) (inc start-num))
    0)
   1)))

(comment Function to check successive candidates for n until one works)
(def search
 (lambda (divisors start-num)
  (if (sequentially-divisible? divisors start-num)
   start-num
   (search divisors (inc start-num)))))

(comment Solution function: search for candidates for n starting from 1)
(def f
 (lambda (divisors)
  (search divisors 1)))


1

Python 2、78バイト

def f(a,c=0):
 while [j for i,j in enumerate(a) if(c+i)%j<1]!=a:c+=1
 return c

編集:-26の@Chas Brownのおかげ


いいね!ループの終了条件を変更しましたが、78バイトを取得するためにアイデアを改善できます
チャスブラウン

@ChasBrownありがとう、私はそれをそうすることを考えていませんでした。かわった!
sonrad10


0

APL NARS、140バイト、70文字

r←f w;i;k
i←r←1⊃,w⋄k←¯1+⍴w⋄→0×⍳k=0
A:→0×⍳0=+/(1↓w)∣(k⍴r)+⍳k⋄r+←i⋄→A

テスト

  f 15
15
  f 3 4 5
3
  f 5 4 3
55
  f 2 3 5 7
158
  f 4 9 25 49
29348
  f 11 7 5 3 2 
1518

0

Java 8、82 75バイト

a->{for(int r=1,i,f;;r++){i=f=0;for(int b:a)f+=(r+i++)%b;if(f<1)return r;}}

説明:

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

a->{                 // Method with integer-array parameter and integer return-type
  for(int r=1,       //  Return-integer, starting at 1
          i,         //  Index-integer
          f;         //  Flag-integer
      ;r++){         //  Loop indefinitely, increasing `r` by 1 after every iteration
    i=f=0;           //   Reset both `i` and `f` to 0
    for(int b:a)     //   Inner loop over the input-array
      f+=(r+i++)%b;  //    Increase the flag-integer by `r+i` modulo the current item
    if(f<1)          //   If the flag-integer is still 0 at the end of the inner loop
      return r;}}    //    Return `r` as result

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