Birden fazla şekilde mükemmel güçler mi?


13

Meydan okuma

Göreviniz, pozitif bir tamsayı N verildiğinde , birden çok şekilde mükemmel bir güç olarak ifade edilebilecek N'ye eşit veya N'den küçük tüm pozitif tam sayıları bulan bir program veya işlev yazmaktır .

Tanım

Mükemmel bir güç sayısı olarak tanımlanır ı tarafından bulunan m ^ k :

  • m ve ben pozitif tamsayılar
  • m! = k

Test Durumları

girdi -> çıktı
1000 -> 16, 64, 81, 256, 512, 625, 729
56 -> 16
999 -> 16, 64, 81, 256, 512, 625, 729
81 -> 16, 64, 81
1500 -> 16, 64, 81, 256, 512, 625, 729, 1024, 1296

Lütfen okunabilir ve yorumlanmış bir sürüm de sağlayın.


Son cümleniz boşlukların karakter sayısına dahil olmadığı anlamına mı geliyor?
sepp2k

@ sepp2k Evet! Beyaz boşlukları saymamalıyız.
fR0DDY

4
@ fR0DDY Dili beyaz boşluktan ne haber ? Boşluk karakterlerini yoksaymak her zaman bu dili kazanır.
moinudin

4
Beyaz bir cevapla kazanılabilecek garip bir soruya sahip olmak acı vermez. Birinin bunu yapmak için rahatsız edilmesinin ne kadar sürdüğünü göreceğiz.
gnibbler

1
N üzerinde herhangi bir sınır var mı?
Dogbert

Yanıtlar:


3

Mathematica: 103 karakter

Boşluklar kaldırılabilir

Select[Flatten@
       Table[
        Solve[Log@#/Log@b == k, k, Integers] /. k -> #, {b, 2, #}] & /@ Range@#, 
Length@# > 2 &][[All, 1, 1]] &  

Kullanımı:

%[81]
{16, 64, 81}

3

Jelly , 11 anlamlı bayt, dil postdates meydan okuması

ḊḟÆR *@þ Ḋ  F  fḊ

Çevrimiçi deneyin!

İşte tamamen farklı bir çözüm. Bu, çok verimsiz bir ambalajda etkili bir çekirdek algoritması kullanan (çok büyük sayıları işleyemeyecek kadar meraklı) verimli ve verimsiz bir meraklı melezdir. Daha önce olduğu gibi, tüm beyaz alanlar anlamsızdır.

İşte böyle. (birkaç kez görünür) 2'den girişe kadar olan sayıların bir listesidir:

ḊḟÆR *@þ Ḋ  F  fḊ
ḊḟÆR                Ḋ, with all primes between 2 and the input removed
                    (i.e. all composite numbers from 4 to the input)
     *@þ Ḋ          Exponentiate all Ḋ elements with all ḊḟÆR elements
            F       Flatten the result (it had a nested structure)
               fḊ   Keep only elements in Ḋ

Buradaki temel gözlem, bir sayının birden çok şekilde mükemmel bir güç olmasıdır, ancak bileşik bir üsle (1 değil) mükemmel bir güçse. Bazın 2'den girişe ve üssün 4'ten girişe bir bileşik sayı olduğu bir liste üretiyoruz; bu gerçekten yavaştır, çünkü hepsi soruya bir cevap olan gerçekten büyük sayılar üretir. O zaman cevapları sadece menzil içinde tutarız.

Bu, menzil içindeki maksimum gücün ne olduğunu çalışarak ve daha fazla yinelemeyerek, yüksek verimli bir cevaba dönüştürmek mümkün olabilir, ancak bu çok daha fazla bayt olurdu ve bu kod golfü.


1

Perl: 68 karakter

Maksimum (1000) değerini $Ngirer ve yanıtı döndürür @a.

for $x ( 2..$N ) {
    $c{$x**$_}++ for 2..log($N)/log$x
}
@a = grep { $c{$_} > 1 } keys %c

Bütün bir program için 18 karakter daha istiyorum:

$m = shift;
for $x ( 2..$m ) {
    $c{$x**$_}++ for 2..log($m)/log$x
}
print join ' ', grep { $c{$_} > 1 } keys %c

Bu sırayla yazdırılmıyor. codepad.org/H0Zyau3z
Dogbert

@Dogbert: Sırayla baskı yapmak zorluğun bir parçası değil. Eğer öyleyse, daha sort önce ekleyebilirsiniz grep. Bu arada daha önce kod takımı görmemiştim. Teşekkürler.

0

Ruby - 101 karakter (boşluk olmadan)

f=->l{c=Hash.new{0}
2.upto(1E4){|i|2.upto(20){|j|c[i**j]+=1}}
c.map{|k,v|v>1&&k<=l&&k||p}.compact.sort}

1 <= limit <= 100,000,0005 saniye içinde çalışır .

Ölçek

> f[10000]
[16, 64, 81, 256, 512, 625, 729, 1024, 1296, 2401, 4096, 6561, 10000]

0

Jelly , 13 anlamlı karakter, dil meydan okuma sonrası meydan okuma

R  µ  ọḊ *@Ḋ ċ >2  µ  Ðf

Çevrimiçi deneyin!

Buradaki tüm boşluklar önemsiz. Sorunun da söylediği gibi cevabımın yapısını göstermek için kullandım.

Şöyle çalışır:

R  µ  ọḊ *@Ḋ ċ >2  µ  Ðf
R                     Ðf    Find all numbers n from 1 to the input, such that:
   µ               µ          (grouping marks, like {} in C)
       Ḋ   Ḋ                  Take the range from 2 to n
      ọ                       Find the number of times each divides n
         *@                   Raise the range from 2 to n to these powers
             ċ                Count the number of times n appears
               >2             and the result must be greater than 2

Örneğin, n = 256 test edilirken, 2'den 256'ya kadar olan sayıların her birinin sayısını 256'ya böldüğünü kontrol ederiz. kez), 8 (iki kez bölünen) ve 16 (iki kez bölünen). Böylece, bölünme sayısını orada belirlenen güçlere yükselttiğimizde:

2⁸, 3, 4⁴, 5, 6, 7, 8², 9, 10, 11, 12, 13, 14, 15, 16², 17, ..., 255, 256

Bu, orijinal değeri (256), 256'nın mükemmel bir güç olduğu şekle eşit sayıda üretir, artı bir (son eleman 256 üretir çünkü 256 = 256¹). Yani dizide 256'dan daha fazla 256 görürsek (ve bu durumda yaparız; 8² 64'tür, ancak diğer "ilginç" öğelerin tümü 256 üretir), mükemmel bir güç olmalıdır.

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.