Memulihkan kekuatan dari kekuatan utama

16

Tampaknya banyak orang ingin memiliki ini, jadi sekarang sekuel tantangan ini !

Definisi : a kekuatan utama adalah nomor alami yang dapat dinyatakan dalam bentuk p n dimana p adalah prima dan n adalah nomor alam.

Tugas : Diberi kekuatan utama p n > 1, kembalikan kekuatan n.

Testcases :

input output
9     2
16    4
343   3
2687  1
59049 10

Penilaian : Ini adalah . Jawabannya terpendek dalam byte menang.

bocor Nun
sumber
2
Catatan : Tantangan ini mungkin sepele dalam beberapa bahasa golf, tapi itu tidak begitu sepele untuk beberapa bahasa utama, serta bahasa Juni 2018, QBasic.
Erik yang Outgolfer
Bisakah kita menghasilkan True, bukan 1? Atau, mengapung bukan int?
Jo King
1
@ Menjawab ya, ya.
Leaky Nun
@EriktheOutgolfer Challenge diterima : D
DLosc

Jawaban:

5

Python 3 , 49 byte

f=lambda n,x=2:n%x and f(n,x+1)or n/x<2or-~f(n/x)

Cobalah online!

Output Truebukan 1 ( sebagaimana diizinkan oleh OP ). Fungsi rekursif yang berulang kali menemukan faktor terendah dan kemudian memanggil fungsi lagi dengan kekuatan terendah berikutnya hingga mencapai 1. Ini adalah perpanjangan dari jawaban saya untuk pertanyaan sebelumnya.

Jo King
sumber
4

Bash + GNU utilitas, 22

  • 2 byte disimpan berkat @ H.PWiz dan @Cowsquack
factor|tr -cd \ |wc -c

Cobalah online!

digital Trauma
sumber
1
Apakah factor|sed s/\ //|wc -wbekerja?
H.PWiz
1
Bagaimana dengan factor|tr -cd \ |wc -c?
Kritixi Lithos
3

dc , 50 41 byte

1si[dli1+dsi%0<X]dsXx[dli/dli<Y]sYdli<Yzp

Cobalah online!

Mengambil input dari atas tumpukan (di TIO, menempatkan input di header untuk load-nya ke stack sebelum eksekusi). Output ke stdout.

Penjelasan

Register digunakan:

i: pembagi uji coba saat ini, saat Xsedang berjalan. Kemudian, pembagi kami temukan.

X: Makro dli1+dsi%0<X, yang memiliki efek "kenaikan i, kemudian memeriksa modulus dengan nilai pada stack (yang akan menjadi input asli) Jika tidak nol, ulangi.".

Y: makro dli/dli<Y, yang memiliki efek "Tambahkan ke tumpukan salinan bagian atas tumpukan saat ini, dibagi dengan i. Ulangi sampai itercapai."

Program lengkap:

1si                 Initialize i
[dli1+dsi%0<X]dsXx  Define and run X
[dli/dli<Y]sY       Define Y
dli<Y               Run Y, but only if needed (if the input wasn't just i)
z                   The stack is i^n, i^(n-1), ... ,i, so print the stack depth
Sophia Lechner
sumber
Saya menemukan solusi yang jauh lebih baik! Mengedit sekarang ...
Sophia Lechner
3

wajah , 86 byte

(%d@)\$*,c'$,io>Av"[""mN*c?*m1*mp*m%*s1"$pN1p:~+p1p%%Np?%~:=/NNp+?1?-%N1?%=p%'$i?w1'%>

Hore, lebih lama dari Jawa!

Cobalah online!

Saya sangat menyukai trik menggunakan nilai pengembalian sscanf. Biasanya nilai kembali akan dibuang, tapi di sini akan selalu menjadi 1, karena kami selalu membaca nomor tunggal sebagai input. Kita dapat mengambil keuntungan dari ini dengan menetapkan nilai kembalinya ke variabel 1, menyimpan 2 byte yang seharusnya diperlukan untuk menetapkan 11 secara eksplisit.

(%d@)

\$*,c'$,io>  ( setup - assign $ to "%d", * to a number, o to stdout )
Av"[""mN*    ( set " to input and allocate space for N for int conversion )
c?*          ( calloc ?, starting it at zero - this will be the output )
m1*          ( allocate variable "1", which gets the value 1 eventually )
mp*m%*       ( p is the prime, % will be used to store N mod p )

