Apakah saya Nomor Mandiri?

31

Sebuah nomor diri (juga disebut sejumlah Kolombia atau Devlali) adalah nomor alam, xdimana persamaan n + <digit sum of n> = xtidak memiliki solusi untuk setiap nomor alam n. Misalnya, 21 bukan angka mandiri, karena n = 15menghasilkan 15 + 1 + 5 = 21. Di sisi lain, 20 adalah angka mandiri, karena tidak ndapat ditemukan yang memenuhi kesetaraan tersebut.

Karena definisi ini mereferensikan jumlah digit, itu tergantung pada basis. Untuk keperluan tantangan ini, kami hanya akan mempertimbangkan nomor mandiri basis 10, yang merupakan urutan A003052 di OEIS. Bilangan self Biner ( A010061 ) dan basis 100 ( A283002 ) juga telah dikalibrasi.

Tantangan

Diberikan bilangan bulat positif xsebagai input, menghasilkan nilai kebenaran jika xbilangan mandiri di basis 10, dan nilai falsey sebaliknya. Untuk klarifikasi nilai-nilai kebenaran dan falsey, lihat meta postingan ini pada subjek .

Anda dapat menulis program atau fungsi lengkap, dan input dan output dapat disediakan di salah satu saluran yang biasa. Celah standar tentu saja dilarang.

Ini adalah , jadi semakin pendek jawaban Anda (dalam byte) semakin baik!

Uji kasus

Benar:

1
3
5
7
9
20
31
86
154
525

Falsey:

2
4
6
8
10
15
21
50
100
500

Tautan kotak pasir

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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

Sok
sumber
Tampaknya ada beberapa diskusi / ketidaksepakatan tentang hasil yang valid, jadi saya pikir saya belum jelas tentang apa yang saya maksudkan. Saya telah menambahkan sebuah kalimat yang semoga menghapus semuanya, merujuk pada meta post ini . Maaf jika saya menyebabkan kebingungan tentang ini!
Sok
Bukan untuk menimbulkan lebih banyak kebingungan, tapi saya pikir diskusi ini relevan dengan mengapa ada beberapa kebingungan. Harap pertimbangkan ini ketika membuat tantangan di masa depan, karena mungkin sulit untuk memposting dalam bahasa yang tidak memiliki jika / jika dikonstruksi jika Anda menggunakan konsensus lama.
FryAmTheEggman
@FryAmTheEggman Saya tidak menyadari bahwa konsensus telah berubah, saya merasa seperti orang yang kurang ajar sekarang: / Tetap saja, saya sudah menambahkan satu klarifikasi sekarang, sepertinya salah untuk mengubahnya lagi. Saya hanya akan mengingatnya untuk tantangan berikutnya yang saya posting. Terima kasih
Sok
2
Saya bukan nomor apa pun! Saya orang bebas!
David Richerby
1
@DavidRicherby * mengirim bola putih setelah Anda *
Sok

Jawaban:

7

Java (JDK 10) , 84 byte

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

Cobalah online!

Penjelasan

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
}

Kredit

Olivier Grégoire
sumber
1
-1 byte: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 byte: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 byte

LD€SO+ÊW

Cobalah online! atau sebagai Test suite

Penjelasan

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
Emigna
sumber
5

Brachylog , 12 byte

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

Cobalah online!

Penjelasan

¬{         }    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
Fatalisasi
sumber
1
Apakah false.nilai kebenaran dengan metode objektif apa pun true.tidak? Saya pikir tidak, dan sepertinya itu akan didukung oleh konsensus meta
Sok
1
@Sok Saya menambahkan 3 byte yang tidak menarik untuk mengatasi kekhawatiran Anda.
Fatalkan
5

C (gcc) , 70 67 65 byte

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

Cobalah online!

Untuk mengurangi 2 byte lainnya, nilai kebenaran yang dikembalikan tidak lagi 1, tetapi jumlahnya sendiri.

