私は自己番号ですか?


31

自己番号(また、コロンビア又はDevlali数と呼ばれる)は自然数であり、x式は、n + <digit sum of n> = x任意の自然数の解がありませんn。たとえば、21は、n = 15結果としての自己番号ではありません15 + 1 + 5 = 21。一方、20 自己数nです。これは、そのような等式を満足するものが見つからないためです。

この定義は数字の合計を参照するため、基数に依存します。この課題のために、OEISのシーケンスA003052である10 数の自己番号のみを考慮します。バイナリ(A010061)およびベース100(A283002)自己番号も計算されました。

チャレンジ

x入力として正の整数を指定すると、x10を底とする自己数の場合は真理値を出力し、そうでない場合は偽値を出力します。真理値と偽値の明確化については、このテーマに関するメタ投稿を参照しください。

完全なプログラムまたは機能を記述でき、通常のチャネルのいずれかで入出力を提供できます。もちろん、標準の抜け穴は禁止されています。

これはですので、回答(バイト単位)が短いほど良いです!

テストケース

真実:

1
3
5
7
9
20
31
86
154
525

偽:

2
4
6
8
10
15
21
50
100
500

サンドボックスリンク

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

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


有効なアウトプットについて議論/意見の相違があるように思われるので、私が何を意図していたのかはっきりしていなかったと思います。このメタ投稿を参照して、うまくいけば物事を明確にする文章を追加しました。これについて混乱を招いた場合は申し訳ありません!
ソク

混乱を招くことはありませんが、この議論はなぜ混乱が生じたのかに関係があると思います。古いコンセンサスを使用している場合、if / else構造を持たない言語で投稿するのは難しい可能性があるため、今後の課題を作成する際にこれを考慮してください。
FryAmTheEggman

@FryAmTheEggmanコンセンサスが変わったことに気付いていなかったので、今はちょっとした気分です:/それでも、私はすでに1つの説明を追加しました。もう一度変更するのは間違っているようです。私が投稿する次の挑戦のためにそれを心に留めておきます。ありがとう
ソク

2
私はどんな数でもありません!私は自由人です!
デビッドリチャービー

1
@DavidRicherby *あなたの後に白いボールを送ります*
ソク

回答:



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;}
ネヴァイ


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.はないでしょうか?私はそうは思わない、そしてそれはメタコンセンサス
ソク

1
@Sok私はあなたの懸念を解決するために3つの興味深いバイトを加えました。
致命的


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 .. xxは入力)に対して、加算kとその桁の合計、減算を行いますx。これは、kの各数値に対するその演算の結果を含む配列を返します。配列内のいずれかの数値がゼロの場合、その数値は自己の数値ではありません。

入力20およびの21場合、出力は次のとおりです。

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

inputに20は非ゼロ要素のみがあり、input には少なくとも1つの非ゼロ要素があります21。つまり、それは20自己番号であり、そうで21はありません。

Octaveは、TIOリンクに見られるように、少なくとも1つのゼロを持つ配列をfalseとして扱います。


4

MATL、11バイト

t:tFYA!Xs+-

出力は空でない配列で、すべてのエントリがゼロ以外の場合は真であり、1つ以上のゼロが含まれている場合は偽です。

オンラインでお試しください!または、真実性/虚偽テストを含むすべてのテストケースを検証します

説明

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

ゼリー、6バイト

ḟDS+Ɗ€

入力のためのN、この戻り[n]の場合、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.

これらの6文字を6バイトのみにパックするエンコーディングは何ですか?
WGroleau




3

J28、24、22の 21バイト

コナー・オブライエンのおかげで-1バイト

-ngnのおかげで2バイト

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

オンラインでお試しください!

説明:

i. リスト0 .. n-1

( )"+ リスト内の各アイテム

.,.&.": それを数字のリストに変換し、

1# 彼らの合計を見つける

+ アイテムに追加します

$@-. 引数からリストを除外し、形状を見つける


1
これは古い投稿である"0 i.ことが"+i.わかりますが、(-1バイト)になる可能性があります。
コナーオブライエン

1
@ ConorO'Brienありがとう!当時はこの種のゴルフを知らなかったと思う。今、私はそれを使用します(覚えているとき:))
Galen Ivanov

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

@ngn本当にありがとうございます!
ガレンイワノフ

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
あなたは、ドロップすることができます[し、]内側sum
氏Xcoder

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

lambda x:all(i+sum(map(int,`i`))-x for i in range(x))
B.エクレス

2

Pyth、8バイト

!/m+sjdT

テストスイート。

真実/偽の値の交換が許可されている場合、ドロップして!代わりに7バイトを取得できます。Sokの提案の1つは、2バイトのゴルフに役立ちました。

説明

!/ m + sjdT –完全なプログラム。STDINから入力Qを取得し、TrueまたはFalseを出力します。
  m –変数dで範囲[0 ... Q)にマップします。
     jdT – dを基数10に変換します。
    s –合計。
   + –そして、合計をd自体に追加します。
 / –結果内のQの出現をカウントします。
!–否定。結果を暗黙的に出力します。

私は持っていた.AmnQ+dsjdT、私は知らなかった/。長い間、Pythを適切に使用していないようです!+1
ソク

@Sok /は、基本的にリスト内の要素の出現回数をカウントします。}オブジェクトをリストに表示するかどうかをテストするを使用することもできますが、それは同じバイトカウントだと思います。
氏Xcoder

これSは必須ではないと思います-入力は正の整数になるので0、マッピングリストに入れることは問題になりませんか?少なくとも、指定されたテストケースでは機能するようです。
ソク

@Sok素晴らしい、あなたは正しい!これにより、もう1バイト削り取ることができました。
Mr. Xcoder

にどのように+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 $_, map {$_+[+] .comb}, ^$_

残りは、単にboolに強制し、ブロックにラップするだけです。

39バイト

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

@Emignaが提供するTIOテストリンク

@nwellenhofは、grepを使用すると6バイト節約できることを指摘しました!


1
クールなソリューション!テスト目的でTIOリンクを追加できます。
エミグナ




2

Japt -d!、6バイト

N¥U+ìx

それを試してみてください


オリジナル、8バイト

真実または偽の入力番号を返します0。JavaScriptで空の配列のみが偽である場合、これは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

_+
$&$.&

それぞれの10進値nをその単項値にサフィックスします。

^_+
$&¶$&

のコピーを作成しxます。

\d
*

の各10進数字nを単項に変換し、その数字をの既存のコピーに追加しますn

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

x結果のいずれかに表示されるかどうかを確認します。

0

結果を反転します。






1

網膜、24バイト

.+
*

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

オンラインでお試しください!

入力が単項で与えられた18バイトかもしれませんが、他のRetinaの回答も10進数を使用するため、10進数を使用するとより公平な比較ができると考えました。

説明

.+
*

_単項数字として使用して、入力を単項に変換します。


$.`¶$`

文字列の各位置(つまり、開始、終了、およびすべての文字ペアの間)に、次を挿入します。 $.`:、プレフィックスの長さ(または一致のゼロインデックス位置)、ラインフィード、、$`プレフィックス自体(つまりインデックスがゼロの位置の単項表現)。たとえば、入力が3あり、単項表現がある場合、___結果は次のようになります。

0
_1
__2
___3
___

言い換えると、0から入力(両端を含む)までの各数値に対して1行を取得し、その数値の単項表現と10進表現の両方を保持します。

\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

Add ++、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

スタックス、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、出力の場合91、および100はそれぞれ別の行になります。

実行してデバッグする


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

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