코드가 종료됩니까?


92

이것은 수학적으로 구부러진 것으로 생각한 코드 골프 도전입니다. 문제는 가능한 가장 짧은 코드를 작성하여 코드가 종료되는지 여부에 대한 열린 질문입니다. 내가 의미하는 것의 예는 anwser 에서이 cs stackexchange 질문에 맞게 조정 된 다음 파이썬 코드 일 수 있습니다 .

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

수학자들은 홀수의 완벽한 숫자는 없다고 추측하지만 증명 된 적이 없으므로이 코드 조각이 끝날지 아무도 모릅니다. 더 짧은 다른 코드 조각 (콜라 츠 추측 또는 쌍둥이 프라임 추측과 같은 다른 열린 문제에 의존 할 수 있음)을 생각해 낼 수 있습니까?하지만 종료 여부는 알 수 없습니까?

편집 : 일부 사람들은 좋은 추가 규칙을 제시했습니다-질문에 대한 해결책은 결정적이어야합니다. 비결정론을 사용하여 더 짧은 솔루션을 찾을 수 있다면 더 흥미로울 수 있습니다. 이 경우 규칙은 종료 확률을 알 수없는 스 니펫을 찾는 것입니다.


2
PPCG에 오신 것을 환영합니다!
Luis Mendo

3
코드는 50 바이트로 제한 할 수 있습니다 n=3 while sum(k*(n%k<1)for k in range(1,n))-n:n+=2.
xnor

13
이것은 정말 훌륭한 개념입니다. 이와 같은 독창적 인 아이디어를 보는 것이 좋습니다.
Nathan Merrill

7
@ Mego 나는이 도전이 무한 데이터 유형을 자동으로 무한 메모리로 가정하는 것으로 가정하는 경우에만 효과가 있다고 생각합니다.
Martin Rosenau

52
제목을 읽으면 정지 문제를 해결하고 해결책을 제시하기를 원한다고 생각했습니다.
MrPaulch

답변:


29

젤리 , 7 바이트

!‘Ʋµ4#

온라인으로 사용해보십시오!

배경

Brocard의 문제에 대한 네 번째 해결책 , 즉 솔루션 n 을 찾으면 종료됩니다 ! + 1 = ㎡ 크기(N, M) ≠ (4, 5), (5, 11), (7, 71) 양의 정수 위에. 구현은 부동 소수점 산술을 사용하지 않으므로 네 번째 솔루션을 찾거나 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 번째 Fermat 프라임 이 발견 되면 종료 됩니다.

온라인으로 사용해보십시오!

작동 원리

ÆẸ⁺‘Æ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

모든 Fermat 번호 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

파이썬, 36 바이트

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

Brocard의 문제를 사용합니다 .

n! +1은 n≥8에 대한 완벽한 정사각형입니까?

연속 계승을 계산하고 정사각형인지 확인합니다 k>7. 2 바이트의 Dennis에게 감사합니다!

이것은 파이썬이 임의로 많은 수의 정확한 산술을 계속한다고 가정합니다. 실제 구현에서는 종료됩니다.


1
겠습니까 -~n**.5대신 작동하지 (n+1)**.5?
ETHproductions

@ETHproductions 지수의 우선 순위는의 우선 순위보다 높으므로 float를 비트 단위로 부정하려고 ~하면 TypeError가 발생 합니다.
Dennis

11

펄, 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 루프 대신에 while 루프를 사용하여 골프를 줄였습니다 (어쨌든). 또한 생각했던 것보다 적은 바이트 수를 가졌습니다 (나중에 바이트 수를 더 자세히 살펴 봐야 할 것입니다).

편집 : 대체 $n와가 $_의 묵시적 인수에 대해 2 바이트를 저장합니다 reverse. 나는 이 구현이 얻는 것처럼 이것이 골프 라고 생각 합니다.

편집 : 나는 틀렸다. until($%=reverse)==$_차이가 0이 아닌 동안 (즉, true) 사용하는 대신 갈 수 있습니다 while($%=reverse)-$_.


3
가능한 많은 수의 일반 펄 숫자가 있기 때문에 실제로이 프로그램의 종료 여부를 결정할 수 있습니다. 이 작업을 수행하거나 구현하려면 bigint 패키지를로드해야합니다.
Ton Hospel

