Kod sonlandırılıyor mu?


92

Bu matematiksel bir bükülme ile düşündüğüm bir kod golf mücadelesi. Buradaki zorluk, kodun sonlandırılıp sonlandırılmayacağı açık bir soru olacak şekilde mümkün olan en kısa kodu yazmaktır. Ne demek istediğimin bir örneği, bir cevaplayıcıdan bu cs stackexchange sorusuna uyarlanan aşağıdaki python kod parçası olabilir .

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

Matematikçiler garip bir mükemmel sayının olmadığını varsayıyorlar, ancak hiçbir zaman kanıtlanmadı, bu yüzden bu kodun hiç bitmeyeceğini kimse bilmiyor. Diğer kod parçalarını (belki de Collatz ya da ikiz primler varsayımı gibi diğer açık sorunlara dayanarak) kısaltabilir ancak sonlandırıp sonlandırmayacağı bilinmiyor.

Düzenleme: Bazı insanlar iyi bir ek kural getirdiler - Sorunun çözümleri belirleyici olmalı. Her ne kadar ilginç olmasa da, nondeterminism kullanarak daha kısa çözümler bulabilirseniz. Bu durumda, kural, fesih olasılığının bilinmediği bir pasajı bulmak olacaktır.


2
PPCG'ye Hoşgeldiniz!
Luis Mendo,

3
Kodunuz 50 bayt golfed edilebilir: n=3 while sum(k*(n%k<1)for k in range(1,n))-n:n+=2.
xnor

13
Bu gerçekten harika bir kavram. Bunun gibi orijinal fikirleri görmek güzel.
Nathan Merrill

7
@Mego Bence bu meydan okuma yalnızca otomatik olarak sonsuz hafızayı alacak olan sonsuz veri tipini varsayıyorsa işe yarar.
Martin Rosenau

52
Başlığı okuduğumda, durma problemini çözmemizi istediğini ve çözümü çözdüğümüzü düşündüm.
MrPaulch

Yanıtlar:


29

Jöle , 7 bayt

!‘Ʋµ4#

Çevrimiçi deneyin!

Arka fon

Bu, Brocard'ın sorununa dördüncü bir çözüm bulduğunda sona erecektir , yani bir çözüm n! + 1 = pozitif tamsayılar üzerinde (n, m) ≠ (4, 5), (5, 11), (7, 71) ile . Uygulama kayan nokta aritmetiği kullanmaz, bu nedenle yalnızca dördüncü bir çözüm bulduğunda veya n ise! artık bellekte temsil edilemez.

Brocard'ın sorunu ilk önce bu cevapta @ xnor tarafından kullanıldı.

Nasıl çalışır

!‘Ʋµ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
Jöle öğrenmem gerekiyor ...
noɥʇʎԀʎzɐɹƆ

19

Jöle , 11 9 bayt

ÆẸ⁺‘ÆPµ6#

Bu, altıncı Fermat üssü bulunduğunda sona erecektir .

Çevrimiçi deneyin!

Nasıl çalışır

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

fP_h^2^2T5

Tüm Fermat sayılarının 2^(2^n)+1 için birleşik olduğu varsayımını kullanır 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 bayt

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

Brocard'ın problemini kullanır :

N! + 1, herhangi bir n≥8 için mükemmel bir kare midir?

Ardışık faktörleri hesaplar ve kareler olup olmadığını kontrol eder k>7. 2 bayt için Dennis'e teşekkürler!

Bu, Python'un isteğe bağlı olarak büyük sayılar için doğru aritmetik işlemine devam ettiğini varsayar. Gerçek uygulamada sona erer.


1
-~n**.5Yerine işe yaramaz mıydı (n+1)**.5?
ETHProductions

@ETProdüksiyonlar Üstelliğin önceliği, önceliğinden daha yüksektir ~, bu nedenle bit yüzlü bir floatı engellemeye çalışmak için bir TypeError'ı yükseltecektir .
Dennis,

11

Perl, 50 38 36 34 33 bayt

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

Açıklama: 196, muhtemel bir Lychrel sayısıdır - tersini kendisine tekrar tekrar ekleyerek bir palindrom oluşturmayan bir sayı. Döngü, $ n, 196 başlangıç ​​değeri için henüz bilinmeyen, tersine eşit olana kadar devam eder.

25 + 52 = 77

bu geçerli değil.

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

bu yüzden bu dizideki sayıların hiçbiri geçerli değil.

