Inverser et ajouter la dégénérescence


22

Intro

Inverser et ajouter est aussi simple que ncela puisse paraître, prenez-le et ajoutez-le à ses chiffres dans l'ordre inverse. (par exemple 234 + 432 = 666).

Si vous appliquez ce processus à plusieurs reprises, certains nombres finiront par atteindre un nombre premier, et certains n'atteindront jamais un nombre premier.

Exemple

J'ai actuellement

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!

Ce nombre atteint son apogée

En revanche, tout multiple de 3 n'atteindra jamais un nombre premier, c'est parce que tous les multiples de 3 ont une somme de chiffres qui est un multiple de 3 et vice versa. Ainsi, inverser et ajouter un multiple de 3 donnera toujours un nouveau multiple de 3 et donc jamais un nombre premier.

Tâche

Prenez un entier positif net déterminez si une inversion et une addition répétées entraîneront un nombre premier. Sortez une valeur véridique ou fausse. Soit véridique pour atteint une valeur première et fausse pour non, soit l'inverse est acceptable.

Les nombres premiers seront considérés comme atteignant un nombre premier en zéro itération.

Il s'agit de , essayez donc de rendre votre code aussi court que possible.

Cas de test

Vrai pour atteint un premier faux pour n'atteint jamais un premier

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

Allusion

Pendant que j'écrivais ce défi, j'ai découvert un truc sympa qui rend ce problème beaucoup plus facile. Ce n'est pas impossible sans cette astuce et ce n'est pas banal non plus mais ça aide. J'ai eu beaucoup de plaisir à découvrir cela, donc je vais le laisser dans un spoiler ci-dessous.

L'inverse et l'ajout répétés atteindront toujours un multiple de 11 en 6 itérations ou moins. S'il n'atteint pas d'amorce avant d'avoir atteint un multiple de 11, il n'atteindra jamais d'amorce.


Je trouve que c'est plus un problème mathématique qu'un problème de codage. Je suppose que les problèmes de code ont des règles spécifiques qui sont implémentées dans le code par le répondeur; Je ne pense pas que ce soit le cas avec ce défi.
Arjun

@ DobbyTheFree-Elf Je pense que la différence entre ce problème et les problèmes de "codage" typiques est que souvent pour ces derniers, l'algorithme à implémenter est évident et il s'agit juste de le faire en le moins de code possible. Ce défi vous oblige à proposer un algorithme à partir de zéro. Les deux posent leurs propres puzzles uniques, mais les deux sont finalement des problèmes de codage.
Wheat Wizard

Je suis d'accord avec votre commentaire, mais à mon avis, proposer un tel algorithme présent dans ce défi est plus un travail de mathématicien que de programmeur. Je ne sais pas ce que les autres pensent, mais c'est du moins ce que je pense. Donc, cela a mon downvote.
Arjun

1
@ DobbyTheFree-Elf Je déteste vous le dire, mais trouver des algorithmes efficaces pour résoudre un problème dans une partie cruciale d'un bon programmeur.
Wheat Wizard

Je suis également d'accord avec cela. Mais l'algorithme pour ce défi aura plus de valeur mathématique. Il faudra trouver ou créer des théorèmes mathématiques éprouvés pour garantir une sortie correcte avec chaque entrée possible, ce qui, à mon avis, fait ce que font les mathématiciens. Les approches courantes comme la force brute, etc. ne fonctionneront pas dans ce cas.
Arjun

Réponses:


7

Rubis , 84 79 77 74 octets

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

Essayez-le en ligne!

