นี่เป็นเลข Smith หรือไม่?


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คุณสามารถใช้ค่าความจริงและเท็จใด ๆ ตราบใดที่มันชัดเจนว่าพวกเขาคืออะไร
  • นี่เป็นความท้าทายของนักดังนั้นให้เขียนรหัสของคุณให้สั้นที่สุด!

6
ฉันต้องอ่านสิ่งนี้: "ผลรวมของตัวเลขเท่ากับผลรวมจำนวนหลักของปัจจัยหลัก"สองสามครั้ง: P
Stewie Griffin

@StewieGriffin: ใช่มันเป็นประโยคที่ค่อนข้างซับซ้อน แต่ฉันรู้สึกเหมือนฉันต้องการที่จะให้คำนิยามที่เหมาะสมแทนการอาศัยเพียงตัวอย่าง :)
shooqie

2
นี่เป็นหนึ่งในคำถามเหล่านั้นที่ฉันคิดว่า "Java + this = no" ฉัน upvoted สำหรับความคิดแม้ว่า: P
Shaun Wild

3
บางครั้งฉันสังเกตเห็นรูปแบบในจำนวนผลรวมของตัวเลขเป็นต้น แต่จริงๆแล้วคนสังเกตเห็นสิ่งต่าง ๆ เช่นนี้: "Albert Wilansky ประกาศเกียรติคุณจำนวน Smith เมื่อเขาสังเกตเห็นการกำหนดคุณสมบัติในหมายเลขโทรศัพท์ของพี่สะใภ้ของเขา" ?
Stewie Griffin

1
@StewieGriffin: ใช่มันเหมือน Ramanujan และ 1729 ก็ทำให้ฉันงุนงงเช่นกัน
shooqie

คำตอบ:


9

เจลลี่ , 12 11 ไบต์

Æfḟȯ.DFżDSE

ส่งคืน1สำหรับตัวเลข Smith และ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

@Emigna - เป็นสิ่งที่ฉันทำ แต่นำไปใช้ในรูปแบบที่เหนือกว่า: D
Jonathan Allan

@JonathanAllan แต่น่าเสียดายที่ผมไม่ได้พูด Jelly ดังนั้นผมจึงมีความคิดว่ารหัสของคุณไม่ :)
Emigna

1
@Emigna - ใช่ฉันได้วางแผนที่จะหาวิธีตีกอล์ฟลงก่อนที่จะเพิ่มส่วนของวิธีการทำงาน
Jonathan Allan

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ถ้าตัวเลขเป็นตัวเลข Smith หรือ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)

1
ผู้มีสิทธิเลือกตั้งลงไป - อาจเป็นประโยชน์ในการเพิ่มความคิดเห็นเพื่ออธิบายว่าทำไม
Jonathan Allan

6
@JonathanAllan ผู้ใช้ชุมชนลงคะแนนโดยอัตโนมัติเมื่อคำตอบถูกแก้ไข ผมคิดว่านี่เป็นข้อผิดพลาด
Dennis

1
print n<m>s==sum(map(int,`m`))บรรทัดสุดท้ายสามารถเขียนเป็น
เดนนิส

@Dennis นั่นเป็นการใช้การเปรียบเทียบที่ถูกผูกมัด!
LevitatingLion

8

Brachylogขนาด 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.

2
@JonathanAllan มันไม่ ใน Brachylog เครื่องหมายลบสำหรับตัวเลขคือ_(เรียกว่าเครื่องหมายลบต่ำ )
ทำให้เสียชีวิต


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) เราต้องตรวจสอบให้แน่ใจว่าผลรวมหลักสองชุดของเราเป็น-equal บูลีนผลลัพธ์จะถูกทิ้งไว้บนไพพ์ไลน์และเอาต์พุตจะเป็นนัย

NB - ต้องการ v3 หรือใหม่กว่าสำหรับ-notinโอเปอเรเตอร์ ฉันยังคงใช้อินพุตสำหรับ4937775( การคำนวณช้า ) ดังนั้นฉันจะอัปเดตเมื่อเสร็จแล้ว หลังจาก 3+ ชั่วโมงฉันได้รับข้อผิดพลาดของ stackoverflow ดังนั้นจึงมีขอบเขตบนบางแห่ง โอ้ดี