gastropner
sumber
4

Oktaf , 49 47 44 byte

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

Cobalah online!

Penjelasan:

Mencoba melakukan operasi pada suatu rentang adalah rumit dan panjang, karena num2strmengembalikan sebuah string dengan spasi sebagai pemisah jika ada lebih dari jumlah input. Mengurangi 48 akan memberikan sesuatu seperti: 1 -16 -16 2 -16 -16 3 -16 -16 4untuk rentang input 1 ... 4 . Menyingkirkan semua -16membutuhkan banyak byte.

Oleh karena itu, kami akan melakukan ini dengan menggunakan loop arrayfun. Untuk setiap angka k = 1 .. x , di mana x adalah input, kita tambahkan kdan jumlah digitnya, dan kurangi x. Ini akan mengembalikan array dengan hasil operasi itu untuk masing-masing angka dalam k . Jika salah satu angka dalam array adalah nol, angka tersebut bukan angka mandiri.

Untuk input 20dan 21, outputnya adalah:

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

Hanya ada elemen non-nol untuk input 20, dan setidaknya satu elemen non-nol untuk input 21. Itu berarti itu 20nomor mandiri, dan 21bukan.

Oktaf memperlakukan array dengan setidaknya satu nol sebagai false, seperti dapat dilihat di TIO-link.

Stewie Griffin
sumber
4

MATL , 11 byte

t:tFYA!Xs+-

Outputnya adalah array yang tidak kosong, yang benar jika semua entri tidak nol, dan palsu jika mengandung satu atau lebih nol.

Cobalah online! Atau verifikasi semua kasus uji , termasuk uji kebenaran / kesalahan.

Penjelasan

Pertimbangkan input n = 10sebagai contoh.

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
Luis Mendo
sumber
3

APL (Dyalog) , 14 byte

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

Cobalah online!

Bagaimana?

                  range
     (  ⍎¨∘⍕)      digits
     (+/    )      digit sums
   ⍳+              vectorized addition with the range
 ⊢∊                is the input included?
~                  negate
Uriel
sumber
itu 16 byte. untuk membuat mereka 15: +/⍎¨∘⍕->#+.⍎⍕
ngn
3

Jelly , 6 byte

ḟDS+Ɗ€

Untuk input n , ini mengembalikan [n] jika n adalah angka mandiri, [] jika tidak.

Cobalah online!

Bagaimana itu bekerja

ḟ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.
Dennis
sumber
Pengkodean apa yang mengemas enam karakter ini menjadi hanya enam byte?
WGroleau
1
Jelly menggunakan halaman kode khusus .
Dennis
3

J , 28, 24, 22 21 byte

-1 byte terima kasih kepada Conor O'Brien

-2 byts terima kasih kepada ngn

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

Cobalah online!

Penjelasan:

i. daftar 0 .. n-1

( )"+ untuk setiap item dalam daftar

.,.&.": mengonversinya menjadi daftar angka,

1# temukan jumlah mereka

+ dan tambahkan ke item

$@-. kecualikan daftar dari argumen dan temukan bentuk

