ナルシシズムの数をテストする


53

A ナルシシスト数は、独自の数字の和である数は、それぞれの桁数の累乗です。

たとえば、153(3桁)を使用します。

1 3 + 5 3 + 3 3 = 1 + 125 + 27 = 153

1634:

1 4 + 6 4 + 3 4 + 4 4 = 1 + 1296 + 81 + 256 = 1634

挑戦:

コードはユーザーからの入力を受け取り、指定された番号がナルシスティックな番号であるかどうかに応じてTrueまたはFalseを出力する必要があります。

テキスト文字列またはその他の無効な入力のエラーチェックは不要です。出力には1または0を使用できます。ナルシスティックな数字のリストを単に生成するコード、またはリストに対してユーザー入力をチェックするコードは、資格がありません。

OEIS A005188


3
Trueそのような数値であれば出力しても問題ありませんが、そうでない場合は他の何か(この場合は数値自体)を出力できますか?
-devRicher

回答:


39

APL(15)

∆≡⍕+/(⍎¨∆)*⍴∆←⍞

1trueおよび0falseの場合に出力します。

説明:

  • ∆←⍞:(文字として)行を読み取り、保存する
  • (⍎¨∆)*⍴∆:で各文字を評価し、それを累乗します⍴∆
  • ∆≡⍕+/:入力がこれらの合計の文字列表現に等しいかどうかを確認します

9
私はちょうど何を読んでなかった
Jbwilliams1

4
@LagWagon神の言葉
14

21

GolfScript、16文字

~.`:s{48-s,?-}/!

入力はSTDINで指定する必要があり、出力は0または1であり、非自己陶酔的/自己陶酔的な数を示します。

コードの説明:

~              # Evaluate the input to get a number
.              # Accumulator (initially the number itself)
`:s            # Convert number to string and assign to variable s
{              # Loop over characters of the string
  48-          # Reduce character value by 48
  s,           # Push length of input number
  ?            # Power
  -            # Subtract result from accumulator
}/
!              # Not! (i.e. iff accumulator was zero it was a narcissistic number)

