コードは終了しますか?


92

これは、数学的な曲がりで考えたコードゴルフの挑戦です。課題は、可能な限り短いコードを記述して、コードが終了するかどうかが未解決の問題になるようにすることです。私が言いたいことの例は、アンサーからこの cs stackexchangeの質問に適応した次のPythonコードです。

def is_perfect(n):
    return sum(i for i in range(1, n) if n % i == 0) == n

n = 3
while not is_perfect(n):
    n = n + 2

数学者は、奇数の完全な数は存在しないと推測していますが、証明されたことがないため、このコードが終了するかどうかは誰にもわかりません。短いが、終了するかどうか不明なコードの他の部分(おそらくCollat​​z予想や双子素数予想などの他の未解決の問題に依存している)を思い付くことができますか?

編集:一部の人々は良い追加のルールを持ち出しました-質問に対する解決策は決定論的でなければなりません。非決定性を使用してより短いソリューションを見つけることができればさらに興味深いかもしれませんが。この場合、ルールは、終了の確率が不明なスニペットを見つけることです。


2
PPCGへようこそ!
ルイスメンドー

3
コードは50バイトまでゴルフできます:n=3 while sum(k*(n%k<1)for k in range(1,n))-n:n+=2
xnor

13
これは本当に素晴らしいコンセプトです。このような独創的なアイデアを見るのは素晴らしいことです。
ネイサンメリル

7
@Megoこのチャレンジは、無限のデータ型を想定し、自動的に無限のメモリを想定する場合にのみ機能すると思います。
マーティンローゼナウ

52
私がタイトルを読んだとき、私はあなたが私たちに停止の問題を解決し、解決策を求めて欲しいと思った。
MrPaulch

回答:


29

ゼリー、7 バイト

!‘Ʋµ4#

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

バックグラウンド

Brocardの問題に対する4番目の解決策、つまり解決策n!が見つかると、これは終了します+ 1 =㎡(N、M)≠(4,5)、(5,11)、(7、71)正の整数を超えます。実装は浮動小数点演算を使用しないため、4番目の解決策が見つかった場合、またはn!メモリー内で表現できなくなります。

Brocardの問題は、この回答で@xnorによって最初に使用されました。

使い方

!‘Ʋµ4#  Main link. No arguments. Implicit argument: 0

    µ4#  Convert the links to the left into a monadic chain and call it with
         arguments k = 0, 1, 2, ... until 4 of them return 1.
!        Factorial; yield k!.
 ‘       Increment; yield k! + 1.
  Ʋ     Squareness; return 1 if k! + 1 is a perfect square, 0 if not.

3
私は...ゼリー学ぶ必要がある
noɥʇʎԀʎzɐɹƆ

19

ゼリー11 9 バイト

ÆẸ⁺‘ÆPµ6#

これは、6番目のフェルマー素数が見つかると終了します。

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

使い方

ÆẸ⁺‘ÆPµ6#  Main link. No arguments. Implicit argument: 0

      µ6#  Convert the links to the left into a monadic chain and call it with
           arguments k = 0, 1, 2, ... until 6 of them return 1.
ÆẸ         Convert [k] to the integer with that prime exponent factorization, i.e.,
           into 2 ** k.
  ⁺        Repeat.
   ‘       Increment.
           We've now calculated 2 ** 2 ** k + 1.
    ÆP     Test the result for primality.

16

Pyth、10バイト

fP_h^2^2T5

すべてのフェルマー数 2^(2^n)+1がであるという推測を使用しn>4ます。

f        5   Find the first number T>=5 for which
   h^2^2T    2^(2^T)+1
 P_          is prime                   

11

Python、36バイト

k=n=1
while(n+1)**.5%1+7/k:k+=1;n*=k

Brocardの問題を使用します

n!+1はn≥8に対して完全な正方形ですか?

連続した階乗を計算し、それらが二乗でかどうかをチェックしますk>7。2バイトのDennisに感謝します!

これは、Pythonが任意の大きな数値に対して正確な算術演算を引き続き行うことを前提としています。実際の実装では、終了します。


1
-~n**.5代わりに動作しません(n+1)**.5か?
ETHproductions

@ETHproductionsべき乗の優先順位はの優先順位よりも高い~ため、ビット単位でfloatを否定しようとするとTypeErrorが発生します。
デニス

11

Perl、50 38 36 34 33バイト

$_=196;$_+=$%while($%=reverse)-$_

説明:196は可能性のあるLychrel番号です -自身にその逆を繰り返し追加することによって回文を形成しない番号。ループは、$ nがその逆に等しくなるまで続きます。これは、初期値196ではまだ不明です。

25 + 52 = 77

無効です。

96 + 69 = 165
165 + 561 = 726
726 + 627 = 1353
1353 + 3531 = 4884

したがって、このシーケンスの数字はどれも有効ではありません。