Galen Ivanov
sumber
1
Saya menyadari ini adalah posting lama, tetapi "0 i.bisa "+i.(-1 byte).
Conor O'Brien
1
@ ConorO'Brien Terima kasih! Saya pikir saya tidak tahu jenis golf saat itu; sekarang saya menggunakannya (ketika saya ingat :))
Galen Ivanov
1
-.@e.->$@-.
ngn
@ ngn Terima kasih, sangat bagus!
Galen Ivanov
1
@ GalenIvanov juga [:( )"+i.->( )"+@i.
ngn
2

Python 2, 70 66 Bytes

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

EDIT: -4 terima kasih kepada @ user56656

sonrad10
sumber
1
di python2 Anda dapat menggunakan `i`bukannya str(i)menyimpan 4 byte.
Wheat Wizard
@ user56656 terima kasih, saya tidak tahu tentang itu
sonrad10
1
Anda dapat []sum
meletakkan
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 byte

!/m+sjdT

Suite uji.

Jika menukar nilai true / falsy diperbolehkan, maka kita bisa menjatuhkan !dan mendapatkan 7 byte sebagai gantinya. Salah satu saran Sok membantu saya bermain golf 2 byte.

Penjelasan

! / m + sjdT - Program lengkap. Mengambil input Q dari STDIN, menghasilkan True atau False.
  m - Peta pada rentang [0 ... Q) dengan variabel d.
     jdT - Konversi d ke basis 10.
    s - Jumlah.
   + - Dan tambahkan jumlahnya ke d itu sendiri.
 / - Hitung kemunculan Q di hasilnya.
! - Meniadakan. Secara implisit mengeluarkan hasilnya.
Tuan Xcoder
sumber
Saya pernah .AmnQ+dsjdT, saya tidak tahu /. Saya sudah lama tidak menggunakan Pyth dengan benar! +1
Sok
@Sok /pada dasarnya menghitung kemunculan elemen dalam daftar. Saya juga dapat menggunakan }, yang menguji apakah suatu objek muncul dalam daftar, tetapi saya pikir itu adalah jumlah byte yang sama.
Tn. Xcoder
Saya pikir Stidak diperlukan - input akan menjadi bilangan bulat positif, sehingga memiliki 0dalam daftar pemetaan tidak akan menjadi masalah? Paling tidak, tampaknya berfungsi untuk kasus uji yang diberikan.
Sok
@ Oke, Anda benar! Saya mencukur satu byte lagi berkat ini.
Tn. Xcoder
Bagaimana +sjdTmenambahkan sjdTke d? Saya belum pernah melihat yang seperti itu
RK.
2

Perl 6 , 39 33 byte

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

Cobalah!

Blok kosong dengan parameter tunggal implisit, yang disebut sebagai:

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

Karena n + digits(n) >= n, kami hanya dapat menghitung angka Kolombia untuk semua angka hingga nilai kueri kami dan melihat apakah ada yang cocok. Jadi ini menghitung angka Kolombia untuk input yang diberikan:

{$_ + [+] .comb}

Yang kami terapkan untuk semua nilai hingga target kami:

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

Tetapi kami hanya peduli apakah salah satu dari mereka cocok, bukan apa nilai-nilai itu, jadi seperti yang ditunjukkan oleh @nwellenhof, kita dapat grep:

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

Sisanya hanya paksaan untuk bool dan membungkus sebuah blok.

39 byte

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

TIO test link disediakan oleh @Emigna

@nwellenhof menunjukkan bahwa menggunakan grep akan menghemat 6 byte!

Phil H
sumber
1
Solusi keren! Anda dapat menambahkan tautan TIO untuk tujuan pengujian.
Emigna
1
{!grep $_,map {$_+[+] .comb},^$_}selama 33 byte.
nwellnhof
29 byte
Jo King
2

Python 3 , 60 , 56 , 55 , 54 byte

lambda x:{x}-{n+sum(map(int,str(n)))for n in range(x)}

Cobalah online!

-4 menggunakan semua invers daripada
-1 dengan mengubah! =
Ke ^ oleh @ jonathan-allan -1 dengan menggunakan set oleh @ovs

Rick Rongen
sumber
2

Japt -d! , 6 byte

N¥U+ìx

Cobalah


Asli, 8 byte

Mengembalikan nomor input untuk truey atau 0for falsey. Jika hanya array kosong yang salah dalam JavaScript, ini bisa 7 byte.

ÂNkUÇ+ìx

Cobalah


Penjelasan

             :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

Cobalah

             :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
Shaggy
sumber
1

Retina , 55 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

.+
*

Konversikan input xke unary.

