Inverter e adicionar degenerescência


22

Introdução

Inverter e adicionar é tão simples quanto parece, pegue ne adicione aos seus dígitos na ordem inversa. (por exemplo, 234 + 432 = 666).

Se você aplicar esse processo repetidamente, alguns números atingirão um número primo e outros nunca atingirão um primo.

Exemplo

Eu tenho atualmente

11431 rep.

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!

Este número atinge um primo

Por outro lado, qualquer múltiplo de 3 nunca alcançará um primo, porque todos os múltiplos de 3 têm uma soma de dígitos que é um múltiplo de 3 e vice-versa. Portanto, reverter e adicionar um múltiplo de 3 sempre resultará em um novo múltiplo de 3 e, portanto, nunca será um primo.

Tarefa

Pegue um número inteiro positivo ne determine se a inversão e a adição repetidas resultarão em um número primo. Emita um valor verdadeiro ou falso. Qualquer verdade para atinge um valor primo e falso para não, ou o contrário é aceitável.

Os números primos serão considerados como atingindo um número primo em zero iterações.

Isso é então tente fazer o seu código o mais curto possível.

Casos de teste

Verdadeiro para atinge um primo falso para nunca atinge um primo

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

Sugestão

Enquanto escrevia esse desafio, descobri um truque interessante que facilita muito esse problema. Não é impossível sem esse truque e também não é trivial, mas ajuda. Eu me diverti muito descobrindo isso, então deixarei em um spoiler abaixo.

A reversão e adição repetidas sempre atingem um múltiplo de 11 em 6 iterações ou menos. Se não atingir um primo antes de atingir um múltiplo de 11, nunca atingirá um primo.


Acho mais um problema matemático do que um código. Eu acho que os problemas de código têm regras específicas estabelecidas, que são implementadas no código pelo respondente; Não acho que esse seja o caso desse desafio.
Arjun #

@ DobbyTheFree-Elf Acho que a diferença entre esse problema e os problemas típicos de "codificação" é que, freqüentemente, para o último, o algoritmo a ser implementado é óbvio e é apenas uma questão de fazê-lo no menor código possível. Esse desafio força você a criar um algoritmo do zero. Ambos apresentam seus próprios quebra-cabeças, mas, no final das contas, ainda estão com problemas de codificação.
Assistente de trigo

Concordo com esse seu comentário, mas, na minha opinião, apresentar esse algoritmo presente neste desafio é mais um trabalho de um matemático do que de um programador. Não sei o que os outros pensam, mas é pelo menos o que penso. Então, isso tem o meu voto negativo.
Arjun #

1
@ DobbyTheFree-Elf Eu odeio dizer isso a você, mas encontrar algoritmos eficientes para resolver um problema em uma parte crucial de ser um bom programador.
Assistente de trigo

Também concordo com isso. Mas o algoritmo para esse desafio terá mais valor matemático. Será necessário encontrar ou criar teoremas matemáticos comprovados para garantir uma saída correta com todas as entradas possíveis, o que, na minha opinião, o que os matemáticos fazem. Abordagens comuns, como força bruta, etc. não funcionarão neste caso.
Arjun

Respostas:


7

Ruby , 84 79 77 74 bytes

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

Experimente online!

Se eu acertar, quando atingirmos um múltiplo de 11, podemos parar (só obteremos múltiplos de 11 depois disso)


Há algo mais poderoso que podemos provar com as informações no spoiler.
Assistente de trigo

3

Haskell , 65 bytes

fpega um Integere retorna um Bool. Truesignifica que atinge um nível máximo.

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

Experimente online!

Infelizmente, o teste inicial curto, mas ineficiente, significa que os Truecasos de teste do OP, que não 11são grandes demais para serem finalizados. Mas, por exemplo, 11432 é um Truecaso que termina.

Você também pode tentar este com mais três bytes, para o qual o TIO pode concluir todos os Truecasos de teste:

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

Experimente online!

Os testes principais das duas versões quebram em 1, mas acontece que chega a um prime (2) de qualquer maneira.

