我是一个自我号码吗?


31

一个自号(也称为哥伦比亚或Devlali号)是一个自然数,x其中的公式n + <digit sum of n> = x对任何自然数无解n。例如,21不是一个自数,n = 15结果为15 + 1 + 5 = 21。另一方面,20 一个自己的数字,因为n找不到满足这种相等性的数字。

由于此定义引用数字总和,因此它取决于基数。出于此挑战的目的,我们将仅考虑基数为10的自身编号,即OEIS 中的序列A003052。二进制(A010061)和以100为基数(A283002)的自编号也经过计算。

挑战

给定一个正整数x作为输入,如果x以10为底的自数,则输出一个真值,否则输出一个假值。为了澄清真实值和虚假值,请参阅此主题的meta文章

您可以编写完整的程序或函数,并且可以在任何常用通道上提供输入和输出。当然,标准漏洞是被禁止的。

这是,因此答案越短(以字节为单位)越好!

测试用例

真相:

1
3
5
7
9
20
31
86
154
525

虚假:

2
4
6
8
10
15
21
50
100
500

沙盒链接

排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

# Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以将旧分数保留在标题中,方法是将它们打掉。例如:

# Ruby, <s>104</s> <s>101</s> 96 bytes

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

# Perl, 43 + 2 (-p flag) = 45 bytes

您还可以将语言名称设置为链接,然后该链接将显示在页首横幅代码段中:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


似乎有一些关于有效输出的讨论/不同意见,所以我想我对我的意图还不清楚。我添加了一个句子,希望能使这篇文章变得清晰起来。对不起,如果我对此造成任何混淆!
没关系

不要引起更多的混乱,但是我认为此讨论与为什么存在一些混乱有关。在提出未来的挑战时,请考虑这一点,因为如果使用旧的共识,可能很难以没有if / else构造的语言发布。
FryAmTheEggman

@FryAmTheEggman我还没有意识到共识已经发生了转变,我现在有点傻了:/不过,我现在已经添加了一个澄清,再次更改它似乎是错误的。我会在发布下一个挑战时牢记这一点。谢谢
Sok

2
我没有任何电话号码!我是自由人!
David Richerby

1
@DavidRicherby *在您之后发送白球*
Sok

Answers:



7

Java(JDK 10),84字节

i->{for(int n=i;i-->1;)i|=((""+i).chars().map(x->x-48).sum()+i^n)-1>>-1;return~i<0;}

在线尝试!

说明

i->{                                    // IntPredicate
  for(int n=i;i-->1;)                   //  for each number below n
    i|=(                                //   keep the sign of
      (""+i).chars().map(x->x-48).sum() //    sum of digits
      +i                                //    plus the number
      ^n                                //    xor n (hoping for a zero)
     )-1>>-1;                           //    changing that into a negative number if equals to zero
  return~i<0;                           //  return i>=0
}

学分


1
-1个字节:n->{int i=n,r=0;for(;i-->0;)r=(""+i).chars().map(x->x-48).sum()+i==n?1:r;return r<1;}
Kevin Cruijssen

2
84个字节:i->{for(int n=i;i-->1;)i|=((""+i).chars().map(x->x-48).sum()+i^n)-1>>-1;return~i<0;}
Nevay

5

05AB1E,8个字节

LD€SO+ÊW

在线尝试! 或作为测试套件

说明

L          # push range [1 ... input]
 D         # duplicate
  €S       # split each number into a list of digits
    O      # sum digit lists
     +     # add (n + digitSum(n))
      Ê    # check for inequality with input
       W   # min

5

Brachylog,12个字节

¬{⟦∋Iẹ+;I+?}

在线尝试!

说明

¬{         }    Fails if succeeds, suceeds if fails:
  ⟦∋I             I ∈ [0, ..., Input]
    Iẹ+           The sum of the elements (i.e. digits) of I...
       ;I+?       ... with I itself results in the Input

1
false.通过一种方式,任何客观的方法truthy值true.是不是?我不这么认为,这似乎将得到元共识的
Sok

1
@Sok我添加了3个无关的字节来解决您的问题。
致命

5

C(gcc)70 67 65字节

i,r,d,j;f(n){for(r=i=n;d=j=--i;r*=d!=n)for(;j;j/=10)d+=j%10;i=r;}

在线尝试!

为了减少2个字节,返回的真实值不再是1,而是数字本身。


