位数总和相等


23

介绍

让我们来数180。这是一个有趣的数字,因为该数字的总和等于:

1 + 8 + 0 = 9

以及该数字的平方形式,或者:

180² = 32400 > 3 + 2 + 4 + 0 + 0 = 9

这些都是9。原始数字和平方数字的位数总和相同。当然,这也可以在OEIS:A058369中找到。

任务

给定一个非负整数n,在此条件下输出第nn个数。

测试用例(零索引

Input > Output

0 > 1
1 > 9
2 > 10
3 > 18
4 > 19
5 > 45
6 > 46
7 > 55
8 > 90
9 > 99
10 > 100
11 > 145
12 > 180
13 > 189
14 > 190
15 > 198
16 > 199
17 > 289
18 > 351
19 > 361

如果更适合您,输入也可以是1索引的

这是,因此以最少的字节提交为准!


万一没有人发现它,列表中将只显示等于0或1(模9)的数字。
尼尔2016年

@MamaFunRoll嗯...不 抱歉。用5根数字号码有正方形,其数字根为7
尼尔

@Neil owait nvm
Mama Fun Roll

我写了一个Brachylog谓词来确定输入是否是此序列的一项,但是无法使find-nth样板正常工作,因此我将其留在注释中:^₂;?{ẹ+}ᵛ
不相关的字符串

Answers:


5

果冻,13个字节

,²DS€=/
1dz#Ṫ

输入为1索引。在线尝试!

怎么运行的

1dz#Ṫ    Main link. Argument: n (index)

1        Set the return value to 1.
   #     Execute ... until ... matches have been found.
 Ç         the helper link
  ³        n
    Ṫ    Extract the last match.


,²DS€=/  Helper link. Argument: k (integer)

,²       Pair k with k².
  D      Convert each to decimal.
   S€    Compute the sum of each list of base 10 digits.
     =/  Reduce by equality.

4

Haskell,54个字节

s=sum.map(read.pure).show
([x|x<-[1..],s x==s(x^2)]!!)

用法示例:([x|x<-[1..],s x==s(x^2)]!!) 17-> 289

s calculates the digit sum:

                    show     -- turn number into a string
     map(read.pure)          -- turn every character (the digits) in to a
                             -- one element string and convert back to integer
sum                          -- sum those integers

main function:

[x|x<-[1..]            ]     -- make a list of all x starting from 1
           ,s x==s(x^2)      -- where s x == s (x^2)
                        !!   -- pick nth element from that list

4

JavaScript(ES6),76 73 72字节

n=>eval("for(q=s=>eval([...s+''].join`+`),i=1;q(i)!=q(i*i)||n--;i++);i")

我花了30分钟试图使它生效,直到我意识到输出错误的变量:|为止。

这是零索引的。


1
我觉得将其转换为递归函数将大大缩短此时间...
Mama Fun Roll

4

Perl 6,47 46字节

{(grep {$_.comb.sum==$_².comb.sum},1..*)[$_]}

4

05AB1E10 9 8 字节

µNÐn‚1öË

1个索引。

-1字节感谢@Emigna通过在末尾删除隐式½counter_variable每次迭代后增加)
-1字节感谢@GrimySO通过使用删除了重复项‚1ö

在线尝试。

说明:

µ         # Loop while the counter_variable is not equal to the (implicit) input yet:
 NÐ       #  Push the 0-based loop index three times
   n      #  Take the square of this index
          #   i.e. 180 → 32400
         #  Pair it with the index
          #   i.e. 180 and 32400 → [180,32400]
     1ö   #  Convert both numbers from base-1 to base-10, which basically sums the digits
          #   i.e. [180,32400] → [9,9]
       Ë  #  Check if both sums are equal
          #   i.e. [9,9] → 1 (truthy)
          #  (if they are: implicitly increase the counter_variable by 1)
          # (after the loop: implicitly print the top of the stack, which is the remaining
          #  copy of the index from the triplicate we've used)

2
您不需要½在这里,因为它是隐式的
Emigna '18年

1
-1 :µNDn‚1öË就像SO但是矢量化,这使我们避免了代码重复。
格林尼

@肮脏再次感谢。我还在“小贴士”帖子中添加了该贴士。:)
凯文·克鲁伊森

3

Mathematica,64个字节

