Зворотне і додайте виродження


22

Вступ

Зворотне і додавання так само просто, як це звучить, візьміть nі додайте його до його цифр у зворотному порядку. (наприклад, 234 + 432 = 666).

Якщо ви неодноразово застосовуєте цей процес, деякі цифри в кінцевому підсумку перейдуть до простого числа, а деякі ніколи не досягнуть простого числа.

Приклад

На даний момент я маю

11431 респ.

11431 is not prime
11431 + 13411 = 24842 which is not prime
24842 + 24842 = 49684 which is not prime
49684 + 48694 = 98378 which is not prime
98378 + 87389 = 185767 which is prime!

Це число вражає простим числом

На відміну від будь-якого кратного 3 ніколи не вдариться за простим, це тому, що всі кратні 3 мають розрядну суму, кратну 3, і навпаки. Таким чином, зворотне і додавання на кратне 3 завжди призведе до нового кратного 3 і, отже, ніколи не буде простим.

Завдання

Візьміть додатне ціле число nі визначте, чи багаторазове повернення і додавання коли-небудь призведе до простого числа. Виведіть величину правдивого чи хибного значення. Будь-яка правда для досягнення основного і хибного значення для не є, або навпаки обидва є прийнятними.

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

Це тому постарайтеся зробити свій код якомога коротшим.

Випробування

Істинно для досягнення простих помилок, тому що ніколи не досягає простого

11 -> True
11431 -> True
13201 -> True
13360 -> True
13450 -> True
1019410 -> True
1019510 -> True
22 -> False
1431 -> False
15621 -> False
14641 -> False

Підказка

Під час написання цього виклику я виявив крутий трюк, який полегшує цю проблему. Без цього фокусу це неможливо, і з ним теж не банально, але це допомагає. Мені було дуже цікаво відкрити це, тому я залишу його в спойлері внизу.

Повторне зворотне і додавання завжди буде кратне 11 з 6 ітерацій або менше. Якщо він не потрапить у прем'єр-міністр до того, як він потрапить у кратне значення 11, він ніколи не вдарить простір.


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

@ DobbyTheFree-Elf Я думаю, що різниця між цією проблемою і типовими проблемами "кодування" полягає в тому, що часто для останніх алгоритм, який потрібно реалізувати, очевидний, і це просто питання зробити це якомога менше коду. Цей виклик змушує вас створити алгоритм з нуля. Обидва створюють свої власні унікальні головоломки, але обидва в кінцевому рахунку все ще залишаються проблемами кодування.
— Пшеничний майстер

Я погоджуюся з вашим коментарем, але, на мою думку, придумати такий алгоритм, присутній у цьому виклику, - це більше робота математика, ніж програміста. Я не знаю, що думають інші, але це принаймні те, що я думаю. Отож, це є моїм наслідком.
— Арджун

1
@ DobbyTheFree-Elf Я ненавиджу порушувати це вам, але знаходжу ефективні алгоритми для вирішення проблеми у вирішальній частині бути хорошим програмістом.
— Пшеничний майстер

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

Відповіді:


7

Рубі , 84 79 77 74 байт

->x{y=1;x+="#{x}".reverse.to_i while(2...x).any?{|z|0==y=x%z}&&x%11>0;y>0}

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

Якщо я зрозумів це правильно, коли ми досягнемо кратного 11, ми можемо зупинитися (ми отримаємо кратні 11 після цього)


Є щось більш потужне, що ми можемо довести, використовуючи інформацію в спойлері.
— Пшеничний майстер

3

Haskell , 65 байт

fбере Integerі повертає a Bool. Trueозначає, що вона досягає розквіту.

f n=gcd(product[2..n-1])n<2||gcd 33n<2&&f(n+read(reverse$show n))

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

На жаль, короткий, але неефективний простий тест означає, що Trueтестові випадки ОП, крім того, 11зростають занадто великими, щоб закінчити. Але, наприклад, 11432 - це Trueсправа, яка закінчується.

Ви також можете спробувати цей 3-байт довший, для якого TIO може закінчити всі Trueтестові випадки:

