Tam sayı yetkileri


19

Gibi bazı sayılar 64, tam sayı gücü olarak çeşitli şekillerde ifade edilebilir:

64 ^ 1
 8 ^ 2
 4 ^ 3
 2 ^ 6

Mümkün [1,2,3,6]olan en az bayt cinsinden bu tür güçlerin (burada, ) sıralı bir dizisini çıktılayın.


Giriş

1'den büyük ve 10000'den küçük pozitif bir tam sayı.


Çıktı

Girdinin tam sayı ile ifade edilebildiği bir tam sayı güçler dizisi p(dahil 1) . Çıktılar, sırayla oldukları sürece ondalık sayılara sahip olabilir.a^pa

Kayan nokta sorunları program tarafından ele alınmalıdır.


Örnekler

Input: 3
Output: [1]

Input: 9
Output: [1, 2]

Input: 81
Output: [1, 2, 4]

Input: 729
Output: [1, 2, 3, 6]

sayı tahtası

Puanınızın tahtada görünmesi için şu biçimde olması gerekir:

# Language, Bytes

Üstü çizili bir soruna neden olmamalıdır.


1
Cevabım [1 2 3 6]son test senaryosu için yazdırılıyor . Ayrıca yazdırabilir mi [6 3 2 1], [1.0 2.0 3.0 6.0]yoksa [6.0 3.0 2.0 1.0]?
Dennis

2
Giriş boyutları ve kayan nokta aritmetiği hakkında ne kabul edebiliriz? Bu, sayının köklerini almaya çalıştığınız ve sonucun tamsayı olup olmadığına baktığınız çözümü etkiler.
xnor

4
Köklere yapılan göndermelerin herkesi karıştırdığını düşünüyorum, bu yüzden bunu güçler açısından yeniden yazdım. Bir şeyleri değiştirmekten çekinmeyin.
xnor

1
Düzenlemeyi takdir ediyorum! Sorumun kalitesini yükselttikleri sürece öneri ve revizyonlar her zaman bekler (ki sizinkine inanıyorum). Kısa süre önce bu özel ağ hakkında sorular sormaya başladım ve topluluğun genel olarak hoş karşılandığını gördüm. Eleştiri ve düzeltme çok takdir edilmektedir! @xnor
Zach Gates

1
En büyük geçerli gücü bulun ve faktörlerini listeleyin!
SuperJedi224

Yanıtlar:


10

Pyth, 10 bayt

f}Q^RTSQSQ

gösteri

Her güç için, o güce alınan girişe kadar olan tüm numaraların listesini oluşturur ve ardından girişin listede olup olmadığını kontrol eder.


10

Haskell, 38

f n=[b|b<-[1..n],n`elem`map(^b)[1..n]]

Oldukça basit. Liste kavraması b, girdinin narasında göründüğü değerleri bulur [1^b, 2^b, ..., n^b]. bAralığı kontrol etmek yeterlidir [1..n].


9

Python 2, 53

lambda n:[i/n for i in range(n*n)if(i%n+1)**(i/n)==n]

Brute, [0, n-1] 'deki üslerdeki tüm baz kombinasyonlarını ve [1, n]' deki baz kombinasyonlarını zorlar.


8

Python 3, 56 bayt

lambda n:[i for i in range(1,n)if round(n**(1/i))**i==n]

Bu gerçekten beceriksiz. Her potansiyel ikökün yuvarlayarak, gücünü alarak ive orijinaline eşit olup olmadığını kontrol ederek bir tamsayı verip vermediğini test eder .

Kökün bir tam sayı olduğunu doğrudan kontrol etmek zordur, çünkü kayan noktalar gibi şeyler verir 64**(1/3) == 3.9999999999999996. Bir tamsayıya yuvarlama, gücün alınmasının orijinal değerine dönüp dönmediğini kontrol edelim. Bunu önerdiği için ypercube'e teşekkürler, 1 bayt tasarruf etti.

Feersum daha kısa ve daha akıllı bir çözüme sahiptir . Hepiniz bunu gerçekten yükseltmelisiniz.