4

八度49 47 44字节

@(x)arrayfun(@(k)k+sum(num2str(k)-48)-x,1:x)

在线尝试!

说明:

尝试在一个范围上进行操作很麻烦而且很长,因为num2str如果输入的数字多,则返回一个以空格作为分隔符的字符串。因此,减去48将得到以下结果:1 -16 -16 2 -16 -16 3 -16 -16 4对于输入范围1 ... 4。摆脱所有这些-16需要很多字节。

因此,我们将使用进行循环arrayfun。对于每个数字 k = 1 .. x,其中x是输入,我们k对其相加并加和,然后减去x。这将为中的每个数字返回一个数组,其中包含该操作的结果 k中的。如果数组中的任何数字为零,则该数字不是自身数字。

对于输入2021,输出为:

20:  -18, -16, -14, -12, -10, -8, -6, -4, -2, -9, -7, -5, -3, -1, 1, 3, 5, 7, 9, 2
21:  -19, -17, -15, -13, -11, -9, -7, -5, -3, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 1, 3

输入只有非零元素,输入20至少有一个非零元素21。那意味着那20是一个自号,21不是。

从TIO链接中可以看出,八度将具有至少一个零的数组视为false。


4

MATL,11个字节

t:tFYA!Xs+-

输出是一个非空数组,如果其所有条目都不为零,则为true;如果包含一个或多个零,则为false。

在线尝试!要么验证所有测试用例,包括真实性/伪造性测试。

说明

以输入n = 10为例。

t       % Implicit input, n. Duplicate
        % STACK: 10, 10
:       % Range
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10]
t       % Duplicate
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10], [1 2 3 4 5 6 7 8 9 10]
FYA!    % Convert to base 10 digits and transpose
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10], [0 0 0 0 0 0 0 0 0 1
                                              1 2 3 4 5 6 7 8 9 0]
Xs      % Sum of each column
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10], [1 2 3 4 5 6 7 8 9 1]
+       % Add, element-wise
        % STACK: 10, [2 4 6 8 10 12 14 16 18 11]
-       % Subtract, element-wise
        % STACK: [8 6 4 2 0 -2 -4 -6 -8 -1]
        % Implicit display

3

APL(Dyalog),14个字节

~⊢∊⍳+(+/⍎¨∘⍕)¨∘⍳

在线尝试!

怎么样?

                  range
     (  ⍎¨∘⍕)      digits
     (+/    )      digit sums
   ⍳+              vectorized addition with the range
 ⊢∊                is the input included?
~                  negate

那是16个字节。将其设置为15:+/⍎¨∘⍕->#+.⍎⍕
ngn

3

果冻,6个字节

ḟDS+Ɗ€

对于输入Ñ,此返回[N] ,如果Ñ是自数,[]如果不是。

在线尝试!

怎么运行的

ḟDS+Ɗ€  Main link. Argument: n

     €  Call the link to the left for each k in [1, ..., n].
    Ɗ     Drei; combine the three links to the left into a monadic chain.
 D          Decimal; map k to the array of its digits in base 10.
  S         Take the sum.
   +        Add k to the sum of the k's digits.
ḟ       Filterfalse; promote n to [n], then remove all elements that appear in the
        array to the right.
        This returns [n] if the array doesn't contain n, [] if it does.

什么编码将这六个字符打包成六个字节?
WGroleau '18

1
Jelly使用自定义代码页
丹尼斯



3

J28,24,22 21字节

-1字节感谢Conor O'Brien

-2倍感谢ngn

