Это номер Смита?

28

Описание задачи

Число Смит является композитом числа, сумма цифр равна сумме сумм цифр его простых множителей. Учитывая целое число N, определите, является ли это число Смита или нет.

Первые несколько номеров Смита являются 4, 22, 27, 58, 85, 94, 121, 166, 202, 265, 274, 319, 346, 355, 378, 382, 391, 438(последовательность A006753 в OEIS).

Пример ввода / вывода

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

Заметки

  • Ваш код может быть функцией (методом) или полноценной рабочей программой,
  • Вместо таких слов, как Trueи False, вы можете использовать любые истинные и ложные значения, если ясно, что они есть,
  • Это задача , поэтому сделайте ваш код как можно короче!
shooqie
источник
6
Я должен был прочитать это: «сумма цифр равна сумме цифр ее основных факторов» несколько раз: P
Стьюи Гриффин
@StewieGriffin: Да, это довольно сложное предложение, но я чувствовал, что мне нужно дать правильное определение, а не полагаться исключительно на примеры :)
shooqie
2
Это один из тех вопросов, где я подумал: «Ява + это = нет», но за эту идею я проголосовал: P
Shaun Wild
3
Я иногда замечаю закономерности в числах, сумме цифр и т. Д., Но действительно ли люди замечают такие вещи: «Альберт Вилански придумал термин« число Смита », когда заметил определяющее свойство в номере телефона своего зятя» ?
Стьюи Гриффин
1
@StewieGriffin: Да, это как Рамануджан и 1729, всегда меня сбивало с толку.
Shooqie

Ответы:

9

Желе , 12 11 байт

Æfḟȯ.DFżDSE

Возвращает 1 для чисел Смита и 0 в противном случае. Попробуйте онлайн! или проверьте все контрольные примеры .

Задний план

Æf(простая факторизация) и D(целое-десятичное) реализованы так, что P(произведение) и (десятичное-целое) составляют левые инверсии.

Для целых чисел -4 до 4 , Æfвозвращает следующее.

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

Для чисел -10, -1, -0.5, 0, 0,5, 1, 10 , Dвозвращает следующее.

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

Как это работает

Æ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
Это действительно крутое решение, которое я должен сказать!
Эминья
@Emigna - это то, что я сделал, но реализовал в гораздо превосходящей манере: D
Джонатан Аллан
@JonathanAllan К сожалению, я не говорю на желе, поэтому понятия не имею, что делает ваш код :)
Emigna
1
@Emigna - да, я планировал выяснить, как играть в гольф, прежде чем добавить раздел, как это работает.
Джонатан Аллан
9

Python 2, 122 115 110 106 байт

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

Сохранено 4 байта благодаря Денису

Попробуйте это на ideone.com

объяснение

Считывает число в stdin и выводит, является Trueли число Смитом или Falseнет.

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)
LevitatingLion
источник
1
Вниз избиратель - может быть полезно добавить комментарий, чтобы объяснить, почему
Джонатан Аллан
6
@JonathanAllan Падение было автоматически подано пользователем Сообщества, когда ответ был отредактирован. Я считаю это ошибкой .
Деннис
1
Последняя строка может быть переписана как print n<m>s==sum(map(int,`m`)).
Деннис
@Dennis Это отличное использование цепного сравнения!
Левитация
8

Брахилог , 19 байт

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

Попробуйте онлайн!

объяснение

@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.
Fatalize
источник
2
@JonathanAllan Это так . В Brachylog отрицательный знак для чисел _(так называемый низкий минус ).
Fatalize
7

05AB1E , 11 17 байт

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

объяснение

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

Попробуйте онлайн!

Emigna
источник
5

PowerShell v3 +, 183 байта

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)

Нет встроенной первичной проверки. Нет встроенного факторинга. Нет встроенной цифры-суммы. Все сделано вручную. : D

Принимает ввод $nкак целое число, устанавливает $bравным пустому массиву. Вот $bнаша коллекция основных факторов.

Далее идет forцикл. Сначала мы устанавливаем $aравным нашему входному номеру, а условным является до тех пор, пока $aон меньше или равен 1. Этот цикл будет искать наши основные факторы.

Цикл от 2до $a, использует Where-Object( |?{...}) для извлечения простых чисел , которые также являются факторами !($a%$_). Они вводятся во внутренний цикл, |%{...}который помещает фактор в $bделитель и делит его $a(таким образом, мы в конечном итоге доберемся до 1).

Итак, теперь у нас есть все наши главные факторы $b. Время сформулировать наш логический результат. Нам нужно убедиться, что $nэто так -notin $b, потому что, если это так, это означает, что $nэто простое число, и это не число Смита. Кроме того, ( -and) нам нужно убедиться, что наши два набора цифр являются -eqдействительными. Полученное логическое значение остается в конвейере, а вывод неявным.

NB - Требуется v3 или новее для -notinоператора. Я все еще использую ввод для 4937775(это медленно для вычисления), поэтому я обновлю это, когда это закончится. Через 3+ часа я получил ошибку переполнения стека. Итак, где-то есть верхняя граница. Ну что ж.

Это будет работать для отрицательного ввода, нуля или единицы, потому что правая часть функции -andбудет отображать ошибку, пока она пытается вычислить суммы цифр (показано ниже), что приведет к тому, что эта половина перейдет $falseпри оценке. Поскольку STDERR по умолчанию игнорируется , и правильный вывод по-прежнему отображается, это нормально.