私は ``〜.`をダブルテイクしましたが、改善することは不可能のようです。良いですね。
ピーターテイラー


14

Perl、38文字

perl -lpe '$@=y///c;$s+=$_**$@for/./g;$_=$_==$s'

非常に簡単な実装。

35文字に収まるわずかに異なるバージョンを次に示します。

perl -lpe '$@=y///c;$s+=$_**$@for/./g;$_-=$s'

このバージョンは、入力が自己陶酔的な場合は偽の値を出力し、そうでない場合は(Perlが受け入れた)真の値を出力します。この後方バージョンはチャレンジの説明の範囲内に収まると主張するかもしれませんが、熟考のうえ、私はそうしないことにしました。私は自分のスコアを改善することに必死ではありません。まだ。


「テキスト文字列やその他の無効な入力のエラーチェックは不要です。」–では、入力が末尾の改行なしで有効な数になると仮定してはどうでしょうか。echo -n 153 | perl -pe '…'なしで動作し-lます。
マナトワーク

真と偽の出力が何であるかを定義している限り、それは合法であるはずです
-Cruncher

厳密に言えば、チャレンジテキストの文言は、True / Falseまたは0/1が何を意味すべきかについて少しあいまいな点を残しているので、これを1つ渡します。ただし、自己陶酔的な値に対してtrueを返す同じ長さの別のスクリプトには利点があります。
イッツィ

同じ考えだが短い:perl -pe'map$s+=$_**@y,@y=/./g;$_=$_==$s'
msh210

13

J、23文字

(".=+/@("."0^#))(1!:1)1

(1!:1)1 キーボード入力(文字列を返す)です。

".入力を数値に変換します。"0ランク(次元)を0に指定します。つまり、各文字を取得して数値に変換します。

^は累乗関数で#あり、長さ関数です。したがって、各桁を文字列の長さの累乗(同等に桁数)にします。

+/は単なる合計であり=、合計と数を比較しています。


2
「あなたのコードはユーザーからの入力を受け取り、与えられた数がナルシスティックな数であるかどうかに応じてTrueまたはFalseを出力する必要があります。」(強調鉱山)
ジョンドヴォルザーク

@JanDvorak悪い点-キーボード入力が追加されました。
有理数

12

ルビー、34 + 5 = 39

コマンドラインフラグ付き

ruby -nlaF|

走る

p eval [$F,0]*"**#{~/$/}+"+"==#$_"

trueまたはfalseを出力します。


3
これは、私が今までに正規のコードゴルフで見た中で最もルビーのフラグかもしれません:P
ドアノブ

11

R、71 69 66 56 48

@Giuseppeのおかげで8バイト削減!アイデアは、モジュロ演算の前に整数除算を実行することでした。

i=nchar(a<-scan()):0;a==sum((a%/%10^i%%10)^i[1])

(3年)対応する説明付きの古いバージョン:

i=nchar(a<-scan()):1;a==sum(((a%%10^i)%/%10^(i-1))^i[1])

a<-scan()入力として数値(整数、実数、...)を取ります(153例の場合)。
i3から1(3の文字数)を含むベクトルになりaます。
%%は、1000、100、および10を法a%%10^iaするベクトル化を意味します153, 53, 3。したがって、となります。
(a%%10^i)%/%10^(i-1)は、そのベクトルを100、10、1で除算した整数です1, 5, 3。したがって、。
の最初の要素がiの文字数(ここでは桁数)であるa、つまり31, 125, 27それを含むベクトルを与えて、sumと比較しaます。


整数除算は常に切り捨てられますか?そうでなければ、370(自己陶酔的な数)が4,7,0に変わる(falseを返す)または270(非自己陶酔的)が3,7,0に変わる(trueを返す)などの問題に遭遇する可能性があります。
イッツィ

整数除算は丸められません... 370の100による整数除算は3で、残りは3.70ではなく70です。
プランナパス

1
48バイト ...誰かがこれをホームページにぶつけた!
ジュゼッペ

9

Python 3、56バイト

あまり難読化されていませんが、簡単な解決策です。

s = input()
print(int(s)==sum(int(c)**len(s)for c in s))

1
[そして]不要で、あなたは目の前にスペースをドロップすることができますforので、あまりにも:sum(int(c)**len(s)for c in s)
マリナス

すごい!ヒントをありがとう。
danmcardle

1
2つの文字を保存するには、スペースを削除しs = input()、もう1つをprint関数ではない2.7に移動します。
ベン

良い点、編集。
danmcardle

中かっこを追加するとprint(したがって1文字以上)、これが有効なPython 2.xおよびPython 3.xソリューションになることを指摘する必要があると思います。
マーティントーマ

8

PHP、80 74 66文字

非常に簡単なPHPソリューション:

<?for(;$i<$l=strlen($a=$argv[1]);)$s+=pow($a[$i++],$l);echo$s==$a;

error_reporting通知が含まれていないことを前提としています。そうしないと、初期化$s=0;とにかなりの数の余分な文字が必要になり$i=0ます。

多くの文字を短縮するためのThx @manatwork。


$ aと$ lを別々のステートメントで割り当てないでください。<?for($i=0;$i<$l=strlen($a=$argv[1]);$i++){$s+=pow($a[$i],$l);}echo$s==$a;短いです。
マナトワーク

通知を生成するステートメントが既にあるので、もう1つ追加するだけです。ループ制御変数の初期化を削除します。ループ制御変数のインクリメントも、スタンドアロンのステートメントである必要はありません。そして、中括弧は絶対に必要ありません<?for(;$i<$l=strlen($a=$argv[1]);)$s+=pow($a[$i++],$l);echo$s==$a;
マナトワーク

@manatwork:codegolfへの暖かい歓迎をありがとう:)
Vlad Preda

これにゴルフすることができますfor(;$i<$l=strlen($a=$argn);)$s+=$a[$i++]**$l;echo$s==$a;
ヨルクヒュルサーマン

8

Dc:48文字

[1pq]Sr?d0rdZSz[d10/r10%lz^rSh+Lhd0!=c]dScx+=r0p

サンプル実行:

bash-4.1$ dc -e '[1pq]Sr?d0rdZSz[d10/r10%lz^rSh+Lhd0!=c]dScx+=r0p' <<< '153'
1

bash-4.1$ dc -e '[1pq]Sr?d0rdZSz[d10/r10%lz^rSh+Lhd0!=c]dScx+=r0p' <<< '1634'
1

bash-4.1$ dc -e '[1pq]Sr?d0rdZSz[d10/r10%lz^rSh+Lhd0!=c]dScx+=r0p' <<< '2013'
0

実際に使用されることはありませんdc書き込みへの試みで、必死のタイプミスのために保存し、cd
スタン・ストラム


8

R、53バイト

sum(scan(t=gsub("(.)","\\1 ",x<-scan()))^nchar(x))==x

gsub正規表現は、その結果、文字の間にスペースを挿入するscan機能は、数字のベクターに数を読み取ることができるようになります。


+1私はそうすることを考えたことがなかっただろう、それは素晴らしい。
プランナパス


6

Powershell、75 63 62 60 58

編集:@Isziのコメントごとに更新(注:これは存在ないことに依存します$x

編集:@Dankoの変更を追加しました。

[char[]]($x=$n=read-host)|%{$x-="$_*"*$n.length+1|iex};!$x

58 56文字

入力が10桁に制限されている場合(すべてのint32を含む)

($x=$n=read-host)[0..9]|%{$x-="$_*"*$n.length+1|iex};!$x

私がやる前に誰かがPowerShellをやろうとしているのではないかと思っていました。
イッツィ

別の変数$xを追加し、testの+=代わりに合計を使用して12文字を保存します。measure -sum$x-eq$n
イスジ

1
61文字:($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x
ダンコドゥルビッチ

1
@DankoDurbić、ナイス!型強制は、PoShコードゴルフでしばしば役立ちます。しかし、実行すると62しか得られません'($x=$n=read-host)-split""|%{$x-=[math]::pow($_,$n.length)};!$x'.length
-Rynant

1
@Rynant良い点。PowerShellで長さのチェックを実行したところ、62も見つかりました。実際のスクリプトに対して同様に長さチェックを実行すると、61が表示されます。これはおそらく、PowerShellが''置き換えたものをPowerShellが処理する方法が原因です''。元のスクリプトをExcelに取り込み、再確認し=LEN("($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x")て62を得ました。もちろん、いつでも手動でカウントできますが、実際にカウントするのは誰ですか?
イッツィ

5

Python 2.x-51

Python 3.xのcrazedgremlinのソリューションと同じ概念:

s=input();print s==sum(int(c)**len(`s`)for c in`s`)

4

C- 97 93文字

a,b;main(c){scanf("%d",&c);b=c;for(;c;c/=10)a+=pow(c%10,(int)log10(b)+1);printf("%d",a==b);}

インデント付き:

a,b;
main(c) { 
  scanf("%d",&c);
  b=c;
  for(;c;c/=10)
    a+=pow(c%10,(int)log10(b)+1);
  printf("%d",a==b);
}

2
intグローバル変数を定義する必要はありません。
コンラッドボロスキー14年

わあ 入力をに読み込んでいますargc
SIGSTACKFAULT

また、-lmコンパイル時のカウント+1バイトで行う必要はありませんか?
-SIGSTACKFAULT

@Blacksilver -lmフラグは、C89コンパイラには必要ありません。
ジョシュ

あぁ。毎日新しいことを学びましょう。
SIGSTACKFAULT

4

デルファイ-166

uses System.SysUtils,math;var i,r,l:integer;s:string;begin r:=0;readln(s);l:=length(s);for I:=1to l do r:=round(r+power(strtoint(s[i]),l));writeln(inttostr(r)=s);end.

インデント付き

uses System.SysUtils,math;
var
  i,r,l:integer;
  s:string;
begin
  r:=0;
  readln(s);
  l:=length(s);
  for I:=1to l do
    r:=round(r+power(strtoint(s[i]),l));
  writeln(inttostr(r)=s);
end.


3

Haskell 2010-76文字

main=do x<-getLine;print$(==x)$show$sum$map((^length x).(+(-48)).fromEnum)x

1
コードを実行するミリ秒数ではなく、使用した文字数を投稿する必要があります。;)
ユーザー不明

3

Awk:40 39文字

{for(;i<NF;)s+=$(i+++1)**NF;$0=$0==s}1

サンプル実行:

bash-4.1$ awk -F '' '{for(;i<NF;)s+=$(i+++1)**NF;$0=$0==s}1' <<< '153'
1

bash-4.1$ awk -F '' '{for(;i<NF;)s+=$(i+++1)**NF;$0=$0==s}1' <<< '1634'
1

bash-4.1$ awk -F '' '{for(;i<NF;)s+=$(i+++1)**NF;$0=$0==s}1' <<< '2013'
0

3

バッシュ、64文字

for((a=$1;a>0;s+=(a%10)**${#1},a/=10));do :; done;echo $[s==$1]

a = $ 1; p = $ {#a}; for((; a> 0; a / = 10)); do s = $((s +(a%10)** p)); done; echo $( (s == $ 1))


1
単一の場所で変数pを使用しているため、その必要はありません。変数aの初期化をに移動してfor、個別に使用することができ;ますfor((a=$1;a>0;a/=10));do s=$[s+(a%10)**${#1}];done;echo $[s==$1]
マナトワーク

1
評価をforもう1つの文字に移動することにより、短縮できますfor((a=$1;a>0;s+=(a%10)**${#1},a/=10));do :; done;echo $[s==$1]
マナトワーク

ああ、好奇心が強い!そのようなことを試みましたが、うまくいきませんでした。何がおかしいのか興味があります。
ユーザー不明

3

ルア(101文字)

Luaは簡潔であることで知られていませんが、とにかく試してみるのは楽しかったです。

for n in io.lines()do l,s=n:len(),0 for i=1,l do d=n:byte(i)s=s+(d-48)^l end print(s==tonumber(n))end

改善を歓迎します。


プログラムが数値のリストを処理および処理できる必要はないため、バイトを使用してその機能を実装することはしません。ループfor n in io.lines()do [...]endを置き換えると、n=io.read()いくつかのバイトが節約されます(TIO)。
ジョナサンフレッチ

3

JavaScript- 70 58文字

for(i in a=b=prompt())b-=Math.pow(a[i],a.length)
alert(!b)

注意:

Stack ExchangeのString.prototype開発コンソールでこれをテストしている場合は、このソリューションを破壊する多くの非標準プロパティが追加されていることに注意してくださいString.prototype.formatUnicorn。のようなクリーンな環境でテストしてくださいabout:blank


そこで70文字を数えます。
マナトワーク

@manatwork、おっと、改行を数えるのを忘れていました。
zzzzBov

デクリメントという素晴らしいトリック!
マナトワーク

2
true入力に関係なく、常に返されます
ココ14

@koko、誤った結果が表示される理由を説明するメモを追加しました。
zzzzBov

3

Java-84バイト

(a,l)->{int s=0;for(byte c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);};

非ラムダバージョン:101バイト:

boolean n(String a,int l){int s=0;for(byte c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);}

このように呼び出されます:

interface X {
    boolean n(String a, int l);
}

static X x = (a,l)->{int s=0;for(byte c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);};

public static void main(String[] args) {
    System.out.println(n("153",3));
    System.out.println(n("1634",4));
    System.out.println(n("123",3));
    System.out.println(n("654",3));
}

返却値:

true
true
false
false

ラムダ引数の前後の括弧を削除できますが、a,l->まったく同じように動作します。
FlipTack

私は2つのバイトあなたはほぼ一年前にこれを答えるましたが、あなたができるゴルフを知っている:(a,l)->可能a->l->byteすることができinta->l->{int s=0;for(int c:a.getBytes())s+=Math.pow(c-48,l);return a.equals(""+s);}
ケビンCruijssen

3

Japt14 9 7バイト

¶ì_xpZÊ

オンラインで試す


説明

integerの暗黙的な入力U

ì_

変換U数字の配列には、( ì)関数を介してそれを通過した後に整数に戻って変換します。

xpZÊ

加算(x)で縮小し、各要素をプロセスの配列のp長さ(Ê)の累乗()に上げます。

結果がに厳密に等しいかどうかを確認しUます。


¥U¬®n pUlÃx11バイトで動作すると思います;)
オリバー


2

Common Lisp- 116 102文字

(defun f(m)(labels((l(n)(if(> n 0)(+(expt(mod n 10)(ceiling(log m 10)))(l(floor n 10)))0)))(= m(l m))))

フォーマット済み:

(defun f(m)
  (labels((l(n)
            (if(> n 0)
               (+(expt(mod n 10)(ceiling(log m 10)))
                 (l(floor n 10)))
               0)))
    (=(l m)m)))

2

Smalltalk- 102 99文字

[:n|a:=n asString collect:[:e|e digitValue]as:Array.^n=(a collect:[:each|each raisedTo:a size])sum]

ワークスペースvalue:で、番号を付けて送信し、印刷します。


2

C#、117

using System.Linq;class A{int Main(string[] a){return a[0].Select(c=>c-'0'^a[0].Length).Sum()==int.Parse(a[0])?1:0;}}

2

Haskell、68 66バイト

d 0=[]
d n=mod n 10:d(div n 10)
sum.(\a->map(^length a)a).d>>=(==)

使用法:

*Main> sum.(\a->map(^length a)a).d>>=(==) $ 1634
True
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.