Disaryum İkilemi


31

Disaryum İkilemi

Disarium, aşağıdakilerden oluşan bir sayı olarak tanımlanır:

kendi konumlarına göre çalışan rakamlarının toplamı orijinal numaraya eşittir


Göreviniz :

Bir akvaryum olarak sınıflandırılmış sayılarla ilgili garip bir takıntınız var. Akvaryum yollarını takip etme ihtiyacı sizin için o kadar büyük ki herhangi bir akvaryumdaki numaralı sayfaları herhangi bir kitapta okumayı reddediyorsunuz . İki BÜYÜK problemin var:

  1. Profesörün sadece sayfasından ders kitabını okumanızı atanan nsayfayam
  2. Geçen hafta kafana gerçekten çok sert çarptın ve bir sayının akvaryum olarak kabul edilip edilmeyeceğini programatik olarak nasıl belirleyeceğini hatırlayamıyor gibisin.

Zaman esastır, okumanız gereken sayfaları belirleme kodunun mümkün olduğunca kısa olması gerekir.

Sen bir kapsayıcı aralığında disarium tüm tanımlamak gerekir nthrough m.

Bir akvaryum örneği :

89 = 8 1 + 9 2

135 = 1 1 + 3 2 + 5 3

518 = 5 1 + 1 2 + 8 3

Bu kod-golf, yani en az bayt sayısı kazanıyor!

İşte A032799'un tam dizisi .


@Fatalize Aralık dahil, bu soruyu yansıtmak için soruyu düzenleyeceğim.
CraigR8806

Garantili sınırlar var mı nve yok mmu? Çok büyük bir akvaryum var (12157692622039623539), cevapları tanımlayabilmeli mi?
Lynn

@Lynn Çok sayıda çözüm olduğu göz önüne alındığında, ürün yelpazesinde sınırların olmaması gerektiğini söyleyebilirim.
CraigR8806,

2
@Lynn. Akvaryumda> 22 hane yok, bu nedenle aralık zaten sınırlı.
Mad Physicist,

3
@MistahFiggins Lütfen sorunuzun altındaki OEIS bağlantısına gidin. Disarium sekansının gerçekten sonlu olduğunu gösteren bir kanıt bulacaksınız.
CraigR8806

Yanıtlar:


11

Perl 6 , 40 39 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

{                                     }  # 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.

8

Python2, 98 89 88 84 bayt

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

Korkunç. Kısalır. Daha iyi görünmeye başla

İşte özyinelemeli girişim (86 bayt):

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

4 byte tasarruf için @Rod teşekkürler ! rangeiçin enumerateve böyle devam eder.


geçiş enumerate, kullanabilirsiniz int(n)yerineint(`x`[p])
Çubuk

7

Perl, 43 bayt

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

Çevrimiçi deneyin!

Regex gerçekten güçlü, millet.

açıklama

Kodun yaptığı ilk şey, üzerinden iki tamsayı okumaktır <>ve birinci ile ikinci arasında bir aralık oluşturur ... Bunlar daha sonra standart kullanan mapbu aralık boyunca yineleme fonksiyonu, ve her bir değeri için aşağıdaki kod geçerlidir: say if$_==eval s/./+$&**$+[0]/gr. Bu saçma sapan gibi görünüyor, ve bir çeşit, ama işte gerçekten olan şey.

mapörtük olarak geçerli değerini değişkende saklar $_. Birçok perl işlevi ve işlemi, hiçbiri verilmediğinde bu değeri kullanır. Bu, s///ikame operatörü gibi normal ifadeleri içerir .

Bir ikame regex'in dört bölümü vardır:

  1. İşlenecek dize. Normalde, operatör =~bir dizgeye bir regex uygulamak için kullanılır, ancak bu operatör yoksa, o zaman regex, işlev $_aracılığıyla geçerli numaramızı içeren örtük değişkene uygulanır map.
  2. Aranacak dize. Bu durumda, joker karakterle gösterilen herhangi bir yeni satır dışı karakter arıyoruz .. Aslında her bir basamağı yakalayacağız.
  3. İle değiştirilecek dize. Her +şeyi çok daha kolaylaştıran bazı sihirli Perl değişkenleriyle karıştırılmış matematiksel ifadenin ardından artı işaretini kullanıyoruz .