編集:forループではなく、untilループを使用して(なんとかして)ゴルフをしました。また、思ったよりもバイト数が少なかった(おそらく将来、バイトカウントをもっと注意深く見るべきだろう)。

編集:置き換え$n$_で暗黙の引数に2つのバイトを保存しますreverse。私が考えるこの実装を得るために起こっているようgolfedとして、これはあります。

編集:私は間違っていました。使用する代わりにuntil($%=reverse)==$_、差がゼロ以外(つまりtrue)である間に進むことができますwhile($%=reverse)-$_


3
考えられるプレーンperlの数には限りがあるため、実際にはこのプログラムが終了するかどうかを判断できます。この作業を行う(または実装する)には、bigintパッケージを読み込む必要があります
Ton Hospel

やれ。出来ることならどうぞ。:-)
Veky

11

MATL、11バイト

`@QEtZq&+=z

Goldbachの推測が偽である場合に終了します。つまり、プログラムは、22つの素数の合計として表現できない数よりも大きい偶数を見つけると停止します。

`        % Do...while
  @      %   Push iteration index k. Gives 1, 2, 3, ...
  QE     %   Add 1 and multiply by 2. Gives 4, 6, 8, ...
  tZq    %   Duplicate. Push all primes up to current k
  &+     %   Matrix with all pairwise additions of those primes
  =z     %   Number of entries of that matrix that equal k. This is used as loop
         %   condition. That is, the loop continues if this number is nonzero
         % Implicit end

8

05AB1E、8バイト

6番目のフェルマー素数が見つかると終了します。

5µNoo>p½

説明

5µ          # loop over increasing N (starting at 1) until counter reaches 5
  Noo       # 2^2^N
     >      # + 1
      p½    # if prime, increase counter

8

Python、30 28バイト

n=2
while 2**~-n%n**3-1:n+=1

このプログラムは、2 ^(n-1)-1がn ^ 3で割り切れる整数nが1より大きい場合にのみ停止します。私の知る限り、このプロパティを持つ数が存在するかどうかはわかりません(このプロパティを満たす数が素数の場合、2から3の次数のWieferich素数と呼ばれ、そのような素数が存在するかどうかはわかりません)。


括弧が正しく配置されていますか?2 ^(n-1)!≡1(mod n ^ 3)ではなく2 ^ n≡1(mod n ^ 3)であるかどうかをテストしているようです。確かに、Pythonの演算子の優先順位はそれほどよくわかりません。
ガブリエルベナミー

おっと、コードは正しいですが、私の説明は正しくありません。直します。
ジュリアンローゼン

2
あなたは置き換えることができ(n-1)~-n
小麦ウィザード


6

脳フラック、212の 208 204バイト

このプログラムは、MegaTomによって記述された乗算アルゴリズムと1000000000によって記述された非正方形チェッカーを使用します

オンラインで試す

(((()()()()){})){{}((({}()))<{(({})[()])}{}>[()]){({}<({}<>)({<({}[()])><>({})<>}{}<><{}>)>[()])}{}(({}())){(({}[()]<>)<>)(({({})({}[()])}{}[({})]<>)){{}{}({}<>)(<([()])>)}{}({}()){(((<{}{}<>{}>)))}{}}{}}

このプログラムは8から始まり、各数値をテストして、n!+1が正数であるかどうかを確認します。見つかったら終了します。これはブロカードの問題として知られており、数学の未解決の問題です。


6

Brachylog(v2)、Brachylogのエンコードで3バイト

⟦cṗ

オンラインでお試しください!(明らかな理由により、目に見えるものを何もせずにタイムアウトします)

完全なプログラム。入力なしで実行すると、最初のSmarandache primeを検索し、true.見つかった場合は出力します。スマランダチェ素数が存在するかどうかは未解決の問題です。(Brachylogの素数テストアルゴリズムは、理論上は任意の大きな数で動作しますが、ゆっくりと実行される傾向があることに注意してください。したがって、自分でSmarandache素数を見つけることに興味がある場合は、別の言語を使用することをお勧めします)

説明

⟦cṗ
⟦     Form an increasing range from 0 to {the smallest number with no assertion failure} 
 c    Concatenate all the numbers that make up that range, in decimal
  ṗ   Assert that the result is prime

Brachylogは、リストのように扱うときは常に数値の10進数を操作するため、「範囲」の後に「連結」を続けると、Smarandache数値のシーケンスを生成する非常に簡潔な方法になります(そして、素数でフィルタリングします; Brachylogのデフォルトの完全なプログラムの動作は、結果のジェネレータの最初の要素を強制します)。範囲には先行ゼロがありますが、幸いなことに、このフローパターンでは、Brachylogは失敗するのではなくゼロを削除します。

不明な停止ステータスではなく60秒以内に終了する同様のプログラムのデモとして、6(mod 11)に等しい最初のSmarandache番号を見つける例を次に示します。