Düzenleme: for döngüsü yerine bir till döngüsü kullanarak golf oynadı (bir şekilde). Ayrıca, düşündüğümden daha az baytım vardı (gelecekte bayrağımı daha dikkatli bir şekilde incelemeliyim).

Düzenleme: içinde ima edilen argüman için 2 bayt kaydetmek için $nile değiştirildi . Ben düşünüyorum bu uygulama almak için gidiyor gibi golfed olarak budur.$_reverse

Düzenleme: Yanılmışım. Bunun yerine kullanmanın until($%=reverse)==$_farkı sıfırdan farklı ise gidebileceğimi (yani true): while($%=reverse)-$_.


3
Sınırlı sayıda olası perl sayısı olduğundan, bu programın sonlandırılıp sonlandırılmayacağını belirleyebilirim. Bu işi yapmak için bir bigint paketi yüklemelisiniz (veya uygulayın)
Ton Hospel

Yap. Sana meydan okuyorum. :-)
Veky

11

MATL, 11 bayt

`@QEtZq&+=z

Goldbach varsayımının yanlış olması durumunda sona erer . Başka bir deyişle, 2iki asal toplamın toplamı olarak ifade edilemeyecek olandan daha büyük bir sayı bulursa program durur .

`        % 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 bayt

6. Fermat üssü bulunduğunda sonlandırılacak .

5µNoo>p½

açıklama

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 bayt

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

Bu program, ancak 2 ^ (n-1) -1, n ^ 3 tarafından bölünebilecek şekilde 1'den büyük bir tamsayı varsa, durur. Bildiğim kadarıyla, bu özelliğe sahip herhangi bir sayının var olup olmadığı bilinmiyor (bu özelliği karşılayan bir sayı asal ise, buna temel 2'ye göre 3'e göre bir Wieferich astarı denir ve bu tür bir asalın olup olmadığı açıktır).


Parantezlerin doğru yerleştirildiğinden emin misiniz? 2 ^ (n-1)! ≡ 1 (mod n ^ 3) olup olmadığını görmek için test yapıyor gibisiniz, 2 ^ n testing 1 (mod n ^ 3). Kabul ediyorum, Python'un operatörünün hepsinden önce geldiğini bilmiyorum.
Gabriel Benamy

Hata! Kod doğru, ancak açıklamam değil. Düzelteceğim.
Julian Rosen

2
(n-1)ile değiştirebilirsiniz~-n
Buğday Sihirbazı


6

Brain-Flak, 212 208 204 bayt

Bu program MegaTom tarafından yazılmış çarpım algoritmasını ve 1000000000 tarafından yazılmış kare olmayan bir denetleyiciyi kullanır

Çevrimiçi Deneyin

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

Bu program 8'de başlar ve n! +1'in kare sayı olup olmadığını görmek için her sayıyı sınar. Bir tane bulduğunda çıkar. Bu Brocard'ın Problemi olarak bilinir ve matematikte açık bir problemdir.


6

Brachylog (v2), Brachylog şifrelemesinde 3 bayt

⟦cṗ

Çevrimiçi deneyin! (bariz sebeplerden dolayı görünür bir şey yapmadan zaman aşımına uğrayacaktır)

Tam program; Hiçbir girişi ile çalıştırırsanız, ilk arar Smarandache asal ve çıkışlar true.ancak ve diğeri bulduğunda. Herhangi bir Smarandache astarının bulunup bulunmadığına dair açık bir soru. (Brachylog'un ana test algoritmasının, keyfi olarak çok büyük sayılar üzerinde teorik olarak çalışmasına rağmen, üzerinde yavaş çalışma eğiliminde olduğunu unutmayın; bu nedenle, Smarandache prime'larını kendiniz bulmakla ilgileniyorsanız, farklı bir dil kullanmanızı öneririm.)

açıklama

⟦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, bir liste gibi davranmaya çalıştığınızda bir sayının ondalık basamağında çalışır, bu nedenle "aralık" ve ardından "bitiştirme", Smarandache sayılarının sırasını oluşturmak için çok özlü bir yoldur (ve sonra bunu asallığa göre süzeriz; Brachylog's; varsayılan tam program davranışı daha sonra ortaya çıkan jeneratörün ilk elemanını zorlar). Aralığın önde gelen bir sıfır değeri vardır, ancak neyse ki bu akış düzeninde Brachylog başarısızlıktan ziyade sıfırı kaldırır.

İşte, 6'ya eşit olan ilk Smarandache numarasını bulan bir örnek, bilinmeyen durma durumuna sahip olmak yerine 60 saniye içinde sona eren benzer bir programın gösterimi:

⟦c{-₆~×₁₁&}

Çevrimiçi deneyin!

Bu, true.tam bir program olarak yazdırılır , ancak Zbu genel yaklaşımın işe yaradığına dair daha iyi bir gösteri vererek, söz konusu sayıyı gerçekten yazdırmak için komut satırı argümanına attım .


5

Python 2,8 bayt

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)

