Ben bir kişisel numara mıyım?


31

Bir kendini numarası (bir Kolombiya veya Devlali sayısı olarak adlandırılır), bir doğal sayı olduğu x, denklem burada n + <digit sum of n> = xherhangi bir doğal sayı için çözümler vardır n. Örneğin, 21 , n = 15sonuç olarak kendi kendine bir sayı değildir 15 + 1 + 5 = 21. Öte yandan, 20 olan hiçbir gibi bir öz numarası nhangi karşılar böyle bir eşitlik bulunabilir.

Bu tanım, rakam toplamını referans aldığından, taban bağımlıdır. Bu zorluğun amaçları doğrultusunda, yalnızca OEIS'de A003052 dizisi olan 10 öz sayıları göz önünde bulunduracağız . İkili ( A010061 ) ve baz 100 ( A283002 ) kendilik numaralarını da işaretler.

Meydan okuma

xGirdi olarak pozitif bir tamsayı verildiğinde , x10 tabanındaki bir öz sayı ve aksi takdirde bir falsey değeri varsa , bir gerçek değer verin . Hakikat ve falsey değerlerinin açıklığa kavuşturulması için konuyla ilgili bu meta yazıya bakın .

Tam bir program veya fonksiyon yazabilirsiniz ve normal kanalların herhangi birinde giriş ve çıkış sağlanabilir. Standart boşluklar elbette yasaklandı.

Bu , yani cevabınız ne kadar kısaysa (bayt cinsinden) o kadar iyi olur!

Test durumları

Truthy:

1
3
5
7
9
20
31
86
154
525

Falsey:

2
4
6
8
10
15
21
50
100
500

Sandbox bağlantısı

Liderler

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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


Geçerli çıktıların bir tartışması / anlaşmazlığı var gibi görünüyor, bu yüzden ne istediğim konusunda net değildim. Bu meta postaya atıfta bulunarak her şeyi açıklığa kavuşturması gereken bir cümle ekledim . Bu konuda herhangi bir karışıklığa neden olduysam özür dilerim!
Sok

Daha fazla karışıklığa neden olmamakla birlikte, bu tartışmanın neden bir karışıklık olduğu ile ilgili olduğunu düşünüyorum . Gelecekteki zorlukları yaşarken lütfen bunu düşünün, çünkü eski fikir birliğini kullanıyorsanız, eğer yapılmayan dilleri yazmak zor olabilir.
FryAmTheEggman

@FryAmTheEggman Konsensüsün değiştiğini fark etmemiştim, şimdi bir uyuşuk gibi hissediyorum: / Yine de, şimdiden bir açıklama ekledim, tekrar değiştirmek yanlış görünüyor. Göndereceğim bir sonraki meydan okuma için bunu aklımda tutacağım. Teşekkürler
Sok

2
Ben herhangi bir sayı değilim! Ben özgür bir adamım!
David Richerby

1
@DavidRicherby * senden sonra beyaz top gönderir *
Sok

Yanıtlar:



7

Java (JDK 10) , 84 bayt

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

Çevrimiçi deneyin!

açıklama

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
}

Kredi


1
-1 bayt: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 22.08.2015

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


5

Brachylog , 12 bayt

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

Çevrimiçi deneyin!

açıklama

¬{         }    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.bir şekilde herhangi bir nesnel yöntem ile truthy değeri true.değil mi? Birisi için sanmıyorum ve öyle görünüyor ki meta konsensüs
Sok

1
@Sok Endişelerinize ulaşmak için 3 tane ilginç olmayan bayt ekledim.
18'de

5

C (gcc) , 70 67 65 bayt

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

Çevrimiçi deneyin!

Başka bir 2 byte'ı tıraş etmek için döndürülen gerçek değer artık 1 değil, sayının kendisidir.


4

Octave , 49 47 44 bayt

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

Çevrimiçi deneyin!

Açıklama:

Bir aralıkta işlemi yapmaya çalışmak zahmetli ve uzundur, çünkü num2strgiriş sayısından daha fazlası varsa ayırıcı olarak boşluk içeren bir dize döndürür. Bu nedenle 48 çıkarma, şöyle bir şey verecektir: 1 ... 41 -16 -16 2 -16 -16 3 -16 -16 4 giriş aralığı için . Tüm bunlardan kurtulmak çok fazla bayt alır.-16

