Liệu mã chấm dứt?


92

Đây là một thử thách golf mã mà tôi nghĩ đến với một bẻ cong toán học. Thách thức là viết mã ngắn nhất có thể sao cho đó là một câu hỏi mở cho dù mã đó có chấm dứt hay không. Một ví dụ về những gì tôi có nghĩa là có thể là đoạn mã sau python, chuyển thể từ một anwser để này stackexchange câu hỏi cs.

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

Các nhà toán học phỏng đoán rằng không có con số hoàn hảo kỳ lạ, nhưng nó chưa bao giờ được chứng minh, vì vậy không ai biết liệu đoạn mã này có bao giờ chấm dứt hay không. Bạn có thể đưa ra các đoạn mã khác (có thể dựa vào các vấn đề mở khác như phỏng đoán Collatz, hoặc phỏng đoán số nguyên tố sinh đôi) ngắn hơn, nhưng không biết liệu chúng có chấm dứt hay không?

Chỉnh sửa: Một số người đã đưa ra một quy tắc bổ sung tốt - Các giải pháp cho câu hỏi nên mang tính quyết định. Mặc dù nó có thể còn thú vị hơn nếu bạn có thể tìm thấy các giải pháp ngắn hơn bằng cách sử dụng thuyết không điều kiện. Trong trường hợp này, quy tắc sẽ là tìm một đoạn mà xác suất chấm dứt là không xác định.


2
Chào mừng đến với PPCG!
Luis Mendo

3
Mã của bạn có thể được đánh gôn tới 50 byte : n=3 while sum(k*(n%k<1)for k in range(1,n))-n:n+=2.
xnor

13
Đây thực sự là một khái niệm tuyệt vời. Thật tuyệt khi thấy những ý tưởng ban đầu như thế này.
Nathan Merrill

7
@Mego Tôi nghĩ rằng thách thức này chỉ hoạt động nếu bạn giả sử các loại dữ liệu vô hạn, những gì sẽ tự động giả định bộ nhớ vô hạn.
Martin Rosenau

52
Khi tôi đọc tiêu đề, tôi nghĩ rằng bạn muốn chúng tôi giải quyết vấn đề tạm dừng VÀ đánh golf giải pháp.
MrPaulch

Câu trả lời:


29

Thạch , 7 byte

!‘Ʋµ4#

Hãy thử trực tuyến!

Lý lịch

Điều này sẽ chấm dứt khi nó tìm ra giải pháp thứ tư cho vấn đề của Brocard , tức là giải pháp n! + 1 = mét vuông với (n, m) (4, 5), (5, 11), (7, 71) trên các số nguyên dương. Việc thực hiện không sử dụng số học dấu phẩy động, vì vậy nó sẽ chỉ chấm dứt nếu nó tìm ra giải pháp thứ tư hoặc nếu n! không thể được biểu diễn trong bộ nhớ

Vấn đề của Brocard lần đầu tiên được sử dụng trong câu trả lời này bởi @xnor.

Làm thế nào nó hoạt động

!‘Ʋµ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
Tôi cần học thạch ...
noɥʇʎԀʎzɐɹƆ

19

Thạch , 11 9 byte

ÆẸ⁺‘ÆPµ6#

Điều này sẽ chấm dứt khi thủ tướng Fermat thứ sáu được tìm thấy.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Bình thường, 10 byte

fP_h^2^2T5

Sử dụng phỏng đoán rằng tất cả các số Fermat 2^(2^n)+1 là tổng hợp cho 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 byte

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

Sử dụng vấn đề của Brocard :

Có phải n! +1 là một hình vuông hoàn hảo cho bất kỳ n≥8 nào không?

Tính các yếu tố liên tiếp và kiểm tra xem chúng có phải là hình vuông và có k>7 . Cảm ơn Dennis vì 2 byte!

Điều này giả định Python tiếp tục có số học chính xác cho số lượng lớn tùy ý. Trong thực tế thực hiện, nó chấm dứt.


1
Sẽ -~n**.5không làm việc thay (n+1)**.5thế?
Sản phẩm ETH

@ETHproductions Ưu tiên của cấp số nhân cao hơn mức ưu tiên ~, do đó sẽ chỉ tăng TypeError khi cố gắng phủ định một số float.
Dennis

11

Perl, 50 38 36 34 33 byte

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

Giải thích: 196 là một số Lychrel có thể - một số không tạo thành một bảng màu bằng cách liên tục thêm ngược lại với chính nó. Vòng lặp tiếp tục cho đến khi $ n bằng với đảo ngược của nó, điều này chưa được biết đến với giá trị ban đầu 196.

25 + 52 = 77

không hợp lệ

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

vì vậy không có con số nào trong chuỗi này là hợp lệ.

