Поменять местами и добавить вырождение


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и определите, приведет ли многократное обращение и добавление к простому числу. Выведите истинное или ложное значение. Либо истинное значение for достигает простого значения, либо ложное значение для not, либо оба варианта приемлемы.

Считается, что простые числа достигают простого числа за ноль итераций.

Это поэтому постарайтесь сделать свой код максимально коротким.

Тестовые случаи

Истинный для достигает простого ложь для никогда не достигает простого

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и возвращает Bool. Trueозначает, что оно достигает пика.

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

Попробуйте онлайн!

К сожалению, короткое, но неэффективное простое тестирование означает, что тестовые сценарии OP, 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 является максимальным). Если коротко, то это не дает мне более короткого решения. Вы имеете в виду что-то более мощное, чем это?
Орджан Йохансен

Нет, это было 6 - максимум
Wheat Wizard


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, просто ṚḌ, и я выбрал, ṚḌ$+$чтобы я мог организовать это лучше.
Эрик Outgolfer

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

1

05AB1E , 14 13 байт

РЕДАКТИРОВАТЬ : Сохраненный один байт, потому что ввод используется повторно, если в стеке недостаточно элементов

[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)}

комментарии

Это основано на формуле магического спойлера, описанной Wheat Wizard.

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 Server, 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

Да, конечно, комментарии могут быть удалены.
Андрей Одегов

Вы, кажется, жестко закодировали входы. Я не слишком уверен, но я думаю, что приемлемый формат ввода выбирает их из таблицы вместо этого
Джо Кинг,


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 );

Попробуйте онлайн!

Я использовал эту вещь для подсчета байтов.


Ах, хорошо, это должно закончиться. Тогда я неправильно понял вопрос. Отредактировал вопрос, чтобы прекратить для ложных случаев.
Андрей

N
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.