私は完璧ですか(数字)?


26

これが私の最初の挑戦です!

バックグラウンド

完全数は正の整数であり、それ自体を除くすべての約数の合計に等しくなります。
だから、6完璧な数があるため、あります1 + 2 + 3 = 6
一方、12そうではありません1 + 2 + 3 + 4 + 6 = 16 != 12

仕事

タスクは簡単です。プログラムを作成すると、n次のメッセージのいずれかが表示されます。

私は完璧な数でd1 + d2 + ... + dm = s == n
はありませんd1 + d2 + ... + dm = s [<>] n

どこ
d1, ... dmのすべての約数あるnため除きますn
sすべての約数の合計ですd1, ..., dm(これも、なしn)。(if )または(if )の
[<>]いずれかです。<s < n>s > n

nである6"1 + 2 + 3 = 6 == 6ので、私は、完全数午前"
の場合nであるが12、 "私は完全数ないです1 + 2 + 3 + 4 + 6 = 16> 12なぜなら、"
についてnビーイング13:「1 = 1 <13であるため、私は完全な数ではありません」

ルール

  • nあなたの言語の標準より大きくありませんint
  • n標準入力、コマンドライン引数、またはファイルから読み取ることができます。
  • 出力メッセージは標準出力に印刷する必要があり、追加の文字を出力に表示することはできません(末尾に空白または改行がある場合があります)
  • タスク(またはその主要部分)を解決する組み込み関数またはライブラリ関数を使用することはできません。いいえ、GetDivisors()またはそのようなもの。
  • 他のすべての標準的な抜け穴が適用されます。

勝者

これはので、バイト単位の最短コードが勝ちです!


@orlpそうではありませんが、チャレンジを編集しました。ありがとうございます。
ゼレゲス

7
なぜあなたは使用しない===同じ式で?それは意味がありません。d1 + d2 + ... + dm = s = nIMO である必要があります。
orlp

たとえば、入力6と12を使用して、入力と出力の例を示してください。
ズガルブ

14
@Zeregesそれは無意味です。何も割り当てられていません。比較のみ。
-orlp

1
@orlp意図されています。
ゼレゲス

回答:


4

Pyth、81バイト

jd[+WK-QsJf!%QTStQ"I am"" not""a perfect number, because"j" + "J\=sJ@c3"==<>"._KQ

オンラインで試す:デモンストレーションまたはテストスイート

説明:

                                 implicit: Q = input number
               StQ               the range of numbers [1, 2, ..., Q-1]
          f                      filter for numbers T, which satisfy:
           !%QT                     Q mod T != 0
         J                       save this list of divisors in J
      -QsJ                       difference between Q and sum of J
     K                           save the difference in K

jd[                              put all of the following items in a list
                                 and print them joined by spaces: 
                  "I am"           * "I am"
   +WK                  " not"       + "not" if K != 0
"a perfect number, because"        * "a perfect ..."
j" + "J                            * the divisors J joined by " + "
       \=                          * "="
         sJ                        * sum of J
            c3"==<>"               * split the string "==<>" in 3 pieces:
                                        ["==", "<", ">"]
           @        ._K              and take the (sign of K)th one (modulo 3)
                       Q           * Q

9

Java、255 270バイト(17を基点とするFF)

class C{public static void main(String[]a){int i=new Integer(a[0]),k=0,l=0;a[0]=" ";for(;++k<i;)if(i%k<1){l+=k;a[0]+=k+" ";}}System.out.print("I am "+(l==i?"":"not ")+"a perfect number, because "+a[0].trim().replace(" "," + ")+" = "+l+(l==i?" == ":l<i?" < ":" > ")+i);}}

より読みやすいバージョン:

class C {
    public static void main(String[] a) {
        int i = new Integer(a[0]), k = 0, l = 0;
        a[0] = " ";
        for(; ++k<i ;){
            if (i % k == 0) {
                l += k;
                a[0] += k + " ";
            }
        }
        System.out.print("I am " + (l == i ? "" : "not ") + "a perfect number, because " + a[0].trim().replace(" "," + ") + " = " + l + (l == i ? " == " : l < i ? " < " : " > ") + i);
    }
}

以前は奇数では機能しなかったため、いくつかの調整が必要でした。少なくとも、私は再びバイトカウントで幸運になりました。:)


