Est-ce un numéro Smith?


28

Description du défi

Un nombre Smith est un nombre composite dont la somme des chiffres est égale à la somme des sommes des chiffres de ses facteurs premiers. Étant donné un entier N, déterminez s'il s'agit d'un nombre de Smith ou non.

Les premiers numéros Smith sont 4, 22, 27, 58, 85, 94, 121, 166, 202, 265, 274, 319, 346, 355, 378, 382, 391, 438(séquence A006753 en OEIS).

Exemple d'entrée / sortie

18: False (sum of digits: 1 + 8 = 9; factors: 2, 3, 3; sum of digits of factors: 2 + 3 + 3 = 8)
22: True
13: False (meets the digit requirement, but is prime)
666: True (sum of digits: 6 + 6 + 6 = 18; factors: 2, 3, 3, 37; sum of digits of factors: 2 + 3 + 3 + 3 + 7 = 18)
-265: False (negative numbers can't be composite)
0: False (not composite)
1: False (not composite)
4937775: True

Remarques

  • Votre code peut être une fonction (méthode) ou un programme de travail complet,
  • Au lieu de mots comme Trueet False, vous pouvez utiliser toutes les valeurs véridiques et fausses, tant qu'elles sont claires,
  • C'est un défi de , alors faites votre code aussi court que possible!

6
J'ai dû lire ceci: "la somme des chiffres est égale à la somme des sommes des chiffres de ses facteurs premiers" plusieurs fois: P
Stewie Griffin

@StewieGriffin: Oui, c'est une phrase assez compliquée, mais je sentais que je devais donner une définition correcte au lieu de me fier uniquement aux exemples :)
shooqie

2
C'est une de ces questions où je pensais "Java + this = no", mais j'ai voté pour l'idée: P
Shaun Wild

3
Je remarque parfois des régularités dans les nombres, la somme des chiffres, etc., mais vraiment, les gens remarquent-ils des choses comme ceci: "Albert Wilansky a inventé le terme numéro Smith quand il a remarqué la propriété définissante dans le numéro de téléphone de son beau-frère" ?
Stewie Griffin

1
@StewieGriffin: Oui, c'est comme Ramanujan et 1729, ça m'a toujours dérouté aussi.
shooqie

Réponses:


9

Gelée , 12 11 octets

Æfḟȯ.DFżDSE

Renvoie 1 pour les nombres de Smith et 0 sinon. Essayez-le en ligne! ou vérifiez tous les cas de test .

Contexte

Æf(factorisation principale) et D(entier à décimal) sont implémentés de sorte que P(produit) et (décimal à entier) constituent des inverses gauches.

Pour les entiers -4 à 4 , Æfrenvoie ce qui suit.

-4 -> [-1, 2, 2]
-3 -> [-1, 3]
-2 -> [-1, 2]
-1 -> [-1]
 0 -> [0]
 1 -> []
 2 -> [2]
 3 -> [3]
 4 -> [2, 2]

Pour les nombres -10, -1, -0,5, 0, 0,5, 1, 10 , Drenvoie ce qui suit.

-11   -> [-1, -1]
-10   -> [-1, 0]
 -1   -> [-1]
 -0.5 -> [-0.5]
  0   -> [0]
  0.5 -> [0.5]
  1   -> [1]
 10   -> [1, 0]
 11   -> [1, 1]

Comment ça marche

Æfḟȯ.DFżDSE  Main link. Argument: n (integer)

Æf           Yield the prime factorization of n.
  ḟ          Filter; remove n from its prime factorization.
             This yields an empty array if n is -1, 0, 1, or prime.
   ȯ.        If the previous result is an empty array, replace it with 0.5.
     D       Convert all prime factors to decimal.
      F      Flatten the result.
        D    Yield n in decimal.
       ż     Zip the results to both sides, creating a two-column array.
         S   Compute the sum of each column.
             If n is -1, 0, 1, or prime, the sum of the prime factorization's
             digits will be 0.5, and thus unequal to the sum of the decimal array.
             If n < -1, the sum of the prime factorization's digits will be
             positive, while the sum of the decimal array will be negative.
          E  Test both sums for equality.

2
C'est une solution vraiment cool, je dois dire!
Emigna

@Emigna - C'est ce que j'ai fait, mais mis en œuvre de manière bien supérieure: D
Jonathan Allan

@JonathanAllan Malheureusement je ne parle pas Jelly donc je n'ai aucune idée de ce que fait votre code :)
Emigna

1
@Emigna - oui, j'avais prévu de travailler sur le golf avant d'ajouter une section sur le fonctionnement.
Jonathan Allan

9

Python 2, 122 115 110 106 106 octets

n=m=input()
s=0
for d in range(2,n):
 while n%d<1:n/=d;s+=sum(map(int,`d`))
print n<m>s==sum(map(int,`m`))

Enregistré 4 octets grâce à Dennis

Essayez-le sur ideone.com

Explication

Lit un nombre sur stdin et affiche Truesi le nombre est un nombre Smith ou Falses'il ne l'est pas.

n=m=input()                  # stores the number to be checked in n and in m
s=0                          # initializes s, the sum of the sums of digits of prime factors, to 0
for d in range(2,n):         # checks all numbers from 2 to n for prime factors
 while n%d<1:                # while n is divisible by d
                             #   (to include the same prime factor more than once)
  n/=d                       # divide n by d
  s+=sum(map(int,`d`))       # add the sum of the digits of d to s
print                        # print the result: "True" if and only if
      n<m                    #   n was divided at least once, i.e. n is not prime
      >                      #   and m>s (always true) and
      s==sum(map(int,`m`))   #   s is equal to the sum of digits of m (the input)

1
Votant vers le bas - il pourrait être utile d'ajouter un commentaire pour expliquer pourquoi
Jonathan Allan

6
@JonathanAllan Le vote négatif a été automatiquement émis par l'utilisateur de la communauté lorsque la réponse a été modifiée. Je considère cela comme un bug .
Dennis

1
La dernière ligne peut être réécrite en print n<m>s==sum(map(int,`m`)).
Dennis

@Dennis C'est une excellente utilisation de la comparaison en chaîne!
LevitatingLion

8

Brachylog , 19 octets

@e+S,?$pPl>1,P@ec+S

Essayez-le en ligne!

Explication

@e+S,                 S is the sum of the digits of the input.
     ?$pP             P is the list of prime factors of the input.
        Pl>1,         There are more than 1 prime factors.
             P@e      Split each prime factor into a list of digits.
                c     Flatten the list.
                 +S   The sum of this list of digits must be S.

2
@JonathanAllan Il fait . Dans Brachylog, le signe négatif pour les nombres est _(appelé moins bas ).
Fatalize

7

05AB1E , 11 17 octets

X›0si¹ÒSO¹SOQ¹p_&

Explication

X›0si              # if input is less than 2 then false, else
       SO          # sum of digits
     ¹Ò            # of prime factors with duplicates
            Q      # equal to
          SO       # sum of digits
         ¹         # of input
                &  # and
             ¹p_   # input is not prime

Essayez-le en ligne!


5

PowerShell v3 +, 183 octets

param($n)$b=@();for($a=$n;$a-gt1){2..$a|?{'1'*$_-match'^(?!(..+)\1+$)..'-and!($a%$_)}|%{$b+=$_;$a/=$_}}$n-notin$b-and(([char[]]"$n")-join'+'|iex)-eq(($b|%{[char[]]"$_"})-join'+'|iex)

Pas de vérification principale intégrée. Pas d'affacturage intégré. Pas de somme de chiffres intégrée. Tout est fait à la main. :RÉ

Prend l'entrée $ncomme un entier, définit $bégal à un tableau vide. Voici $bnotre collection de facteurs premiers.

Vient ensuite une forboucle. Nous fixons d'abord $aégal à notre nombre d'entrée, et le conditionnel est jusqu'à ce qu'il $asoit inférieur ou égal à 1. Cette boucle va trouver nos facteurs premiers.

Nous bouclons de 2jusqu'à $a, utilise Where-Object( |?{...}) pour extraire des nombres premiers qui sont également des facteurs !($a%$_). Ceux-ci sont introduits dans une boucle interne |%{...}qui place le facteur dans $bet se divise $a(ainsi nous finirons par arriver à1 ).

Donc, maintenant, nous avons tous nos facteurs premiers dans $b. Il est temps de formuler notre sortie booléenne. Nous devons vérifier que $nc'est le cas -notin $b, car si c'est le cas, cela signifie que $nc'est premier, et donc ce n'est pas un nombre Smith. De plus, ( -and) nous devons nous assurer que nos deux ensembles de chiffres sont -equaux. Le booléen résultant est laissé sur le pipeline et la sortie est implicite.

NB - Nécessite la version 3 ou plus récente pour l' -notinopérateur. J'exécute toujours l'entrée pour 4937775(c'est lent à calculer), donc je mettrai à jour cela quand cela se terminera. Après plus de 3 heures, j'ai eu une erreur de stackoverflow. Donc, il y a une limite supérieure quelque part. Tant pis.