Özel skalar değişkeni $&her zaman, bu durumda tek bir rakam olan son başarılı regex yakalamanın tamamını içerir. Özel dizi değişkeni @+her zaman son başarılı eşleşme için eşleşme sonrası ofsetlerin bir listesini içerir , yani eşleşmeden sonraki metnin dizini . $+[0]içinde endeksidir $_hemen aşağıdaki metin $&. Böyle bir durumda 135, rakamı yakalarız 1ve 135hemen sonra gelen metnin içindeki indeks (yani 35) bizim üssümüz olan 1'dir. Böylece, $&(1) 'i (1)' in gücüne yükseltmek $+[0]ve 1 elde etmek istiyoruz. 3 'ü 2' ye yükseltmek ve 9 elde etmek istiyoruz. 5 'i 3' e yükseltmek ve 125 elde etmek istiyoruz.

Girdi olsaydı, 135sonuçta ortaya çıkan dize +1**1+3**2+5**3.

  1. Regex değiştiren bayraklar. Burada iki regex bayrağı kullanıyoruz - /gve /r. /gtercümana ilk bulunduktan sonra yerine koymaya devam etmesini söyler (aksi halde sona ereriz +1**135). /rtercümana orijinal dizeyi değiştirmemesini ve bunun yerine dizeden sonra ne olacağını döndürmesini söyler . Bu önemlidir, çünkü aksi takdirde üzerine yazılır $_ve karşılaştırma amacıyla buna ihtiyacımız vardır.

İkame işleminin tamamı tamamlandıktan sonra, evalişlevle birlikte değerlendirilen matematiksel bir ifade elde ederiz . Orijinal sayı ile karşılaştırılarak +1**1+3**2+5**3değerlendirilir . Bu ikisi eşit olduğundan, kod sayıyı yazdırır.1 + 9 + 125 = 135135


Güzel bir çözüm. (Bunun işe yaramayacağını unutmayın, ilk giriş 0'dır, ancak önemli olduğundan emin değilim). Golf için birkaç bayt:map$_-eval s/./+$&**$+[0]/gr||say,<>..<>
Dada

Ve "@+"1 bayt daha kısa $+[0]:)
Dada

7

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

20B tasarruf için Arnauld ve 6B tasarruf için ETHProductions!

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

kullanım

Fonksiyonu bir değişkene atayın ve minimum ve maksimum değişkenleri argüman olarak verin. Örnek:

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

Çıktı

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

Daha fazla golf

Bu oldukça iyi golf oynuyor gibi gözüküyor, ama her zaman iyileştirme için yer var.


Evet, bu aslında biraz daha kısa. Teşekkürler!
Luke

1
İki bayt kaydetmek d**(e+1)için değiştirebilirsiniz d**-~e.
ETH Sunumları

Bahşiş için teşekkürler. Python'u yenmeden önce sadece 2 bayt ...
Luke

Sen kullanabilirsiniz &yerine &&. Gitmek için bir bayt daha ...
Arnauld

Ben sadece yerel kopyamda değiştirdim ... Sanırım daha hızlıydın.
Luke

6

JavaScript (Firefox 52+), 68 bayt

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

Üzerinden çıkan özyinelemeli işlev alert. Bu sayfada indirebileceğiniz Firefox Geliştirici Sürümü’nde çalışır . Firefox’un önceki sürümleri **operatörü desteklemiyor ve başka hiçbir tarayıcı [for(a of b)c]sözdizimini desteklemiyor .

Test snippet'i

Bu, .mapdizi anlama yerine kullanır ve Math.powbunun yerine **ES6'yı destekleyen tüm tarayıcılarda çalışmalıdır.


6

05AB1E , 12 bayt

Emigna sayesinde 2 bayt kaydedildi

ŸvygLySmOyQ—

Çevrimiçi deneyin!

Ÿ            # 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

ŸvygLySmOyQ—12 bayt için çalışmalı.
Emigna

5

Python 3, 100 bayt

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

En kısa yaklaşım değil, ama oldukça sevimli. Son derece sayısız karışıklık var; güzel bir kanıt için OEIS sayfasına bakın. Bunların hepsi bunlar.


Bu, bir boşluk olan meta kodlamanın kullanımıdır meta.codegolf.stackexchange.com/a/1063/55243 Yanıtınızı standart kurallara uyacak şekilde değiştirmenizi tavsiye ederim
george

5
Program hala "çalışıyor" ve çıktı kodlanmış olmadığından , bunun kodlama kuralını ihlal ettiğini sanmıyorum .
Alex Howansky

4

R, 100 bayt

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

Alır Adsız işlev nve m. Her zaman R'de olduğu gibi, tamsayıları sayısal basamaklı bir vektöre bölmek sıkıcıdır ve çok fazla bayt yer. Bu, işlevi nispeten yavaşlatır ve yalnızca 32-bit tamsayılar için çalışır.


4

Jöle , 11 bayt