l == iは255を超えますか?
ドワナ

遺跡は、あなたのバイト数場合、私は知っているが、あなたはその場所に「列B」と使用「B」と[0]の出現(4の)最後の3を交換することにより、文字を救うことができる
クレイグ

6

R、158の 163 157 153 143 141バイト

これはまだゴルフの余地があると思います。
編集:に置き換えられましif(b<n)'<'else if(b>n)'>'else'=='c('<'[b<n],'>'[b>n],'=='[b==n])paste(...)に置き換えられていますrbind(...)[-1]。@plannapusにさらに2バイトありがとう。

n=scan();a=2:n-1;b=sum(w<-a[!n%%a]);cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n)

非ゴルフ

n<-scan()             # get number from stdin
w<-which(!n%%1:(n-1)) # build vector of divisors
b=sum(w)              # sum divisors
cat('I am',           # output to STDOUT with a space separator
    'not'[b!=n],      # include not if b!=n
    'a perfect number, because',
    rbind('+',w)[-1], # create a matrix with the top row as '+', remove the first element of the vector
    '=',
    b,                # the summed value
    c(                # creates a vector that contains only the required symbol and ==
        '<'[b<n],     # include < if b<n
        '>'[b>n],     # include > if b>n
        '=='
    )[1],             # take the first element 
    n                 # the original number
)

試運転

> n=scan();b=sum(w<-which(!n%%1:(n-1)));cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n)
1: 6
2: 
Read 1 item
I am a perfect number, because 1 + 2 + 3 = 6 == 6
> n=scan();b=sum(w<-which(!n%%1:(n-1)));cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n)
1: 12
2: 
Read 1 item
I am not a perfect number, because 1 + 2 + 3 + 4 + 6 = 16 > 12
> n=scan();b=sum(w<-which(!n%%1:(n-1)));cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n)
1: 13
2: 
Read 1 item
I am not a perfect number, because 1 = 1 < 13
> 

+除数の間にサインインする必要があります。
ゼレゲス

@Zereges私はちょうどそれに気づいており、まもなく修正します
-MickyT

素晴らしいrbindトリックのために+1 !あなたが割り当てた場合は、2つの余分なバイトを保存することができます2:n-1変数に、言うawhich(!n%%1:(n-1)) これなりa[!n%%a]。(完全なコードはその後n=scan();a=2:n-1;b=sum(w<-a[!n%%a]);cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n)
プランナパス

@plannapusありがとう、私は本当に自分自身に満足していました。
MickyT

5

Python 2、183 173 170バイト

b=input();c=[i for i in range(1,b)if b%i<1];d=sum(c);print'I am %sa perfect number because %s = %d %s %d'%('not '*(d!=b),' + '.join(map(str,c)),d,'=<>='[cmp(b,d)%3::3],b)

例:

$ python perfect_number.py <<< 6
I am a perfect number because 1 + 2 + 3 = 6 == 6
$ python perfect_number.py <<< 12
I am not a perfect number because 1 + 2 + 3 + 4 + 6 = 16 > 12
$ python perfect_number.py <<< 13
I am not a perfect number because 1 = 1 < 13
$ python perfect_number.py <<< 100
I am not a perfect number because 1 + 2 + 4 + 5 + 10 + 20 + 25 + 50 = 117 > 100
$ python perfect_number.py <<< 8128
I am a perfect number because 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064 = 8128 == 8128

13バイトを節約してくれたxnorに感謝します!


4
'=<>'[cmp(b,d)]-革命に参加しましょう!
orlp

素晴らしい、ありがとう!ああ、待って... :)
Celeo