해. 감히 :-)
Veky

11

MATL, 11 바이트

`@QEtZq&+=z

Goldbach 추측 이 거짓 인 경우 종료합니다 . 즉, 프로그램이 짝수보다 큰 짝수를 찾으면 2두 소수의 합으로 표현할 수 없습니다.

`        % 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 번째 Fermat 프라임 이 발견 되면 종료됩니다 .

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

파이썬, 30 28 바이트

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

2 ^ (n-1) -1을 n ^ 3으로 나눌 수 있도록 1보다 큰 정수 n이있는 경우에만이 프로그램이 중지됩니다. 내 지식으로는이 속성을 가진 숫자가 존재하는지 여부를 알 수 없습니다 (이 속성을 만족하는 숫자가 소수이면 Wieferich 소수는 3에서 2까지이며, 소수는 존재하는지 여부는 열려 있습니다).


괄호가 올바르게 배치 되었습니까? 2 ^ n ≡ 1 (mod n ^ 3)이 아니라 2 ^ (n-1)! ≡ 1 (mod n ^ 3)인지 확인하기 위해 테스트하는 것 같습니다. 물론 파이썬의 연산자가 그 우선 순위를 잘 모릅니다.
가브리엘 베 나미

코드는 정확하지만 제 설명은 정확하지 않습니다. 내가 고칠 게
Julian Rosen

2
당신은 대체 할 수 (n-1)~-n
밀 마법사

7

하스켈, 47 바이트

[n|n<-[1..],2*n==sum[d|d<-[2..n],n`mod`d<1]]!!0

제수의 합 이 첫 번째 준 완성 수를 검색합니다 . 1을 추가하는 대신 제수 목록에서 1을 제외합니다.n2*n+1


6

뇌 플랙, 212 (208) 204 바이트

이 프로그램은 MegaTom에 의해 작성된 곱셈 알고리즘 과 1000000000에 의해 작성된 비 제곱 체커를 사용합니다.

온라인으로 사용해보십시오

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

이 프로그램은 8에서 시작하여 n! +1이 제곱인지 여부를 확인하기 위해 각 숫자를 테스트합니다. 발견되면 종료합니다. 이것을 Brocard 's Problem 이라고하며 수학에서 열린 문제입니다.


6

Brachylog (v2), Brachylog 인코딩에서 3 바이트

⟦cṗ

온라인으로 사용해보십시오! (명백한 이유로 가시적 인 작업을 수행하지 않고 시간이 초과됩니다)

전체 프로그램; 입력없이 실행하면 첫 번째 Smarandache prime을 검색 true.하고 찾은 경우 출력 합니다. Smarandache 소수가 존재하는지 여부에 대한 공개 질문입니다. 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 숫자의 시퀀스를 생성하는 매우 간결한 방법입니다. 기본 전체 프로그램 동작은 결과 생성기의 첫 번째 요소를 강제합니다). 범위는 앞에 0이 있지만 다행히도이 흐름 패턴을 통해 Brachylog는 실패하지 않고 0을 제거합니다.

다음은 알 수없는 정지 상태가 아닌 60 초 내에 종료되는 유사한 프로그램의 데모로 6 (mod 11) 인 첫 번째 Smarandache 번호를 찾는 예입니다.

⟦c{-₆~×₁₁&}

온라인으로 사용해보십시오!

이것은 true.전체 프로그램으로 인쇄 되지만 Z명령 행 인수에서 실제로 해당 숫자를 인쇄 하여이 일반적인 접근 방식이 더 효과적이라는 더 나은 데모를 제공했습니다.


5

파이썬 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이 Sierpiński 번호 인 경우 종료됩니다. 10223은 현재 2013 년 12 월 기준으로 Sierpiński 번호 일 수도 있고 아닐 수도있는 가장 작은 후보입니다.

Sierpiński 숫자는 k모든 형식의 숫자 (k * 2^n) + 1가 복합 인 숫자입니다 .


나는이 문제와 Sierpinski 문제가 더 많은 계산으로 가까운 장래에 해결되기를 바랍니다.
qwr