Bu kod, 10223 bir Sierpiński numarasıysa sona erecektir. 10223 şu anda Aralık 2013 itibariyle bir Sierpiński numarası olabilecek veya olmayabilecek en küçük aday.

Sierpiński numarası, kformdaki tüm sayıların birleşik olduğu bir sayıdır (k * 2^n) + 1.


Umarım bu sorun ve Sierpinski sorunu yakın gelecekte daha fazla hesaplama yapılarak çözülür.
qwr

4
Bu kod kesinlikle sona ermektedir, çünkü sadece iki lamdadanın ismini verdiğiniz için aslında hiçbir şey çağırmazsınız . :-P
Veky

4
Aslında yapmadın. Python2 semantik donmuş olduğundan (PEP 404) ve BDFL fiat'ın ( neopythonic.blogspot.hr/2009/04/final-words-on-tail-calls.html) yinelemeli çağrılar için zorlu bir limit içerdiğinden kodunuz her zaman sonlandırılıyor ). ;-P
Veky

2
@Veky Yorumunuzu oylamanız gerekiyordu.
Qwerp-Derp

1
Bu yazıldıktan birkaç gün sonra, asal 10223*2^31172165 + 1 keşfedildi . O zamandan 21181beri, Sierpiński olup olmadığı bilinmeyen en küçük sayı olmuştur.
Jeppe Stig Nielsen

4

Pyth, 16 bayt

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

Collatz varsayımının tutmadığı ilk değeri döndürür. Toplantının tüm sayılar için geçerli olup olmadığı bilinmediğinden, bu kodun sonlandırılıp sonlandırılmayacağı bilinmemektedir.


3
Bunu okuyamazsan, kodunun iddia ettiğinin aynısını yaptığından şüpheliyim. 4-2-1'den farklı bir döngüye giden ilk numarayı mı arıyorsunuz? Sanırım herhangi bir döngüde bitmeyen daha küçük bir sayı varsa bulamazsınız. Her neyse, eğer kodunuz böyle yaparsa, sonlandırılıp sonlandırılmayacağını bilmemek için yeterlidir.
Christian Sievers,

1
Ben bir döngüye giden ilk tamsayı> = 1'i ararım ve bu döngünün geçişi içinde hiçbir yerde 1 yoktur.
Steven H.

3
Beklediğim bu. Ancak, bir rakamın collatz varsayımını tatmin etmemesinin akla gelebilecek tek yolu bu değildir.
Christian Sievers

Aslında, her sayının ya Sonsuza dek ayrıldığı ya da Collatz haritası altında 1-2-4'ü kapsadığı kanıtlanmıştır. Kodunuz asla sonlandırılmayacak. Buradaki fikir, bir döngü oluşturan adımların dizisinin, sadece çözümleri 1-2-4, negatif değerler ve tam sayı olmayan rasyonel olan bir denklem oluşturmasıdır.
John Dvorak

3
@JanDvorak Bunun doğru olduğuna inanmıyorum. Bir kaynaktan alıntı yapabilir misin?
KSFT

4

Aslında , 16 bayt

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

Çevrimiçi deneyin!

Bazı bileşik sayı vardır IFF Bu kod sonlandırır nböyle totient(n)böler n-1( LEHMER en totient problemi ).

Açıklama:

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

Jöle , 9 8 bayt

@Dennis sayesinde -1 bayt! (önlemek için çarpma yerine üs kullanma Æṣ(0))

*ḂÆṣ=µ2#

Varsa , sıfır ve en küçük tek sayı olan bir liste döndürür .

Nasıl?

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

Bu, herhangi bir kod golf yarışmasını kazanmıyor ve sonsuz bellek ve özyineleme derinliği gerektiriyor, ancak bu iki yıl önce matematik yığın yığınında sorduğum ilginç bir problemi tespit etmek için neredeyse mükemmel bir fırsat , 8'den büyük hiçbir Fibonacci sayısı iki pozitif küp . Yeterince tuhaf, bir kod golf mücadelesi fikri olarak başladı, sanırım tam olarak geldim.

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 bayt

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 varsayımı tüm çift sayılar için geçerli değilse (yani bütün sayılar iki asalın toplamı olarak ifade edilebiliyorsa) bu kod sonlanacaktır. Halen 4 * 10 ^ 18 olan numaralar için test edilmiştir.

