Bu bir Smith numarası mı?


28

Meydan açıklaması

Bir Smith numarası bir olan bileşik miktarı toplamı basamağı olan birincil faktör basamağı toplamının toplamı eşittir sayı. Bir tam sayı verildiğinde N, bunun bir Smith numarası olup olmadığını belirleyin.

İlk birkaç Smith sayılardır 4, 22, 27, 58, 85, 94, 121, 166, 202, 265, 274, 319, 346, 355, 378, 382, 391, 438(sekans A006753 OEIS olarak).

Örnek giriş / çıkış

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

notlar

  • Kodunuz bir işlev (yöntem) veya tam çalışan bir program olabilir,
  • Yerine gibi kelimelerin Trueve False, herhangi truthy ve falsy değerleri kullanabilirsiniz, yeter ki açık olarak ne olduklarını,
  • Bu bir mücadelesi, bu yüzden kodunuzu mümkün olduğunca kısa tutun!

6
Bunu okumak zorundaydım: "basamakların toplamı, asal faktörlerin basamaklarının toplamına eşittir" , birkaç kez: P
Stewie Griffin,

@StewieGriffin: Evet, oldukça karmaşık bir cümledir, ancak yalnızca örneklere güvenmek yerine doğru bir tanım vermem gerektiğini hissettim :)
shooqie

2
Bu, "Java + this = no" diye düşündüğüm sorulardan biriydi, yine de fikrini geliştirdim: P
Shaun Wild

3
Bazen sayılardaki kalıpları, rakamların toplamını vb. Fark ediyorum, ancak insanlar gerçekten bunun gibi şeyleri fark ediyorlar : "Albert Wilansky, kayınbiraderinin telefon numarasında tanımlayıcı özelliği fark ettiğinde Smith sayısı terimini kullandı" ?
Stewie Griffin,

1
@StewieGriffin: Evet, Ramanujan ve 1729 gibi, beni de şaşırttı.
shooqie

Yanıtlar:


9

Jöle , 12 11 bayt

Æfḟȯ.DFżDSE

İade 1 Smith sayılar için ve 0 aksi. Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Arka fon

Æf(asal çarpanlara ayırma) ve D(tamsayıdan ondalık basamağa), P(ürün) ve (tamsayıdan tamsayı) soldaki ters çevrmeleri oluşturacak şekilde uygulanır.

Tamsayıları için -4 için 4 , Æfaşağıdakileri döndürür.

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

Numaraları için -10, -1, -0.5, 0, 0.5, 1, 10 , Daşağıdaki döndürür.

-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]

Nasıl çalışır

Æ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
Bu söylemem gereken çok hoş bir çözüm!
Emigna

@Emigna - Ben yaptım, ama çok üstün bir şekilde uygulandı: D
Jonathan Allan


1
@Emigna - evet, nasıl çalıştığını bölümü eklemeden önce nasıl golf oynayacağını hesaplamayı planlamıştım.
Jonathan Allan

9

Python 2, 122 115 110 106 bayt

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

Dennis sayesinde 4 bayt kaydedildi

İdeone.com'da deneyin

açıklama

Stdin üzerinde bir sayı okur ve Truesayı bir Smith numarasıysa ya da Falsedeğilse, çıktı verir.

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
Aşağı seçmen - nedenini açıklamak için bir yorum eklemek yararlı olabilir
Jonathan Allan

6
@JonathanAllan Cevap, düzenleme yapıldığı zaman aşağı oy Topluluk kullanıcısı tarafından otomatik olarak yayınlandı. Bunun bir hata olduğunu düşünüyorum .
Dennis,

1
Son satır olarak yeniden yazılabilir print n<m>s==sum(map(int,`m`)).
Dennis,

@Dennis Zincirleme karşılaştırmanın harika bir kullanımı!
LevitatingLion 11

8

Brachylog , 19 bayt

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

Çevrimiçi deneyin!

açıklama

@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 It does . Brachylog'da sayıların negatif işareti _( düşük eksi olarak adlandırılır ).
16'da

7

05AB1E , 11 17 bayt

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

açıklama

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

Çevrimiçi deneyin!


5

PowerShell v3 +, 183 bayt

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)

Dahili ana kontrol yok. Dahili faktoring yok. Dahili basamak toplamı yok. Her şeyin el yapımı. : D

Girdiyi $nbir tamsayı olarak alır, $bboş bir diziye eşit olarak ayarlar . İşte, $basal faktörler koleksiyonumuz.

Sıradaki bir fordöngü. Öncelikle $agirdi numaramıza eşit olarak belirledik ve koşullu, $a1'e eşit veya daha küçük olana kadardır. Bu döngü asal faktörlerimizi bulacaktır.

Aynı zamanda faktör olan primerleri çıkarmak 2için baştan sona loop $a, use Where-Object( |?{...}) . Bunlar faktörü içine alan ve bölen bir iç döngü içine beslenir (böylece sonunda elde edeceğiz ).!($a%$_)|%{...}$b$a1

Öyleyse, şimdi ana faktörlerimizin hepsinde var $b. Boole çıkışımızı formüle etme zamanı. Biz doğrulamak gerekir $nolduğunu -notin $bo vasıta olmasıdır çünkü eğer, $nbu nedenle asal olduğunu ve Smith sayı değildir. Ayrıca, ( -and) Emin bizim iki kümesi yapmak gerekir haneli toplamlar vardır -eqUAL. Elde edilen Boole boru hattında bırakılır ve çıktı örtüktür.

