测试一些自恋的人


53

一个水仙花数是一个数字这是它自己的数字的总和,每个调至位数的力量。

例如,取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

Answers:


39

APL(15)

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

1如果为true和0false ,则输出。

说明:

  • ∆←⍞:读取一行(作为字符),存储在
  • (⍎¨∆)*⍴∆:评估其中的每个角色并将其提升为力量⍴∆
  • ∆≡⍕+/:查看输入是否等于这些总和的字符串表示形式

9
我刚刚读了什么
Jbwilliams1 2014年

4
@LagWagon上帝的语言

21

GolfScript,16个字符

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

输入必须在STD​​IN上给出,输出为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)

我对``〜.`''进行了两次检查,但似乎无法改善。好东西。
彼得·泰勒

15

Mathematica,43个字符

Tr[#^Length@#&@IntegerDigits@#]==#&@Input[]

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
manatwork

我认为,只要您定义正确和错误的输出是什么,它就应该合法
Cruncher

严格来说,质询文本的措词确实对True / False或0/1的含义有些含糊,所以让我通过。但是,对于自恋值返回相同长度的另一个等长脚本将具有优势。
Iszi 2013年

同样的想法,但更短:perl -pe'map$s+=$_**@y,@y=/./g;$_=$_==$s'
msh210 '16

13

J,23个字符

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

(1!:1)1 是键盘输入(返回字符串)。

".将输入转换为数字;"0指定等级(维度)为0,换句话说,将每个字符转换为数字。

^是幂函数,#是长度函数,因此将每个数字取为字符串长度的幂(等效为数字的位数)。

+/只是总和,=正在比较总和和数字。


2
“您的代码必须接受用户的输入,并根据给定的数字是自恋数字来输出True或False。” (我的重点)
John Dvorak

@JanDvorak我的坏-添加了键盘输入。
理性

12

Ruby,34 + 5 = 39

带有命令行标志

ruby -nlaF|

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

输出true或false。


3
这可能是我在合法代码高尔夫中见过的最Ruby标记:P
Doorknob

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例如示例)。
i变成一个包含3到1(a为3 的字符数)的向量。
%%被向量化,因此a%%10^i表示取a模为1000、100 和10的模:因此得到153, 53, 3
(a%%10^i)%/%10^(i-1)是该向量的整数除以100、10、1:因此,1, 5, 3
我们用的第一个元素来提升,即i的字符数(此处为数字)a,即3,给出一个包含1, 125, 27我们的向量sum并与进行比较a


整数除法是否总是四舍五入?否则,您可能会遇到问题,例如370(自恋的数字)变成4,7,0(将返回假)或270(非自恋的)变成3,7,0(返回真)。
Iszi 2013年

整数除法不会四舍五入... 370除以100的整数除法是3,其余的是70,而不是3.70。
plannapus

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,2013年

1
您可以删除两个空格来保存两个字符,将其s = input()移动到2.7 print则不能再保存一个字符。

好点,编辑。
danmcardle

我认为您应该指出,将括号添加到print(因此再增加一个字符)将使其成为有效的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;and $i=0

Thx @manatwork用于缩短许多字符。


不要在单独的语句中分配$ a和$ l。<?for($i=0;$i<$l=strlen($a=$argv[1]);$i++){$s+=pow($a[$i],$l);}echo$s==$a;更短。
manatwork

您已经有了生成通知的语句,只需添加另一个:删除循环控制变量初始化。递增循环控制变量也不必是独立的语句。而且绝对不需要大括号:<?for(;$i<$l=strlen($a=$argv[1]);)$s+=pow($a[$i++],$l);echo$s==$a;
manatwork

@manatwork:感谢您对codegolf的热烈欢迎:)
Vlad Preda

可以golfed本for(;$i<$l=strlen($a=$argn);)$s+=$a[$i++]**$l;echo$s==$a;
约尔格Hülsermann

8

直流电: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

K,24 23

{x=+/xexp["I"$'a]@#a:$x}

通过重新排序将1个字符剃光

{x=+/{x xexp#x}"I"$'$x}

8

R,53个字节

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

gsub正则表达式中插入人物之间的空间,从而使scan功能将能够读出数字到数字的向量。


+1我从未想过要这样做,这真是太好了。
plannapus


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。
Iszi 2013年

通过添加另一个变量$x并使用+=进行求和而不是measure -sum测试来节省12个字符$x-eq$n
Iszi 2013年

1
61个字符:($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x
DankoDurbić13年

1
@DankoDurbić,尼斯!PoSh代码打高尔夫球时通常会强制使用类型强制。我只跑了62岁'($x=$n=read-host)-split""|%{$x-=[math]::pow($_,$n.length)};!$x'.length
Rynant

1
@Rantant好点。我在PowerShell中运行了长度检查,并得出了62个结果。当对实际脚本进行类似的长度检查时,结果为61。这可能是因为PowerShell处理''您替换为的方式的原因''。我将原始脚本带入Excel中进行仔细检查,结果=LEN("($x=$n=read-host)-split''|%{$x-=[math]::pow($_,$n.length)};!$x")也得到了62个。当然,我们总是可以手动进行计数-但是谁真正做到了?
Iszi 2013年

5

Python 2.x-51

与crazedgremlin针对Python 3.x的解决方案相同的概念:

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为全局变量定义。
Konrad Borowski14年

哇。您正在读取的输入argc
SIGSTACKFAULT

另外,是否不必-lm在编译时计数+1个字节?
SIGSTACKFAULT

@Blacksilver -lmC89编译器不需要该标志。
乔什(Josh)

啊哈 每天学习新事物。
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

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

Bash,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]
manatwork

1
通过将评估移到for另一个字符可以缩短:for((a=$1;a>0;s+=(a%10)**${#1},a/=10));do :; done;echo $[s==$1]
manatwork

哦,很好奇!我尝试过类似的方法,但是没有用。好奇出了什么问题。
用户未知,

3

Lua(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 [...]endn=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

@manatwork,哎呀,忘了数换行符。
zzzzBov

减少的绝招!
manatwork

2
true不管输入什么,它总是为我返回
koko 2014年

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

非lambda版本: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

您可以删除lambda参数周围的括号,其a,l->作用完全相同。
FlipTack

我知道您差不多在一年前就已经回答了,但是您可以打高尔夫两个字节:(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);}
Kevin Cruijssen

3

Japt14 9 7字节

¶ì_xpZÊ

在线尝试


说明

整数的隐式输入U

ì_

转换U为数字数组(ì),将其传递给函数,然后转换回整数。

xpZÊ

通过加法(x)减少,从而在过程中将每个元素提高到数组p长度(Ê)的幂()。

检查结果是否严格等于U


我认为¥U¬®n pUlÃx这将适用于11个字节;)
奥利弗(Oliver


2

普通Lisp- 116102个字符

(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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.