$@-.(+1#.,.&.":)"+@i.

在线尝试!

说明:

i. 清单0 .. n-1

( )"+ 对于列表中的每个项目

.,.&.": 将其转换为数字列表,

1# 找到他们的总和

+ 并将其添加到项目

$@-. 从参数中排除列表并找到形状


1
我意识到这是一个旧帖子,但是"0 i.可以是"+i.(-1字节)。
科纳·奥布莱恩

1
@ ConorO'Brien谢谢!我想我那时还不了解这种高尔夫。现在我使用它(当我记得时:))
Galen Ivanov

1
-.@e.->$@-.
ngn

@ngn谢谢,真的很好!
Galen Ivanov

1
@GalenIvanov也[:( )"+i.- >( )"+@i.
NGN

2

Python 2,70 66字节

lambda x:[i for i in range(x)if i+sum([int(j)for j in`i`])==x]==[]

编辑:-4感谢@ user56656


1
在python2中,您可以使用`i`而不是str(i)保存4个字节。
小麦巫师

@ user56656谢谢,我不知道这一点
sonrad10

1
您可以将[and ]放进sum
Xcoder先生18年

lambda x:[i for i in range(x)if i+sum(map(int,`i`))==x]==[]
B. Eckles

lambda x:all(i+sum(map(int,`i`))-x for i in range(x))
B. Eckles

2

Pyth,8个字节

!/m+sjdT

测试套件。

如果允许交换true / falsy值,那么我们可以丢弃!并获取7个字节。其中一个的建议,帮助我的高尔夫球2个字节。

说明

!/ m + sjdT –完整程序。从STDIN获取输入Q,输出True或False。
  m –使用变量d映射[0 ... Q)范围。
     jdT –将d转换为10。
    s –总和。
   + –并将和加到d本身。
 / –计算结果中Q的出现。
!–取反。隐式输出结果。

我有.AmnQ+dsjdT,我不知道/。似乎很长一段时间我都没有正确使用Pyth!+1
Sok

@Sok /基本上计算列表中某个元素的出现次数。我也可以使用},它测试对象是否出现在列表中,但是我认为这是相同的字节数。
Xcoder先生18年

我认为这S不是必需的-输入将是一个正整数,因此0在映射列表中有没有问题?至少,它似乎适用于给定的测试用例。
Sok

@Sok太好了,您是对的!由于这个原因,我又减少了一个字节。
Xcoder先生18年

如何+sjdT添加sjdTd?我从未见过那样的东西
RK。

2

Perl 6的39个 33字节

{!grep $_,map {$_+[+] .comb},^$_}

试试看!

具有隐式单个参数的裸块,因此称为:

say {!grep $_,map {$_+[+] .comb},^$_}(500);
> False
say {!grep $_,map {$_+[+] .comb},^$_}(525);
> True

由于n + digits(n) >= n,我们可以为所有数字计算哥伦比亚数,直到查询值,然后查看它们是否匹配。因此,这将计算给定输入的哥伦比亚号:

{$_ + [+] .comb}

我们将其应用于达到目标的所有值:

(^$_).map({$_+[+] .comb})

但是我们只关心它们中的任何一个是否匹配,而不关心这些值是什么,因此正如@nwellenhof指出的,我们可以grep:

grep $_, map {$_+[+] .comb}, ^$_

其余的只是强制性的,将其包装成块。

39个字节

{!((^$_).map({$_+[+] .comb}).any==$_)}

@Emigna提供的TIO测试链接

@nwellenhof指出,使用grep可以节省6个字节!


1
很酷的解决方案!您可以添加TIO链接进行测试。
Emigna




2

Japt -d!,6个字节

N¥U+ìx

试试吧


原始的8个字节

返回输入数字为真或0假。如果在JavaScript中仅空数组为false,则可能为7个字节。

ÂNkUÇ+ìx

试试吧


说明

             :Implicit input of integer U
   UÇ        :Generate the range [0,U) and pass each Z through a function
      ì      :  Digits of Z
       x     :  Reduce by addition
     +       :  Add to Z
  k          :Remove the elements in that array
 N           :From the array of inputs
            :Bitwise NOT NOT (~~), casts an empty array to 0 or a single element array to an integer 

另类

Ç+ìxÃe¦U

试试吧

             :Implicit input of integer U
Ç            :Generate the range [0,U) and pass each Z through a function
  ì          :  Digits of Z
   x         :  Reduce by addition
 +           :  Add to Z
    Ã        :End function
     e       :Every
      ¦U     :  Does not equal U

1

视网膜,55字节

.+
*
Lv`_+
_+
$&$.&
^_+
$&¶$&
\d
*
Cms`^(_+)\b.*¶\1\b
0

在线尝试!链接包括测试用例。说明:

.+
*

将输入转换x为一元。

Lv`_+

创建从x到的范围1

_+
$&$.&

将每个十进制值后缀为n一进制值。

^_+
$&¶$&

复制的副本x

\d
*

将的每个十进制数字转换n为一进制,从而将这些数字添加到的现有副本中n

Cms`^(_+)\b.*¶\1\b

检查是否x在任何结果中出现。

0

反转结果。


1

JavaScript(ES6),52 51字节

@ l4m2节省了1个字节

返回01

n=>(g=k=>k?eval([...k+'k'].join`+`)-n&&g(k-1):1)(n)

在线尝试!


n=>(g=k=>k?n-eval([...k+'k'].join`+`)&&g(k-1):1)(n)
l4m2




1

视网膜,24字节

.+
*

$.`¶$`
\d
*
D`
.\z

在线尝试!

一元输入可能是18个字节,但是另一个Retina答案也使用了十进制,因此我认为使用十进制将使比较更公平。

说明

.+
*

使用_一进制数字将输入转换为一进制。


$.`¶$`

在字符串的每个位置(即开始,结束和每对字符之间),插入:$.`,前缀的长度(或匹配项的零索引位置),换行符,$`前缀本身(即零索引位置的一元表示形式)。例如,如果输入是3并且我们将具有一元表示形式___,则将导致:

0
_1
__2
___3
___

换句话说,对于从0到输入端(包括端值)的每个数字,我们获得一行,该行同时包含该数字的一进制和十进制表示形式。

\d
*

我们将每个数字转换为一进制,这将有效地计算每一行的数字总和并将其添加到数字本身(全部为一进制)。

D`

重复数据删除行。这实际上并不会删除重复的行,而只是将它们清除为空行。因此,如果从0到输入的任何数字加上其数字总和等于输入,则将清除最后一行。否则,最后一行保持原样。

.\z

检查最后一行是否还有字符。我们不能使用$,因为它也匹配在尾随换行符的前面(这正是我们不想看的地方)。


1

Bash + GNU Coreutils,91字节

返回真实或虚假。

e=1;for((i=1;i<=$1;i++));{ [ $(bc<<<`grep -o . <<<$i|tr '\n' +`$i) -eq $1 ]&&e=0; };exit $e

1

Kotlin,48个字节

x->(1..x).all{v->"$v".sumBy{it.toInt()-48}+v!=x}

在线尝试!

说明:

(1..x)      // Range of numbers from 1 to x
.all{v->    // Function expression that checks if ALL values evaluate to tru
"$v"        // Convert the value into a string
.sumBy{it.toInt()-48} // For each character, get the ASCII char value, subtract 48 in order to get it back to the numerical value, and then sum it up
+v          // Add the original number
!=x}        // Ensure that it does not equal the input

1

加++,27字节

D,g,@,BDB+A+BK=
L,RbUABkºg!

在线尝试!

怎么运行的

D,g,@,		; Create a monadic function 'g'
		; Example argument:		[15]
	BD	; Digits;		STACK = [[1 5]]
	B+	; Sum;			STACK = [6]
	A+	; Add argument;		STACK = [21]
	BK=	; Equals input;		STACK = [1]

L,		; Create a lambda function
		; Example argument:		[21]
	RbUABk	; Push range;		STACK = [1 2 3 ... 19 20 21]
	ºg	; Any true from 'g';	STACK = [1]
	!	; Logical NOT;		STACK = [0]


1

Stax,8 个字节

Å8avj╒Éπ

运行并调试

说明

ASCII等效项:

{cE+|+x=f!
{       f     Filter [1..input] with block
 cE           Decimal digits of current value
   +|+        Sum of digits and the current value
      x=      Equals input
         !    Logical not, maps empty array to 1 and non-empty array to 0

fcE+|+x=是一个Stax程序,它输出所有数字,这些数字的总和等于输入的数字。例如对于101输出将是91100,每个都在单独的行上。

运行并调试


1

Pyt,7 个字节

ĐřĐŚ+∈¬

在线尝试!

如果允许交换真实/虚假值,则¬末尾的可以丢弃6个字节。

说明:

        Implicit input
Đ       Duplicate input
ř       Get [1,2,...,input]
Đ       Duplicate the top of the stack
Ś       Get the sum of the digits of each element in the array
+       Add the top two items on the stack element-wise
∈       Is the input in the list?
¬       Negate the top of the stack
        Implicit print

1

J,20个字节

#@-.i.+1#.10#.inv i.

在线尝试!

                  i.     Range [0,n-1]
          10#.inv        To base 10
       1#.               Sum the digits
    i.+                  Plus the corresponding number
  -.                     Remove from the input, leaves an empty list if it was a self number.
#@                       An empty list is truthy, so return the length instead.
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.