Kontrol etsen doğru olmaz mıydı round(n**(1/i),0)**i==n?
ypercubeᵀᴹ

@ypercube İyi arama, 0tur için varsayılan doğruluk ile birlikte , bayt tasarrufu sağlar.
xnor

7

Pyth, 11 10 12 bayt

fsmqQ^dTSQSQ

Tüm olası güç kombinasyonlarını kontrol eder. Çok yavaş.


5

CJam, 23 bayt

rimF{1=:E){E\d%!},}%:&p

Bu, n'nin birincil çarpanlarına ayrılması ve tüm üslerin bölenlerinin kesişimini hesaplayarak çalışır .

Biraz daha uzun olan benim diğer çözelti , ama işe beklediğiniz (ve anında bitirmek) arasındaki tüm tamsayılar için 2 ve 2 63 - 1 .

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

ri                       Read an integer from STDIN.
  mF                     Push its prime factorization.
    {             }%     For each [prime exponent]:
     1=:E                  Retrieve the exponent and save it in E.
         ){     },         Filter; for each I in [0 ... E]:
           E\d%              Compute E % Double(I).
                             (Casting to Double is required to divide by 0.)
               !             Push the logical NOT of the modulus.
                           Keep I if the result is truhty, i.e., if I divides E.
                    :&   Intersect all resulting arrays of integers.
                      p  Print the resulting array.

5

APL, 17 bayt

(X=⌊X←N*÷⍳N)/⍳N←⎕

İlk APL programım; golf önerileri takdir edilmektedir.

              N←⎕  ⍝ Store input into N
             ⍳     ⍝ The list [1 2 ... N]
            /      ⍝ Select the elements A for which
      N*÷⍳N)       ⍝ N^(1/A)
(X=⌊X←             ⍝ equals its floor (that is, is an integer)

Lütfen sözde kod / açıklama ekleyin. Ama
APL'yi

Ayrıca +1, APL'ye çok sevgi. Mükemmel golf aracı.

Sözde koduna dayanarak, bu işe yaramaz (APL yaklaşık bir kayan nokta eşitlik testi yapmazsa). Örneğin, pow(pow(7,3),1./3))ben 6.99999999999999C veya Python olsun . Çünkü 1 / A hesaplanırken doğruluk kaybedilir.
feersum

@feersum Çevrimdışı tercümanları bilmiyorum, ancak 3'ün tüm güçleri tryapl.org'da doğru çalışıyor.
lirtosiast

@ThomasKwa Görünüşe göre yaklaşık bir eşitlik testi kullanılıyor. dyalog.com/uploads/documents/Papers/tolerant_comparison/…
feersum

3

JavaScript (ES5), 73 bayt 81 bayt 79 bayt 75 bayt

for(n=+prompt(),p=Math.pow,i=0;i++<n;)p(.5+p(n,1/i)|0,i)==n&&console.log(i)

Olası kökün en yakın tamsayı gücünün eşit olup olmadığını kontrol eder n. ~~(.5+...), Math.round(...)tamsayı aralığı içindeki ifadeler için eşdeğerdir (0 ila 2 ^ 31-1).

Düzenleme: 2 bayt tıraş &&yerine tembel mantık kullanılır ifve soru bir açıklama eklediğinden girdi için bilgi istemi eklendi. Daha önce girdinin saklandığı varsayılarak n.

Düzenleme 2: Değiştirildi ~~(.5+...)için .5+...|0gruplama kaçınarak iki bayt kaydedin.

Düzenle 3:var 4 bayt kaydetmek için kaldırıldı . Katı olmayan modda bu kabul edilebilir.


İfadeleri dengeleyerek birkaç bayt tıraş edebilirsiniz: for (var p = Math.pow, i = 1; i ++ <n; p (~~ (.5 + p (n, 1 / i)), i) == n && console .log (i));

@Alhadis Girdiğiniz için teşekkürler, biraz düzenleme yapacağım
Patrick Roberts