f n=and[mod n i>0|i<-[2..n-1]]||gcd 33n<2&&f(n+read(reverse$show n))

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

Основні тести обох версій розбиваються на 1, але так трапляється, що все одно потрапляє до простого числа (2).

Інакше я помітив приблизно те саме, що і GB у спойлері подання Ruby:

Після того, як число зросте на рівну довжину, наступна ітерація буде ділитися на 11. Коли число ділиться на 11, так і всі наступні ітерації.


@WheatWizard Ну це означає, що кількість ітерацій обмежена, з (вибачте, немає тегів-спойлерів у коментарях) максимум 6 кроків, щоб перевірити, я думаю (наприклад, 100 максимально). Якщо спробувати коротко, то, схоже, це не дає мені коротшого рішення. Ви маєте на увазі щось більш потужне, ніж це?
— Ørjan Johansen

Ні, це було 6 - це максимум
— Пшеничний майстер


2

Python 2 , 78 70 69 байт

f=lambda x:all(x%a for a in range(2,x))or x%11and f(x+int(`x`[::-1]))

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

Пояснення

Ця програма спирається на те, що

Кожне число, яке втратить назавжди, досягне кратного 11 менше, ніж за 6 ходів

Ця програма являє собою рекурсивну лямбду з циркульованими логічні порівняннями. Він спочатку перевіряє, чи n є простим.

all(x%a for a in range(2,x))

Якщо це правда, ми повертаємо правду.

Якщо це неправда, ми перевіряємо, чи кратне це 11.

x%11

Якщо false, ми повертаємо false, інакше ми повертаємо результат fнаступної ітерації

f(x+int(`x`[::-1]))

2

Желе , 11 байт

ṚḌ$+$6СÆPS

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


Для зацікавлення тих, хто читає цю відповідь, останнім Sможе бути Tтакож і відповідь. RD$+$також може бути +RD$$або RD+<newline>Ç(всі тривіальні модифікації)
— HyperNeutrino

@HyperNeutrino я вибрав, Sоскільки у нього менше шансів показати що-небудь> 1. Нема RD, просто ṚḌ, і я вибрав ṚḌ$+$так, щоб я міг це краще організувати.
— Ерік Аутгольфер

Мені було занадто лінь ставити крапки; Я знаю, чому ти ставиш S; Я мав би це обрати T, але це в основному для інтересів усіх інших.
— HyperNeutrino

1

05AB1E , 14 13 байт

EDIT : Збережений один байт, оскільки введення повторно використовується, якщо на стеку недостатньо елементів