Bu nedenle, bunu kullanarak bir döngü ile yapacağız arrayfun. K = 1 .. x sayılarından her biri için , x , girdidir, ekleriz kve sayılarını toplar ve çıkarırız x. Bu işlem, k sayısının her biri için bu işlemin sonucuyla birlikte bir dizi döndürür . Dizideki sayılardan herhangi biri sıfır ise, sayı bir öz sayı değildir.

Girişler 20ve 21çıkışlar:

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

Girdi için yalnızca sıfır olmayan öğeler ve girdi için 20en az bir sıfır olmayan öğe vardır 21. Bu 20, kendi kendine bir sayı olduğu anlamına 21gelmez.

Octave, TIO-linkinde görülebileceği gibi, en az bir sıfıra sahip bir diziyi ele alır.


4

MATL , 11 bayt

t:tFYA!Xs+-

Çıktı, boş olmayan bir dizidir; tüm girişleri sıfır değilse truthy ve bir veya daha fazla sıfır içeriyorsa sahtedir.

Çevrimiçi deneyin! Veya doğruluk / yanlışlık testi de dahil olmak üzere tüm sınav durumlarını doğrulayın .

açıklama

n = 10Bir örnek olarak girişi düşünün .

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 bayt

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

Çevrimiçi deneyin!

Nasıl?

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

bu 16 bayttır. Onları 15 yapmak için: +/⍎¨∘⍕->#+.⍎⍕
ngn

3

Jöle , 6 bayt

ḟDS+Ɗ€

Girişi için n , bu getiriler [n] eğer n kendi kendine numarası olan [] değilse.

Çevrimiçi deneyin!

Nasıl çalışır

ḟ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.

Hangi kodlama bu altı karakteri yalnızca altı bayta paketler?
WGroleau




3

J , 28, 24, 22 21 bayt

Conor O'Brien sayesinde -1 bayt

Ngn sayesinde -2 bayt

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

Çevrimiçi deneyin!

Açıklama:

i. bir liste 0 .. n-1

( )"+ listedeki her öğe için

.,.&.": onu basamak listesine dönüştürmek,

1# toplamını bul

+ ve öğeye ekleyin

$@-. listeyi argümandan hariç tut ve şekli bul


1
Bunun eski bir yazı olduğunu biliyorum, ancak "0 i.olabilir "+i.(-1 bayt).
Conor O'Brien

1
@ ConorO'Brien Teşekkürler! Sanırım o zamanlar böyle bir golf bilmiyordum; şimdi kullanıyorum (hatırladığımda :))
Galen Ivanov

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

@ngn Teşekkürler, gerçekten çok hoş!
Galen Ivanov

1
@GalenIvanov ayrıca [:( )"+i.->( )"+@i.
ngn

2

Python 2, 70 66 Bayt

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

EDIT: -4 @ user56656 sayesinde


1
python2'de 4 bayt kaydetmek `i`yerine kullanabilirsiniz str(i).
Buğday Sihirbazı

@ user56656 teşekkürler, bunun hakkında hiçbir şey bilmiyordum
sonrad10 22.03.2018

1
İçini [ve ]içini düşürebilirsinsum
Bay Xcoder

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 bayt

!/m+sjdT

Test odası.

Eğer truthy / falsy değerlerinin değiştirilmesine izin verilirse, o zaman bırakıp !yerine 7 byte alabiliriz. Sok'un önerilerinden biri 2 bayt golf atmamı sağladı.

açıklama

! / m + sjdT - Tam program. STDIN'den Q girişi alır, True veya False olarak çıkar.
  m - [0 ... Q) aralığının üstünde d değişkeni ile eşleştirin.
     jdT - d'yi 10 tabanına dönüştürün.
    s - Sum.
   + - Ve toplamı d'ye ekleyin.
 / - Sonuçtaki Q oluşumlarını say.
! - Olumsuz. Örtülü sonucu çıktı.

Yaptım .AmnQ+dsjdT, hiçbir fikrim yoktu /. Görünüşe göre Pyth'i uzun zamandır düzgün kullanmıyorum! +1
Sok

@Sok /temelde bir elemanın listedeki oluşumunu sayar. }Bir nesnenin listede görünüp görünmediğini test eden de kullanabilirim , ancak bence aynı bayt sayısı.
Bay Xcoder

SGerekli olmadığını düşünüyorum - girdi pozitif bir tamsayı olacak, bu nedenle 0harita listesinde yer almak sorun olmaz mı? En azından verilen test durumlarında işe yaradığı görülüyor.
Sok

