Dilema Disarium

31

Dilema Disarium

Disarium didefinisikan sebagai angka yang:

jumlah digitnya yang diberdayakan dengan posisi masing-masing sama dengan angka aslinya


Tugas Anda :

Anda memiliki obsesi aneh dengan angka-angka yang diklasifikasikan sebagai disarium. Kebutuhan untuk mengikuti cara-cara disarium begitu besar dalam diri Anda sehingga Anda menolak untuk membaca halaman-halaman bernomor non-disarium dalam buku apa pun. Anda memiliki dua masalah BESAR :

  1. Profesor Anda baru saja menugaskan Anda untuk membaca buku teks Anda dari halaman nke halamanm
  2. Anda memukul kepala Anda dengan sangat keras minggu lalu dan sepertinya tidak dapat mengingat bagaimana secara program menentukan apakah suatu angka dianggap sebagai disarium.

Waktu sangat penting sehingga kode untuk menentukan halaman yang perlu Anda baca harus sesingkat mungkin.

Anda perlu mengidentifikasi semua disarium yang dalam rentang termasuk nmelalui m.

Contoh disarium :

89 = 8 1 + 9 2

135 = 1 1 + 3 2 + 5 3

518 = 5 1 + 1 2 + 8 3

Ini adalah kode-golf, jadi jumlah byte terkecil yang menang!

Berikut ini adalah urutan lengkap A032799 .

CraigR8806
sumber
@Fatalize Rentang ini inklusif, saya akan mengedit pertanyaan untuk mencerminkan ini.
CraigR8806
Apakah ada batas yang dijamin pada ndan m? Ada disarium yang sangat besar (12157692622039623539), haruskah jawaban dapat mengidentifikasinya?
Lynn
@ Lynn Mengingat bahwa sudah ada sejumlah solusi, saya akan mengatakan tidak boleh ada batas pada kisaran.
CraigR8806
2
@ Lynn. Tidak ada disarium> 22 digit, jadi jaraknya sudah dibatasi.
Fisikawan Gila
3
@MistahFiggins Silakan buka tautan OEIS di bagian bawah pertanyaan. Anda akan menemukan bukti yang menunjukkan bahwa urutan Disarium memang terbatas.
CraigR8806

Jawaban:

11

Perl 6 , 40 39 byte

{grep {$_==sum .comb Z**1..*},$^a..$^b}

Cobalah online!

Bagaimana itu bekerja

{                                     }  # A lambda.
                              $^a..$^b   # Range between the two lambda arguments.
 grep {                     },           # Return numbers from that range which satisfy:
               .comb Z  1..*             #  Digits zipped with the sequence 1,2,3,...,
                      **                 #  with exponentiation operator applied to each pair,
           sum                           #  and those exponents summed,
       $_==                              #  equals the number.
seseorang
sumber
8

Python2, 98 89 88 84 byte

lambda n,m:[x for x in range(n,m+1)if sum(int(m)**-~p for p,m in enumerate(`x`))==x]

Mengerikan. Akan semakin pendek. Mulai terlihat lebih baik

Inilah upaya rekursif saya (86 byte):

f=lambda n,m:[]if n>m else[n]*(sum(int(m)**-~p for p,m in enumerate(`n`))==n)+f(n+1,m)

Terima kasih kepada @Rod karena telah menghemat 4 byte! rangeke enumeratedan seterusnya.

Yytsi
sumber
beralih ke enumerate, Anda dapat menggunakan int(n)sebagai gantinyaint(`x`[p])
Rod
7

Perl, 43 byte

map{say if$_==eval s/./+$&**$+[0]/gr}<>..<>

Cobalah online!

Regex sangat kuat, kalian.

Penjelasan

Hal pertama yang dilakukan kode adalah membaca dua bilangan bulat sebagai input via <>, dan membuat rentang dari yang pertama ke yang kedua.. . Ia kemudian menggunakan standar mapfungsi untuk iterate melalui kisaran ini, dan berlaku kode berikut untuk setiap nilai: say if$_==eval s/./+$&**$+[0]/gr. Ini terlihat seperti omong kosong, dan memang begitulah, tapi inilah yang sebenarnya terjadi.