D*J$S⁼
rÇÐf

Çevrimiçi deneyin!

Bunu 16'dan 11'e düşürdüm, bazılarının yardımıyla!

Açıklama:

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

JEndeksleri almak için kullanabilirsiniz . Daha kısa bir yol olabilir D*J$S⁼bir içine iki bağlantıları birleştirmek
mil

Yaklaşık 20 saniye önce bu sonuca vardım. Thnx!
steenbergh

3

CJam , 23 bayt

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

Çevrimiçi deneyin!

açıklama

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


3

Python 2.X, 92 bayt

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]

Bundan sonra (i+1)işe yaramaz boşluk , ancak parantezlerden kurtularak bu sorun değil -~i.
Yytsi,

Bu denememi seninkiyle aynı yapar!
hashcode55

Neredeyse. Sende list('k'), bende olmayan. Ancak, boşluk hala kaldırabilirsiniz :)
Yytsi

3

Python 2 , 84 bayt

Tam program yaklaşımı, şu anda lambda çözeltisi ile aynı uzunlukta.

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

Çevrimiçi deneyin!


Hmm. Neredeyse kesin bir cevap düşündüm, ama karışıklığa bağlı olarak atıldım input(). Çok hoş! +1.
Yytsi,

3

Japt, 15 bayt

òV f_¥Zì £XpYÄÃx

Çevrimiçi test edin! Bu @obarakon ve benim aramızdaki bir işbirliğiydi.

Nasıl çalışır

ò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

Japt'in en son sürümünde, xbaşka bir baytı golf yapmamıza izin veren bir argüman olarak bir işlevi kabul eder:

òV f_¥Zì x@XpYÄ

Çevrimiçi test edin!


2

Clojure, 107 bayt

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

Denklemi uygulamak çok uzun.


