Gücü ana güçten kurtarın


16

Görünüşe göre birçok insan buna sahip olmak istiyor, bu yüzden şimdi bu zorluğun devamı var !

Tanım : asal güç , p'nin asal ve n'nin doğal bir sayı olduğu p n şeklinde ifade edilebilen doğal bir sayıdır.

Görev : Birinci güç p n > 1 verildiğinde , n gücünü geri verin.

Testcases :

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

Puanlama : Bu . Bayt cinsinden en kısa cevap kazanır.


2
Not : Bu zorluk bazı golf dillerinde önemsiz olabilir, ancak bazı ana diller ve Haziran 2018 dili QBasic için o kadar önemsiz değildir.
Outgolfer Erik

1 yerine True çıktısı verebilir miyiz? Alternatif olarak, ints yerine yüzer mi?
Jo King

1
@ Evet evet, evet.
Leaky Nun

@EriktheOutgolfer Zorluk kabul edildi : D
DLosc

Yanıtlar:







3

dc , 50 41 bayt

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

Çevrimiçi deneyin!

Yığının üstünden girdi alır (TIO'da, yürütmeden önce girişi yığına yüklemek için başlığa koyun). Stdout'a çıkışlar.

açıklama

Kullanılan kayıtlar:

i: geçerli deneme bölen, Xçalışırken. Daha sonra bulduğumuz bölen.

X: dli1+dsi%0<X"artış i, daha sonra, yığın üzerindeki değerle modülü (orijinal girdi olacak) kontrol edin makro . Sıfır değilse, tekrar".

Y: "Yığına dli/dli<Y, yığının geçerli üst kısmının kopyasını bölüi . Tekrar iulaşılana kadar tekrarlayın ."

Tam program:

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

Çok daha iyi bir çözüm buldum! Şimdi düzenleniyor ...
Sophia Lechner

3

yüz , 86 bayt

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

Yaşasın, Java'dan daha uzun!

Çevrimiçi deneyin!

Özellikle dönüş değerini kullanma hilesinden hoşlanıyorum sscanf. Normalde dönüş değeri atılır, ancak burada her zaman 1 olur, çünkü her zaman giriş olarak tek bir sayı okuyoruz. Geri dönüş değerini değişkene atayarak, 1aksi takdirde 11'e açıkça atanması gereken 2 baytı kaydederek bundan faydalanabiliriz.

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








2

Boşluk, 141 bayt

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

Harfler S(boşluk), T(sekme) ve N(yeni satır) yalnızca vurgulama olarak eklendi.
[..._some_action]yalnızca açıklama olarak eklendi.

Çevrimiçi deneyin (yalnızca ham alanlar, sekmeler ve yeni satırlarla).

Sahte kodda açıklama:

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

Örnek çalışma: 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 bir hatayla duruyor: Çıkış bulunamadı.








1

Cjam, 5 bayt

rimf,

Çevrimiçi deneyin!

Açıklama:

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

Yapı harika!


Gönderiler varsayılan olarak program veya işlev olmalıdır ve bunu bir işlev olarak görmüyoruz . Hem rimf,(tam program) hem de {mf,}(işlev) geçerli olacaktır.
Dennis

@Dennis Evet, bence biraz kafam karıştı. Ayrıca daha önce izin verilen stardard io'ya baktım ve gerçekten ne göndermem gerektiğini merak ettim ... Aslında bu konuda meta hakkında bir soru sormak istedim. Ama bunu doğruladın, çok teşekkürler!
Chromium

1

QBasic, 51 bayt

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

Tabanı bulmak için "Prime'ı Kurtar" çözümü ile aynı algoritmayı kullanır, sonra üssü almak için logaritma kurallarını kullanır:lÖg(pn)=nlÖg(p)




0

Perl 6 , 36 bayt

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

İlk faktörü arar (2..*).first: $_%%*, sonra oradan yaklaşık değeri hesaplar (günlükler kesin olarak elde edilmez) ve yuvarlar.

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