Chỉnh sửa: Đánh gôn xuống bằng cách sử dụng vòng lặp cho đến khi thay vì vòng lặp for (bằng cách nào đó). Ngoài ra, tôi có ít byte hơn tôi nghĩ (có lẽ tôi nên xem xét số lượng tử của mình cẩn thận hơn trong tương lai).

Chỉnh sửa: Thay thế $nbằng $_để lưu 2 byte cho đối số ngụ ý trong reverse. Tôi nghĩ rằng điều này cũng như chơi golf vì việc thực hiện này sẽ có được.

Chỉnh sửa: Tôi đã sai. Thay vì sử dụng until($%=reverse)==$_tôi có thể đi trong khi sự khác biệt là khác không (nghĩa là đúng) : while($%=reverse)-$_.


3
Vì có một số hữu hạn các số perl đơn giản có thể, trên thực tế tôi có thể xác định xem chương trình này có kết thúc hay không. Bạn cần tải một gói bigint để thực hiện công việc này (hoặc thực hiện nó)
TonMedel

Làm đi. Tao thách mày. :-)
Veky

11

MATL, 11 byte

`@QEtZq&+=z

Chấm dứt nếu phỏng đoán Goldbach là sai. Đó là, chương trình dừng lại nếu nó tìm thấy một số chẵn lớn hơn số 2đó không thể được biểu thị bằng tổng của hai số nguyên tố.

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

Python, 30 28 byte

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

Chương trình này sẽ dừng khi và chỉ khi có số nguyên n lớn hơn 1 sao cho 2 ^ (n-1) -1 chia hết cho n ^ 3. Theo hiểu biết của tôi, không biết có bất kỳ số nào có thuộc tính này hay không (nếu một số thỏa mãn tính chất này là số nguyên tố, nó được gọi là số nguyên tố Wieferich của đơn hàng 3 đến cơ sở 2, và nó có mở cho dù có tồn tại bất kỳ số nguyên tố nào như vậy không.


Bạn có chắc rằng dấu ngoặc đơn được đặt chính xác? Có vẻ như bạn đang thử nghiệm để xem nếu 2 ^ (n-1)! 1 (mod n ^ 3) chứ không phải 2 ^ n 1 (mod n ^ 3). Cấp, tôi không biết ưu tiên toán tử của Python.
Gabriel Benamy

Rất tiếc, mã là chính xác, nhưng lời giải thích của tôi thì không. Tôi sẽ sửa chữa nó.
Julian Rosen

2
bạn có thể thay thế (n-1)bằng~-n
Wheat Wizard


6

Brain-Flak, 212 208 204 byte

Chương trình này sử dụng thuật toán nhân được viết bởi MegaTom và trình kiểm tra không vuông được viết bởi 1000000000

Dùng thử trực tuyến

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

Chương trình này bắt đầu từ 8 và kiểm tra từng số để xem n! +1 có phải là số vuông không. Nó thoát khi tìm thấy một. Đây được gọi là Bài toán của Brocard và nó là một bài toán mở trong toán học.


6

Brachylog (v2), 3 byte trong mã hóa của Brachylog

⟦cṗ

Hãy thử trực tuyến!(sẽ hết thời gian mà không làm gì có thể nhìn thấy, vì lý do rõ ràng)

Chương trình đầy đủ; nếu chạy mà không có đầu vào, hãy tìm kiếm số nguyên tố Smarandache đầu tiên và đầu ratrue. nếu và khi nó tìm thấy. Đó là một câu hỏi mở về việc có tồn tại bất kỳ số nguyên tố Smarandache nào không. (Lưu ý rằng thuật toán kiểm tra chính của Brachylog, mặc dù nó hoạt động trên lý thuyết với số lượng lớn tùy ý, có xu hướng chạy chậm trên chúng; do đó, nếu bạn quan tâm đến việc tự tìm kiếm các số nguyên tố Smarandache, tôi khuyên bạn nên sử dụng một ngôn ngữ khác.)

Giải trình

⟦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 hoạt động trên các chữ số thập phân của một số bất cứ khi nào bạn cố gắng coi nó như một danh sách, vì vậy "phạm vi" theo sau là "concatenate" là một cách rất ngắn gọn để tạo ra chuỗi số Smarandache (và sau đó chúng tôi lọc nó theo nguyên tắc; hành vi chương trình đầy đủ mặc định sau đó sẽ buộc phần tử đầu tiên của trình tạo kết quả). Phạm vi có số 0 đứng đầu, nhưng may mắn thay, với mô hình dòng chảy này, Brachylog loại bỏ số 0 thay vì thất bại.

Dưới đây là một ví dụ tìm thấy số Smarandache đầu tiên bằng 6 (mod 11), như một minh chứng cho một chương trình tương tự chấm dứt trong vòng 60 giây thay vì có trạng thái tạm dừng không xác định:

⟦c{-₆~×₁₁&}

Hãy thử trực tuyến!

Điều này sẽ in true.như một chương trình đầy đủ, nhưng tôi đã ném vào Zđối số dòng lệnh để thực sự in số đang đề cập, cho thấy một minh chứng rõ hơn rằng phương pháp chung này hoạt động.


5

Python 2, 88 byte

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)

Mã này sẽ chấm dứt nếu 10223 là số Sierpiński. 10223 hiện là ứng cử viên nhỏ nhất có thể có hoặc không phải là số Sierpiński, kể từ tháng 12 năm 2013.

Số Sierpiński là một số ktrong đó tất cả các số có dạng (k * 2^n) + 1tổng hợp.


Tôi hy vọng vấn đề này và vấn đề Sierpinki sẽ được giải quyết trong tương lai gần, chỉ với nhiều tính toán hơn.
qwr

4
Mã này chắc chắn chấm dứt, vì bạn chỉ cần đặt tên cho hai lambdas, bạn không thực sự gọi bất cứ điều gì. :-P
Veky

4
Trong thực tế, bạn đã không. Mã của bạn vẫn luôn chấm dứt, vì ngữ nghĩa Python2 bị đóng băng (PEP 404) và nó bao gồm giới hạn cứng đối với các cuộc gọi đệ quy của fiat của BDFL ( neopythonic.blogspot.hr/2009/04/final-words-on-tail-calls.html ). ;-P
Veky

2
@Veky Đã nâng cao nhận xét của bạn.
Qwerp-Derp

1
Không nhiều ngày sau khi điều này được viết, thủ tướng 10223*2^31172165 + 1 đã được phát hiện . Kể từ đó, 21181là số nhỏ nhất mà nó không được biết nếu nó là Sierpiński hay không.
Jeppe Stig Nielsen

4

Bình thường, 16 byte

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

Trả về giá trị đầu tiên mà phỏng đoán Collatz không giữ. Vì không biết liệu phỏng đoán có đúng với tất cả các số hay không, không biết liệu mã này có chấm dứt hay không.


3
Không thể đọc nó, tôi nghi ngờ mã của bạn thực hiện chính xác những gì bạn yêu cầu. Bạn có tìm kiếm số đầu tiên đi vào một vòng lặp khác với 4-2-1 không? Tôi đoán bạn sẽ không tìm thấy nó nếu có một số nhỏ hơn không kết thúc trong bất kỳ vòng lặp nào. Dù sao, nếu đó là những gì mã của bạn làm, điều đó đủ tốt để không biết liệu nó sẽ chấm dứt.
Christian Sievers

1
Tôi tìm kiếm số nguyên đầu tiên> = 1 đi đến một vòng lặp và không ở đâu trong phạm vi truyền tải đến vòng lặp đó chứa 1.
Steven H.

3
Đó là những gì tôi mong đợi. Nhưng đó không phải là cách duy nhất để một con số không thỏa mãn được phỏng đoán collatz.
Christian Sievers

Trên thực tế, người ta đã chứng minh rằng mọi số đều phân kỳ thành vô cực hoặc che phủ thành 1-2-4 dưới bản đồ Collatz. Mã của bạn sẽ không bao giờ chấm dứt. Ý tưởng là chuỗi các bước hình thành một vòng lặp thiết lập một phương trình, với các giải pháp duy nhất là 1-2-4, các giá trị âm và các tỷ lệ không nguyên.
John Dvorak

3
@JanDvorak Tôi không tin đó là sự thật. Bạn có thể trích dẫn một nguồn?
KSFT

4

Trên thực tế , 16 byte

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

Hãy thử trực tuyến!

Mã này chấm dứt nếu có một số số tổng hợp nđể totient(n)chia n-1( vấn đề toàn bộ của Lehmer ).

Giải trình:

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

Thạch , 9 8 byte

-1 byte nhờ @Dennis! (sử dụng lũy ​​thừa thay vì nhân để tránh Æṣ(0))

*ḂÆṣ=µ2#

Sẽ trả về một danh sách 0 và số hoàn hảo lẻ nhỏ nhất , nếu có.

Làm sao?

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

Điều này không chiến thắng bất kỳ cuộc thi golf mã nào và nó đòi hỏi trí nhớ vô hạn và độ sâu đệ quy, nhưng đây là một cơ hội gần như hoàn hảo để giải quyết một vấn đề thú vị mà tôi đã hỏi về toán học stackexchange hai năm trước, rằng không có số Fibonacci nào lớn hơn 8 là tổng của hai khối tích cực . Thật thú vị, nó bắt đầu như một ý tưởng thử thách golf mã, vì vậy tôi đoán rằng tôi đã đến vòng tròn đầy đủ.

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 byte

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)

Mã này sẽ chấm dứt nếu phỏng đoán Goldbach không giữ cho tất cả các số chẵn (nghĩa là nếu tất cả các số chẵn có thể được biểu thị dưới dạng tổng của hai số nguyên tố). Hiện tại nó đã được thử nghiệm cho các số lên tới 4 * 10 ^ 18.

Rất nhiều lời cảm ơn đến @ Pietu1998 vì đã rút ngắn rất nhiều mã của tôi!

EDIT: Cảm ơn @Jonathan ALLan đã cạo 6 byte khỏi mã của tôi!


Tôi nghĩ bạn có thể lưu 6 byte với g=lambda n:[p(b)*p(n-b)for b in range(n)]and g(n+2). Tôi cũng nghĩ rằng điều này nên đọc "sẽ chấm dứt nếu phỏng đoán Goldbach không giữ được".
Jonathan Allan

2

JavaScript (ES6), 104 101 byte

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

Sử dụng cùng một phương thức như câu trả lời Perl: đặt n thành 196, sau đó liên tục thêm n vào cơ sở 10 đảo ngược cho đến khi nó là một bảng màu trong cơ sở 10. Điều này sẽ ngắn hơn nếu JS hỗ trợ các số chính xác tùy ý, nhưng tốt.


Mặc dù điều này là dài, nhưng nó được chơi golf khéo léo, vì vậy +1.
wizzwizz4


1

Python 2, 64 byte

Số Lychrel là một số tự nhiên không thể tạo thành một bảng màu thông qua quá trình lặp lại nhiều lần đảo ngược các chữ số của nó và thêm các số kết quả.

Không có số Lychrel nào được chứng minh là tồn tại trong cơ sở mười. 196 là ứng cử viên số mười Lychrel cơ sở nhỏ nhất. Nó đã được chỉ ra rằng nếu một palindrom tồn tại (tạo ra 196 không phải là số Lychrel), thì nó sẽ có ít nhất một tỷ (10 ^ 9) chữ số, bởi vì mọi người đã chạy thuật toán đó từ lâu.

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

@trichoplax À, các tab / dấu cách "tính năng" lại xuất hiện ...
wizzwizz4

1
Nếu bất cứ ai khác cũng thấy việc chuyển đổi tab không hữu ích, sẽ có một cuộc thảo luận về meta ...
trichoplax

1

Thạch , 7 byte

*+3Ẓµ4#

Hãy thử trực tuyến! (in hai yếu tố, không phải 4, để bạn thực sự có thể thấy nó dừng lại)

viết sai rồiviết sai rồiviết sai rồi+3

Giải trình

*+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 byte, có thể tranh cãi cho dù đó là xác định

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

Trình tạo số ngẫu nhiên mặc định của R có sự tương đương trong 653 kích thước liên tiếp nhưng nó không được biết đến trong 654 kích thước. Do đó, có thể có hoặc không có một chuỗi các số giả ngẫu nhiên lấy mẫu phần tử thấp nhất từ ​​một vectơ đã cho 654 lần liên tiếp (ở đây là vectơ 1:2).

Vì RNG của R là định kỳ (mặc dù với khoảng thời gian rất dài), tôi cho rằng điều này mang tính quyết định vì cuối cùng nó sẽ lặp lại từ đầu. Ý kiến ​​của bạn có thể khác nhau, tất nhiên.


0

Python 3, 101 byte

Tôi biết nó dài hơn nhiều người khác, nhưng tôi đã dành rất nhiều thời gian để xem tôi có thể chơi golf này ngắn đến mức nào.

Này cố gắng bác bỏ Sum của Powers Conjecture Euler cho k=6(có tồn tại không có giải pháp số nguyên dương để phương trình Diophantine A^6+B^6+C^6+D^6+E^6==F^6), mà không có phản ví dụ đã được tìm thấy.

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

Trong Python 2 (104 byte):

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

Ít chơi gôn hơn:

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

Phiên bản toán học không có eval:

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

Tham chiếu thay thế: Phỏng đoán sức mạnh tổng hợp của Euler - MathWorld


0

Python, 68 byte

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

Dùng thử trực tuyến

Cố gắng trả lời một trong những câu hỏi của Gelfand .

  1. Hàng "23456789" có xuất hiện cho n> 1 không? Không có gì cho n <= 10 ^ 5. ...

0

Clojure, 154 byte

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

Kiểm tra xem có số nào trên 82.000 chỉ chứa 0 và 1 cho cơ sở 2 không cho đến cơ sở 5. Nói cách khác, nó sẽ kiểm tra xem có số nào khác trong chuỗi này không .

Trong đó nhóm đặc biệt, chỉ có 3 số: 0, 182,000. Không có nhiều số theo quy tắc đó ít hơn xấp xỉ 3*10^19723.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.