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


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.