Caso contrário, notei a mesma coisa que GB no spoiler da submissão do Ruby:

Uma vez que um número cresça no mesmo comprimento, a próxima iteração será divisível por 11. Quando um número for divisível por 11, o mesmo ocorrerá com todas as iterações seguintes.


@ WheatWizard Bem, isso implica que o número de iterações é limitado, com (desculpe, não há tags de spoiler nos comentários) no máximo 6 etapas para verificar, eu acho (por exemplo, 100 é o máximo). Tentando brevemente, isso não parece me dar uma solução mais curta. Você quer dizer algo mais poderoso que isso?
Ørjan Johansen

Não foi isso 6 é o máximo
Assistente de trigo


2

Python 2 , 78 70 69 bytes

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

Experimente online!

Explicação

Este programa baseia-se no fato de que

Todo número dessa perda para sempre atingirá um múltiplo de 11 em menos de 6 movimentos

Este programa é um lambda recursivo com comparativos lógicos em circuitos. Ele primeiro verifica se n é primo.

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

Se isso é verdade, retornamos verdadeiro.

Se for falso, verificamos se é um múltiplo de 11.

x%11

Se false, retornamos false, caso contrário, retornamos o resultado de fna próxima iteração

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

2

Gelatina , 11 bytes

ṚḌ$+$6СÆPS

Experimente online!


Para o interesse de qualquer pessoa que leia esta resposta, a última também Spode ser uma T. RD$+$também pode ser +RD$$ou RD+<newline>Ç(todas as modificaes triviais)
HyperNeutrino

@HyperNeutrino eu escolhi Sporque tem menos chance de mostrar algo> 1. Não há RD, apenas ṚḌ, e eu escolhi ṚḌ$+$para que eu pudesse organizá-lo melhor.
precisa saber é o seguinte

Eu estava com preguiça de colocar os pontos; Eu sei porque você coloca S; Eu deveria ter escolhido isso de novo T, mas isso é principalmente para o interesse de todos os outros.
HyperNeutrino

1

05AB1E , 14 13 bytes

EDIT : salvou um byte porque a entrada é reutilizada se não houver elementos suficientes na pilha

[Dp#D11Ö#R+]p

Experimente online!

Usa a dica na pergunta

Como funciona

[              # 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 bytes

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 bytes

Retorna 0ou true.

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

Comentado

Isso é baseado na fórmula do spoiler mágico descrita pelo 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
    )                   //
}                       //

Casos de teste

Eu removi as duas maiores entradas do snippet, pois elas levam alguns segundos para serem concluídas. (Mas eles também funcionam.)


0

Mathematica, 45 bytes

Or@@PrimeQ@NestList[#+IntegerReverse@#&,#,6]&

0

Microsoft Sql Server, 826 786 * bytes

* Lembrei-me da função IIF que foi introduzida no 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)

Verifique on-line

A formatação mais elegante

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

Você precisa os /*true*/e /*false*/comentários?
Esolanging Fruit

Não. Foram os comentários que separaram os dados de entrada de acordo com os resultados esperados.
Andrei Odegov

Você pode excluí-los?
Esolanging Fruit

Sim, é claro, os comentários podem ser excluídos.
Andrei Odegov

Você parece ter codificado as entradas. Eu não estou muito certo, mas acho que um formato de entrada aceitável é selecionando-os a partir de uma tabela em vez
Jo rei

0

Geléia , 9 bytes

ṚḌ+Ɗ6СẒẸ

Experimente online!

Como funciona

ṚḌ+Ɗ6СẒẸ    Monadic main link.
ṚḌ+Ɗ         Monad: Reverse and add to original.
    6С      Repeatedly apply the above 6 times, collecting all iterations
       ẒẸ    Is any of them a prime?

0

PHP 114 bytes

<?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');}

Versão mais legível:

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

Experimente online!

Eu usei isso para contar bytes.


Ah, tudo bem, deve terminar. Entendi mal a pergunta então. Editou a pergunta para finalizar em casos de falso-y.
Andrew

n
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.