map secara implisit menyimpan nilai saat ini dalam variabel $_ . Banyak fungsi perl dan operasi menggunakan nilai ini ketika tidak ada yang diberikan. Ini termasuk ekspresi reguler, seperti s///operator substitusi.

Ada empat bagian untuk regex substitusi:

  1. String yang akan dimanipulasi. Biasanya, operator =~digunakan untuk menerapkan regex ke string, tetapi jika operator ini tidak ada, maka regex diterapkan ke variabel implisit$_ , yang berisi nomor kami saat ini melaluimap fungsi.
  2. String untuk mencari. Dalam hal ini, kami sedang mencari karakter tunggal non-baris baru, dilambangkan dengan wildcard. . Akibatnya, kami menangkap setiap digit individu.
  3. String untuk diganti dengan. Kami mengganti tanda tambah +diikuti oleh ekspresi matematika, dicampur dengan beberapa variabel Perl ajaib yang membuat semuanya secara signifikan lebih mudah.

Variabel skalar khusus $&selalu berisi keseluruhan dari penangkapan regex sukses terakhir, yang dalam hal ini adalah satu digit. Variabel array khusus @+selalu berisi daftar offset postmatch untuk kecocokan sukses terakhir, yaitu indeks teks setelah pertandingan. $+[0]adalah indeks $_teks segera berikut $&. Dalam kasus 135, kami menangkap digit 1, dan indeks 135teks segera setelahnya (yaitu, 35) adalah 1, yang merupakan eksponen kami. Jadi, kami ingin meningkatkan $&(1) ke kekuatan$+[0] (1) dan mendapatkan 1. Kami ingin menaikkan 3 ke kekuatan 2 dan mendapatkan 9. Kami ingin menaikkan 5 ke kekuatan 3 dan mendapatkan 125.

Jika input tadi 135, string yang dihasilkan adalah +1**1+3**2+5**3.

  1. Regex-modifying flags. Di sini kami menggunakan dua bendera regex - /gdan /r. /gmemberitahu juru bahasa untuk melanjutkan penggantian setelah yang pertama ditemukan (kalau tidak kita akan berakhir dengan +1**135). /rmemberi tahu penerjemah untuk tidak mengubah string asli , dan sebaliknya mengembalikan apa yang akan menjadi string setelah penggantian. Ini penting, karena jika tidak, itu akan ditimpa $_, dan kita memerlukannya untuk tujuan perbandingan.

Setelah seluruh penggantian dilakukan, kita mendapatkan ekspresi matematika, yang dievaluasi dengan evalfungsinya. +1**1+3**2+5**3dievaluasi menjadi 1 + 9 + 125 = 135, yang dibandingkan dengan nomor aslinya 135. Karena keduanya sama, kode mencetak angka.

Gabriel Benamy
sumber
Solusi indah. (Perhatikan bahwa ini tidak akan berfungsi adalah input pertama adalah 0, tapi saya tidak yakin itu penting). Beberapa byte untuk golf:map$_-eval s/./+$&**$+[0]/gr||say,<>..<>
Dada
Dan "@+"1 byte lebih pendek dari $+[0]:)
Dada
7

JavaScript (ES7), 105 91 89 88 83 79 82 81 byte

Terima kasih kepada Arnauld untuk menghemat 20B, dan ETHProduk untuk menghemat 6B!

a=>b=>[...Array(b).keys()].filter(c=>c>=a&([...c+''].map(d=>c-=d**++e,e=0),!c))

Pemakaian

Tetapkan fungsi ke variabel, dan berikan minimum dan maksimum sebagai argumen. Contoh:

f=a=>b=>[...Array(b).keys()].filter(c=>c>=a&([...c+''].map(d=>c-=d**++e,e=0),!c))
f(0)(90)

Keluaran

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 89]

Golf lebih lanjut

Ini sepertinya golf yang bagus, tapi selalu ada ruang untuk perbaikan ... saya pikir.

