프라임 파워에서 프라임 복구


13

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

작업 : 프라임 전력 p n > 1이 주어지면 프라임 p를 반환합니다.

테스트 케이스 :

input output
9     3
16    2
343   7
2687  2687
59049 3

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


1
n1이 될 수 있습니까 ?
user202729

@ user202729 : 네 번째 테스트 사례 n = 1.
Emigna 2016 년

15
아마도 주요 부분 대신 전력 부분 을 얻는 것이 더 어려웠을 것입니다. 그대로, 이것은 단지 "1이 아닌 가장 낮은 요소를 얻는다"
Jo King

답변:




7

자바 8, 46 39 37 바이트

n->{int r=1;for(;n%++r>0;);return r;}

@Tsathoggua 덕분에 간접적으로 -7 바이트 . JoKing
덕분에 -2 바이트

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

설명:

n->{               // Method with integer as both parameter and return-type
  int r=1;         //  Start the result-integer `r` at 1
  for(;n%++r>0;);  //  Increase `r` by 1 before every iteration with `++r`
                   //  and loop until `n` is divisible by `r`
  return r;}       //  After the loop, return `r` as result

다음 python3에서 루이스 Mendo의 대답 , 쓸 수있을 것입니다 n->{for(int i=1;++i<=n;)if(n%i<1)return i;}(43 개) 문자를 얻으려면? (저는 Java를 못해요.)
Tsathoggua

@Tsathoggua Java 메소드는 항상 리턴을 가져야하므로 현재로서는 그렇지 않습니다. n->{for(int i=1;++i<=n;)if(n%i<1)return i;return n;}작동하지만 불행히도 더 깁니다. Java는 무한 루프에서 단일 리턴을 가질 수 있으므로 실제로 바이트를 절약 할 수 있습니다. 감사합니다! n->{for(int i=1;;)if(n%++i<1)return i;}. 이후 i이 될 것이다 n(테스트 케이스와 마찬가지로 결국 2687)과 n%n==0의는 i<=n이 경우에 필요하지 않습니다.
Kevin Cruijssen

1
어떻게 약 37 바이트 . 더 이상 골프를 칠 수 있는지 Java에 익숙하지 않습니다
Jo King

@JoKing 더 이상 골프를 볼 것이 없어서 -2 주셔서 감사합니다.
Kevin Cruijssen



4

공백 , 80 61 60 바이트

[S S T  T   N
_Push_-1][S S S N
_Push_0][T  N
T   T   _Read_STDIN_as_number][N
S S N
_Create_Label_LOOP][S S S T N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate][S S S N
_Push_0][T  T   T   _Retrieve][S N
T   _Swap][T    S T T   _Modulo][N
T   T   N
_If_0_Jump_to_Label_LOOP][S S T T   N
_Push_-1][T S S N
_Multiply][T    N
S T _Print_as_number]

@JoKing 덕분에 -20 바이트 .

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

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

의사 코드의 설명 :

Integer n = STDIN as integer
Integer i = -1
Start LOOP:
  i = i - 1
  if(n modulo-i is negative)
    Go to next iteration of LOOP
  else
    i = i * -1
    Print i
    Exit with error: No exit defined

예제 실행 : input = 9

Command   Explanation                    Stack        Heap     STDIN    STDOUT    STDERR

SSTTN     Push -1                        [-1]
SSSN      Push 0                         [-1,0]
TNTT      Read STDIN as integer          [-1]         {0:9}    9
NSSN      Create Label_LOOP              [-1]         {0:9}
 SSSTN    Push 1                         [-1,1]       {0:9}
 TSST     Subtract top two (-1-1)        [-2]         {0:9}
 SNS      Duplicate top (-2)             [-2,-2]      {0:9}
 SSSN     Push 0                         [-2,-2,0]    {0:9}
 TTT      Retrieve                       [-2,-2,9]    {0:9}
 SNT      Swap top two                   [-2,9,-2]    {0:9}
 TSTT     Modulo top two (9%-2)          [-2,-1]      {0:9}
 NTSN     If neg.: Jump to Label_LOOP    [-2]         {0:9}

 SSTTN    Push -1                        [-2,-1]      {0:9}
 TSST     Subtract top two (-2-1)        [-3]         {0:9}
 SNS      Duplicate top (-2)             [-3,-3]      {0:9}
 SSSN     Push 0                         [-3,-3,0]    {0:9}
 TTT      Retrieve                       [-3,-3,9]    {0:9}
 SNT      Swap top two                   [-3,9,-3]    {0:9}
 TSTT     Modulo top two (9%-3)          [-3,0]       {0:9}
 NTSN     If neg.: Jump to Label_LOOP    [-3]         {0:9}
 SSTTN    Push -1                        [-3,-1]      {0:9}
 TSSN     Multiply top two (-3*-1)       [3]          {0:9}
 TNST     Print as integer               []           {0:9}             3
                                                                                  error

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


1
i == n수표 가 필요하십니까 ? n%n어쨌든 0 일 것입니다
Jo King

물론 @JoKing Ah. 감사합니다. 19 바이트가 바로 저장되었습니다. :)
Kevin Cruijssen 2016 년