⟦c{-₆~×₁₁&}

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

これはtrue.完全なプログラムとして印刷されZますが、問題の数値を実際に印刷するためにコマンドライン引数を投入し、この一般的なアプローチが機能することをより良く示しています。


5

Python 2、88バイト

p=lambda n:all(n%x for x in range(2,n))
s=lambda n:0if p((10223*2**n)+1)else s(n+1)
s(0)

10223がシェルピスキ番号の場合、このコードは終了します。2013年12月現在、10223は現在、シェルピスキー番号である場合とそうでない場合がある最小の候補です。

シェルピスキー番号はk、フォームのすべての番号(k * 2^n) + 1が合成される番号です。


この問題とシェルピンスキーの問題が近い将来に、さらに多くの計算で解決されることを願っています。
qwr

4
このコードは確実に終了します。2つのラムダに名前を付けるだけなので、実際に何も呼び出しません。:-P
Veky

4
実際、あなたはしませんでした。Python2のセマンティクスが凍結(PEP 404)されているため、コードは常に終了し、BDFLのフィアットによる再帰呼び出しのハード制限が含まれています(neopythonic.blogspot.hr/2009/04/final-words-on-tail-calls.html)。;-P
Veky

2
@Vekyあなたのコメントを支持しなければなりませんでした。
Qwerp-Derp

1
これが書かれてから何も経たないうちに、素数10223*2^31172165 + 1 が発見されました。それ以来、21181それはシエルピスキであるかどうかがわからない最小の数字でした。
ジェッペスティグニールセン

4

Pyth、16バイト

f!}1.u@,/G2h*3GG

Collat​​z予想が成り立たない最初の値を返します。推測がすべての数値に当てはまるかどうかは不明であるため、このコードが終了するかどうかは不明です。


3
それを読むことができなくても、あなたのコードはあなたが主張していることを正確に行っているとは思わない。4-2-1とは異なるループに入る最初の番号を検索しますか?ループで終わらないより小さな数がある場合、あなたはそれを見つけないと思います。とにかく、それがあなたのコードがすることなら、それが終了するかどうかわからないのに十分です。
クリスチャンシーバーズ

1
Iそのループにトラバース内どこにもループに行かないし、最初の整数> = 1の検索1.含まれている
スティーブンH.

3
それは私が期待したことです。しかし、数がコラッツ予想を満たさない唯一の考えられる方法ではありません。
クリスチャンシーバーズ

実際、コラッツのマップでは、すべての数が無限に発散するか、1-2-4に及ぶことが証明されています。コードが終了することはありません。アイデアは、ループを形成する一連のステップが方程式を設定することであり、そのソリューションは1-2-4、負の値、および非整数の有理数のみです。
ジョンドヴォルザーク

3
@JanDvorakそれが本当だとは思わない。ソースを引用できますか?
KSFT

4

実際には、16バイト

1`;;pY)▒@D÷íu*`╓

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

このコードはntotient(n)分割するような複合数がある場合に終了しますn-1レーマーの全問題)。

説明:

1`;;pY)▒@D÷íu*`╓
1`            `╓  first integer, starting with 0, where the following function leaves a truthy value on top of the stack:
    pY       *      composite (not prime) and
   ;  )▒            totient(n)
  ;     @D֒u       is in the list of divisors of n-1

4

ゼリー9 8 バイト