Cela fonctionnera pour une entrée négative, zéro ou un, car la droite de la -andva éliminer une erreur pendant qu'elle essaie de calculer les sommes des chiffres (illustrées ci-dessous), ce qui entraînera le passage de cette moitié $falselors de l'évaluation. Étant donné que STDERR est ignoré par défaut et que la sortie correcte est toujours affichée, c'est très bien.


Cas de test

PS C:\Tools\Scripts\golfing> 4,22,27,58,85,94,18,13,666,-265,0,1|%{"$_ -> "+(.\is-this-a-smith-number.ps1 $_)}
4 -> True
22 -> True
27 -> True
58 -> True
85 -> True
94 -> True
18 -> False
13 -> False
666 -> True
Invoke-Expression : Cannot bind argument to parameter 'Command' because it is an empty string.
At C:\Tools\Scripts\golfing\is-this-a-smith-number.ps1:1 char:179
+ ... "$_"})-join'+'|iex)
+                    ~~~
    + CategoryInfo          : InvalidData: (:String) [Invoke-Expression], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand

-265 -> False
Invoke-Expression : Cannot bind argument to parameter 'Command' because it is an empty string.
At C:\Tools\Scripts\golfing\is-this-a-smith-number.ps1:1 char:179
+ ... "$_"})-join'+'|iex)
+                    ~~~
    + CategoryInfo          : InvalidData: (:String) [Invoke-Expression], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand

0 -> False
Invoke-Expression : Cannot bind argument to parameter 'Command' because it is an empty string.
At C:\Tools\Scripts\golfing\is-this-a-smith-number.ps1:1 char:179
+ ... "$_"})-join'+'|iex)
+                    ~~~
    + CategoryInfo          : InvalidData: (:String) [Invoke-Expression], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand

1 -> False


3

Gelée , 27 25 23 octets

(le golf est probablement définitivement possible)

ḢDS×
ÆFÇ€SḢ
DS=Ça<2oÆP¬

Renvoie 0pour False ou 1pour True

Tous les cas de test sur TryItOnline

Comment?

DS=Ça<2oÆP¬ - main link takes an argument, n
DS          - transform n to a decimal list and sum up
   Ç        - call the previous link (ÆFÇ€SḢ)
  =         - test for equality
     <2     - less than 2?
    a       - logical and
        ÆP  - is prime?
       o    - logical or
          ¬ - not
            - all in all tests if the result of the previous link is equal to the digit
              sum if the number is composite otherwise returns 0.

ÆFÇ€SḢ - link takes an argument, n again
ÆF     - list of list of n's prime factors and their multiplicities
  Ç€   - apply the previous link (ḢDS×) for each
    S  - sum up
     Ḣ - pop head of list (there will only be one item)