yaparak birkaç byte tasarruf edebilirsiniz(.pow(-(int v)48M)
cliffroot 15

2

TI-Basic, 85 bayt

Input 
For(I,X,Y
If I<=9 or sum(I={89,135,175,518,598,1306,1676,2427,2646798,12157692622039623539
Disp I
End

Sabit kodlamaya izin verildiğini bilmiyordum. :)
Abel Tom

@AbelTom Peki, bu seri sadece 20 terim olduğunu yardımcı olur. Ayrıca, sayıyı TI-Basic'te dizgeye çevirmek çok sayıda bayt alır. int(log(Her sayı için sadece başka bir çözüm olacaktır ve güçler daha sonra olacaktır . Belki bu daha kısa, ama şüpheliyim.
Timtech

Bu girdi yöntemi çok zekice ama bir çeşit kabataslak. FUNCModda olmanız ve pencerenin giriş noktanızı içerecek şekilde ayarlanması gerekir. Bana yeterince taşınabilir görünmüyor.
Jakob

@ JakobCornell Varsayılan olarak calc FUNCmodundadır, ancak giriş çözünürlüğü hakkında ne dediğinizi görebiliyorum. Ancak bu yöntem golf oynamakta oldukça yaygındır. Bunun Prompt X,Yyerine her zaman yapabilirsin .
Timtech

2

Haskell, 61 bayt

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

Kullanım örneği 5 # 600-> [5,6,7,8,9,89,135,175,518,598].

iAralıktaki her numarayı kontrol edin [n..m]. Rakamlar, ibir dizgeye ( show) çevrilerek ve her karakter bir puretekrar tamsayıya dönüştürülen bir eleman dizgisi ( ) haline getirilerek elde edilir read. Bu sayılar elementi [1..]fonksiyon ile birlikte fermuarlayın ^ve alın sum.


2

PHP, 92 91 88 bayt

3 bayt kaydedildi @AlexHowansky

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

komut satırı argümanlarından girdi alır; sonunda virgül basar. İle koş -r.


1
for([,$n,$m]=$argv;$n<=$m;
Üçünüzü

Baskının orada çalışması garip ama yankı yok. Sanırım çünkü yankı hiçbir şey döndürmüyor - boş değil, garip bir şekilde.
Alex Howansky

@AlexHowansky: Aynı zamanda garip "$n"[index]ve "_$n"[index]ayrıştırma hataları üretiyor "89"[index]ve $s="$n";$s[index]mükemmel bir şekilde gayet iyi.
Titus

Hmm evet, bu ilk başta garip görünüyor, ancak dokümanları kontrol ettikten sonra, açıkça özelliğin yalnızca string değişmezleri için çalıştığını söyledikleri görülüyor.
Alex Howansky

Heh heh bu işe ("_$n")[index]
yarar

2

Mathematica, 59 bayt

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

Adsız işlev, iki tamsayı argümanı alarak ve bir tamsayı listesi döndürür. (d=IntegerDigits@#)^Range@Length@dBir sayının rakam listesini uygun güçlere üretir; Tr[...]==#Bu sayısal güçlerin toplamının orijinal sayıya eşit olup olmadığını tespit eder.


2

MATLAB, 88 73 bayt

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

Orijinal cevap:

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

num2str(n)-'0'a'yı nbasamaklarının bir vektörüne böler ve içindeki rakamların 1:floor(log10(n))+1birini tutan bir vektördür n. Golfün isimsiz bir fonksiyonuna giriş yapması sayesinde 15 byte tasarruf sağlıyor.


1

Haskell , 82 76 75 bayt

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

Çevrimiçi deneyin! Kullanımı:5 ! 175

Bu kontroller aralığında her sayı niçin mise onun bir disarium numarası ve dolayısıyla oldukça yavaş Big içindir m.


Daha hızlı sürüm: (93 bytes)

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

Çevrimiçi deneyin!


1

C (gcc) , 136 bayt

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

TIO'da pow tanımlayan başlık, çünkü bir nedenden ötürü pow içermiyordu. Bilgisayarım yaptı, ben de buna devam edeceğim.

Çevrimiçi deneyin!


1

MATL , 16 bayt

&:"@tFYAtn:^s=?@

Çevrimiçi deneyin!

&:        % 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

1

Toplu iş, 115 bayt

@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

Toplu iş, yalnızca son akvaryum numarasını karşılaştırmanın bir yolu olmayan 32 bit aritmetik değerine sahiptir, ancak dize karşılaştırmalarında ısrar ediyorsanız, 402 bayt için:

@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

1

Python 2, 100 bayt

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

Bunu çalıştırmak için henüz bir şansım olmadı (bunu telefonumda yapıyorum).


Bu işe yaramıyor. Yanlış sözdizimi ve düzeltildiğinde yalnızca boolean değerleri yazdırır. Üstat 0'dan başlar, bu da hatalıdır. Ayrıca, içindeki köşeli parantezlere de ihtiyacınız yoktur sum.
Yytsi

Bu, akvaryum numaralarını kontrol etmiyor.
hashcode55,

@ hashcode55, düzeltildi (?)
Daniel

@TuukkaX, şimdi çalışması gerektiğini düşünüyorum
Daniel

Bilgisayarda değilim, ancak bu her yinelemede yeni bir satır iyazmalıdır , burada bir Disarium var. Buna izin verilip verilmediği konusunda hiçbir fikrim yok, ancak çıktı çok boşaldığından hayır diyebilirim.
Yytsi,

1

Scala, 132 129 bayt

(% :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 düzenleme: den döngüsünün değişken adını değiştirme &için ikaydedilen üç boşluk.


açıklama

Giriş aralığındaki her değer için:

  • ile bir dizgeye dönüştür +""
  • zipWithIndexbasamağın karakterini ve indeksini içeren tuples listesini üretmek için kullanın
  • Her karakterin int değerini eksi 48'i (0-9 satırına kadar) liste indeksinin gücüne artı bir tane (^ 1'den başlamak için) döndürerek listeyi katlayın
  • sonuç girdiyle eşleşiyorsa yazdırın

Yorumlar

Sonunda nasıl foldve zipWithIndexçalışmayı öğrenmeye başladı . Ben mutsuz değilim intdönüşümler, ama ben özlülük memnun ediyorum foldve zipWithIndex.


1

Octave, 88 87 bayt

Bayt tasarrufu için MattWH'a teşekkür ederiz (f (x) -48 - f (x) - '0')

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

Koşmak:

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

açıklama

@(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
                )
            )

1

C 175 169 bayt

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

Ungolfed versiyonu:

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

}

Bir şekilde kısaltılabilir, ama şu anda göremiyorum.

@TuukkaX 6 bayt kaydettiğiniz için teşekkür ederiz.


Her ikisi n!=0de değiştirilebilir n.
Yytsi,

Haklısın, bu mantıklı!
Abel Tom,

0

Java

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

açıklama

s    - index
i    - iteration variable
j    - matches
c    - sum of each digit^its index
d    - index of digit in i

0

Python 3: 131 Bayt

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)))

Bu kodu oluşturduktan sonra, sınırlı sayıda yanlışlığın olduğu anlaşılmıştır, bu nedenle bu çözüme büyük girdiler zor olan çok fazla liste kavrama kullanmak yerine, bunları açıkça kontrol etmek daha uygun olabilir.

Çevrimiçi deneyin!

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.