s1"$pN       ( scan " into N with $ as format; also assigns 1 to 1 )

1p:~         ( begin loop, starting p at 1 )
  +p1p       ( increment p )
  %%Np       ( set % to N mod p )
?%~          ( repeat if the result is nonzero, so that we reach the factor )

:=           ( another loop to repeatedly divide N by p )
  /NNp       ( divide N by p in-place )
  +?1?       ( increment the counter )
  -%N1       ( reuse % as a temp variable to store N-1 )
?%=          ( repeat while N-1 is not 0 -- i.e. break when N = 1 )

p%'$i?       ( sprintf ? into ', reusing the input format string )
w1'%>        ( write to stdout )
Gagang pintu
sumber
2

Java 8, 59 bytes

Sebuah lambda dari intke int.

x->{int f=1,c=0;while(x%++f>0);for(;x>1;c++)x/=f;return c;}

Cobalah online

Jakob
sumber
2

J, 4 byte

#@q:

q:memberikan daftar faktor prima, #memberikan panjang daftar.

Cobalah online!

Jonah
sumber
2

R , 37 bytes

length(numbers::primeFactors(scan()))

Cobalah online!

ngm
sumber
1
sum(x|1)hampir selalu lebih pendek darilength(x)
Giuseppe
2

Stax ,43 byte

|f%

Jalankan dan debug itu

Panjang faktorisasi utama.