ḢDS× - link takes an argument, a factor, multiplicity pair
Ḣ    - pop head, the prime factor - modifies list leaving the multiplicity
 DS  - transform n to a decimal list and sum up
   × - multiply the sum with the multiplicity

3

En fait, 18 octets

Malheureusement, en fait, il n'y a pas de factorisation intégrée qui donne les facteurs premiers d'un nombre à la multiplicité, j'ai donc dû en pirater un ensemble. Suggestions de golf bienvenues. Essayez-le en ligne!

;w`i$n`MΣ♂≈Σ@$♂≈Σ=

Ungolfing

         Implicit input n.
;w       Duplicate n and get the prime factorization of a copy of n.
`...`M   Map the following function over the [prime, exponent] lists of w.
  i        Flatten the list. Stack: prime, exponent.
  $n       Push str(prime) to the stack, exponent times.
            The purpose of this function is to get w's prime factors to multiplicity.
Σ        sum() the result of the map.
          On a list of strings, this has the same effect as "".join()
♂≈Σ      Convert every digit to an int and sum().
@        Swap the top two elements, bringing other copy of n to TOS.
$♂≈Σ     Push str(n), convert every digit to an int, and sum().
=        Check if the sum() of n's digits is equal 
          to the sum of the sum of the digits of n's prime factors to multiplicity.
         Implicit return.

3

Haskell, 120 105 octets

1%_=[];a%x|mod a x<1=x:div a x%x|0<1=a%(x+1)
p z=sum[read[c]|c<-show z]
s x|z<-x%2=z<[x]&&sum(p<$>z)==p x

2

Octave, 80 78 octets

t=num2str(factor(x=input('')))-48;disp(any(t<0)&~sum([num2str(x)-48 -t(t>0)]))

Explication:

factor(x=input(''))                 % Take input, store as x and factor it
num2str(factor(x=input('')))-48     % Convert it to an array (123 -> [1 2 3]) 
                                    % and store as t
any(t<0)                            % Check if there are several prime factors
                                    % [2 3] -> [2 -16 3]
sum([num2str(x)-48 -t(t>0)])        % Check if sum of prime factor
                                    % is equal the sum of digits

Essayez-le en ligne .


1
Cela any(t<0)pour la non-primalité est très intelligent
Luis Mendo

2

Pyth, 21 octets

&&>Q1!P_QqsjQTssmjdTP

Un programme qui prend l'entrée d'un entier et imprime Trueou Falseselon le cas.

Essayez-le en ligne

Comment ça marche

&&>Q1!P_QqsjQTssmjdTP  Program. Input: Q
           jQT         Yield digits of the base-10 representation of Q as a list
          s            Add the digits
                    P  Yield prime factors of Q (implicit input fill)
                mjdT   Map base-10 representation across the above, yielding digits of each
                       factor as a list of lists
               s       Flatten the above
              s        Add up the digits
         q             Those two sums are equal
&                      and
  >Q1                  Q>1
 &                     and
     !P_Q              Q is not prime
                       Implicitly print

2

Perl 6 , 92 88 87 octets

{sub f(\i){my \n=first i%%*,2..i-1;n??n~f i/n!!i}
!.is-prime&&$_>1&&.comb.sum==.&f.comb.sum}

{sub f(\i){my \n=first i%%*,2..^i;n??[n,|f i/n]!!|i}
$_>.&f>1&&.comb.sum==.&f.comb.sum}

Une fonction anonyme qui renvoie un Bool.

  • Effectue maintenant une factorisation manuelle à 100% et un contrôle de primalité.
  • Enregistrement de quelques octets en testant à la fois "entrée> 1" et "nombre de facteurs> 1" avec une comparaison en chaîne, car m> Ω (m) .