@Tamam Harika, haklısın! Bu sayede bir bayt daha tıraş ettim.
Bay Xcoder

Nasıl mu +sjdTeklemek sjdTiçin d? Daha önce hiç böyle bir şey görmedim
RK.

2

Perl 6 , 39 33 bayt

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

Denemek!

Öyle adlandırılan örtük tek parametreli çıplak blok:

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

O zamandan beri n + digits(n) >= n, Kolombiya rakamını sorgu değerimize kadar tüm sayılar için hesaplayabilir ve bunlardan herhangi birinin uyuşup uyuşmadığını görebiliriz. Bu, verilen bir girdi için Kolombiya sayısını hesaplar:

{$_ + [+] .comb}

Hedefimize kadar tüm değerlere uyguladığımız:

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

Ancak, @nwellenhof'un belirttiği gibi, bu değerlerin ne olduğunu değil, sadece eşleşip eşleşmediklerini önemseyebiliriz:

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

Gerisi sadece bir bloğa sarılmak ve sarılmak için zorlamadır.

39 bayt

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

@Emigna tarafından sağlanan TIO test bağlantısı

@nwellenhof grep kullanmanın 6 bayt tasarruf edeceğini belirtti.


1
Harika çözüm! Test amacıyla bir TIO bağlantısı ekleyebilirsiniz .
Emigna




2

Japt -d! , 6 bayt

N¥U+ìx

Dene


Orijinal, 8 bayt

Truthy veya falsey için giriş numarasını döndürür 0. JavaScript'te sadece boş dizi falsey olsaydı, bu 7 bayt olabilirdi.

ÂNkUÇ+ìx

Dene


açıklama

             :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 

Alternatif

Ç+ìxÃe¦U

Dene

             :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

Retina , 55 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama:

.+
*

Girişi xunary'ye dönüştürün .

Lv`_+

Bir dizi oluşturma xiçin aşağı 1.

_+
$&$.&

Her birinin ondalık değerini n, bir unary değerine ekleyin.

^_+
$&¶$&

Bir kopyasını alın x.

\d
*

Her ondalık basamağını nunary'ye dönüştürün , böylece basamakları mevcut kopyasına ekleyin n.

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

xSonuçlardan herhangi birinde görünüp görünmediğini kontrol edin .

0

Sonucu ters çevirin.


1

JavaScript (ES6), 52 51 bytes

Saved 1 byte thanks to @l4m2

Returns 0 or 1.

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

Try it online!


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




1

Retina, 24 bytes

.+
*

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

Try it online!

Could be 18 bytes with input given in unary, but the other Retina answer uses decimal as well, so I figured using decimal would make for a fairer comparison.

Explanation

.+
*

Convert input to unary, using _ as the unary digit.


$.`¶$`

At each position in the string (i.e. beginning, end, and between every pair of characters), insert: $.`, the length of the prefix (or the zero-indexed position of the match), , a linefeed, $`, the prefix itself (i.e. a unary representation of the zero-indexed position). E.g. if the input was 3 and we'd have the unary representation ___, then this would result in:

0
_1
__2
___3
___

In other words, we get one line for each number from 0 to the input (inclusive), which holds both a unary and a decimal representation of that number.

\d
*

We convert each digit to unary, which effectively computes the digit sum on each line and adds it to the number itself (all in unary).

D`

Deduplicate lines. This doesn't actually delete duplicate lines but just clears them to empty lines. So if any number from 0 to the input plus its digit sum is equal to the input, the last line will get cleared. Otherwise, the last line remains in place.

.\z

Check whether there's still a character on the last line. We can't use $, because that also matches in front of a trailing linefeed (which is exactly where we don't want to look).


1

Bash + GNU Coreutils, 91 Bytes

Returns truthy or falsy.

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

1

Kotlin, 48 bytes

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

Try it online!

Explanation:

(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 bytes

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

Try it online!

How it works

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 bytes

Å8avj╒Éπ

Run and debug it

Explanation

ASCII equivalent:

{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= is a Stax program that outputs all numbers whose sum of digits added to itself equals the input. For example for 101 the output would be 91 and 100, each on a separate line.

Run and debug it


1

Pyt, 7 bytes

ĐřĐŚ+∈¬

Try it online!

If swapping truthy/falsy values is allowed, then the ¬ at the end can be dropped for 6 bytes.

Explanation:

        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 bytes

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

Try it online!

                  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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.