@PatrickRoberts Hızlı bir p=Math.powşekilde 1 bayt tasarruf edebilirsiniz
Downgoat

@vihan, bu vargerekli olduğu için geçersiz bir beyan olurdu
Patrick Roberts

forBunun yerine kastetmedikçe prompt..
Patrick Roberts

3

Brachylog , 8 bayt

≥^↙.?≥ℕ≜

Çevrimiçi deneyin!

Giriş değişkeninden giriş alır ve tam olarak aynı uzunluğa sahip olan eski çözümün aksine, her gücü çıkış değişkeninden gerektiği gibi artan sırada üretir≥ℕ≜^↙.?∧ .

≥           Some number which is less than or equal to
            the input,
 ^          when raised to the power of
  ↙.        the output,
    ?       is the input.
       ≜    Label
            the output
      ℕ     as a whole number
     ≥      which is less than or equal to
    ?       the input.

Her üsün girdiden daha büyük olmadığını iddia etmek için kesin bir gerekçem yok, ancak programın gerçekten sonlanması için sınırlanması gerekiyor.

ḋḅlᵛfverilen test senaryolarının tümü için çok daha kısa (jeneratör dışı) bir çözümdür, ancak girdi farklı primerlerin bir ürünü gücü değilse başarısız olur. (Bunu düşünün, çünkü tüm test senaryoları asal güçler, ḋlfaynı zamanda işe yarıyor ...) Bu fikri kurtarmak için bulduğum en iyi şey ḋḅlᵐḋˢ⊇ᵛ×f, 10 bayta çıkıyor.




2

JavaScript ES7, 66 bayt

Deneysel dizi kavramalarından yararlanır. Yalnızca Firefox'ta çalışır.

n=>[for(i of Array(n).keys(m=Math.pow))if(m(0|.5+m(n,1/i),i)==n)i]

Olası golf. Muhtemelen ifadeleri biraz daha kısaltmaya çalışacağım ve umarım uzun Array(n).keys()sözdizimine bir alternatif bulacağım .

Daha kısa olabilir, ancak JavaScript'in korkunç kayan nokta doğruluğu vardır.


Ah, yeni bir şey öğrendim ... harika.
Patrick Roberts

2

CJam, 20 bayt

ri_,1df+\1$fmL9fmO&p

Giriş için n , bu değerlerini hesaplar log b n herkes için b az veya hiç eşit n ve tam sayılardır sonuçları tutar.

Bu, arasındaki tüm tamsayılar için çalışmalıdır 2 ile 9.999 . Çalışma süresi kabaca O (n) 'dir .

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

ri                   e# Read an integer N from STDIN.
  _,                 e# Copy N and transform it into [0 ... N-1].
    1df+             e# Add 1.0 to each, resulting in [1.0 ... Nd].
        \1$          e# Swap the array with N and copy the array.
           fmL       e# Mapped log base N: N [1.0 ... Nd] -> [log1(N) ... logN(N)]
              9fmO   e# Round each logarithm to 9 decimals.
                  &  e# Intersect this array with [1.0 ... Nd].
                   p e# Print the result.

Başarısız olduğu tek girdi 15.625 mi, yoksa sınadığınız tek girdi mi?
Beta Çürümesi

Kesinlikle başkaları var. Aslında, daha önceki revizyonumu geçersiz kılan 4913 için de başarısız olduğunu öğrendim .
Dennis

2

Yakut, 50

->n{(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||p(i)}}

Ekrana yazdırır.

Yakut, 57

->n{a=[]
(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||a<<i}
a}

Bir dizi döndürür.

Test programında:

f=->n{(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||puts(i)}}

g=->n{a=[]
(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||a<<i}
a}

f.call(4096)
puts g.call(4096)

Her bir kökü hesaplar ve kalan 1e-8'den küçük olup olmadığını görmek için modulo 1'i test eder. Sınırlı kesinlik nedeniyle bazı geçerli tamsayı kökleri 0.9999 .. şeklinde hesaplanır, bu nedenle bunlara 1e-9 ekleme ihtiyacı vardır.

