Czy to numer Smitha?


28

Opis wyzwania

Liczba Smitha jest liczbą złożoną, której suma cyfr jest równa sumie liczb jego czynników pierwszych. Biorąc pod uwagę liczbę całkowitą N, określ, czy jest to liczba Smitha, czy nie.

Pierwszych kilka numerów Smith są 4, 22, 27, 58, 85, 94, 121, 166, 202, 265, 274, 319, 346, 355, 378, 382, 391, 438(sekwencja A006753 w OEIS).

Przykładowe wejście / wyjście

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

Uwagi

  • Twój kod może być funkcją (metodą) lub pełnym działającym programem,
  • Zamiast słów takich jak Truei Falsemożesz używać dowolnych wartości prawdziwości i fałszowania, o ile są jasne, jakie one są,
  • Jest to wyzwanie dla , dlatego ustaw swój kod tak krótko, jak to możliwe!

6
Musiałem przeczytać to: „suma cyfr jest równa sumie cyfr jego czynników pierwszych” kilka razy: P
Stewie Griffin

@StewieGriffin: Tak, to dość skomplikowane zdanie, ale czułem, że muszę podać właściwą definicję zamiast polegać wyłącznie na przykładach :)
shooqie,

2
To jedno z tych pytań, w których pomyślałem „Java + this = no”, jednak głosowałem za tym pomysłem: P
Shaun Wild

3
Czasem dostrzegam wzorce liczb, sumę cyfr itp., Ale czy ludzie zauważają takie rzeczy: „Albert Wilansky ukuł termin Smitha, gdy zauważył właściwość określającą numer telefonu swojego szwagra” ?
Stewie Griffin

1
@StewieGriffin: Tak, to jest jak Ramanujan i 1729, zawsze mnie też zaskoczyło.
shooqie,

Odpowiedzi:


9

Galaretka , 12 11 bajtów

Æfḟȯ.DFżDSE

Zwraca 1 dla liczb Smitha i 0 w przeciwnym razie. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

tło

Æf(rozkład na czynniki pierwsze) i D(liczba całkowita na dziesiętną) są implementowane w taki sposób, że P(iloczyn) i (liczba dziesiętna na liczbę całkowitą) stanowią lewe odwrotności.

Dla liczb -4 do 4 , Æfzwraca następujący.

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

Numery -10, -1, -0,5, 0, 0,5, 1, 10 , Dzwraca następującą.

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

Jak to działa

Æ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
To naprawdę fajne rozwiązanie, muszę powiedzieć!
Emigna

@Emigna - To właśnie zrobiłem, ale zaimplementowałem w znacznie lepszy sposób: D
Jonathan Allan

@JonathanAllan Niestety nie mówię po galaretce, więc nie mam pojęcia, co robi Twój kod :)
Emigna

1
@Emigna - tak, planowałem opracować sposób gry w golfa przed dodaniem sekcji dotyczącej tego, jak to działa.
Jonathan Allan

9

Python 2, 122 115 110 106 bajtów

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

Zaoszczędzono 4 bajty dzięki Dennisowi

Wypróbuj na ideone.com

Wyjaśnienie

Odczytuje liczbę na stdin i wypisuje, Trueczy liczba jest liczbą Smitha, czy Falsenie.

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
Głosujący w dół - przydatne może być dodanie komentarza wyjaśniającego dlaczego
Jonathan Allan,

6
@JonathanAllan Opinia głosowa została automatycznie oddana przez użytkownika społeczności podczas edycji odpowiedzi. Uważam to za błąd .
Dennis

1
Ostatni wiersz można przepisać jako print n<m>s==sum(map(int,`m`)).
Dennis

@Dennis To świetne wykorzystanie porównania łańcuchowego!
LevitatingLion

8

Brachylog , 19 bajtów

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

Wypróbuj online!

Wyjaśnienie

@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 To robi . W Brachylog znakiem ujemnym dla liczb jest _(tak zwany niski minus ).
Fatalize

7

05AB1E , 11 17 bajtów

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

Wyjaśnienie

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

Wypróbuj online!


5

PowerShell v3 +, 183 bajty

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)

Brak wbudowanego sprawdzania liczby pierwszych. Brak wbudowanego faktoringu. Brak wbudowanej sumy cyfrowej. Wszystko wykonane ręcznie. :RE

Pobiera dane wejściowe $njako liczbę całkowitą, ustawia wartość $brówną pustej tablicy. Oto $bnasza kolekcja czynników głównych.

Dalej jest forpętla. Najpierw ustawiamy wartość $arówną naszej liczbie wejściowej, a warunek jest do momentu, gdy $abędzie mniejsza lub równa 1. Ta pętla znajdzie nasze czynniki pierwsze.

Pętlujemy od 2do $a, uses Where-Object( |?{...}), aby wyciągać liczby pierwsze, które są również czynnikami !($a%$_). Są one wprowadzane do wewnętrznej pętli, |%{...}która umieszcza czynnik $bi dzieli $a(w ten sposób ostatecznie dojdziemy 1).

Więc teraz mamy wszystkie nasze czynniki pierwsze $b. Czas sformułować naszą wartość logiczną. Musimy upewnić się, że $njest -notin $b, bo jeśli jest to znaczy, że $njest pierwsza, a więc nie jest liczbą Smith. Dodatkowo ( -and) musimy upewnić się, że nasze dwa zestawy cyfr-equal. Wynikowy boolean pozostaje w potoku, a dane wyjściowe są niejawne.