Контрольные примеры

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
AdmBorkBork
источник
3

Желе , 27 25 23 байта

(дальнейшая игра в гольф, вероятно, определенно возможна)

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

Возвращает 0за ложь или 1за истину

Все тестовые случаи в TryItOnline

Как?

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

На самом деле, 18 байт

К сожалению, на самом деле нет встроенной факторизации, которая дает множителям число главных факторов, поэтому мне пришлось взломать их вместе. Предложения по игре в гольф приветствуются. Попробуйте онлайн!

;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.
Sherlock9
источник
3

Haskell, 120 105 байтов

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
Damien
источник
2

Октава, 80 78 байт

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

Объяснение:

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

Попробуйте онлайн .

Стьюи Гриффин
источник
1
Это any(t<0)для не-первичности очень умно
Луис Мендо
2

Pyth, 21 байт

&&>Q1!P_QqsjQTssmjdTP

Программа, которая принимает ввод целого числа и печатает Trueили Falseкак релевантный.

Попробуйте онлайн

Как это работает

&&>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
TheBikingViking
источник
2

Perl 6 , 92 88 87 байт

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

  • В настоящее время выполняется 100% ручная факторизация и проверка простоты.
  • Сохраненный несколько байт путем тестирования как «вход> 1» и «число факторов> 1» с одной цепью , сравнения, так как т> Ω (м) .

( попробуйте онлайн )

РЕДАКТИРОВАТЬ: -1 байт благодаря b2gills

SMLS
источник
2..i-1лучше пишется как 2..^i.
Брэд Гилберт b2gills
2

Java 7, 509 506 435 426 419 230 байт

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

Это один из тех вопросов, где я подумал: «Java + this = no», но за эту идею я проголосовал: P

Ах, хорошо .. Некоторые языки программирования используют один байт для простых факторов или простых проверок, но Java, безусловно, не является одним из них.

РЕДАКТИРОВАТЬ: вдвое количество байтов теперь, когда у меня было время подумать об этом.

Ungolfed (сортировка ..) и контрольные примеры:

Попробуй это здесь.

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

Выход:

false
true
false
true
false
false
false
true
Кевин Круйссен
источник
2

Brachylog (новее) , 11 байт

¬ṗ&ẹ+.&ḋcẹ+

Попробуйте онлайн!

Предикат завершается успешно, если ввод представляет собой число Смита, и завершается ошибкой, если это не так.

               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

Пайк, 16 байт

Pm[`mbs(sQ[qRlt*

Попробуй это здесь!

синий
источник
1
Ошибки без результата для ввода меньше2
Джонатан Аллан
@JonathanAllan не вывод на стандартный вывод является ложным. Если предупреждения отключены, stderr тоже игнорируется
Blue
Я знал, что мы можем игнорировать stderr, но никакой вывод не кажется немного странным ... но если это приемлемо, то это приемлемо.
Джонатан Аллан
Лично я не уверен, что это приемлемо, но я могу сказать, что это правильно?
Blue
1

Perl 6 , 80 байт

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

Попробуйте онлайн!

Блок анонимного кода, который принимает целое число и возвращает логическое значение.

Джо Кинг
источник
1

APL (Dyalog Extended) , 36 29 байт SBCS

Этот ответ обязан своей игривости монаде Расширенного за возврат основных множителей числа, и это лучше при конвертации базы, чем в Dyalog Unicode.

Редактировать: -7 байт благодаря dzaima.

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

Попробуйте онлайн!

объяснение

{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.
Sherlock9
источник
29 байт -{2>⍵:0⋄(⊃=+/-⊃×2<≢)+⌿10⊤⍵,⍭⍵}
Дзайма
1

C (gcc) , 139 136 байт

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

Попробуйте онлайн!

-3 байта благодаря потолку

Объяснение:

/* 
 * 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 == _ */
    }                                           /* ; */
}                                               /* } */
LambdaBeta
источник
Это внесло несколько ошибок (например, 2 и 3), но я думаю, что это все еще должно быть достижимо.
LambdaBeta
Предлагаю t-h&&i==_вместоt-h?i==_:0
потолок кошка
0

Ракетка 176 байт

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

Возвращает 1, если истина, и 0, если ложь:

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

Подробная версия:

(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))
rnso
источник
0

Ржавчина - 143 байта

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

заимствованное решение Python @levitatinglion ... по крайней мере, это короче, чем Java ...

дегольфед на play.rust-lang.org

не яркий
источник
0

APL (NARS), 33 символа, 66 байтов

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

«π⍵» возвращает список факторов factors, предположим, что входное значение - одно положительное целое число> = 1; тест:

  h←{1≥≢k←π⍵:0⋄s←{+/⍎¨⍕⍵}⋄(s⍵)=+/s¨k}
  (h¨1..100)/1..100
4 22 27 58 85 94 
RosLuP
источник
0

C (gcc), 177 байт

Определяет функцию, Qкоторая возвращает 0 для чисел кузнеца и ненулевое значение для чисел не кузнеца

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

Попробуйте онлайн!

Объяснение:

// 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;
}
Bolce Bussiere
источник
153 байта
ceilingcat