N'nin n. Köküne kadar hesaplanır, bu da toplam fazlalıktır, ancak sonsuz olmayan bir döngü yazmanın en kısa yolu gibi görünüyordu.



2

DC, 104 bayt

Giriş terminalden alınır, çıktı yazdırılır ve istif üzerinde.

Çünkü bu? operatör, dc -e "<solution>"veya kullanmanız gerekirdc <file with solution in it> .

Kimse cevaplarımı göremiyor, onlara oy vermek yerine, DC'deki sorunları çözmekten gerçekten keyif alıyorum. Şimdiye kadar bu konudaki en az verimli çözüm, ama yine de göndereceğimi düşündüm.

1sb?sn[lesi]ss[lble1+dse^dln=sln>c]sc[liSflq1+sq]sm[Lfplq1-dsq0<p]dsp[lb1+sb0si0selcxli0!=mlbln!=h]dshxx

başlangıç ​​şeyler

1sb           Store 1 in register b
?sn           Store user input in register n
[lesi]ss      A macro to copy the e to the i register, stored in the s register

Sonuç hedeften büyük veya hedefe eşit olana kadar bir tabanı tüm güçlere yükseltmek için makro

[lble1+dse^dln=sln>c]sc
[lb                 ]   load our base num (register b)
[  le               ]   load our exponent (register e)
[    1+dse          ]   add 1 to the exponent, copy and store in the e register
[         ^d        ]   raise the base to the exponent and copy it
[           ln=s    ]   load the user input, if that is equal to the power result run the macro in register s
[               ln>c]   load the user input, if it's greater than the power result run the macro in register c (this one)
[                   ]sc save this macro in register c

Yukarıdaki üs makrolarından bulunulan geçerli bir üs değerini başka bir yığına kaydetmek için makro

[liSflq1+sq]sm
[liSf      ]     copy the i register to the top of the stack in register f
[    lq1+sq]     add 1 to the q register
[          ]sm   save this macro in the m register

Yukarıdaki 2x makrosunu (makro c) 2'den hedeflerimize kadar tüm tabanlardan çalıştıracak makro

[lb1+sb0si0selcxli0!=mlbln!=h]dsh
[lb1+sb                      ]     add 1 to the base number
[      0si0se                ]     reset the i and e registers (previously found value and exponent
[            lcx             ]     load and run the c macro
[               li0!=m       ]     load the result of the c macro and if it's not 0, run m to save it to the f stack
[                     lbln!=h]     if our base number is not equal to our target number, run macro h (this macro)
[                            ]dsh  duplicate this macro and save one copy, so that one is left on the stack to run later

Makroyu değerleri f yığından yazdırmak için

[Lfplq1-dsq0<p]dsp
[Lfp          ]      load the top value from the f register and print it
[   lq1-dsq   ]      load the q register and subtract one from it and save it
[          0<p]      if the q register is greater than 0, run macro p (this macro) again
[             ]dsp   duplicate this macro and save one copy, so that one is left on the stack to run later

xx finally run the two macros on the stack (h and then p)


1
Pek çok insanın DC'yi bilmediğini tahmin ediyorum. Yeni soruları cevaplamak (özellikle en erken cevaplardan biri olmak) daha fazla dikkat çekmenize yardımcı olacaktır. Çok popüler olduğu için yanıtlarınız için TIO bağlantılarını kullanmayı da deneyebilirsiniz. İşte TIO'da DC .
mbomb007

Teşekkürler! Bunu kesinlikle ileriye dönük cevaplar için kullanacağım!
FlexEast



0

Japt , 10 bayt

õ
f@mpX øN

Dene

õ            :Implicit input of integer U
õ            :Range [1,U]
f@mpX øN     :Reassign to U
f            :Filter
 @           :By passing each X through the following function
  m          :  Map U
   pX        :    Raise to the power of X
      ø      :  Contains
       N     :    Any element of the (singelton) array of inputs
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.