[Dp#D11Ö#R+]p

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

Використовує підказку у питанні

Як це працює

[              # begin infinite loop
               # implicit input
 D             # duplicate input
  p            # push primality of input
   #           # if prime, break
    D          # duplicate input
     11        # push 11
       Ö       # push input % 11 == 0
        #      # if multiple of 11, break
               # implicit push input
          R    # reverse input
           +   # add both numbers
            ]  # end infinite loop
             p # push primality of result; 1 if prime, 0 if multiple of 11
               # implicit print

0

MATLAB, 88 81 байт

function r=f(n);r=0;for i=1:7 r=r+isprime(n);n=n+str2num(fliplr(num2str(n)));end;

0

JavaScript (ES6), 73 байти

Повертається 0або true.

f=n=>{for(d=n;n%--d;);return d<2||n%11&&f(+[...n+''].reverse().join``+n)}

Прокоментував

Це засновано на формулі магії-спойлера, описаній пшеничним майстром.

f = n => {              // given n:
  for(d = n; n % --d;); // find the highest divisor d of n
  return                //
    d < 2 ||            // if this divisor is 1, return true (n is prime)
    n % 11 &&           // else: if 11 is a divisor of n, return 0
    f(                  // else: do a recursive call with
      +[...n + '']      // the digits of n
      .reverse().join`` // reversed, joined,
      + n               // coerced to a number and added to n
    )                   //
}                       //

Тестові кейси

Я вилучив з фрагмента два найбільші входи, оскільки на їх виконання знадобиться кілька секунд. (Але вони теж працюють.)



0

Сервер Microsoft Sql, 826 786 * байт

* Я нагадав про функцію IIF, яка була введена в Microsoft Sql Server 2012

set nocount on
use rextester
go
if object_id('dbo.n','IF')is not null drop function dbo.n
go
create function dbo.n(@ bigint,@f bigint)returns table as return
with a as(select 0 c union all select 0),b as(select 0 c from a,a t),c as(select 0 c from b,b t),
d as(select 0 c from c,c t),e as(select 0 c from d,d t),f as(select 0 c from e,e t),
v as(select top(@f-@+1)0 c from f)select row_number()over(order by(select 0))+@-1 n from v
go
with u as(select cast(a as bigint)a from(values(11),(11431),(13201),(13360),(13450),(1019410),(1019510),(22),(1431),
(15621),(14641))u(a)),v as(select a,a c from u union all select a,c+reverse(str(c,38))from v
where 0=any(select c%n from dbo.n(2,c/2))and c%11>0)select a,iif(0=any(select max(c)%n from dbo.n(2,max(c)/2)),0,1)
from v group by a option(maxrecursion 0)

Перевірте це в Інтернеті

Більш акуратне форматування

SET NOCOUNT ON;
USE rextester;
GO
IF OBJECT_ID('dbo.n', 'IF') IS NOT NULL DROP FUNCTION dbo.n;
GO
CREATE FUNCTION dbo.n(@ BIGINT,@f BIGINT)RETURNS TABLE AS RETURN
  WITH
    a AS(SELECT 0 c UNION ALL SELECT 0),
    b AS(SELECT 0 c FROM a,a t),
    c AS(SELECT 0 c FROM b,b t),
    d AS(SELECT 0 c FROM c,c t),
    e AS(SELECT 0 c FROM d,d t),
    f AS(SELECT 0 c FROM e,e t),
    v AS(SELECT TOP(@f-@+1)0 c FROM f)
    SELECT ROW_NUMBER()OVER(ORDER BY(SELECT 0))+@-1 n FROM v;
GO
WITH u AS(
  SELECT CAST(a AS BIGINT) a
  FROM(VALUES (11), (11431), (13201), (13360), (13450), (1019410), (1019510),
              (22), (1431), (15621), (14641)) u(a)
),
v AS(
  SELECT a, a c FROM u
    UNION ALL
  SELECT a, c + reverse(str(c, 38))
  FROM v
  WHERE 0 = ANY(SELECT c % n FROM dbo.n(2, c / 2)) AND c % 11 > 0
)
SELECT a, IIF(0 = ANY(SELECT MAX(c) % n FROM dbo.n(2, MAX(c) / 2)), 0, 1)
FROM v
GROUP BY a
OPTION (MAXRECURSION 0);

Вам потрібні /*true*/і /*false*/коментарі?
— Esolanging Fruit

Ні. Саме коментарі використовуються для розділення вхідних даних відповідно до очікуваних результатів.
— Андрій Одегов

Чи можете ви їх видалити?
— Esolanging Fruit

Так, звичайно, коментарі можна видалити.
— Андрій Одегов

Здається, у вас жорстко закодовані входи. Я не надто впевнений, але думаю, що прийнятний формат введення - це вибирати їх замість таблиці
— Jo King


0

PHP 114 байт

<?php function f($n){$n1=strrev((string)$n);$r=$n+(int)$n1;for($i=2;$i<$r;$i++){if($r%$i==0){die('0');}}die('1');}

Більш прочитана версія:

<?php function f($n)
{
    $n1 = strrev((string)$n);
    $r = $n + (int)$n1;
    for ($i = 2; $i < $r; $i++) {
        if ($r % $i == 0) {
            die('0');
        }
    }
    die('1');
}

f(11431 );

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

Я використовував цю річ для підрахунку байтів.


Ну гаразд, це має припинити. Я неправильно зрозумів питання тоді. Відредагував питання про припинення у фальшивих випадках.
— Андрій

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