Luke
sumber
Ya, itu sebenarnya sedikit lebih pendek. Terima kasih!
Luke
1
Anda dapat mengubah d**(e+1)ke d**-~euntuk menyimpan dua byte.
ETHproduk
Terima kasih atas tipnya, menambahkannya. Hanya 2 byte lagi sebelum kita mengalahkan Python ...
Luke
Anda bisa menggunakan &bukan &&. Satu byte lagi untuk pergi ...
Arnauld
Saya baru saja mengubah itu di salinan lokal saya ... Sepertinya Anda lebih cepat.
Luke
6

JavaScript (Firefox 52+), 68 byte

f=(n,m)=>(e=0,[for(d of t=n+'')t-=d**++e],t||alert(n),n-m&&f(n+1,m))

Fungsi rekursif yang dihasilkan melalui alert. Bekerja di Edisi Pengembang Firefox, yang dapat Anda unduh di halaman ini . Versi Firefox sebelumnya tidak mendukung **operator, dan tidak ada browser lain yang mendukung [for(a of b)c]sintaksis.

Cuplikan tes

Ini menggunakan .mapalih-alih pemahaman array, dan Math.powbukannya **, jadi itu harus bekerja di semua browser yang mendukung ES6.

Produksi ETH
sumber
6

05AB1E , 12 byte

Disimpan 2 byte berkat Emigna

ŸvygLySmOyQ—

Cobalah online!

Ÿ            # push [a .. b]
 vy          # for each
   gL        # push [1 .. num digits]
     yS      # push [individual digits]
       m     # push [list of digits to the power of [1..num digits] ]
        O    # sum
         yQ— # print this value if equal
Riley
sumber
ŸvygLySmOyQ—harus bekerja selama 12 byte.
Emigna
5

Python 3, 100 byte

lambda n,m:{*range(10),89,135,175,518,598,1306,1676,2427,2646798,0xa8b8cd06890f2773}&{*range(n,m+1)}

Bukan pendekatan terpendek, tapi yang cukup lucu. Ada banyak sekali disarium; lihat halaman OEIS untuk bukti yang bagus. Ini semuanya.

Lynn
sumber
Ini adalah penggunaan hard-coding yang merupakan celah meta.codegolf.stackexchange.com/a/1063/55243 Saya akan merekomendasikan Anda mengubah jawaban Anda agar sesuai dengan aturan standar
george
5
Saya tidak berpikir ini melanggar aturan hard-coding, karena program ini masih "tidak berfungsi" dan outputnya tidak hard-coded.
Alex Howansky
4

R, 100 byte

function(n,m,x=n:m)x[sapply(x,function(y)sum(as.integer(el(strsplit(c(y,""),"")))^(1:nchar(y)))==y)]

Fungsi tanpa nama yang mengambil ndan m. Seperti biasa dalam R, membelah bilangan bulat menjadi vektor angka numerik itu membosankan dan memakan banyak byte. Ini membuat fungsinya relatif lambat dan hanya berfungsi untuk bilangan bulat 32-bit.

Billywob
sumber
4

Jelly , 11 byte

D*J$S⁼
rÇÐf

Cobalah online!

Kurangi ini dari 16 menjadi 11, dengan bantuan dari @miles!

Penjelasan:

rÇÐf    Main link, arguments are m and n
r       Generate a list from m to n
 Ç      Invoke the helper link
  Ðf    And filter out all that don't return 1 on that link

D*J$S⁼  Helper link, determines if item is Disarium
D       Break input (the current item of our list in Main) into digits (135 --> [1, 3, 5])
  J$    Create a range from 1 to x, where x is the number of digits             [1, 2, 3]
 *      Raise each digit to the power of their respective index 
    S⁼  And return a 1 if the sum of powers is equal to the helper-link's input
steenbergh
sumber
Anda bisa menggunakan Juntuk mendapatkan indeks. Cara yang lebih pendek mungkin D*J$S⁼untuk menggabungkan dua Anda link dalam satu
mil
Tiba tepat pada kesimpulan itu sekitar 20 detik yang lalu. Thnx!
steenbergh
3