1
@Celeo同様のソリューションを思いついた。のb%i<1ために書くことができますb%i==0['not ',''][int(d==b)]あなたは必要ありませんintPythonは自動的に変換されますので、。さらに、文字列mulitplicationを使用できます"not "*(d!=b)
xnor

@xnor提案ありがとう!
Celeo

1
@Celeo orlpの提案は、として機能するように調整でき"=<>="[cmp(b,d)%3::3]ます。
xnor

4

ジュリア、161 157バイト

n=int(ARGS[1])
d=filter(i->n%i<1,1:n-1)
s=sum(d)
print("I am ",s!=n?"not ":"","a perfect number, because ",join(d," + ")," = $s ",s<n?"<":s>n?">":"=="," $n")

ゴルフをしていない:

# Read n as the first command line argument
n = int(ARGS[1])

# Get the divisors of n and their sum
d = filter(i -> n % i == 0, 1:n-1)
s = sum(d)

# Print to STDOUT
print("I am ",
      s != n ? "not " : "",
      "a perfect number, because ",
      join(d, " + "),
      " = $s ",
      s < n ? "<" : s > n ? ">" : "==",
      " $n")

4

CJam、90バイト

"I am"rd:R{R\%!},:D:+R-g:Cz" not"*" a perfect number, because "D'+*'=+D:++'=C+_'=a&+a+R+S*

比較のために、単一の印刷=は83バイトで実現できます。

CJamインタープリターでオンラインで試してください。

使い方

"I am"  e# Push that string.
rd:R    e# Read a Double from STDIN and save it in R.
{       e# Filter; for each I in [0 ... R-1]:
  R\%!  e# Push the logical NOT of (R % I).
},      e# Keep the elements such that R % I == 0.
:D      e# Save the array of divisors in D.
:+R-g   e# Add the divisors, subtract R and compute the sign of the difference.
:Cz     e# Save the sign in C and apply absolute value.
"not "* e# Repeat the string "not " that many times.

" a perfect number, because "

D'+*    e# Join the divisors, separating by plus signs.
'=+D:++ e# Append a '=' and the sum of the divisors.
'=C+    e# Add the sign to '=', pushing '<', '=' or '>'.
_'=a&   e# Intersect a copy with ['='].
+a+     e# Concatenate, wrap in array and concatenate.
        e# This appends "<", "==" or ">".
R+      e# Append the input number.
S*      e# Join, separating by spaces.

2

Perl、148バイト

$a=<>;$_=join' + ',grep{$a%$_==0}1..$a-1;$s=eval;print"I am ".($s==$a?'':'not ')."a perfect number because $_ = $s ".(('==','>','<')[$s<=>$a])." $a"

改行あり:

$a=<>;
$_=join' + ',grep{$a%$_==0}1..$a-1;
$s=eval;
print"I am ".($s==$a?'':'not ')."a perfect number because $_ = $s ".(('==','>','<')[$s<=>$a])." $a"

私はこれを突破しましたが、'not 'and '==','>','<'ステートメントの周りの外側の括弧を削除してから.に切り替えることで10バイトを節約できます,printリストを作成するときに何も追加されないため)。また、括弧の中に、彼らが使用している最初の時間をあなたの割り当てを移動するカップルを保存し、あなたがわずかにロジックを変更した場合grep$a%_<1,1..($a=<>)-1$a!=($s=eval)&&'not '、あなたは、いくつかのより多くをオフに剃る必要があります!すべてが理にかなっていることを願っています!
ドムヘイスティングス

2

Lua、244 231バイト

ゴルフ:

n=io.read("*n")d={}s="1"t=1 for i=2,n-1 do if n%i==0 then table.insert(d,i)s=s.." + "..i t=t+i end end print(("I am%s a perfect number, because %s = %s"):format(t==n and""or" not", s, t..(t==n and" == "or(t>n and" > "or" < "))..n))

ゴルフをしていない:

n=io.read("*n")
divisors={}
sequence="1"
sum=1
for i=2,n-1 do
    if n%i==0 then 
        table.insert(divisors,i)
        sequence=sequence.." + "..i
        sum=sum+i
    end