a=Tr@*IntegerDigits;Nest[NestWhile[#+1&,#+1,a@#!=a[#^2]&]&,1,#]&

简单的匿名功能。零索引。


3

珀斯,15岁

e.fqsjZTsj^Z2TQ

1字节感谢DenkerAffe!

在这里尝试或运行测试套件

使用1索引选项。

幼稚的实现,使用.f它来获取n匹配给定条件的第一个数字。


h如果使用明确允许的1索引,则可以通过删除来节省一个字节。
Denker

@DenkerAffe哦,谢谢,我应该更仔细地阅读:P
FryAmTheEggman

2

MATL24 23字节

x`@2:^"@V!Us]=?@]NG<]1$

使用基于1的输入。

在线尝试!

x        % take inpout and delete it (gets copied into clipboard G)
`        %   do...while
  @      %   push loop iteration index: candidate number, n
  2:^    %   array [n n^2]
  "      %   for each element of that array 
    @    %     push that element 
    V!U  %     get its digits (to string, transpose, to number)
    Xs   %     compute their sum
  ]      %   end for each
  =      %   are the two sums equal?
  ?      %   if so
    @    %     the candidate number is valid: push it
  ]      %   end if
  NG<    %   is number of elements in stack less than input?
]        % if so, proceed with next iteration. End do...while. 
1$       % specify 1 input for implicit display: only top of stack

1
非常高兴,MATL终于被那里的远程编译器列出了!
2016年

1

朱莉娅79 66字节

f(n,x=0,i=1,s=c->sum(digits(c)))=x<n?f(n,x+(s(i)==s(i^2)),i+1):i-1

这是一个接受整数并返回整数的递归函数。它使用基于1的索引。

我们存储一些东西作为函数参数:

  • n :输入
  • x :一个计数器,我们找到了多少个处于这种情况的数字
  • i :用于检查条件的数字
  • s :用于计算其输入的数字总和的函数

x小于输入时,我们递归计算,x如果i满足条件则递增,然后递增i。一旦x == n,我们返回i,但是我们必须减去1,因为它会被递增一次。


1

凸0.2,36 35个字节

Convex是我正在开发的一种新语言,主要基于CJam和Golfscript。可以在此处找到解释器和IDE 。输入是命令行参数中的整数。索引是基于一的。使用CP-1252编码。