4
이 코드는 반드시 두 개의 람다를 명명하기 때문에 실제로 아무것도 호출 하지 않으므로 종료됩니다 . - 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 이 발견되었습니다 . 그 이후로 21181Sierpiński인지 아닌지 알 수없는 가장 작은 숫자였습니다.
Jeppe Stig Nielsen

4

Pyth, 16 바이트

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

Collatz 추측이 보유하지 않은 첫 번째 값을 리턴합니다. 추측이 모든 수에 적용되는지 여부는 알 수 없으므로이 코드가 종료되는지 여부는 알 수 없습니다.


3
그것을 읽을 수 없다면, 당신의 코드가 정확히 당신이 주장하는 것을 의심합니다. 4-2-1과 다른 루프로가는 첫 번째 숫자를 검색합니까? 루프로 끝나지 않는 더 작은 숫자가 있으면 찾지 못할 것입니다. 어쨌든, 그것이 코드가하는 일이라면 종료 여부를 알기에 충분합니다.
Christian Sievers

1
루프로가는 첫 번째 정수> = 1을 검색하고 해당 루프의 순회 내에 1을 포함하지 않습니다.
Steven H.

3
그것이 내가 기대했던 것입니다. 그러나 이것이 콜 랏츠 추측을 만족시키지 못하는 유일한 방법은 아닙니다.
Christian Sievers

실제로 Collatz 맵에서 모든 숫자가 무한대로 퍼져 있거나 1-2-4로 덮여 있음이 입증되었습니다. 귀하의 코드는 절대 종료되지 않습니다. 루프를 형성하는 일련의 단계는 방정식이 1-2-4, 음수 값 및 정수가 아닌 비이성 식만 설정한다는 것입니다.
John Dvorak

3
@ JanDvorak 나는 그것이 사실이라고 생각하지 않습니다. 출처를 인용 할 수 있습니까?
KSFT

4

실제로 16 바이트

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

온라인으로 사용해보십시오!

일부 합성 수있다 IFF에이 코드는 종료 n되도록 totient(n)분할 n-1( 레머 totient의 문제 ).

설명:

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#

존재하는 경우 0과 가장 작은 홀수 완벽 숫자 의 목록을 반환 합니다.

어떻게?

*ḂÆṣ=µ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

파이썬, 92 바이트

이것은 어떤 코드 골프 대회에서도 이기지 못하며 무한한 메모리와 재귀 깊이가 필요하지만 2 년 전에 수학 스택 교환에서 요청한 흥미로운 문제를 해결할 수있는 거의 완벽한 기회입니다 .8보다 큰 피보나치 수는 합계가 아닙니다. 두 개의 긍정적 인 큐브 . 재미있게도, 그것은 골프 골프 도전 아이디어로 시작되었으므로, 나는 완전한 원을 보았습니다.

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

파이썬 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 추측이 모든 짝수를 보유하지 않는 경우 (즉, 모든 짝수를 두 소수의 합으로 표현할 수있는 경우) 종료됩니다. 현재 최대 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 추측이 보류 되지 않으면 종료 될 것"이라고 읽어야한다고 생각합니다 .
Jonathan Allan

2

자바 스크립트 (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을 회문으로 회귀 할 때까지 n 을 10을 거꾸로 반복하여 n 을 반복해서 추가합니다 .


이것이 길지만 영리하게 골프를 쳤으므로 +1입니다.
wizzwizz4


1

파이썬 2, 64 바이트

Lychrel 숫자는 반복적으로 숫자를 거꾸로 바꾸고 결과 숫자를 추가하는 반복 과정을 통해 회문을 형성 할 수없는 자연 숫자입니다.

어떤 라이 크렐 수는 기본 열 존재 증명되지 않았다. 196은 가장 작은 기본 열 리클 렐 수 후보입니다. 회문이 존재하는 경우 ( 리치 렐 수가 아닌 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가 아닌 두 가지 요소를 인쇄합니다)

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

파이썬 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

클로저, 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))))

8과 밑 수가 5이고 밑이 2 인 0과 1 만 포함하는 숫자가 있는지 확인합니다. 즉, 이 순서에 다른 숫자가 있는지 확인합니다 .

해당 특수 그룹에는 0, 1및 세 개의 숫자 만 82,000있습니다. 이 규칙 뒤에는 대략 더 적은 숫자가 없습니다 3*10^19723.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.