( essayez-le en ligne )

EDIT: -1 octet grâce à b2gills


2..i-1est mieux orthographié comme 2..^i.
Brad Gilbert b2gills

2

Java 7, 509 506 435 426 419 230 octets

boolean c(int n){return n<2|p(n)?0>1:d(n)==f(n);}int d(int n){return n>9?n%10+d(n/10):n;}int f(int n){int r=0,i;for(i=1;++i<=n;)for(;n%i<1;n/=i,r+=i>9?d(i):i);return r;}boolean p(int n){int i=2;while(i<n)n=n%i++<1?0:n;return n>1;}

J'aurais dû écouter @BasicallyAlanTuring le commentaire de ..

C'est une de ces questions où je pensais "Java + this = no", mais j'ai voté pour l'idée: P

Ah bien .. Certains langages de programmation utilisent un seul octet pour les facteurs premiers ou prime-check, mais Java n'en fait certainement pas partie.

EDIT: Réduit de moitié le nombre d'octets maintenant que j'ai eu le temps d'y penser.

Cas non testés (triés ..) et de test:

Essayez-le ici.

class M{
  static boolean c(int n){
    return n < 2 | p(n)
            ? 0 > 1 //false
            : d(n) == f(n);
  }

  // Sums digits of int
  static int d(int n) {
    return n > 9
            ? n%10 + d(n/10)
            : n;
  }

  // Convert int to sum of prime-factors
  static int f(int n) {
    int r = 0,
        i;
    for(i = 1; ++i <= n; ){
      for( ; n % i < 1; n /= i,
                        r += i > 9 ? d(i) : i);
    }
    return r;
  }

  // Checks if the int is a prime
  static boolean p(int n){
    int i = 2;
    while(i < n){
      n = n % i++ < 1
           ? 0
           : n;
    }
    return n > 1;
  }

  public static void main(String[] a){
    System.out.println(c(18));
    System.out.println(c(22));
    System.out.println(c(13));
    System.out.println(c(666));
    System.out.println(c(-256));
    System.out.println(c(0));
    System.out.println(c(1));
    System.out.println(c(4937775));
  }
}

Sortie:

false
true
false
true
false
false
false
true

2

Brachylog (plus récent) , 11 octets

¬ṗ&ẹ+.&ḋcẹ+

Essayez-le en ligne!

Le prédicat réussit si l'entrée est un nombre Smith et échoue s'il ne l'est pas.

               The input
¬ṗ             is not prime,
  &            and the input's 
   ẹ           digits
    +          sum to
     .         the output variable,
      &        and the input's 
       ḋ       prime factors' (getting prime factors of a number < 1 fails)
        c      concatenated
         ẹ     digits
          +    sum to
               the output variable.



1

Pyke, 16 octets

