Как мы все знаем, это черепахи все время вниз . Но неужели это тоже простые числа?
Число считается «черепашьим-простым», если оно удовлетворяет следующим условиям:
1) It is prime.
2) It is possible to remove a single digit leaving a prime number.
3) Step 2 can be repeated until left with a single digit prime.
Например, 239
это «черепаха-премьер», так как она может быть уменьшена до 23
одного 2
или 3
обоих, оба из которых являются простыми. Это также может быть уменьшено до того 29
времени 2
. 151
не простое число черепахи, так как оно сводится к 15
(не простое), 51
(не простое) или 11
. 11
прост, но может только уменьшить 1
, чего нет.
Учитывая положительное целое число, определите, является ли оно «черепашьей вершиной». Ваш вывод может быть в любой форме, при условии, что он дает одинаковый вывод для любого истинного или ложного значения.
Тестовые случаи:
input -> output
1 -> false
2 -> true
17 -> true
19 -> false
239 -> true
389 -> false
счет
Это код-гольф , поэтому выигрывает самый короткий ответ на каждом языке!
Ответы:
Желе , 16 байт
Попробуйте онлайн!
Как это работает
источник
Haskell ,
1041029998979591 байтПопробуйте онлайн!
объяснение
Сначала мы создали тест на простоту
Это использует теорему Вильсона, чтобы определить первичность входных данных.
Затем мы объявляем базовый случай, который будет утверждать, что пустая строка является правдивой.
Теперь мы определяем фактическую функцию
Мы используем шаблон охранник привязку
zip[0..]x
кy
, потому что мы должны использовать его в два раза ниже. Затем мы утверждаем, что ответ[[snd b|b<-y,b/=a]|a<-y]
все числа, которые являются цифрой, удалены из нашего ввода. Итак, мы утверждаем, что хотя бы одно из этих чисел является правдоподобнымf
. Чтобы гарантировать, что составные числа ложны, мы добавляемprime$read x
. Если число не простое, список станет пустым, аany
пустой список будет ложным.источник
any f[[
↦or[f[
[b|(i,b)<-y,i/=a]|(a,_)<-y
↦[snd b|b<-y,b/=a]|a<-y
R,
1241221201139593106105 байтКоторый оценивает функцию:
Рекурсивное решение. Вводит в виде списка цифр.
Имеет 2 логических утверждения:
Является ли
x
премьер при соединении?Является ли любое из следующего
TRUE
:Длина не равна
x
нулю? Это наше последнее условие прекращения.Является ли
f
TRUE
для любого подмножестваx
?Первое утверждение гарантирует, что мы продолжаем работать только с простыми числами. Второй выполняет рекурсию.
Сохранено два байта благодаря @Giuseppe.
Мне пришлось вернуть некоторые из моих гольфов из-за ошибки, когда я случайно тестировал предыдущее определение функции.
R, 98 байт, неконкурентный
Как я уже упоминал в комментариях, я сделал пакет . Так как задача предшествует этому, это не конкурирует, но я хотел продемонстрировать это немного. Пока немного, но мы туда доберемся.
C()
является первой функцией в пакете и заботится о соединении цифр в число.источник
sum(x*10^(((l<-sum(x|1))-1):0))
) ооочень многословны. Я действительно думаю о создании пакета для гольфаR
.sapply
... Также я думаю, что вы можете захотеть сделать,f=pryr::f(...)
иначе вам нужно использоватьf
вsapply
.g
или что-то?el(strsplit(x,''))
экономии тонны байтов.Желе , 19 байт
Попробуйте онлайн!
Как это работает
Рекурсия без базового случая ftw.
источник
Желе ,
2726 байтМонадическая ссылка, берущая и возвращающая целые числа (
1
для черепахи0
иначе).Попробуйте онлайн!
Как?
источник
Рубин ,
7257 + 8 =8065 байтИспользует
-rprime
флаг. -15 байт от гистократа!Попробуйте онлайн!
источник
&&!!
на просто&
, это приведёт результат к логическому значению. Ваш рекурсивный вызов также может стать немного короче, если использовать перлизмы:!n.scan(/./){f[$`+$']&&break}}
n.scan
трюк работает так, как работает?.scan.find
, но мы можем вручную выйти из цикла при успешном выполнении. Если мы ломаем ,scan
возвращаемnil
, в противном случае он возвращает строку, которая всегда верна.Java, 220 байт
Попробуйте онлайн!
Golfed:
Ungolfed:
источник
boolean t(String n){int l=n.length(),x=new Integer(n),i;for(i=2;i<x;x=x%i++<1?0:x);if(x>1)if(l<2)return 1>0;else for(i=0;i<l;)if(t(n.substring(0,i)+n.substring(++i,l)))return 1>0;return 1<0;}
f
?>0
преобразование int в логическое значение), которое должно сохранить 2 * 2 + 1 * 4 = 8 байт в версии Кевина Круйссена.05AB1E ,
2827 байтИтеративное решение.
Попробуйте онлайн!
объяснение
источник
Python 2 ,
132124119 байтов-8 Спасибо @WheatWizard
-5 Благодаря @LeakyNun
Попробуйте онлайн!
Ничего не могу придумать, чтобы отточить это без какой-то встроенной первичной проверки. Принимает число в виде строки (я предполагал, что это, учитывая, что OP разрешил список цифр, но если нет, то +14 байт для другой лямбды), и рекурсивно вычисляет черепаху каждого «взбалтыванного» числа.
источник
f=lambda n,i=0:n==''or p(int(n))and i<len(n)and(f(n[:i]+n[i+1:])or f(n,i+1))
сохраняет байт. Кто-то с лучшими навыками игры в гольф Python, вероятно, может сократить это дальше.C #, 355 байт
Попробуйте онлайн!
Мой первый кодовый гольф, так что я надеюсь, что все сделал правильно. Я не мог придумать, как сделать его еще меньше (кроме использования int вместо BigInteger, но я сделал это так, чтобы оно работало для всех предоставленных тестовых случаев). Во всяком случае, здесь то же самое правильно отформатирован:
источник
Perl 6 , 65 байт
Попробуйте онлайн!
источник
PHP , 164 байта
Попробуйте онлайн!
Начинается с проверки числа на первичность, затем проходит по цифрам в виде массива, вытаскивает каждую из них, соединяет остальные вместе и рекурсивно передает их через функцию. Каждая ссылка вниз выполняет логическое ИЛИ с нижними путями, возвращая только
true
если существует хотя бы один путь из всех простых чисел.источник
Javascript 167 байт
объяснение
Показать фрагмент кода
источник