@Dennisのおかげで-1バイト!(を避けるために乗算ではなくべき乗を使用してくださいÆṣ(0)

*ḂÆṣ=µ2#

存在する場合、ゼロと最小の奇数の完全な数のリストを返します。

どうやって?

*ḂÆṣ=µ2# - Main link: no arguments
     µ   - monadic chain separation
      2# - count up from implicit `n=0` and return the first 2 truthy results of
 Ḃ       -     mod 2        -> n%2
*        -     exponentiate -> n**(n%2)  (1 when n is even, n when n is odd)
  Æṣ     -     sum of proper divisors of n**(n%2)
    =    -     equals n?    -> 1 if n is zero or both perfect and odd, else 0


3

Python、92バイト

これはコードのゴルフ大会には勝てず、無限のメモリと再帰の深さを必要としますが、これは2年前に数学スタック交換で尋ねた興味深い問題を埋めるほぼ完璧な機会です、フィボナッチ数は8以上2つの正の立方体。おもしろいことに、それはコードゴルフチャレンジのアイデアとして始まりました。

def f(i,j):
 r=range(i)
 for a in r:
  for b in r:
   if a**3+b**3==i:1/0
 f(j,i+j)
f(13,21)

3

Python 2、123 98 92バイト

p=lambda n,k=2:n<=k or n%k*p(n,k+1)
g=lambda n:[p(b)*p(n-b)for b in range(n)]and g(n+2)
g(4)

Goldbach予想がすべての偶数について成り立たない場合(つまり、すべての偶数が2つの素数の合計として表現できる場合)、このコードは終了します。現在、最大4 * 10 ^ 18までの数でテストされています。

コードを大幅に短縮してくれた@ Pietu1998に多大な感謝を!

編集:私のコードから6バイト削る@JonathanAllanに感謝します!


で6バイト節約できると思いますg=lambda n:[p(b)*p(n-b)for b in range(n)]and g(n+2)。また、これは「Goldbachの予想が成り立たない場合は終了します」と読むべきだと思います。
ジョナサンアラン

2

JavaScript(ES6)、104 101バイト

for(n=[6,9,p=1];!p;n=n.map((x,i)=>(q=n[n.length+~i],p|=x^q,c=q+x+c/10|0)%10).concat(c/10|0||[]))c=p=0

Perlの答えと同じ方法を使用します。nを196に設定し、ベース10の回文になるまで、ベース10にnを繰り返し追加します。これは、JSが任意精度の数値をサポートする場合は短くなりますが


これは長いですが、巧妙にゴルフされているため、+ 1です。
wizzwizz4


1

Python 2、64バイト

Lychrel番号は、その数字を繰り返し反転し、結果の数字を加算する反復プロセスを通じて回文を形成できない自然数です。

10 進数に存在することが証明されたLychrel番号はありません。196は、10進数の最小のLychrel番号候補です。パリンドロームが存在する場合(Lychrel番号ではなく 196を作成する場合)、少なくとも10億(10 ^ 9)桁になること示されています。

n=196
while 1:
    x=str(n);r=x[::-1]
    if x!=r:n=n+int(r)
    else:1/0

@trichoplaxああ、タブ/スペースの「機能」が再び攻撃される
...-wizzwizz4

1
他の誰にもタブ変換が役に立たない見つけた場合、ありますメタ上の議論は ...
センモウヒラムシ

1

ゼリー、7バイト

*+3Ẓµ4#

オンラインでお試しください!(4ではなく2つの要素を印刷するので、実際に停止するのを見ることができます)

nnn+3

説明

*+3Ẓµ4#
     4#  Find the first four numbers with the following property:
    µ      (bracketing/grouping: place everything to the left inside the loop)
*          {The number} to the power of {itself}
 +3        plus 3
   Ẓ       is prime

0

R、30バイト、決定論的であるかどうかについて議論可能

while(any(sample(2,654,T)>1))1

Rのデフォルトの乱数ジェネレーターは、653の連続した次元で等分布を持っていますが、654の次元では不明です。したがって、与えられたベクトルから最も低い要素を654回連続してサンプリングする擬似乱数のシーケンスがある場合とない場合があります(ここではベクトル1:2)。

RのRNGは周期的であるため(非常に長い周期ではありますが)、最終的にループを開始するため、これ決定論的であると主張します。もちろん、あなたの意見は異なる場合があります。


0

Python 3、101バイト

私はそれが他の多くの人よりも長いことを知っていますが、私はこれがどれくらい短いかを見るのに多くの時間を費やしました。

これは、反証しようとパワーズ予想のオイラーの和をk=6(ディオファントス方程式への正の整数解が存在しないA^6+B^6+C^6+D^6+E^6==F^6無反例が見つかっていないいるが、)。

R=[1]
while 1:R+=[R[-1]+1];eval(("[1/("+"+%s**6"*5+"!=%%s**6)%s]"%("for %s in R "*6))%(*"ABCDEF"*2,))

Python 2(104バイト):

R=[1]
while 1:R+=[R[-1]+1];eval(("[1/("+"+%s**6"*5+"!=%%s**6)%s]"%("for %s in R "*6))%tuple("ABCDEF"*2))

少ないゴルフ:

x=2
while 1:
    R=range(1,x)
    [1/(A**6+B**6+C**6+D**6+E**6!=F**6)for F in R for E in R for D in R for C in R for B in R for A in R]
    x+=1

評価なしのMathyバージョン:

R=range
x=2
while 1:
    for i in R(x**6):1/(sum(map(lambda x:x**6,[1+(i%x**-~j/x**j)for j in R(6)]))-i%x-1)
    x+=1

代替リファレンス:オイラーの総和予想-MathWorld



0

Clojure、154バイト

(loop[x 82001](if(= 0(reduce +(map{true 1 false 0}(for[y(range 3 6)](true?(for[z(str(range 2 y))](.indexOf z(Integer/toString x y))))))))x(recur(inc x))))

基数2の0と1だけが含まれる82,000を超える数があるかどうかを基数5まで調べます。つまり、このシーケンスに別の数があるかどうかを調べます

その特別なグループには、3つの数字しかありません:01および82,000。そのルールに続くおよそ未満の数字はありません3*10^19723


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