J, 207
(('The Collatz';'Goldbach''s';'The Twin Primes'),.<'Conjecture is'),.((>:^:((((-:`>:@*&3)^:(~:&1))^:_)&f)^:_ g 2)((+&2)^:(+./@1&p:@(-p:@_1&p:))^:_ f 4)(>:^:((4&p:)^:(2&~:&(-~4&p:))&f)^:_ g 3){'True':'False')
Я выбрал для использования fи gвместо h1и h2, как в зависимости от щедрости; две дополнительные линии с 10 общих символов до достаточно коммутаторе: f=:h1, g=:h2.
И актуальная логика:
Коллатца
>:^:((((-:`>:@*&3)^:(~:&1))^:_)&f)^:_ g 2
((-:`>:@*&3)^:(~:&1))^:_это мясо этого; это по сути петля, которая делает while (x != 1) x = collatz(x). Если мы назовем это предложение reduce:
>:^:(reduce&f)^:_ g 2
reduce&fпредназначен для того, чтобы быть монадическим глаголом (см. конец), где reduce&f nистинно, если reduce(n)останавливается. Другие биты loop-y >:^:()^:_, по сути, представляют собой бесконечный цикл ( >:является инкрементом, ^:может использоваться как условный и итератор), который прерывается при обнаружении сокращения Коллатца, которое не останавливается. Наконец, gвызывается, чтобы увидеть, заканчивается ли когда-либо бесконечный цикл.
Гольдбаха
(+&2)^:(+./@1&p:@(-p:@_1&p:))^:_ f 4
Та же логика, по большей части, очевидная разница в том, что основной расчет в настоящее время +./@1&p:@(-p:@_1&p:). -p:@_1&p:вычисляет разницу между числом и всеми простыми числами, меньшими, чем это число, 1&p:является isPrimeфункцией и +./является логическим ИЛИ. Следовательно, если разность между числом и любым простым числом, меньшим, чем это число, также является простым, то гипотеза Гольдбаха удовлетворяется, и бесконечный цикл продолжается. Опять же, fиспользуется для окончательной проверки того, является ли указанный бесконечный цикл действительно бесконечным.
Twin Primes
>:^:((4&p:)^:(2&~:@(-~4&p:))&f)^:_ g 3
То же, что и выше, за исключением (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 поддерживает стандартный тип чисел произвольной точности, я не уверен, сколько потребуется усилий, чтобы привести этот код в нормальное состояние.