Kodumu çok kısaltmak için @ Pietu1998'e çok teşekkür ederim!

EDIT: @JonathanAllan'a kodumun 6 baytını tıraş ettiğin için teşekkürler!


Bence 6 byte tasarruf edebilirsiniz g=lambda n:[p(b)*p(n-b)for b in range(n)]and g(n+2). Ben de bu "Goldbach varsayım eğer feshedilecektir okumak gerektiğini düşünüyorum değil tutun".
Jonathan Allan,

2

JavaScript (ES6), 104 101 bayt

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 cevabıyla aynı yöntemi kullanır: n'ye 196'yı ayarlar , daha sonra 10 tabanına bir palindrom olana kadar tekrar 10 tabanına n ekler .


Bu uzun olmasına rağmen, zekice golf, yani +1.
wizzwizz4


1

Python 2,64 bayt

Bir Lychrel numarası, rakamlarını tekrar tekrar tersine çevirmek ve elde edilen sayıları eklemek için yinelemeli bir işlemle palindrom oluşturamayan doğal bir sayıdır.

On temelde hiçbir Lychrel sayısının bulunmadığı kanıtlanmamıştır. 196 en küçük üssü olan on Lychrel adayı. Bir palindrom varsa (196 yapım olduğu gösterilmiştir değil , çünkü bir Lychrel numarası), en az bir milyar (10 ^ 9) basamak olurdu insanlar o kadar uzun algoritmayı çalıştırmak.

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

@trichoplax Ah, sekmeler / boşluklar "özellik" yine grevde ...
wizzwizz4

1
Eğer başka biri de sekme dönüşümünün faydasız olduğunu tespit ederse , meta üzerine bir tartışma var ...
trichoplax

1

Jöle , 7 bayt

*+3Ẓµ4#

Çevrimiçi deneyin! (4 değil iki öğe yazdırır, böylece gerçekten durduğunu görebilirsiniz)

nnn+3

açıklama

*+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 bayt, deterministik olup olmadığını tartışabilir

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

R'nin varsayılan rasgele sayı üreteci, ardışık 653 boyutta eşit dağılımına sahiptir, ancak 654 boyutunda bilinmemektedir. Dolayısıyla, en düşük elemanı belirli bir vektörden arka arkaya 654 kez örnekleyen bir sahte sayılar dizisi olabilir veya olmayabilir (burada vektör 1:2).

R'ın RNG (çok uzun süre ile de olsa) periyodik olduğundan, bu iddia olduğunu deterministik yana olacak sonunda başlangıç döngü yuvarlak. Elbette, görüşleriniz farklı olabilir.


0

Python 3, 101 bayt

Bunun diğerlerinden daha uzun sürdüğünü biliyorum, ancak bunu ne kadar kısa sürebilirim diye görmek için çok zaman harcadım.

Bu çürütmek için çalışır Powers Sanısını Euler Sum için k=6(Diofant denkleme hiçbir pozitif tamsayı çözümü vardır A^6+B^6+C^6+D^6+E^6==F^6hiçbir counterexample olduğu saptandığı için,).

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'de (104 bayt):

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

Daha az golf oynadı:

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

Hiçbir değerlendirme ile mathy sürümü:

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

Alternatif referans: Euler Güç Birimi Toplamı - MathWorld


0

Python, 68 bayt

n=2
while"".join(str((i+2)**n)[0]for i in range(8))!="23456789":n+=1

Çevrimiçi deneyin

Gelfand'ın Sorularından birine cevap vermeye çalışıyor .

  1. "23456789" satırı n> 1 için hiç belirecek mi? Hiçbiri n <= 10 ^ 5 yapmaz. ...

0

Clojure, 154 bayt

(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))))

Yalnızca temel 2 diğer bir deyişle 5. temel tüm yol boyunca 0 ve 1 's içeren 82,000 üzerinde bir dizi ise başka bir numara var olmadığını kontrol eder, bu kontrol , bu sekans .

Bu özel grupta, orada sadece 3 sayılardır: 0, 1ve 82,000. Bu kurala uyan yaklaşık sayıdan daha az sayıda numara yoktur 3*10^19723.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.