CJam , 23 byte

q~),\>{_Ab_,,:).#:+=},p

Cobalah online!

Penjelasan

q~                      Get and eval all input
  ),\>                  Get the range between m and n, inclusive
      {                 For each number in the range...
       _Ab               Duplicate and get the list of digits
          _,,:)          Duplicate the list, take its length, make the range from 1 to length
               .#        Vectorize with exponentiation; computes first digit^1, second^2, etc
                 :+      Sum the results
                   =     Compare to the original number
                    },  Filter the range to only numbers for which the above block is true
                      p Print nicely
Kucing Bisnis
sumber
3

Python 2.X, 92 byte

lambda m,n:[k for k in range(m,n+1)if sum(int(j)**(i+1) for i,j in enumerate(list(`k`)))==k]
hashcode55
sumber
Spasi putih tidak berguna setelahnya (i+1), tetapi ini tidak menjadi masalah, saat Anda menyingkirkan tanda kurung dengan melakukan -~i.
Yytsi
Itu akan membuat upaya saya sama persis dengan milik Anda!
hashcode55
Hampir. Anda punya list('k'), yang saya tidak punya. Namun, Anda masih dapat menghapus spasi :)
Yytsi
3

Python 2 , 84 byte

Pendekatan program penuh, saat ini sama dengan solusi lambda.

a,b=input()
while a<=b:
 t=p=0
 for x in`a`:p+=1;t+=int(x)**p
 if t==a:print a
 a+=1

Cobalah online!

FlipTack
sumber
Hmm. Saya memikirkan jawaban yang hampir tepat, tetapi dibuang karena kebingungan input(). Sangat bagus! +1.
Yytsi
3

Japt, 15 byte

òV f_¥Zì £XpYÄÃx

Uji secara online! Ini adalah kolaborasi antara @obarakon dan saya.

Bagaimana itu bekerja

òV f_¥Zì £XpYÄÃx   // Implicit: U, V = input integers
òV                 // Create the inclusive range [U...V].
   f_              // Filter to only the items Z where...
               x   //   the sum of
      Zì           //   the decimal digits of Z,
         £XpYÄÃ    //   where each is raised to the power of (index + 1),
     ¥             //   is equal to Z.
                   // Implicit: output result of last expression

Dalam versi terbaru dari Japt, xmenerima fungsi sebagai argumen, yang memungkinkan kita untuk membuat byte lain:

òV f_¥Zì x@XpYÄ

Uji secara online!

Produksi ETH
sumber
2

Clojure, 107 byte

#(for[i(range %(inc %2)):when(=(int(apply +(map(fn[i v](Math/pow(-(int v)48)(inc i)))(range)(str i))))i)]i)

Menerapkan persamaan sangat lama.