end

print(("I am%s a perfect number, because %s = %s"):format(sum==n and""or" not", sequence, sum..(sum==n and" == "or(sum>n and" > "or" < "))..n))

2

JavaScript(ES6)、146

テンプレート文字列を使用して、Firefoxと最新のChromeで動作します。

for(n=prompt(),o=t=i=1;++i<n;)n%i||(t+=i,o+=' + '+i)
alert(`I am ${t-n?'not ':''}a perfect number because ${o} = ${t} ${t<n?'<':t>n?'>':'=='} `+n)


2

ルビー、174 160 155 136 134 128 122のバイト

n=6;a=[*1...n].reject{|t|n%t>0};b=a.inject(:+)<=>n;print"I am#{" not"*b.abs} a perfect number, because ",a*?+,"<=>"[b+1],n

別の6バイトを保存しました:)

Rubyでのゴルフのヒントに感謝


印刷コマンドはまだ私を悩ます..そして、if-statementの三項を短縮する方法を見つけ出す必要がありますか?私は提供できないelse節を必要とし、唯一のケースごとに1つのコール受け入れ
ユーリKazakov

唯一の印刷物が残っています:)
ユーリカザコフ

1

C#、252バイト

class A{static void Main(string[]a){int i=int.Parse(a[0]);var j=Enumerable.Range(1,i-1).Where(o=>i%o==0);int k=j.Sum();Console.Write("I am "+(i!=k?"not ":"")+"a perfect number, because "+string.Join(" + ",j)+" = "+k+(k>i?" > ":k<i?" < ":" == ")+i);}}

1

ハッシウム、285バイト

免責事項:コマンドライン引数の問題により、Hassiumの最新バージョンのみで動作します。

func main(){n=Convert.toNumber(args[0]);s=1;l="1";foreach(x in range(2,n-3)){if(n%x==0){l+=" + "+x;s+=x;}}if(s==n)println("I am a perfect number, because "+l+" = "+s+" == "+s);else {print("I am not a perfect number, because "+l+" = "+s);if(s>n)println(" > "+n);else println(" < "+n);}}

より読みやすいバージョン:

func main() {
    n = Convert.toNumber(args[0]);
    s = 1;
    l = "1";
    foreach(x in range(2, n - 3)) {
            if (n % x== 0) {
                    l += " + " + x;
                    s += x;
            }
    }
    if (s == n)
            println("I am a perfect number, because " + l + " = " + s + " == " + s);
    else {
            print("I am not a perfect number, because " + l + " = " + s);
            if (s > n)
                    println(" > " + n);
            else
                    println(" < " + n);
    }

}


1
1.コマンドラインの引数を読むようにHassiumを説得することはできないようです。私が実行すればmono src/Hassium/bin/Debug/Hassium.exe t.hs 6、それは言いSystem.ArgumentException: The file 6 does not exist.ます。2.これは、このチャレンジが投稿される前の最後のコミットであるこのバージョンでは機能しません。提出物が競合していないことを示す免責事項を回答に追加してください。
デニス

Windows(MVS2015を使用して構築)で試してみましたが、同じエラーが発生しました。
ゼレゲス

これは、文字通り15分前に更新された問題です。Hassiumを複製し、再度コンパイルします。まったく同じ問題に遭遇したため、非常に申し訳ありません。
ジェイコブミシリアン

1
最新バージョンでも問題なく動作します。免責事項を追加することができれば、私のダウン投票を削除させていただきます。(ちなみに、@Dennisコメントに追加することで私にpingを送信できます。そうしないと、返信が通知されません。)
デニス

@デニス私はそれを追加しました。あなたの通知をありがとう:)
ジェイコブミシリアン

1

MATLAB、238

すべての言語の中で最短になることはありませんが、MATLABでの私の試みは次のとおりです。

