Вам даны функции: h1 (f, * args) и h2 (f, * args)
Оба метода уже определены для вас (здесь звездочка обозначает переменное число аргументов)
f - функция, * args - список параметров, передаваемых этой функции.
h1 возвращает логическое значение: True, если функция f когда-либо останавливается при вызове на * args, и False, если нет (при условии, что на работающей машине у нее бесконечное время и память, и что интерпретатор / компилятор для языка, на котором вы пишете умеет обращаться с бесконечным временем и памятью).
Если f (* args) когда-либо сделает вызов h1 или h2, h1 выдает исключение
h2 ведет себя точно так же, как h1, за исключением того, что если f делает вызовы h1, то h2 не будет выдавать исключение
Как можно меньше символов, напишите программу, которая не требует ввода и должна выводить:
The Collatz Conjecture is {True/False}
Goldbach's Conjecture is {True/False}
The Twin Primes Conjecture is {True/False}
основываясь на обоснованности каждой из этих гипотез.
Вот ссылки в Википедии, объясняющие каждую из гипотез:
http://en.wikipedia.org/wiki/Collatz_conjecture
http://en.wikipedia.org/wiki/Goldbach%27s_conjecture
http://en.wikipedia.org/wiki/Twin_prime
Вы можете предположить, что любая большая целочисленная библиотека на любом языке, который вы выберете, будет успешно представлять произвольные большие целые числа. Другими словами, мы предполагаем, что любой язык / библиотека, способная к выражению 3**(3**10)
, также способна выражать 3**(3**(3**10))
на достаточно сложной машине.
Очевидно, что так как невозможно запустить вашу программу, пожалуйста, предоставьте объяснение того, как она работает вместе с кодом
Ответы:
J, 207
Я выбрал для использования
f
иg
вместоh1
иh2
, как в зависимости от щедрости; две дополнительные линии с 10 общих символов до достаточно коммутаторе:f=:h1
,g=:h2
.И актуальная логика:
Коллатца
((-:`>:@*&3)^:(~:&1))^:_
это мясо этого; это по сути петля, которая делаетwhile (x != 1) x = collatz(x)
. Если мы назовем это предложениеreduce
:reduce&f
предназначен для того, чтобы быть монадическим глаголом (см. конец), гдеreduce&f n
истинно, еслиreduce(n)
останавливается. Другие биты loop-y>:^:()^:_
, по сути, представляют собой бесконечный цикл (>:
является инкрементом,^:
может использоваться как условный и итератор), который прерывается при обнаружении сокращения Коллатца, которое не останавливается. Наконец,g
вызывается, чтобы увидеть, заканчивается ли когда-либо бесконечный цикл.Гольдбаха
Та же логика, по большей части, очевидная разница в том, что основной расчет в настоящее время
+./@1&p:@(-p:@_1&p:)
.-p:@_1&p:
вычисляет разницу между числом и всеми простыми числами, меньшими, чем это число,1&p:
являетсяisPrime
функцией и+./
является логическим ИЛИ. Следовательно, если разность между числом и любым простым числом, меньшим, чем это число, также является простым, то гипотеза Гольдбаха удовлетворяется, и бесконечный цикл продолжается. Опять же,f
используется для окончательной проверки того, является ли указанный бесконечный цикл действительно бесконечным.Twin Primes
То же, что и выше, за исключением
(4&p:)^:(2&~:@(-~4&p:))
.4&p:
возвращает следующее наибольшее простое число после заданного числа.-~4&p:
возвращает разницу между числом и следующим по величине простым числом после него.2&~:
есть!= 2
. Таким образом, самый внутренний цикл аналогиченwhile (nextPrimeAfter(p) - p != 2) p = nextPrimeAfter(p)
.Заметки
Там могут быть синтаксические ошибки, так как я не тестировал с соской
f
иg
еще. Кроме того, я предположил, чтоf
и принялg
бы какую-то форму, которая может быть составлена с глаголом слева и существительным справа, что я не совсем уверен, что в любом случае придерживается J грамматики. Они по своей природе являются функциями более высокого порядка, и я слишком устал, чтобы искать правильную конструкцию в качестве наречий / союзов / что-у-вас на данный момент, если даже есть такая подходящая конструкция.Я на самом деле не использовал правильную конкатенацию строк, а вместо этого решил оставить отдельные строки в штучной упаковке. Таким образом, вывод (при условии, что все остальное верно) будет представлять собой таблицу из 3 столбцов, в которой левый столбец будет «Коллатц» и т. Д., Средний столбец будет «Гипотеза», а правый столбец «Истина» / «Ложь» ,
Я также почти уверен, что J не преобразует целые числа в произвольную точность по умолчанию, а функция полезного простого числа
p:
не имеет произвольно большого домена. С другой стороны, учитывая, что J поддерживает стандартный тип чисел произвольной точности, я не уверен, сколько потребуется усилий, чтобы привести этот код в нормальное состояние.источник
Хаскелл, 242
потому что в Haskell переменные могут содержать не только значения, но и вычисления (это называется лень), я позволю себе заставить
h1, h2
принять один аргумент и вернуть погоду или нет, его оценка остановится.несколько негольфовый код:
немного объяснения:
когда
all
применяется к бесконечному списку, он останавливается, если один из элементов спискаFalse
, из-за лени (короткое замыкание, для всех не-Haskell людей там). мы используем это для вычисления гипотезы Коллатца и гипотезы о двойных простых числах.!
упаковывает этот обман вместе с печатью. результат -True
когдаf
заканчивается все числа4..
. (это не имеет значения для гипотезы Коллатца или гипотезы о двойных простых числах, потому что мы уже знаем, что они справедливы для таких малых чисел).код для гипотезы Коллатца есть
"The Collatz"!c
. он печатает «Гипотеза Коллатца», и результат, который является погодой,c
заканчивается на всех числах4..
.код для гипотезы Гольдбаха есть
"Goldbach's"! \n->or[p$n-r|r<-[2..n-2],p r]
.\n->or[p$n-r|r<-[2..],p r,r<n+1]
это функция, котораяn
, если она представляет собой сумму двух простых чисел, возвращает значениеTrue
, но в противном случае она зацикливается бесконечно. Таким образом, если он останавливается для каждой4..
гипотезы Гольдбаха, это правда.код для гипотезы спаренных простых чисел
"The Twin Primes"! \n->or[p$r+2|r<-[n..],p r]
.\n->or[p$r+2|r<-[n..],p r]
является функцией, котораяn
, если заданные двойные простые числа большеn
, возвращает функцию True, но в противном случае она зацикливается бесконечно. таким образом, если он останавливается для каждого,4..
предположение о двойном простом верно.источник
Python (965 символов)
Так как мой вопрос не получает любви. Я публикую свое решение (не в коде) в Python:
Это довольно просто.
numCollatzSteps (n) говорит, сколько шагов делает последовательность Коллатца для определенного n. Он работает бесконечно, если указанная последовательность Коллатца не заканчивается.
findNonHaltingN () считает вверх, проверяя, что numCollatzSteps завершается для каждого n. findNonHaltingN завершается тогда и только тогда, когда существует n, для которого numCollatzSteps не завершается.
Таким образом, мы можем проверить, верна ли гипотеза Коллатца, проверив, что findNonHaltingN () не останавливает
isPrime (n) проверяет, является ли число простым, видя, что никакое натуральное число от 1 до n-1 не делит его
isSumOf2Primes (n) выполняет итерацию по всем натуральным числам от 2 до n-2 и проверяет, является ли хотя бы одно простым числом вместе с его дополнением
findNonSum () считает четные числа от 4 до тех пор, пока не достигнет первого числа, которое не является суммой 2 простых чисел, а затем вернет его. Если такого числа не существует, оно будет продолжаться бесконечно.
Мы можем проверить, верна ли гипотеза Гольдбаха, увидев, что findNonSum не останавливается.
isSmallTwinPrime (n) возвращает true тогда и только тогда, когда n и n + 2 являются простыми
nextSmallTwinPrime (n) возвращает следующее число> = n, для которого isSmallTwinPrime имеет значение true
largeTwinPrimes () считает, что значение 2 увеличивается, проверяя, что nextSmallTwinPrime останавливается для всех n. Если когда-либо nextSmallTwinPrime не останавливается для некоторого n, то из этого следует, что самые большие двойные простые числа равны n-1 и n + 1, и мы на этом остановимся
Затем мы можем проверить правильность гипотезы двойных простых чисел, проверив, что largeTwinPrimes никогда не останавливается.
источник
APL (234)
Это явно не проверено, но логика кажется здравой. Все команды печати включены, выходные данные являются
104
символами, и фактическая логика есть130
.Ungolfed:
источник
3**(3**10)
(3*3*10
в APL), что дает DOMAIN ERROR в tryapl.org.