주요 전력에서 전력 복구


16

많은 사람들이 이것을 갖고 싶어하는 것 같습니다. 이제이 도전 의 속편입니다 !

정의 : 소수 는 자연수이며 p n 형식으로 표현할 수있는 자연수입니다. 여기서 p는 소수이고 n은 자연수입니다.

작업 : 주요 전력 p n > 1이 주어지면 전력 n을 반환합니다.

테스트 케이스 :

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

채점 : 이것은 입니다. 바이트 단위의 최단 답변이 이깁니다.


2
참고 :이 도전은 일부 골프 언어에서 사소한 것일 수 있지만 2018 년 6 월의 QBasic 언어뿐만 아니라 일부 주류 언어에는 사소한 것이 아닙니다.
Outgolfer Erik

1 대신 True를 출력 할 수 있습니까? 또는 ints 대신 float?
Jo King

1
@JoKing 예, 그렇습니다.
Leaky Nun

@EriktheOutgolfer 도전 수락 : D
DLosc

답변:







3

dc , 50 41 바이트

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

온라인으로 사용해보십시오!

스택 맨 위에서 입력을 가져옵니다 (TIO에서는 입력을 헤더에 넣어 실행 전에 스택에로드합니다). stdout으로 출력합니다.

설명

사용 된 레지스터 :

i: X실행중인 현재 평가판 제수 입니다. 나중에, 우리가 찾은 약수.

X: 매크로 dli1+dsi%0<X는 "증가"효과를 가지며 i스택의 값으로 원래 계수를 확인합니다 (원래 입력이 됨). 0이 아닌 경우 반복합니다.

Y: 매크로 : dli/dli<Y"스택에 스택의 현재 상단 사본을 i. 으로 나눈 값에 추가 합니다. i에 도달 할 때까지 반복 합니다."효과가 있습니다.

전체 프로그램 :

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

3

face , 86 바이트

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

Java보다 긴 Hooray!

온라인으로 사용해보십시오!

나는의 반환 값을 사용하는 트릭을 특히 좋아합니다 sscanf. 일반적으로 반환 값은 버려지지만 항상 단일 숫자를 입력으로 읽으므로 항상 1이됩니다. 반환 값을 변수 1에 할당 1하여 명시 적으로 지정 해야하는 2 바이트를 저장하여 이를 활용할 수 있습니다 .

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

공백, 141 바이트

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

문자 S(공백), T(탭) 및 N(줄 바꾸기)가 강조 표시로만 추가되었습니다.
[..._some_action]설명으로 만 추가되었습니다.

온라인으로 시도하십시오 (원시 공백, 탭 및 줄 바꾸기 만).

의사 코드의 설명 :

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

예제 실행 : 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

프로그램이 오류와 함께 중지됩니다 : 종료를 찾을 수 없습니다.








1

잼, 5 바이트

rimf,

온라인으로 사용해보십시오!

설명:

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

내장은 훌륭합니다!


제출은 기본적으로 프로그램 또는 기능이어야하며, 이 기능은 기능으로 간주하지 않습니다 . 모두 rimf,(전체 프로그램) 및 {mf,}(기능) 유효 할 것이다.
Dennis

@ 데니스 그래, 나는 그것에 대해 혼란스러워 생각합니다. 또한 이전 에 허용 된 stardard io 를 살펴본 후 실제로 제출해야하는 것이 궁금했습니다. 실제로 메타에 대한 질문을하고 싶었습니다. 그러나 당신은 그것을 확인했습니다, 감사합니다!
Chromium

1

Q 기본, 51 바이트

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

"소수점 복구"솔루션 과 동일한 알고리즘 을 사용하여 밑을 찾은 다음 로그 규칙을 사용하여 지수를 얻습니다.영형()=영형().








당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.