NikoNyrh
sumber
dapat menghemat beberapa byte dengan melakukan(.pow(-(int v)48M)
cliffroot
2

TI-Basic, 85 byte

Input 
For(I,X,Y
If I<=9 or sum(I={89,135,175,518,598,1306,1676,2427,2646798,12157692622039623539
Disp I
End
Timtech
sumber
Saya tidak tahu hard-coding diizinkan. :)
Abel Tom
@ BelTom Yah, sangat membantu kalau seri ini hanya memiliki 20 syarat. Juga, mengubah angka menjadi string di TI-Basic membutuhkan banyak byte. Hanya solusi lain untuk int(log(setiap angka dan kemudian melakukan kekuatan. Mungkin ini lebih pendek, tapi saya ragu.
Timtech
Metode input itu sangat pintar tapi agak samar. Anda harus berada dalam FUNCmode dan jendela harus diatur untuk memasukkan titik input Anda. Sepertinya tidak cukup portabel untuk saya.
Jakob
@ JakobCornell Secara default calc dalam FUNCmode, meskipun saya melihat apa yang Anda katakan tentang resolusi input. Tapi, metode ini cukup umum dalam bermain golf. Anda selalu bisa Prompt X,Ysebagai gantinya.
Timtech
2

Haskell, 61 byte

n#m=[i|i<-[n..m],i==sum(zipWith(^)(read.pure<$>show i)[1..])]

Contoh penggunaan 5 # 600-> [5,6,7,8,9,89,135,175,518,598].

Periksa setiap nomor idalam kisaran [n..m]. Digit diekstraksi dengan mengubah imenjadi string ( show) dan membuat masing-masing karakter menjadi satu elemen string ( pure) yang diubah menjadi integer lagi ( read). Zip elemen-elemen angka dengan dengan [1..]melalui fungsi ^dan mengambil sum.

nimi
sumber
2

PHP, 92 91 88 byte

3 byte disimpan berkat @AlexHowansky

for([,$n,$m]=$argv;$n<=$m;$s-$n++?:print"$s,")for($i=$s=0;_>$b=($n._)[$i++];)$s+=$b**$i;

mengambil input dari argumen baris perintah; mencetak koma jejak. Jalankan dengan -r.

Titus
sumber
1
Hemat tiga denganfor([,$n,$m]=$argv;$n<=$m;
Alex Howansky
Aneh bahwa cetak berfungsi di sana tetapi gema tidak. Saya kira karena gema tidak mengembalikan apa pun - bahkan tidak nol, anehnya.
Alex Howansky
@AlexHowansky: Ini juga aneh "$n"[index]dan "_$n"[index]menghasilkan kesalahan parse sementara "89"[index]dan $s="$n";$s[index]baik-baik saja.
Titus
Hmm ya, itu memang tampak aneh pada awalnya, tetapi setelah memeriksa dokumen, tampaknya mereka secara eksplisit mengatakan bahwa fitur ini hanya berfungsi untuk string literal.
Alex Howansky
Heh heh well ini berfungsi, tetapi mungkin tidak menghemat byte:("_$n")[index]
Alex Howansky
2

Mathematica, 59 byte

Select[Range@##,Tr[(d=IntegerDigits@#)^Range@Length@d]==#&]&

Fungsi tanpa nama mengambil dua argumen integer dan mengembalikan daftar integer. (d=IntegerDigits@#)^Range@Length@dmenghasilkan daftar digit angka dengan kekuatan yang sesuai;Tr[...]==#mendeteksi apakah jumlah angka-angka tersebut sama dengan angka aslinya.

Greg Martin
sumber
2

MATLAB, 88 73 byte

@(n,m)find(arrayfun(@(n)n==sum((num2str(n)-48).^(1:log10(n)+1)),n:m))+n-1

Jawaban asli:

function g(n,m);a=n:m;a(arrayfun(@(n)n==sum((num2str(n)-'0').^(1:floor(log10(n))+1)),a))

num2str(n)-'0'membagi a nmenjadi vektor digit-nya, dan 1:floor(log10(n))+1merupakan vektor yang menahan satu ke jumlah digit n. Terima kasih untuk log golf ke fungsi anonim, menghemat 15 byte.

MattWH
sumber
1

Haskell , 82 76 75 byte

n!m=[x|x<-[n..m],x==x#(length.show)x]
0#i=0
n#i=(div n 10)#(i-1)+mod n 10^i

Cobalah online!Pemakaian:5 ! 175

Ini memeriksa setiap angka dalam kisaran nuntuk mapakah itu nomor disarium dan karenanya cukup lambat untuk besarm .


Versi lebih cepat: (93 byte)

n!m=[x|x<-[0..9]++[89,135,175,518,598,1306,1676,2427,2646798,12157692622039623539],x>=n,x<=m]

Cobalah online!

Laikoni
sumber
1

C (gcc) , 136 byte

r[]={0,0};f(n){if(n)f(n/10),r[1]=pow((n%10),*r)+r[1]+.5,r[0]++;else*r=1,r[1]=0;}g(m,x){for(;m<=x;m++){f(m);if(m==r[1])printf("%d,",m);}}

Header mendefinisikan pow pada TIO karena untuk beberapa alasan tidak otomatis menyertakan pow. Komputer saya melakukannya, jadi saya akan melakukannya.

Cobalah online!

nmjcman101
sumber
1

MATL , 16 byte

&:"@tFYAtn:^s=?@

Cobalah online!

&:        % Input two n, m implicitly. Push array [n n+1 ... m]
"         % For each k in that array
  @       %   Push k
  tFYA    %   Duplicate. Convert to decimal digits
  tn:     %   Duplicate. Push [1 2 ... d], where d is the number of digits
  ^       %   Element-wise power
  s       %   Sum of array
  =       %   Compare with previous copy of k: is it equal?
  ?       %   If so
    @     %     Push k
          %   End, implicit
          % End, implicit
          % Display stack, implicit
Luis Mendo
sumber
1

Batch, 115 byte

@for %%d in (0 1 2 3 4 5 6 7 8 9 89 135 175 518 598 1306 1676 2427 2646798)do @if %%d geq %1 if %%d leq %2 echo %%d

Batch hanya memiliki aritmatika 32-bit yang tidak memiliki cara membandingkan angka disarium terakhir, tetapi jika Anda bersikeras untuk perbandingan string, maka untuk 402 byte:

@echo off
for %%d in (0 1 2 3 4 5 6 7 8 9 89 135 175 518 598 1306 1676 2427 2646798 12157692622039623539)do call:c %1 %%d&&call:c %%d %2&&echo %%d
exit/b
:c
call:p %1 %2
set r=%s%
call:p %2 %1
:g
if %r:~,1% lss %s:~,1% exit/b0
if %r:~,1% gtr %s:~,1% exit/b1
if %r%==%s% exit/b0
set r=%r:~1%
set s=%s:~1%
goto g
:p
set s=%1
set t=%2
:l
set s=0%s%
set t=%t:~1%
if not "%t%"=="" goto l
Neil
sumber
1

Python 2, 100 byte

for i in range(input(),input()+1):x=sum(int(`i`[n])**-~n for n in range(len(`i`)));print("",x)[x==i]

Saya belum memiliki kesempatan untuk menjalankan ini (melakukan ini di ponsel saya).

Daniel
sumber
Ini tidak berfungsi. Sintaks yang salah dan ketika diperbaiki, hanya akan mencetak nilai boolean. Mulai dari eksponen 0, yang juga salah. Juga, Anda tidak perlu tanda kurung di dalam sum.
Yytsi
Ini bukan memeriksa nomor disarium.
hashcode55
@ hashcode55, diperbaiki (?)
Daniel
@ TuukkaX, sekarang seharusnya sudah berfungsi saya rasa
Daniel
Saya tidak menggunakan komputer, tetapi ini harus mencetak baris baru pada setiap iterasi, di mana iDisarium. Saya tidak tahu apakah ini diperbolehkan, tetapi saya akan mengatakan tidak, karena hasilnya menjadi sangat kosong.
Yytsi
1

Scala, 132 129 byte

(% :Int,^ :Int)=>for(i<- %to^)if(((0/:(i+"").zipWithIndex)((z,f)=>{z+BigInt(f._1.toInt-48).pow(f._2+1).intValue}))==i)println(i)

129 edit: Mengubah nama variabel for loop dari &menjadi itiga ruang yang disimpan.


Penjelasan

Untuk setiap nilai dalam rentang input:

  • mengubahnya menjadi string dengan +""
  • gunakan zipWithIndexuntuk menghasilkan daftar tupel yang mengandung karakter angka dan indeksnya
  • lipat daftar dengan mengembalikan nilai int masing-masing dikurangi 48 (garis hingga 0-9) dengan kekuatan indeks daftar ditambah satu (untuk mulai dari ^ 1)
  • jika hasilnya cocok dengan input, cetaklah

Komentar

Akhirnya sempat belajar bagaimana folddan zipWithIndexbekerja. Saya tidak senang dengan intkonversi, tetapi saya senang dengan ringkasnya folddan zipWithIndex.

Archmage berdiri bersama Monica
sumber
1

Oktaf, 88 , 87 byte

Terima kasih kepada MattWH karena telah menyimpan byte (f (x) -48 vs f (x) - '0')

@(n,m,f=@num2str,a=n:m)a(a==cell2mat(arrayfun(@(x){sum((f(x)-48).^(1:nnz(f(x))))},a)))

Untuk berlari:

>> f=@(n,m,f=@num2str,a=n:m)a(a==cell2mat(arrayfun(@(x){sum((f(x)-'0').^(1:nnz(f(x))))},a))) 
>> f(0,1000)
ans = 
      1     2     3     4     5     6     7     8     9    89   135   175   518   598

Penjelasan

@(n,m,                                              % Create an anonymous function and pass it n and m as paramteres
    f=@num2str,                                     % Will be using the num2str mehtod twice, set the variable f to the handle to save on bytes
        a=n:m)                                      % Create a vector 'a' and populate it with the numbers n through m
            a(a==                                   % Logically index into a, where the values of a match Disarium numbers
                cell2mat(                           % Convert the cell array returned by arrayfun into a matrix, so we can use it in the logical index
                    arrayfun(@(x){                  % Call the following function on every element of a, using the index named 'x'
                        sum(                        % Sum the matrix that results from the following computation
                            (f(x)-'0')              % Convert the value at index x into a string, then break it into a matrix by subtracting the string '0'.
                                                    % This results in the matrix [1 3 5] for the number 135.
                                .^                  % Compute the element-wise power with the following matrix
                                    (1:nnz(f(x)))   % Create a matrix with the range 1 to the length of the number at index x. This results in the matrix 
                                                    % [1 2 3] for the number 135.
                        )                           % Closes the sum statement
                    },a)                            % Closes the arrayfun statement, passing the matrix a to be operated on
                )
            )
lnnare
sumber
1

C 175 169 byte

f(a,b){for(j=a;j<b;j++){n,i=0,x=0;s=0;n=j;while(n!=0){n/=10;i++;}a[i];n=j;while(n!=0){a[i-x-1]=n%10;n/=10;x++;}for(x=0;x<i;x++)s+=(int)pow(a[x],x+1);if(j==s)printf("%d ",s);}}

Versi tidak disatukan:

void f(int a, int b)
{

  for(int j=a; j<b;j++)
  {
    int n,i=0,x=0;
    int s=0;
    n=j;

   //Convert each number from 'n' to 'm' and store it in an int array 
   while(n)
   {
     n/=10;
     i++;     
   }
   int a[i]; 

   n=j;       
   while(n)
   {
    a[i-x-1]=n%10;
    n/=10;
    x++;     
   }

  //Calculate sum of digits powered with their respective position
  for(x=0;x<i;x++)
   s+=(int)pow(a[x], x+1);

   //Print Desarium
   if(j==s)
    printf("%d ", sum);     
 }

}

Dapat dipersingkat dalam beberapa cara, tetapi saya tidak melihatnya saat ini.

@ TuukkaX Terima kasih telah menghemat 6 byte.

Abel Tom
sumber
Keduanya n!=0dapat diubah menjadi n.
Yytsi
Anda benar, itu masuk akal!
Abel Tom
0

Jawa

s->{long i=0,j=0,c,d;for(;j!=s;){String []f=Long.toString(i).split("");for(d=0,c=0;d<f.length;)c+=Math.pow(Long.valueOf(f[d]),++d);if(i==c)j++;}return i;}

Penjelasan

s    - index
i    - iteration variable
j    - matches
c    - sum of each digit^its index
d    - index of digit in i
Roman Gräf
sumber
0

Python 3: 131 Bytes

n=int(input())
m=int(input())
R=[x for x in range(n,m+1)]
O=[sum(map(int,str(x)))for x in R]
F=[(x**(O.index(x)))for x in O]
L=[x for x in F for w in R if x==w]
print(list(set(L)))

Setelah membuat kode ini, menjadi jelas bahwa ada sejumlah terbatas disarium, sehingga mungkin lebih layak untuk memeriksa ini secara eksplisit daripada menggunakan begitu banyak pemahaman daftar yang sulit pada input besar untuk solusi ini.

Cobalah online!

MildCorma
sumber