Lv`_+

Buat rentang dari xbawah hingga 1.

_+
$&$.&

Sufiks nilai desimal masing-masing nke nilai unarynya.

^_+
$&¶$&

Buat salinan x.

\d
*

Konversi setiap angka desimal nmenjadi unary, sehingga menambahkan digit ke salinan n.

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

Periksa apakah xmuncul di salah satu hasil.

0

Balikkan hasilnya.

Neil
sumber
1

JavaScript (ES6), 52 51 byte

Disimpan 1 byte berkat @ l4m2

Mengembalikan 0 atau 1 .

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

Cobalah online!

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

Haskell , 63 58 byte

s 0=0
s x=x`mod`10+s(x`div`10)
f n=all(\x->x+s x/=n)[1..n]

Cobalah online!

Cristian Lupascu
sumber
1

Ruby , 38 byte

->x{(1..x).all?{|n|n+n.digits.sum!=x}}

Cobalah online!

Kirill L.
sumber
1

Retina , 24 byte

.+
*

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

Cobalah online!

Bisa jadi 18 byte dengan input yang diberikan dalam unary, tetapi jawaban Retina lainnya menggunakan desimal juga, jadi saya pikir menggunakan desimal akan membuat perbandingan yang lebih adil.

Penjelasan

.+
*

Ubah input menjadi unary, gunakan _sebagai digit unary.


$.`¶$`

Di setiap posisi dalam string (yaitu awal, akhir, dan di antara setiap pasangan karakter), masukkan:, $.`panjang awalan (atau posisi nol-diindekskan dari pertandingan),, umpan baris,, $`awalan itu sendiri (yaitu representasi unary dari posisi diindeks nol). Misalnya jika inputnya adalah 3dan kita akan memiliki perwakilan unary ___, maka ini akan menghasilkan:

0
_1
__2
___3
___

Dengan kata lain, kita mendapatkan satu baris untuk setiap angka dari 0 hingga input (inklusif), yang memiliki representasi unary dan desimal dari angka tersebut.

\d
*

Kami mengonversi setiap digit menjadi unary, yang secara efektif menghitung jumlah digit pada setiap baris dan menambahkannya ke nomor itu sendiri (semuanya dalam unary).

D`

Garis terputus-putus. Ini sebenarnya tidak menghapus duplikat baris tetapi hanya membersihkannya ke baris kosong. Jadi, jika angka dari 0 hingga input ditambah jumlah digitnya sama dengan input, baris terakhir akan dihapus. Kalau tidak, baris terakhir tetap di tempatnya.

.\z

Periksa apakah masih ada karakter di baris terakhir. Kami tidak dapat menggunakan $, karena itu juga cocok di depan linefeed Trailing (yang persis di mana kami tidak ingin melihat).

Martin Ender
sumber
1

Bash + GNU Coreutils, 91 Bytes

Mengembalikan kebenaran atau kepalsuan.

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

Kotlin , 48 byte

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

Cobalah online!

Penjelasan:

(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
Makotosan
sumber
1

Tambahkan ++ , 27 byte

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

Cobalah online!

Bagaimana itu bekerja

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]
caird coinheringaahing
sumber
1

Stax , 8 byte

Å8avj╒Éπ

Jalankan dan debug itu

Penjelasan

Setara 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=adalah program Stax yang menampilkan semua angka yang jumlah digitnya ditambahkan sama dengan input. Misalnya untuk 101output akan 91dan 100, masing-masing pada jalur yang terpisah.

Jalankan dan debug itu

Weijun Zhou
sumber
1

Pyt , 7 byte

ĐřĐŚ+∈¬

Cobalah online!

Jika menukar nilai true / falsy diperbolehkan, maka ¬pada akhirnya dapat dijatuhkan selama 6 byte.

Penjelasan:

        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
mudkip201
sumber
1

J , 20 byte

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

Cobalah 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.
FrownyFrog
sumber