1\{\__2#¶{s:~:+}%:={\(\)\}{)\}?}h;(

1

Mathematica,63 60 61 59字节

Select[Range[9^#],Equal@@Tr/@IntegerDigits/@{#,#^2}&][[#]]&

在做出其他回答的同时,我跳了一个字节,然后在有人打高尔夫球之前就发布了这个答案。一个索引。


输入失败>2457。仅仅增加您的收入Range将无济于事,因为A058369[n]/n它似乎没有收敛。
墨菲(Murphy)2016年

更好?fillet +
CalculatorFeline

10^#会比短2^#*9。当然,在n大于约6之后,它变得太慢了……
feersum 16-3-12

为什么不9^#?fil
CalculatorFeline

您是否有证明f(n)<= 9 ^ n?(10很明显,因为10 ^ n始终是一个解)。
feersum '16

1

视网膜,103字节

\d+
$*1 x
{`x+
$.0$*x¶$.0$*a¶$.0$*b
%`b
$_
a+|b+
$.0
\d
$*
+`1¶1
¶
1(.*)¶¶$|¶[^d]+
$1x
}`^ ?x

x

绝对可以打高尔夫球。

使用新的Retina功能%进行平方(因此尚不能与在线版本一起使用)。


1

Mathcad, 70 50字节

Mathcad没有将数字转换为其数字字符串的内置函数,因此用户函数d(a)可以完成此工作。然后,程序遍历正整数,测试总和的相等性,直到它在向量v中累积了n个数字。使用=运算符对程序进行评估,该运算符将显示结果向量。(请注意,整个程序的显示与Mathcad工作表上的显示完全相同

更新的程序:假定默认将a初始化为零,并利用Mathcad返回程序中最后一个求值语句的值这一事实。
利用表达式的求值顺序在第一个求和中递增变量a(然后可用于平方和)

在此处输入图片说明

原始程序:返回最大为n的所有数字的向量。

在此处输入图片说明



0

Java 8,113字节

n->{int r=0;for(;n>=0;)if((++r+"").chars().map(c->c-48).sum()==(r*r+"").chars().map(c->c-48).sum())n--;return r;}

0索引

说明:

在线尝试。

n->{           // Method with integer as both parameter and return-type
  int r=0;     //  Result-integer, starting at 0
  for(;n>=0;)  //  Loop as long as `n` is zero or positive
    if((++r    //   Increase `r` by 1 first
       +"").chars().map(c->c-48).sum()
               //   And if the sum of its digits
       ==(r*r+"").chars().map(c->c-48).sum())
               //   equals the sum of the digit of its square
      n--;     //    Decrease `n` by 1
  return r;}   //  Return the result


0

TI-BASIC 66 62字节

Ans→N:While X<N:IS>(A,A::A:prgmA:Ans→B:A²:prgmA:If B=Ans:IS>(X,N:End:A
sum(int(10fPart(Ans₁₀^(seq(⁻X-1,X,0,log(Ans

输入为 ñ在中Ans
输出为1索引 ñ序列中的第一个词。

辅助函数生成中的值的数字总和Ans

例子:

3:prgmCDGF1E
             10
5:prgmCDGF1E
             19
8:prgmCDGF1E
             55
10:prgmCDGF1E
             99

说明:

Ans→N:While X<N:IS>(A,A::A:prgmA:Ans→B:A²:prgmA:If B=Ans:IS>(X,N:End:A ;prgmCDGF1E

Ans→N            ;store the input in N
While X<N        ;loop until the Nth term has been reached
IS>(A,A:         ;add 1 to A
                 ; (Increment A and skip the next statement if A>A)
A                ;leave A in Ans
prgmA            ;call the helper program below
Ans→B            ;store the result of the helper program in B
A²               ;square A and leave the result in Ans
prgmA            ;call the helper program below
                 ; (result is in Ans)
If B=Ans         ;if the two results are equal
IS>(X,N          ;add 1 to X
                 ; (Increment X and skip the next statement if X>N)
End
A                ;leave A in Ans
                 ;implicit print of Ans

sum(int(10fPart(Ans₁₀^(seq(⁻X-1,X,0,log(Ans   ;prgmA

                      seq(⁻X-1,X,0,log(Ans    ;generate a list...
                                              ; using X as the variable,
                                              ; starting at 0,
                                              ; ending at the log of Ans,
                                              ; and evaluating "⁻X-1" for each element
                                              ; (implicit increment of 1)
                   ₁₀^(                       ;raise 10 to the power of each element
                Ans                           ;multiply each element by the input
          fPart(                              ;remove the integer part from each element
        10                                    ;multiply each element by 10
    int(                                      ;round each element to the nearest integer
sum(                                          ;then sum the resulting list

注意: TI-BASIC是一种标记化语言。字符数不等于字节数。


0

J,62字节

[:{:({.@](>:@[,],[#~(=&(1#."."0@":)*:)@[)}.@])^:(#@]<1+[)^:_&1

在线尝试!

1个索引。由于过分的布管机制,J在这些“第n个”任务上再次表现不佳。


0

APL(NARS),49个字符,98个字节

r←h w;c
c←r←0
→2×⍳∼=/+/¨(⍎¨⍕)¨r,r×r+←1⋄→2×⍳w>c+←1

1索引,测试:

  h¨⍳20
1 9 10 18 19 45 46 55 90 99 100 145 180 189 190 198 199 289 351 361 

0

MathGolf,10个字节

♪╒gÆ‼Σ²Σ=§

在线尝试!

说明

为了使此功能可用,我选择提供一个版本,该版本将计算此属性低于1000的每个数字,并从该列表中获取正确的项目。为了有一个适用于任何输入大小的解决方案,可以将第一个字节替换为ú(push 10 ** TOS)。由于序列中的第n个项始终小于10ñ,脚本将始终成功。但是,这给计算带来了实际的限制,非常低。

♪            push 1000
 ╒           range(1,n+1)
  gÆ         filter list using the next 5 operators
    ‼        apply next two commands to TOS
     Σ       sum(list), digit sum(int)
      ²      pop a : push(a*a) (square)
       Σ     sum(list), digit sum(int) (pushes the digit sum of the square)
        =    pop(a, b), push(a==b) (compares the two)
         §   get from array (returns the <input>th item from the filtered list

也许我应该只为MathGolf创建一个聊天室。无论如何,我有一个问题:是否有用于字符串的替换,分割等内建函数?我感觉压缩可能会在这里保存字节,但是不确定是否存在内置函数来完成它。
凯文·克鲁伊森

有一个封闭的MathGolf聊天。我尝试使其保持活动状态,但是最近我忙于工作,并且一直处于关闭状态。我不想每次都打扰MOD。为了回答您的问题,MathGolf并不是真的要处理字符串操作,但是我已经实现了用于字符串处理的功能来处理一些基本挑战。如您所知,仍然有很多需求。如果添加任何内容,则可能与05AB1E类似,但是最近几个月来我还没有真正的业余时间进行MathGolf开发。
maxb
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.