Чи припиняється код?


92

Це кодове завдання для гольфу, про яке я думав із математичним нахилом. Завдання полягає в тому, щоб написати якомога коротший код таким чином, щоб це було відкритим питанням, припиняється чи ні код. Прикладом того, що я маю на увазі, може бути наступний фрагмент коду python, пристосований із зворотного до цього запитання 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!
Луїс Мендо

3
Ваш код може бути golfed до 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#

Спробуйте в Інтернеті!

Фон

Це припиняється, як тільки знайде четверте рішення проблеми Брокарда , тобто рішення n! + 1 = м² з (n, m) ≠ (4, 5), (5, 11), (7, 71) над натуральними числами. Реалізація не використовує арифметику з плаваючою комою, тому вона припиняється лише в тому випадку, якщо вона знайде четверте рішення або якщо n! більше не можуть бути представлені в пам'яті.

Проблема Брокарда вперше використала у цій відповіді @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#

Це припиняється, коли буде знайдено шостий прайм Ферма .

Спробуйте в Інтернеті!

Як це працює

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

Пітон, 36 байт

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

Використовує проблему Брокарда :

Чи n! +1 - ідеальний квадрат для будь-якого n≥8?

Обчислює послідовні фабрики та перевіряє, чи є вони квадратами та мають k>7. Дякуємо Деннісу за 2 байти!

Це передбачає, що Python продовжує мати точну арифметику для довільно великих чисел. В реальній реалізації він припиняється.


1
Буде -~n**.5не працювати на місці (n+1)**.5?
ETHproductions

@ETHproductions Пріоритет експоненції вищий, ніж пріоритет ~, так що це просто підніме TypeError для спроби нівелювати поплавок побіжно.
Денніс

11

Perl, 50 38 36 34 33 байт

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

Пояснення: 196 - можливе число Ліхреля - число, яке не утворює паліндром, повторно додаючи до нього зворотній бік. Цикл продовжується, поки $ n не дорівнює його зворотному значенню, що поки невідомо для початкового значення 196.

25 + 52 = 77

що недійсне.

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

тому жодне з номерів у цій послідовності не є дійсним.

Редагувати: гольфував його, використовуючи цикл до, а не цикл (якось). Крім того, у мене було менше байтів, ніж я думав (я, мабуть, мабуть уважніше дивитись на свій облік у майбутньому).

Edit: Замінено $nз , $_щоб зберегти 2 байти для мається на увазі аргументу reverse. Я думаю, що це так само гольф, як і ця реалізація.

Редагувати: я помилявся Замість використання until($%=reverse)==$_я можу піти в той час як різниця дорівнює нулю (тобто істинно) while($%=reverse)-$_.


3
Оскільки існує обмежене число можливих простих чисел perl, я фактично можу визначити, припиняється чи ні ця програма. Вам потрібно завантажити пакет bigint, щоб зробити цю роботу (або виконати її)
Тон Євангелія

Зроби це. Я смію тебе. :-)
Veky

11

MATL, 11 байт