wastl
sumber
5
Ahh .. kamu melanggar yang dicoret 4 masih biasa 4; ( meme.; P (Sudah mulai tua sih .. Kurasa sudah cukup bagus)
Kevin Cruijssen
1
Yay, MathJax penyalahgunaan!Tapi ingat untuk meletakkan tanda silang di depan bytecount yang sebenarnya karena potongan leaderboard mungkin tidak bisa mengenalinya.
user202729
2

MATL , 3 byte

Yfz

Cobalah online!

Penjelasan:

     % Implicit input: 59049
Yf   % Factorize input [3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
  z  % Number of non-zero elements: 10
     % Implicit output
Stewie Griffin
sumber
2

Spasi, 141 byte

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_number][T    T   T   _Retrieve][S S S T  N
_Push_1][N
S S N
_Create_Label_LOOP_1][S S S T   N
_Push_1][T  S S S _Add][S N
S _Duplicate][S T   S S T   S N
_Copy_2nd_input][S N
T   _Swap_top_two][T    S T T   _Modulo][N
T   S S N
_If_0_Jump_to_Label_BREAK_1][N
S N
N
_Jump_to_Label_LOOP_1][N
S S S N
_Create_Label_BREAK_1][S S S N
_Push_0][S T    S S T   S N
_Copy_2nd_input][N
S S T   N
_Create_Label_LOOP_2][S N
S _Duplicate_input][S S S T N
_Push_1][T  S S T   _Subtract][N
T   S S S N
_If_0_Jump_to_Label_BREAK_2][S N
T   _Swap_top_two][S S S T  N
_Push_1][T  S S S _Add][S N
T   _Swap_top_two][S T  S S T   S N
Copy_2nd_factor][T  S T S _Integer_divide][N
S N
T   N
_Jump_to_Label_LOOP_2][N
S S S S N
_Create_Label_BREAK_2][S N
N
_Discard_top][T N
S T _Print_as_number]

Huruf S(spasi), T(tab), dan N(baris baru) ditambahkan hanya sebagai penyorotan.
[..._some_action]ditambahkan sebagai penjelasan saja.

Cobalah online (dengan spasi, tab, dan baris baru saja).

Penjelasan dalam pseudo-code:

Integer n = STDIN as input
Integer f = 1
Start LOOP_1:
  f = f + 1
  if(n modulo-f == 0)
    Call function BREAK_1
  Go to next iteration of LOOP_1

function BREAK_1:
  Integer r = 0
  Start LOOP_2:
    if(n == 1)
      Call function BREAK_2
    r = r + 1
    n = n integer-divided by f
    Go to next iteration of LOOP_2

function BREAK_2:
  Print r as number to STDOUT
  Program stops with an error: Exit not defined

Contoh dijalankan: input = 9

Command    Explanation                    Stack           Heap    STDIN   STDOUT   STDERR

SSSN       Push 0                         [0]
SNS        Duplicate top (0)              [0,0]
TNTT       Read STDIN as number           [0]             {0:9}   9
TTT        Retrieve                       [9]             {0:9}
SSSTN      Push 1                         [9,1]           {0:9}
NSSN       Create Label_LOOP_1            [9,1]           {0:9}
 SSSTN     Push 1                         [9,1,1]         {0:9}
 TSSS      Add top two (1+1)              [9,2]           {0:9}
 SNS       Duplicate top (2)              [9,2,2]         {0:9}
 STSSTSN   Copy 2nd from top              [9,2,2,9]       {0:9}
 SNT       Swap top two                   [9,2,9,2]       {0:9}
 TSTT      Modulo top two (9%2)           [9,2,1]         {0:9}
 NTSSN     If 0: Jump to Label_BREAK_1    [9,2]           {0:9}
 NSNN      Jump to Label_LOOP_1           [9,2]           {0:9}

 SSSTN     Push 1                         [9,2,1]         {0:9}
 TSSS      Add top two (2+1)              [9,3]           {0:9}
 SNS       Duplicate top (3)              [9,3,3]         {0:9}
 STSSTSN   Copy 2nd                       [9,3,3,9]       {0:9}
 SNT       Swap top two                   [9,3,9,3]       {0:9}
 TSTT      Modulo top two (9%3)           [9,3,0]         {0:9}
 NTSSN     If 0: Jump to Label_BREAK_1    [9,3]           {0:9}
NSSSN      Create Label_BREAK_1           [9,3]           {0:9}
SSSN       Push 0                         [9,3,0]         {0:9}
STSSTSN    Copy 2nd from top              [9,3,0,9]       {0:9}
NSSTN      Create Label_LOOP_2            [9,3,0,9]       {0:9}
 SNS       Duplicate top (9)              [9,3,0,9,9]     {0:9}
 SSSTN     Push 1                         [9,3,0,9,9,1]   {0:9}
 TSST      Subtract top two (9-1)         [9,3,0,9,8]     {0:9}
 NTSSSN    If 0: Jump to Label_BREAK_2    [9,3,0,9]       {0:9}
 SNT       Swap top two                   [9,3,9,0]       {0:9}
 SSSTN     Push 1                         [9,3,9,0,1]     {0:9}
 TSSS      Add top two (0+1)              [9,3,9,1]       {0:9}
 SNT       Swap top two                   [9,3,1,9]       {0:9}
 STSSTSN   Copy 2nd from top              [9,3,1,9,3]     {0:9}
 TSTS      Integer-divide top two (9/3)   [9,3,1,3]       {0:9}
 NSNTN     Jump to Label_LOOP_2           [9,3,1,3]       {0:9}

 SNS       Duplicate top (3)              [9,3,1,3,3]     {0:9}
 SSSTN     Push 1                         [9,3,1,3,3,1]   {0:9}
 TSST      Subtract top two (3-1)         [9,3,1,3,2]     {0:9}
 NTSSSN    If 0: Jump to Label_BREAK_2    [9,3,1,3]       {0:9}
 SNT       Swap top two                   [9,3,3,1]       {0:9}
 SSSTN     Push 1                         [9,3,3,1,1]     {0:9}
 TSSS      Add top two (1+1)              [9,3,3,2]       {0:9}
 SNT       Swap top two                   [9,3,2,3]       {0:9}
 STSSTSN   Copy 2nd from top              [9,3,2,3,3]     {0:9}
 TSTS      Integer-divide top two (3/3)   [9,3,2,1]       {0:9}
 NSNTN     Jump to Label_LOOP_2           [9,3,2,1]       {0:9}

 SNS       Duplicate top (1)              [9,3,2,1,1]     {0:9}
 SSSTN     Push 1                         [9,3,2,1,1,1]   {0:9}
 TSST      Subtract top two (1-1)         [9,3,2,1,0]     {0:9}
 NTSSSN    If 0: Jump to Label_BREAK_2    [9,3,2,1]       {0:9}
NSSSSN     Create Label_BREAK_2           [9,3,2,1]       {0:9}
 SNN       Discard top                    [9,3,2]         {0:9}
 TNST      Print as integer               [9,3]           {0:9}           2
                                                                                    error

Program berhenti dengan kesalahan: Tidak ditemukan jalan keluar.

Kevin Cruijssen
sumber
2

Brachylog , 2 byte

ḋl

Cobalah online!

Penjelasan

ḋ        Prime decomposition
 l       Length
Fatalisasi
sumber
1

Python 2 , 62 bytes

def f(n,p=2,i=0):
	while n%p:p+=1
	while n>p**i:i+=1
	return i

Cobalah online!

Tidak ada yang mewah di sini.

Chas Brown
sumber
1
Anda dapat menyimpan tiga byte dengan menjadikannya program lengkap: Cobalah online!
dylnan
1

Japt , 3 byte

k l

Cobalah online!

Penjelasan:

k l
k     Get the prime factors of the input
  l   Return the length
Oliver
sumber
1

Oktaf , 18 byte

@(x)nnz(factor(x))

Cobalah online!

Lakukan apa yang tertulis di kaleng: Jumlah elemen yang tidak nol dalam faktorisasi utama input.

Stewie Griffin
sumber
1

Cjam, 5 byte

rimf,

Cobalah secara Online!

Penjelasan:

ri      take the input and convert it to an int
  mf    factors the input
    ,   take the length of the list

Builtin hebat!

Chromium
sumber
Pengajuan harus berupa program atau fungsi secara default, dan kami tidak menganggapnya sebagai fungsi . Baik rimf,(program penuh) dan {mf,}(fungsi) akan valid.
Dennis
@ Dennis Ya, saya pikir saya agak bingung tentang itu. Saya juga melihat stardard io yang diizinkan sebelumnya dan bertanya-tanya tentang apa yang seharusnya saya serahkan ... Saya sebenarnya ingin mengajukan pertanyaan tentang meta tentang itu. Tapi Anda mengonfirmasi itu, jadi terima kasih!
Chromium
1

QBasic, 51 byte

INPUT x
p=2
WHILE x/p>x\p
p=p+1
WEND
?LOG(x)/LOG(p)

Gunakan algoritme yang sama dengan solusi "Pulihkan yang utama" untuk menemukan pangkalan, kemudian gunakan aturan logaritma untuk mendapatkan eksponen:lHaig(haln)=nlHaig(hal).

DLosc
sumber
0

Perl 6 , 36 byte

{round .log/log (2..*).first: $_%%*}

Mencari faktor pertama (2..*).first: $_%%*, lalu dari sana menghitung nilai perkiraan (log tidak akan membuatnya tepat) dan membulatkannya.

Cobalah online!

Phil H
sumber
0

Perl 6 , 18 byte

{+grep($_%%*,^$_)}

Cobalah online!

Blok kode anonim yang mendapat daftar faktor dan memaksanya ke nomor.

Jo King
sumber