Not - -notinOperatör için v3 veya daha yenisini gerektirir . Ben hala girişini çalıştırıyorum 4937775( hesaplaması yavaş ), bu yüzden bittiğinde bunu güncelleyeceğim. 3 + saat sonra bir yığın akışı hatasıyla karşılaştım. Yani, bir yerlerde bazı üst sınırlar var. Oh iyi.

Bu, negatif giriş, sıfır veya bir için işe yarayacaktır, çünkü -andiadenin sağ tarafı, rakamların toplamını (aşağıda gösterilen şekilde) hesaplamaya çalışırken hata verir ve bu yarının $falsedeğerlendirildiğinde gitmesine neden olur . STDERR varsayılan olarak göz ardı edildiğinden ve doğru çıktı hala görüntülendiğinden, bu iyidir.


Test durumları

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

Jöle , 27 25 23 bayt

(daha fazla golf muhtemelen kesinlikle mümkün)

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

0False veya 1True için döndürür

TryItOnline'daki tüm test vakaları

Nasıl?

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

Aslında, 18 bayt

Ne yazık ki, aslında çokluğa sayının asal çarpanlarını veren bir çarpanlara ayırma faktörü yok, bu yüzden bir tanesini kesmek zorunda kaldım. Golf önerileri kabul edilir. Çevrimiçi deneyin!

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

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 bayt

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

Açıklama:

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

Çevrimiçi deneyin .


1
Bu any(t<0)primalite olmayanlar için çok zekice
Luis Mendo

2

Pyth, 21 bayt

&&>Q1!P_QqsjQTssmjdTP

Bir tamsayı girişi alan ve basan Trueveya Falseilgili bir program.

Çevrimiçi deneyin

Nasıl çalışır

&&>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 bayt

{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}

Bool döndüren adsız bir işlev.

  • Şimdi% 100 manuel faktoring ve öncelik kontrolü yapıyor.
  • Hem "giriş> 1" hem de ">>" faktör sayısını tek bir zincirleme karşılaştırma ile test ederek, bazı baytlar kaydedildi, m> Ω (m) .

( çevrimiçi deneyin )

EDIT: b2gills sayesinde -1 bayt


2..i-1olarak daha iyi yazıldığından 2..^i.
Brad Gilbert 2 Eylül'de

2

Java 7, 509 506 435 426 419 230 bayt

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

@BasicallyAlanTuring adlı kullanıcının yorumunu dinlemeliydim .

Bu, "Java + this = no" diye düşündüğüm sorulardan biriydi.

Ah iyi .. Bazı programlama dilleri ana faktörler veya ana kontrol için tek bir bayt kullanır, ancak Java kesinlikle onlardan biri değildir.

EDIT: Düşünmek için biraz zamanım oldu şimdi bayt miktarı yarı yarıya.

Ungolfed (sıralama) .. ve test durumları:

Burada dene.

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

Çıktı:

false
true
false
true
false
false
false
true

2

Brachylog (daha yeni) , 11 bayt

¬ṗ&ẹ+.&ḋcẹ+

Çevrimiçi deneyin!

Girdi bir Smith numarasıysa, başarılı olup olmadığını bildirirseniz başarılı olun.

               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 bayt

Pm[`mbs(sQ[qRlt*

Burada dene!


1
Daha az giriş sonucu olmayan hatalar2
Jonathan Allan

@JonathanAllan stdout'a çıktı yok sahte. Uyarılar devre dışı bırakılırsa, stderr de göz ardı edilir
Blue

Stderr'i görmezden gelebileceğimizi biliyordum, ancak hiçbir çıktı biraz garip görünmüyor ... ama eğer kabul edilebilirse o zaman kabul edilebilir.
Jonathan Allan

Şahsen kabul edilebilir olup olmadığından emin değilim ama doğru olduğunu söyleyebilir miyim?
Mavi,


1

APL (Dyalog Genişletilmiş) , 36 29 bayt SBCS

Bu cevap , bir sayının asal çarpanlarını döndürdüğü için golf meraklılığını Extended'ın monadına borçludur ve temel dönüşümde Dyalog Unicode'dan daha iyidir.

Düzenleme: -7 bayt dzaima sayesinde.

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

Çevrimiçi deneyin!

açıklama

{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 bayt -{2>⍵:0⋄(⊃=+/-⊃×2<≢)+⌿10⊤⍵,⍭⍵}
dzaima


1

C (gcc) , 139 136 bayt

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

Çevrimiçi deneyin!

Ceilingcat sayesinde -3 bayt

Açıklama:

/* 
 * 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 == _ */
    }                                           /* ; */
}                                               /* } */

Bu birkaç hata ortaya çıkardı (örneğin 2 ve 3), ancak bunun hala başarılması gerektiğini düşünüyorum.
LambdaBeta

Öner t-h&&i==_yerinet-h?i==_:0
ceilingcat

0

Raket 176 bayt

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

True ise 1, false ise 0 döndürür:

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

Detaylı versiyon:

(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

Pas - 143 bayt

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

@levitatinglion tarafından ödünç alınan python çözümü ... en azından bu Java'dan daha kısa ...

play.rust-lang.org de degolfed


0

APL (NARS), 33 karakter, 66 bayt

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

"π⍵" list dönüş listesi faktörleri, girişin bir pozitif tamsayı olduğunu varsayalım> = 1; Ölçek:

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

0

C (gcc), 177 Bayt

QSmith sayıları için 0 döndüren, smith olmayan sayılar için sıfır olmayan bir işlev tanımlar.

#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;}

Çevrimiçi deneyin!

Açıklama:

// 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;
}


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.