Pm[`mbs(sQ[qRlt*

Essayez-le ici!


1
Erreurs sans résultat pour une saisie inférieure à2
Jonathan Allan

@JonathanAllan aucune sortie vers stdout n'est fausse. Si les avertissements sont désactivés, stderr est également ignoré
Blue

Je savais que nous pouvons ignorer stderr, mais aucune sortie ne semble un peu bizarre ... mais si c'est acceptable, alors c'est acceptable.
Jonathan Allan

Personnellement, je ne sais pas si c'est acceptable mais je peux dire que c'est vrai?
Blue

1

Perl 6 , 80 octets

{.[0]==.flat.skip.sum}o($!={.comb.sum,($/=first $_%%*,2..^$_)&&map $!,$/,$_/$/})

Essayez-le en ligne!

Bloc de code anonyme qui prend un entier et renvoie un booléen.


1

APL (Dyalog Extended) , 36 29 octets SBCS

Cette réponse doit son golfe à la monade d'Extended pour avoir renvoyé les facteurs premiers d'un nombre, et que mieux à la conversion de base qu'en Dyalog Unicode.

Edit: -7 octets grâce à dzaima.

{2>⍵:0⋄(⊃=+/-⊃×2<≢)+⌿10⊤⍵,⍭⍵}

Essayez-le en ligne!

Explication

{1⋄(3)2}  A dfn, a function in brackets.  is a statement separator.
          The numbers signify the sections in the order they are explained.

2>⍵:0  If we have a number less than 2,
       we immediately return 0 to avoid a DOMAIN ERROR.

+⌿10⊤⍵,⍭⍵
        ⍭⍵  We take the factors of ⍵, our input as our right argument,
      ⍵,    and append it to our input again.
   10      before converting the input and its factors into a matrix of their base-10 digits
            (each row is the places, units, tens, hundreds, etc.)
+⌿         And taking their sum across the columns of the resulting matrix,
            to give us the sum of their digits, their digit-sums.

(⊃=+/-⊃×2<≢)  We run this section over the list of sums of digits above.
 ⊃=+/-⊃       We check if the main digit-sum (of our input)
               Is equal to the sum of our digit-sums
               (minus our main digit-sum that is also still in the list)
        ×2<≢   The trick here is that we can sneak in our composite check
               (if our input is prime there will be only two numbers, 
               the digit-sum of the prime,
               and the digit-sum of its sole prime factor, itself)
               So if we have a prime, we zero our (minus our main sum)
               in the calculation above, so that primes will not succeed in the check.
               We return the result of the check.

29 octets -{2>⍵:0⋄(⊃=+/-⊃×2<≢)+⌿10⊤⍵,⍭⍵}
dzaima


1

C (gcc) , 139 136 octets

S(m,i,t,h,_){t=m=m<2?2:m;for(_=h=i=1;m>1;h=1){while(m%++h);for(m/=h;i+=h%10,h/=10;);}while(t%++h);for(m=t;_+=m%10,m/=10;);m=t-h?i==_:0;}

Essayez-le en ligne!

-3 octets grâce au plafond

Explication:

/* 
 * Variable mappings:
 *  is_smith      => S
 *  argument      => m
 *  factor_digits => i
 *  arg_copy      => t
 *  least_factor  => h
 *  digit_sum     => _    
 */
int is_smith(int argument){                     /* S(m,i,t,h,_){ */
    int factor_digits;
    int arg_copy;
    int least_factor;
    int digit_sum;

    /* 
     * The cases of 0 and 1 are degenerate. 
     * Mapping them to a non-degenerate case with the right result.
     */
    if (argument < 2) {                         /* t=m=m<2?2:m; */
        argument = 2;
    }
    arg_copy = argument;

    /* 
     * Initializing these to 1 instead of zero is done for golf reasons.
     * In the end we just compare them, so it doesn't really matter.
     */
    factor_digits = 1;                          /* for(_=h=i=1; */
    digit_sum = 1;

    /* Loop over each prime factor of argument */
    while (argument > 1) {                      /* m>1; */

        /*
         * Find the smallest factor 
         * Note that it is initialized to 1 in the golfed version since prefix
         * increment is used in the modulus operation.
         */
        least_factor = 2;                       /* h=1){ */
        while (argument % least_factor != 0)    /* while(m% */
            least_factor++;                     /* ++h); */
        argument /= least_factor;               /* for(m/=h; */

        /* Add its digit sum to factor_digits */
        while (least_factor > 0) {
            factor_digits += least_factor % 10; /* i+=h%10, */
            least_factor /= 10;                 /* h/=10;) */
        }                                       /* ; */

    }                                           /* } */

    /* In the golfed version we get this for free in the for loop. */
    least_factor = 2;
    while (arg_copy % least_factor != 0)        /* while(t% */
        least_factor++;                         /* ++h); */

    /* Restore the argument */
    argument = arg_copy;                        /* for(m=t; */

    /* Compute the arguments digit sum */
    while (argument > 0) {
        digit_sum += argument % 10;             /* _+=m%10, */
        argument /= 10;                         /* m/=10;) */
    }                                           /* ; */

    /* This return is done by assigning to first argument when golfed. */
                                                /* m= */
    if (arg_copy == least_factor) {             /* t==h? */
        return 0; /* prime input */             /* 0 */
    } else {                                    /* : */
        return digit_sum == factor_digits;      /* i == _ */
    }                                           /* ; */
}                                               /* } */

Cela a introduit quelques bugs (par exemple 2 et 3) mais je pense que cela devrait toujours être réalisable.
LambdaBeta

Suggérer à la t-h&&i==_place det-h?i==_:0
plafondcat

0

Raquette 176 octets

(define(sd x)(if(= x 0)0(+(modulo x 10)(sd(/(- x(modulo x 10))10)))))
(require math)(define(f N)
(if(=(for/sum((i(factorize N)))(*(sd(list-ref i 0))(list-ref i 1)))(sd N))1 0))

Renvoie 1 si vrai et 0 si faux:

(f 27)
1
(f 28)
0
(f 85)
1
(f 86)
0

Version détaillée:

(define (sd x)   ; fn to find sum of digits
  (if (= x 0)
      0
      (+ (modulo x 10)
         (sd (/ (- x (modulo x 10)) 10)))))

(require math)
(define (f N)
  (if (= (for/sum ((i (factorize N)))
           (* (sd (list-ref i 0))
              (list-ref i 1)))
         (sd N)) 1 0))

0

Rouille - 143 octets

fn t(mut n:u32)->bool{let s=|k:u32| (2..=k).fold((0,k),|(a,m),_|(a+m%10,m/10));s(n).0==(2..n).fold(0,|mut a,d|{while n%d<1{n/=d;a+=s(d).0};a})}

solution python empruntée par @levitatinglion ... au moins c'est plus court que Java ...

dégouliné sur play.rust-lang.org


0

APL (NARS), 33 caractères, 66 octets

{1≥≢k←π⍵:0⋄s←{+/⍎¨⍕⍵}⋄(s⍵)=+/s¨k}

"π⍵" renvoie les facteurs de liste de ⍵, supposons que l'entrée soit un entier positif> = 1; tester:

  h←{1≥≢k←π⍵:0⋄s←{+/⍎¨⍕⍵}⋄(s⍵)=+/s¨k}
  (h¨1..100)/1..100
4 22 27 58 85 94 

0

C (gcc), 177 octets

Définit une fonction Qqui renvoie 0 pour les nombres de forgerons et différente de zéro pour les nombres non forgés

#define r return
O(D,i){for(i=0;D>0;i+=D%10,D-=D%10,D/=10);r i;}D(O,o){for(o=1;o<O;)if(O%++o<1)r o;r O;}Q(p,q,i,j){if(p^(q=D(i=p))){for(j=0;p>1;q=D(p/=q))j+=O(q);r j^O(i);}r 1;}

Essayez-le en ligne!

Explication:

// Return the sum of digits of D if D > 0, otherwise 0
O(D,i){
    // While D is greater than 0:
    // Add the last digit of D to i, and remove the last digit from D
    for(i=0;D>0;i+=D%10,D-=D%10,D/=10);
    return i;
}
// Return the smallest prime factor of O if O>1 else O
D(O,o){
    // Iterate over numbers less than O
    for(o=1;o<O;)
        // If O is divisible by o return o
        if(O%++o<1)
            return o;
    // Otherwise return O
    return O;
}
Q(p,q,i,j){
    // Set q to D(p) and i to p
    // If p != D(p) (i.e, p is composite and > 0)
    if(p^(q=D(i=p))){
        // Iterate over the prime factors of p and store their digit sum in j
        for(j=0;p>1;q=D(p/=q))
            j+=O(q);
        // i is the original value of p. If O(i)^j == 0, O(i) == j
        return j^O(i);
    }
    // If p was composite or < 0, return 1
    return 1;
}


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.