Si je comprends bien, lorsque nous atteignons un multiple de 11, nous pouvons arrêter (nous n'obtiendrons que des multiples de 11 après cela)


Il y a quelque chose de plus puissant que nous pouvons prouver avec les informations dans le spoiler.
Wheat Wizard

3

Haskell , 65 octets

fprend un Integeret retourne un Bool. Truesignifie qu'il atteint un apogée.

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

Essayez-le en ligne!

Malheureusement, le test premier court mais inefficace signifie que les Truecas de test du PO autres que11 devenir trop gros pour finir. Mais par exemple 11432 est un Truecas qui se termine.

Vous pouvez également essayer celui-ci de 3 octets de plus, pour lequel TIO peut terminer tous les Truecas de test:

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

Essayez-le en ligne!

Les tests principaux des deux versions se cassent sur 1, mais il se trouve qu'il arrive de toute façon à un premier (2).

Sinon, j'ai remarqué la même chose que GB dans le spoiler de la soumission Ruby:

Une fois qu'un nombre atteint une longueur paire, l'itération suivante sera divisible par 11. Une fois qu'un nombre est divisible par 11, il en sera de même pour toutes les itérations suivantes.


@WheatWizard Eh bien, cela implique que le nombre d'itérations est limité, avec (désolé, pas de balises de spoiler dans les commentaires) max 6 étapes à vérifier je pense (par exemple 100 est maximal). En essayant brièvement, cela ne semble pas me donner une solution plus courte, cependant. Voulez-vous dire quelque chose de plus puissant que cela?
Ørjan Johansen

Non, c'était 6, c'est le maximum
Wheat Wizard


2

Python 2 , 78 70 69 octets

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

Essayez-le en ligne!

Explication

Ce programme repose sur le fait que

Chaque nombre qui perdra pour toujours atteindra un multiple de 11 en moins de 6 coups

Ce programme est un lambda récursif avec des comparatifs logiques en circuit. Il vérifie d'abord si n est premier.

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

Si cela est vrai, nous revenons vrai.

S'il est faux, nous vérifions s'il s'agit d'un multiple de 11.

x%11

Si faux, nous retournons faux sinon nous renvoyons le résultat de fla prochaine itération

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

2

Gelée , 11 octets

ṚḌ$+$6СÆPS

Essayez-le en ligne!


Pour l'intérêt de tous ceux qui liront cette réponse, la dernière Spourrait être Taussi. RD$+$peut également être +RD$$ou RD+<newline>Ç(toutes les modifications triviales)
HyperNeutrino

@HyperNeutrino que j'ai choisi Sparce qu'il a moins de chance de montrer quoi que ce soit> 1. Il n'y en a pas RD, juste ṚḌ, et j'ai choisi ṚḌ$+$pour mieux l'organiser.
Erik the Outgolfer le

J'étais trop paresseux pour mettre les points; Je sais pourquoi tu mets S; J'aurais dû choisir ça T, mais c'est surtout pour l'intérêt de tout le monde.
HyperNeutrino

1

05AB1E , 14 13 octets

EDIT : enregistré un octet car l'entrée est réutilisée s'il n'y a pas assez d'éléments sur la pile

[Dp#D11Ö#R+]p

Essayez-le en ligne!

Utilise l'indice de la question

Comment ça marche

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

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 octets

Renvoie 0ou true.

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

Commenté

Ceci est basé sur la formule de spoiler magique décrite par 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
    )                   //
}                       //

Cas de test

J'ai supprimé les deux entrées les plus importantes de l'extrait de code, car elles prennent quelques secondes. (Mais ils fonctionnent aussi.)


0

Mathematica, 45 octets

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

0

Serveur Microsoft SQL, 826 786 * octets

* Je me suis souvenu de la fonction IIF introduite dans 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)

Vérifiez-le en ligne

Le formatage plus soigné

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

Avez-vous besoin des commentaires /*true*/et /*false*/?
Esolanging Fruit

Ce sont les commentaires qui séparaient les données d'entrée en fonction des résultats attendus.
Andrei Odegov

Pouvez-vous les supprimer?
Esolanging Fruit

Oui bien sûr, les commentaires peuvent être supprimés.
Andrei Odegov

Vous semblez avoir codé en dur les entrées. Je ne suis pas trop sûr, mais je pense qu'un format d'entrée acceptable consiste à les sélectionner dans une table à la place
Jo King

0

Gelée , 9 octets

ṚḌ+Ɗ6СẒẸ

Essayez-le en ligne!

Comment ça marche

ṚḌ+Ɗ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 octets

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

Version plus lisible:

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

Essayez-le en ligne!

J'ai utilisé cette chose pour compter les octets.


Ah d'accord, ça devrait se terminer. J'ai alors mal compris la question. Modification de la question pour mettre fin aux cas de faux-y.
Andrew

Maintenant, il retourne toujours false sauf si le premier revers est un nombre premier. Vous ne vérifiez pas non plus le premier cas, oùnest un premier choix. Et TIO a un compteur d'octets pour vous ... il a même un formateur automatique pour le modèle de soumission que vous pouvez utiliser
Jo King
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.