`@QEtZq&+=z

Припиняється, якщо гіпотеза Гольдбаха є помилковою. Тобто програма зупиняється, якщо вона знаходить парне число більше, ніж 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-й прайм Ферма .

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

Ця програма зупиняється, якщо і тільки якщо є ціле n більше 1, так що 2 ^ (n-1) -1 ділиться на n ^ 3. Наскільки мені відомо, невідомо, чи існує якесь число з цією властивістю (якщо число, що задовольняє цій властивості, є простим, воно називається прем'єром Віферіха порядку 3 до бази 2, і відкрито, чи існує такий подібний простір).


Ви впевнені, що дужки розміщені правильно? Схоже, ви перевіряєте, чи 2 ^ (n-1)! ≡ 1 (mod n ^ 3), а не 2 ^ n ≡ 1 (mod n ^ 3). Зрозуміло, я не знаю, що оператор Python так добре переважає.
Габріель Бенамі

Ну, код правильний, але моє пояснення не. Я це виправлю.
Джуліян Росен

2
ви можете замінити (n-1)на~-n
Sriotchilism O'Zaic


6

Мозг-Флак, 212 208 204 байт

Ця програма використовує алгоритм множення, написаний MegaTom, і неквадратичну шашку, написану 1000000000

Спробуйте це в Інтернеті

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

Ця програма починається з 8 і перевіряє кожне число, щоб побачити, чи n! +1 - це квадратне число. Він виходить, коли знайде його. Це відоме як проблема Брокарда, і це відкрита проблема в математиці.


6

Brachylog (v2), 3 байти в кодуванні Brachylog

⟦cṗ

Спробуйте в Інтернеті! (час очікується, не роблячи нічого видимого з очевидних причин)

Повна програма; якщо запустити без вводу, шукає перший прайм Smarandache і виводить, true.якщо і коли він знаходить його. Це відкрите питання про те, чи існують якісь праймери Smarandache. (Зверніть увагу, що алгоритм основного тестування Брахілога, хоча він працює теоретично на довільно великій кількості, має тенденцію працювати повільно; тому, якщо вам цікаво знайти праймери 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

Брахілог працює над десятковими цифрами числа, коли ви намагаєтесь ставитись до нього як до списку, тому "діапазон" з подальшим "конкатенатом" - це дуже короткий спосіб генерувати послідовність чисел Смарандаше (а потім ми відфільтровуємо це за первісністю; повна поведінка програми за замовчуванням потім змусить перший елемент генератора). Діапазон має провідний нуль, але, на щастя, за такою схемою потоку Брахілог видаляє нуль, а не виходить з ладу.

Ось приклад, який знаходить перше число Smarandache, яке дорівнює 6 (мод 11), як демонстрацію подібної програми, яка закінчується протягом 60 секунд, а не має невідомий статус зупинки:

⟦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 - число Сєрпіньського. Наразі 10223 є найменшим кандидатом, який може бути або не може бути числом Серпінського станом на грудень 2013 року.

Число Сєрпіньського - це число, kв якому всі числа форми (k * 2^n) + 1є складовими.


Я сподіваюсь, що ця проблема та проблема Серпінського будуть вирішені найближчим часом, просто за допомогою більшого розрахунку.
qwr

4
Цей код безумовно припиняється, оскільки ви просто називаєте два лямбда, ви насправді нічого не дзвоните . :-P
Veky

4
Насправді ви цього не зробили. Ваш код все ще припиняється, оскільки семантика Python2 заморожена (PEP 404), і вона включає жорсткий ліміт на рекурсивні виклики фіатом BDFL ( neopythonic.blogspot.hr/2009/04/final-words-on-tail-calls.html ). ;-P
Векі

2
@Veky Довелося підтвердити ваш коментар.
Qwerp-Derp

1
Чи не забагато днів після того, як це було написано, прем'єр 10223*2^31172165 + 1 був виявлений . З тих 21181пір було найменше число, на яке невідомо, чи це Серпінський чи ні.
Джеппе Стіг Нільсен

4

Pyth, 16 байт

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

Повертає перше значення, для якого не дотримується гіпотеза Колатца. Оскільки невідомо, чи дотримується гіпотеза для всіх чисел, невідомо, чи припиниться цей код.


3
Не маючи змоги його прочитати, я сумніваюся, що ваш код робить саме те, про що ви заявляєте. Ви шукаєте перше число, яке переходить до циклу, відмінного від 4-2-1? Я думаю, ви не знайдете його, якщо буде менше число, яке не закінчується в жодному циклі. У будь-якому випадку, якщо це робить ваш код, це досить добре, щоб не знати, чи припинить його.
Крістіан Сіверс

1
Я шукаю перше ціле число> = 1, яке переходить до циклу і ніде в межах проходу до цієї петлі не міститься 1.
Стівен Х.

3
Це я очікував. Але це не єдиний можливий спосіб, коли число не може задовольнити гіпотезу про коллац.
Крістіан Сіверс

Насправді було доведено, що кожне число або розходяться до нескінченності, або покриває 1-2-4 за картою Колац. Ваш код ніколи не припиняється. Ідея полягає в тому, що послідовність кроків, що утворюють цикл, створює рівняння, єдиними рішеннями якого є 1-2-4, від'ємні значення та нецілі раціональні раціона.
Джон Дворак

3
@JanDvorak Я не вірю, що це правда. Чи можете ви навести джерело?
KSFT

4

Власне , 16 байт

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

Спробуйте в Інтернеті!

Цей код закінчується, якщо існує деяке складене число n, яке totient(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 байт

-1 байт завдяки @Dennis! (використовуйте експоненцію замість множення, щоб уникнути Æṣ(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

4

Haskell, 46 байт

[n|m<-[1..],n<-[1..m],product[1..n]+1==m^2]!!3

Припиняється, якщо він знайде четверте рішення проблеми брокарди .


3

Пітон, 92 байти

Це не виграш у жодних змаганнях з гольфу з кодом, і для цього потрібна нескінченна пам'ять та глибина рекурсії, але це майже ідеальна можливість підключити цікаву проблему, яку я попросив у математиці stackexchange два роки тому, що жодне число Фібоначчі більше 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

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)

Цей код припиняється, якщо гіпотеза Гольдбаха не містить усіх парних чисел (тобто якщо всі парні числа можна виразити як суму двох простих чисел). В даний час вона перевірена на числа до 4 * 10 ^ 18.

Величезна подяка @ Pietu1998 за те, що він значно скоротив мій код!

РЕДАКЦІЯ: Дякую @JonathanAllan за бриття 6 байтів мого коду!


Я думаю, ви можете зберегти 6 байт за допомогою g=lambda n:[p(b)*p(n-b)for b in range(n)]and g(n+2). Я також думаю, що це повинно читати "припиниться, якщо гіпотеза Гольдбаха не дотримується".
Джонатан Аллан

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, потім багаторазово додає n до своєї бази 10 зворотним, доки не стане паліндром у базі 10. Це було б коротше, якби JS підтримував довільну точність чисел, але так добре.


Хоча це довго, це вміло гольфувати, тому +1.
wizzwizz4


1

Python 2, 64 байти

Число Ліхреля - це натуральне число, яке не може сформувати паліндром через ітераційний процес багаторазового перетворення його цифр та додавання отриманих чисел.

В базовій десяті не було доведено жодного числа Ліхреля . 196 - найменший базовий десяток кандидатів із числа Ліхреля. Було показано, що якщо паліндром існує (що робить 196 не числом Ліхреля), він мав би принаймні мільярд (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
Якщо хтось також вважає перетворення вкладок негідним, то там обговорюється мета ...
trichoplax

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 в ГСЧ є періодичним (хоча і з дуже тривалим періодом), я стверджую , що це є детермінованим , оскільки вона в кінцевому рахунку круглого контура з самим початком. Ваша думка, звичайно, може відрізнятися.


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 без 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

Альтернативна довідка: Ейлерова сукупність сил - 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))))

Перевіряє, чи є число вище 82 000, яке містить лише 0 і 1 для бази 2, аж до бази 5. Іншими словами, вона перевіряє, чи є в цій послідовності ще одне число .

У цій спеціальній групі, є тільки три цифри: 0, 1і 82,000. Немає більше цифр, що слідують за цим правилом, які є приблизно приблизно 3*10^19723.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.