그렇지 않은 경우에만 루프를 n%i인쇄하고 나중에 프린트를 호출 할 수 있습니까?
조 왕

1
@ JoKing 확실하지 않습니다. 공백에는 실제로 루프가 없으며 레이블로 이동합니다. 내가 가진 유일한 세 가지 옵션은 다음과 같습니다. 1. 무조건 특정 레이블로 이동합니다. 2. 스택 상단이 0이면 특정 레이블로 이동합니다. 3. 스택 상단이 음수이면 특정 레이블로 이동합니다. 불행히도 루프를 계속하기 위해 "긍정적 인 경우 레이블을 점프"하지 않습니다. 음수를 확인하기 전에 -1을 곱하여이 작업을 수행 할 수는 있지만 그것이 더 짧을지는 의심합니다.
Kevin Cruijssen

1
음의 모듈러스로 시도했지만 <s> 62 </ s> 60 바이트 (yay)로 끝났습니다 . 음수 힙 주소에 저장할 수없는 것으로 나타났습니다 (0은 몇 바이트를 저장했지만)
Jo King






2

4 번째 (2 번째) , 34 바이트

: f 1 begin 1+ 2dup mod 0= until ;

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

설명

  1. 2부터 시작하는 정수 반복
  2. n을 나머지없이 나누는 것을 찾으면 멈추고 돌아옵니다.

코드 설명

: f               \ Define a new word
  1               \ place a 1 on the stack (to use as a counter/index)
  begin           \ start indefinite loop
    1+ 2dup       \ increment counter and duplicate counter and prime power
    mod           \ calculate power % index
  0= until        \ end the loop if modulus is 0 (no remainder)
;                 \ end word definition




1

U + 1D414 는 하나의 문자이지만 UTF-8 및 UTF-16에서는 4 바이트로 표시됩니다.
Ruud Helderman 11

1
@RuudHelderman 맞지만, 이것은 UTF-8 또는 UTF-16이 아닙니다.
Okx

1
@RuudHelderman Neim 코드 페이지 를보고 싶을 수도 있습니다 .
JungHwan Min

@JungHwanMin 감사합니다; Okx의 이전 Neim 제출물을 살펴보면 약간 무지한 반응이 처음이 아니라는 것을 알았습니다. 영리한 기능이지만 분명하지는 않습니다. 설명을 보증합니다 ( 여기 에서 수행됨 ). 인용 코드-골프 태그 정보 : "질문에 문자로 점수를 매기도록 지정하지 않으면 바이트로 점수가 매겨집니다. 채점에 사용할 문자 인코딩을 지정하지 않으면 0에서 255 이외의 유니 코드 코드 포인트를 사용하는 답변은 사용 된 인코딩을 명시하십시오. "
Ruud Helderman

메타 합의에 따른 @RuudHelderman , 답변에 인코딩이 지정되어 있지 않은 경우 기본적으로 언어의 기본 인코딩이 사용됩니다. 존재하지 않으면 UTF-8입니다. 이 경우 Neim은 정의 된 기본 인코딩을 가지고 있으므로 응답자가 설명하지 않아도 답변의 인코딩으로 간주됩니다.
JungHwan Min 2018


1

매스 매 티카, 17 바이트

Divisors[#][[2]]&

두 번째로 작은 제수입니다.





0

PowerShell , 31 바이트

param($a)(2..$a|?{!($a%$_)})[0]

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

의 범위를 구축 2입력 $a, 이들 요소 꺼내서 where( ?) 모듈로 연산 %제로는 결과 !(...)(즉,의 약수 된 것 $a)을, 그리고 최소 필요 [0]한쪽. 그것은 파이프 라인에 남아 있으며 출력은 암시 적입니다.


0

펄 6 , 22 바이트

{grep($_%%*,2..$_)[0]}

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

입력 범위에서 2까지의 계수를 필터링하고 첫 번째 요소를 반환하는 익명 코드 블록입니다. ^$2 바이트를 절약하기 위해 사용하려고 시도했지만 입력이 소수 인 경우에는 작동하지 않았습니다.


0

Visual Basic .NET (.NET Framework v4.5), 123 71 바이트

@Jo King 덕분에 -52 바이트

Function A(n)
For i=n To 2 Step-1
A=If(n Mod i=0,i,A)
Next
End Function

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

언 골프 드 :

Function A(input As Long) As Long
    For i = input To 2 Step -1
        A = If (input Mod i = 0, i, A)
    Next
End Function

설명:

i루프 검색의 첫 번째 숫자로부터 뒤로, 그리고 균등하게 분할 모든 번호를 찾는다. 우리가 뒤로 가고 있기 때문에 가장 작은 것이 Vairable에 저장됩니다 A.

VB는 함수 이름과 일치하는 무료 변수를 제공합니다 (제 경우에는 A). 함수 실행이 끝나면 해당 변수의 값이 리턴됩니다 (명시 적 Return명령문 제외) .


1
프라임 체크가 전혀 필요하지 않습니다. 숫자의 가장 작은 요소 (1이 아닌)는 소수임을 보증합니다. 그렇지 않으면 더 작은 요소가 있습니다
Jo King

@JoKing D' oh! 물론, 내가 그것을 놓쳤다는 것을 믿을 수 없습니다. 감사!
Brian J






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