n=input('');x=1:n-1;f=x(~rem(n,x));s=sum(f);a='not ';b=strjoin(strtrim(cellstr(num2str(f')))',' + ');if(s>n) c=' > ';elseif(s<n) c=' < ';else c=' == ';a='';end;disp(['I am ' a 'a perfect number, because ' b ' = ' num2str(s) c num2str(n)])

そして、これはもう少し読みやすい形式です:

n=input();      %Read in the number using the input() function
x=1:n-1;        %All integers from 1 to n-1
f=x(~rem(n,x)); %Determine which of those numbers are divisors
s=sum(f);       %Sum all the divisors
a='not ';       %We start by assuming it is not perfect (to save some bytes)
b=strjoin(strtrim(cellstr(num2str(f')))',' + '); %Also convert the list of divisors into a string 
                                                 %where they are all separated by ' + ' signs.
%Next check if the number is >, < or == to the sum of its divisors
if(s>n)  
    c=' > ';    %If greater than, we add a ' > ' to the output string
elseif(s<n) 
    c=' < ';    %If less than, we add a ' < ' to the output string
else
    c=' == ';   %If equal, we add a ' == ' to the output string
    a='';       %If it is equal, then it is a perfect number, so clear the 'not' string
end

%Finally concatenate the output string and display the result
disp(['I am ' a 'a perfect number, because ' b ' = ' num2str(s) c num2str(n)])

関数を使用しないことで、さらに2バイトを節約できました。代わりに、コード行を実行し、入力として番号を要求します。実行すると、最後に出力が表示されます。


1

Perl 6、138バイト

$_=get;
my$c=$_ <=>my$s=[+] my@d=grep $_%%*,^$_;
say "I am {
    'not 'x?$c
  }a perfect number, because {
    join ' + ',@d
  } = $s {
    «> == <»[1+$c]
  } $_"

(カウントは、改行とインデントを無視します。これらは必要ないからです)

@d除数を保持する配列です。
$s除数の合計を保持します。
$c入力と除数の合計との間の比較の値です。
(効果$cの一つです-101、本当にの一つでありOrder::LessOrder::SameまたはOrder::More

では'not 'x?$c?$cこの場合には効果的と同じでabs $cあり、x文字列繰り返し演算子です。

«> == <»はの略です( '>', '==', '<' )
$cいずれかを持っているので-1,0,1、それを使用してリストにインデックスを付けることができるように、1つ上にシフトする必要があります。

技術的には、これは2⁶⁴をはるかに超える数で機能しますが、2¹⁶を超える数では並外れた時間がかかります。


0

Pyth、84バイト

jd+,+"I am"*.aK._-QsJf!%QTtUQ" not""a perfect number, because"+.iJm\+tJ[\=sJ@"=<>"KQ

無効な答えです、私は同じ方程式で実装することを拒否している=から==です。


2
「同じ方程式で=および==を実装する」ことを拒否した場合は+1。
-theonlygusti

0

ルビー、164バイト

->i{t=(1...i).select{|j|i%j==0};s=t.inject &:+;r=['==','>','<'][s<=>i];puts "I am #{'not ' if r!='=='}a perfect number, because #{t.join(' + ')} = #{s} #{r} #{i}"}

テスト

irb(main):185:0> ->i{t=(1...i).select{|j|i%j==0};s=t.inject &:+;r=['==','>','<'][s<=>i];puts "I am #{'not ' if r!='=='}a perfect number, because #{t.join(' + ')} = #{s} #{r} #{i}"}.call 6
I am a perfect number, because 1 + 2 + 3 = 6 == 6

irb(main):186:0> ->i{t=(1...i).select{|j|i%j==0};s=t.inject &:+;r=['==','>','<'][s<=>i];puts "I am #{'not ' if r!='=='}a perfect number, because #{t.join(' + ')} = #{s} #{r} #{i}"}.call 12
I am not a perfect number, because 1 + 2 + 3 + 4 + 6 = 16 > 12

irb(main):187:0> ->i{t=(1...i).select{|j|i%j==0};s=t.inject &:+;r=['==','>','<'][s<=>i];puts "I am #{'not ' if r!='=='}a perfect number, because #{t.join(' + ')} = #{s} #{r} #{i}"}.call 13
I am not a perfect number, because 1 = 1 < 13

0

Emacs Lisp、302バイト

(defun p(n)(let((l(remove-if-not'(lambda(x)(=(% n x)0))(number-sequence 1(- n 1)))))(setf s(apply'+ l))(format"I am%s a perfect number, because %s%s = %s %s %s"(if(= s n)""" not")(car l)(apply#'concat(mapcar'(lambda(x)(concat" + "(number-to-string x)))(cdr l)))s(if(= sum n)"=="(if(> sum n)">""<"))n)))

ゴルフされていないバージョン:

(defun perfect (n)
  (let ((l (remove-if-not '(lambda (x) (= (% n x) 0))
              (number-sequence 1 (- n 1)))))
    (setf sum (apply '+ l))
    (format "I am%s a perfect number, because %s%s = %s %s %s" (if (= sum n)"" " not") (car l)
        (apply #'concat (mapcar '(lambda (x) (concat " + " (number-to-string x))) (cdr l)))
        sum (if(= sum n)
            "=="
          (if(> sum n)
              ">"
            "<"))
        n)))

0

Powershell、164バイト

$a=$args[0]
$b=(1..($a-1)|?{!($a%$_)})-join" + "
$c=iex $b
$d=$a.compareto($c)
"I am $("not "*!!$d)a perfect number, because $b = $c $(("==","<",">")[$d]) $a"

一般的なPoSトリックとそれほど一般的ではないPoShトリックのいくつか。

  • 合計を作成し、iexで評価します
  • gt、lt、eq配列のインデックスと比較
  • !! $ dは、$ d = 1または-1の場合はtrue == 1、$ d = 0の場合はfalse == 0と評価されます。

0

awk、150

n=$0{for(p=i=s=n>1;++i<n;)for(;n%i<1;p+=i++)s=s" + "i;printf"I am%s a perfect number, because "s" = "p" %s "n RS,(k=p==n)?_:" not",k?"==":p<n?"<":">"}

これを入力に対して正しいものにするためにいくつかのバイトを浪費しました1。それが予想されるかどうかはわかりません。

n=$0{
    for(p=i=s=n>1;++i<n;)
        for(;n%i<1;p+=i++)s=s" + "i;
    printf "I am%s a perfect number, because "s" = "p" %s "n RS,
           (k=p==n)?_:" not",k?"==":p<n?"<":">"
}

0

05AB1E、58 バイト

„I€ÜIѨ©OIÊi'€–}“€…íÀ‚³,ƒ«“®vy'+}\'=®ODI.S"==><"211S£sèIðý

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

Iۆ              # Push dictionary string "I am"
IѨ               # Push the divisors of the input-integer, with itself removed
   ©              # Store it in the register (without popping)
    O             # Get the sum of these divisors
     IÊi   }      # If it's not equal to the input-integer:
        '€–      '#  Push dictionary string "not"
“€…íÀ‚³,ƒ«“       # Push dictionary string "a perfect number, because"
®v   }            # Loop `y` over the divisors:
  y'+            '#  Push the divisor `y`, and the string "+" to the stack
      \           # Discard the final "+"
       '=        '# And push the string "="
®O                # Get the sum of the divisors again
  D               # Duplicate it
I.S               # Compare it to the input-integer (-1 if smaller; 0 if equal; 1 if larger)
   "==><"         # Push string "==><"
         211S£    # Split into parts of size [2,1,1]: ["==",">","<"]
              sè  # Index into it (where the -1 will wrap around to the last item)
I                 # Push the input-integer again
ðý                # Join everything on the stack by spaces
                  # (and output the result implicitly)

(セクション鉱山のこの05AB1Eチップを参照してください。辞書を使用する方法?理由を理解すること„I€Ü"I am"'€–ある"not"、と“€…íÀ‚³,ƒ«“あります"a perfect number, because"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.