NB - Wymaga od -notinoperatora wersji 3 lub nowszej . Wciąż uruchamiam dane wejściowe dla 4937775(jest to powolne do obliczenia), więc zaktualizuję to, kiedy to się skończy. Po ponad 3 godzinach mam błąd przepełnienia stosu. Więc jest gdzieś górna granica. No cóż.

Działa to dla wejścia ujemnego, zera lub jednego, ponieważ prawa ręka -andeliminuje błąd, gdy próbuje obliczyć sumy cyfr (pokazane poniżej), co spowoduje, że ta połowa przejdzie do $falseoceny. Ponieważ STDERR jest domyślnie ignorowany , a prawidłowe dane wyjściowe są nadal wyświetlane, jest w porządku.


Przypadki testowe

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

Galaretka , 27 25 23 bajtów

(dalsza gra w golfa prawdopodobnie zdecydowanie możliwa)

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

Zwraca wartość 0False lub 1True

Wszystkie przypadki testowe w TryItOnline

W jaki sposób?

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

Właściwie 18 bajtów

Niestety, tak naprawdę nie ma wbudowanej faktoryzacji, która daje mnogość liczb pierwszych, więc musiałem zhakować jeden z nich razem. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!

;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 bajtów

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

Oktawa, 80 78 bajtów

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

Wyjaśnienie:

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

Wypróbuj online .


1
To any(t<0)dla nie-prymatu jest bardzo sprytne
Luis Mendo

2

Pyth, 21 bajtów

&&>Q1!P_QqsjQTssmjdTP

Program, który pobiera dane z liczby całkowitej i wypisuje je Truelub Falseodpowiednio.

Wypróbuj online

Jak to działa

&&>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 bajtów

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

Anonimowa funkcja zwracająca Bool.

  • Teraz wykonuje 100% ręczną faktoryzację i sprawdzanie pierwotności.
  • Zaoszczędzono niektóre bajty, testując zarówno „dane wejściowe> 1”, jak i „liczbę czynników> 1” z jednym połączeniem łańcuchowym, ponieważ m> Ω (m) .

( spróbuj online )

EDYCJA: -1 bajt dzięki b2gills


2..i-1jest lepiej napisany jako 2..^i.
Brad Gilbert b2gills

2

Java 7, 509 506 435 426 419 230 bajtów

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

Powinienem był wysłuchać komentarza @BasicallyAlanTuring .

To jedno z tych pytań, w których pomyślałem „Java + this = no”, ale głosowałem za tym pomysłem: P

Ach cóż ... Niektóre języki programowania używają jednego bajtu dla czynników pierwszych lub sprawdzania liczby pierwszych, ale Java z pewnością nie jest jednym z nich.

EDYCJA: Zmniejszono o połowę liczbę bajtów, kiedy miałem trochę czasu, aby o tym pomyśleć.

Niegolfowane (sortowanie ...) i przypadki testowe:

Wypróbuj tutaj.

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

Wydajność:

false
true
false
true
false
false
false
true

2

Brachylog (nowszy) , 11 bajtów

¬ṗ&ẹ+.&ḋcẹ+

Wypróbuj online!

Predykat kończy się powodzeniem, jeśli dane wejściowe są liczbą Smitha, a porażki, jeśli nie są.

               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 bajtów

Pm[`mbs(sQ[qRlt*

Wypróbuj tutaj!


1
Błędy bez wyniku dla danych wejściowych mniejsze niż2
Jonathan Allan

@JonathanAllan brak wyjścia na standardowe wyjście jest fałszem. Jeśli ostrzeżenia są wyłączone, stderr również jest ignorowany
Blue

Wiedziałem, że możemy zignorować stderr, ale żadne wyjście nie wydaje się trochę dziwne ... ale jeśli jest akceptowalne, jest akceptowalne.
Jonathan Allan

Osobiście nie jestem pewien, czy jest to do przyjęcia, ale mogę powiedzieć, że to prawda?
Blue

1

Perl 6 , 80 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który przyjmuje liczbę całkowitą i zwraca wartość logiczną.


1

APL (Dyalog Extended) , 36 29 bajtów SBCS

Ta odpowiedź zawdzięcza swoją golfową monadę Extended za zwracanie liczb pierwszych liczb, a to jest lepsze w konwersji bazowej niż w Unicode Dyalog.

Edycja: -7 bajtów dzięki dzaima.

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

Wypróbuj online!

Wyjaśnienie

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


1

C (gcc) , 139 136 bajtów

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

Wypróbuj online!

-3 bajty dzięki pułapce cat

Wyjaśnienie:

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

Wprowadziło to kilka błędów (np. 2 i 3), ale myślę, że nadal powinno być możliwe do osiągnięcia.
LambdaBeta

Zaproponuj t-h&&i==_zamiastt-h?i==_:0
ceilingcat

0

Rakieta 176 bajtów

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

Zwraca 1, jeśli prawda, i 0, jeśli fałsz:

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

Wersja szczegółowa:

(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

Rdza - 143 bajty

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

pożyczone rozwiązanie Pythona przez @levitatinglion ... przynajmniej jest to krótsze niż Java ...

degolfed na play.rust-lang.org


0

APL (NARS), 33 znaki, 66 bajtów

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

„π⍵” zwraca współczynniki listy ⍵, zakładając, że wejście jest jedną dodatnią liczbą całkowitą> = 1; test:

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

0

C (gcc), 177 bajtów

Definiuje funkcję, Qktóra zwraca 0 dla liczb Smitha i niezerową dla liczb Smitha

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

Wypróbuj online!

Wyjaśnienie:

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.