สิ่งนี้จะใช้งานได้กับอินพุตเชิงลบศูนย์หรือหนึ่งเนื่องจากทางด้านขวาของ-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

3

MATL, 17 ไบต์

YftV!UsGV!Us=wnqh

เอาท์พุทอาเรย์ความจริงหรือเท็จที่เอาท์พุทความจริงต้องการให้องค์ประกอบทั้งหมดจะไม่เป็นศูนย์

ลองออนไลน์


@JanathanAllan ใช่ ฉันกำลังเพิ่มเล็กน้อยเกี่ยวกับคำจำกัดความของความจริงและความเท็จ
Suever

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.


2

อ็อกเทฟ80 80ไบต์

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)ไม่ใช่ primality เป็นคนฉลาดมาก
หลุยส์ Mendo

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

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% และการตรวจสอบเบื้องต้น
  • ที่บันทึกไว้ไบต์บางส่วนโดยการทดสอบทั้ง "input> 1" และ "จำนวนของปัจจัย> 1" มีการเปรียบเทียบถูกล่ามโซ่หนึ่งเนื่องจากม> Ω (เมตร)

( ลองออนไลน์ )

แก้ไข: -1 ไบต์ขอบคุณ b2gills


2..i-12..^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" ฉัน upvoted สำหรับความคิดว่า: P

อ่า .. ภาษาการเขียนโปรแกรมบางภาษาใช้ไบต์เดียวสำหรับไพรม์แฟคเตอร์หรือไพร์ม - เช็ค แต่จาวานั้นไม่ใช่หนึ่งในนั้น

แก้ไข: ลดจำนวนไบต์ในขณะนี้ที่ฉันมีเวลาคิด

Ungolfed (sort-off .. ) & กรณีทดสอบ:

ลองที่นี่

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ẹ+

ลองออนไลน์!

เพรดิเคตสำเร็จถ้าอินพุตเป็นหมายเลข Smith และล้มเหลวหากไม่ใช่

               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 ไบต์

Pm[`mbs(sQ[qRlt*

ลองที่นี่!


1
ข้อผิดพลาดที่ไม่มีผลลัพธ์สำหรับอินพุตน้อยกว่า2
Jonathan Allan

@JanathanAllan ไม่มีผลลัพธ์ที่ stdout ผิดพลาด หากคำเตือนถูกปิดใช้งาน stderr ก็จะถูกละเว้นเช่นกัน
Blue

ฉันรู้ว่าเราสามารถเพิกเฉย stderr ได้ แต่ไม่มีการแสดงผลใด ๆ ที่ดูแปลก ๆ แต่ถ้าเป็นที่ยอมรับก็ยอมรับได้
Jonathan Allan

โดยส่วนตัวแล้วฉันไม่แน่ใจว่ามันเป็นที่ยอมรับหรือไม่ แต่ฉันสามารถพูดได้ว่าใช่ไหม
Blue


1

APL (Dyalog Extended) , 36 29 ไบต์ SBCS

คำตอบนี้เป็นผลมาจากความสามารถในการเล่นกอล์ฟของMonad ของ Extended เพื่อคืนปัจจัยสำคัญของตัวเลขเป็นการดีกว่าในการแปลงฐานกว่าใน 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.

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


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

ที่แนะนำข้อบกพร่องบางอย่าง (เช่น 2 และ 3) แต่ฉันคิดว่ามันควรจะยังคงทำได้
LambdaBeta

แนะนำt-h&&i==_แทนt-h?i==_:0
ceilingcat

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


0

APL (NARS), 33 ถ่าน, 66 ไบต์

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

"π⍵" ปัจจัยรายการส่งคืนของ⍵สมมติว่าอินพุตเป็นจำนวนเต็มบวกหนึ่งตัว> = 1; ทดสอบ:

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

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.