プライムパワーからプライムを回復する


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:4番目のテストケースn = 1
エミグナ

15
たぶん、プライム部分の代わりにパワー部分を取得するのはより困難だったでしょう。現状では、これは「1ではない最低の係数を取得する」
ジョーキング

回答:




7

Java 8、46 39 37バイト

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

@Tsathogguaのおかげで間接的に-7バイト。
-2バイトのおかげでJoKingの

オンラインでお試しください。

説明:

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==0i<=nこの場合には必要とされません。
ケビンクルーッセン

1
37バイト。私は、これ以上ゴルフができるかどうかを確認するのに十分なJavaに精通していません
ジョーキング

@JoKingこれ以上ゴルフをすることはないので、-2に感謝します。
ケビンクルーッセン



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
ジョーキング

@JoKing Ah、もちろん。おかげで、すぐに19バイトが保存されました。:)
ケビンクルーイッセン

そうでない場合にのみループして、n%i後で印刷を呼び出すことができますか?
ジョーキング

1
@JoKing私はそうは思わない。空白には実際にはループがなく、ラベルにジャンプするだけです。私が持っている唯一の3つのオプションは次のとおりです。1.特定のラベルに無条件にジャンプします。2.スタックの最上部が0の場合、特定のラベルにジャンプします。3.スタックの上部が負の場合、特定のラベルにジャンプします。残念ながら、ループを続行するための「正の場合はラベルにジャンプ」はありません。マイナスをチェックする前に-1を掛けることでこれを達成できましたが、もっと短くなるとは思いません。
ケビンクルーッセン

1
負のモジュラスでそれをやろうとしましたが、最終的には<s> 62 </ s> 60バイトになりました(はい)。負のヒープアドレスに格納できないことが判明しました(0は数バイトを節約しましたが)
ジョーキング






2

Forth(gforth)、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は1文字ですが、UTF-8およびUTF-16では4バイトで表されます。
ルードヘルダーマン

1
@RuudHelderman正しいですが、これはUTF-8でもUTF-16でもありません。
Okx

1
@RuudHelderman Neim codepageをご覧になることをお勧めします。
ジョンファンミン

@JungHwanMinありがとう。Okxの以前のNeimのサブミッションを閲覧したとき、私はわずかに無知な反応が最初ではなかったことに気付きました。賢い機能ですが、明らかではありません。説明を保証します(ここで行います)。code-golfタグ情報の引用:「質問が文字でスコアリングされるように指定されていない限り、バイトでスコアリングされます。スコアリングに使用する文字エンコーディングを指定しない場合、0から255以外のUnicodeコードポイントを使用する回答は、使用されているエンコーディングを明記してください。」
ルードヘルダーマン

メタコンセンサスごとの@RuudHeldermanは、回答でエンコーディングが指定されていない場合、言語のデフォルトエンコーディングがデフォルトになります。それが存在しない場合、UTF-8です。この場合、Neimにはデフォルトのエンコーディングが定義されているため、回答者がそのように説明する必要なく、回答のエンコーディングであると想定されます。
ジョンファンミン


1

Mathematica、17バイト

Divisors[#][[2]]&

2番目に小さい除数。





0

PowerShell、31バイト

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

オンラインでお試しください!

2からinput までの範囲を構築し、モジュロ演算の結果がゼロになる$a要素where?)を取り出し(の約数である要素)、その最小要素を取得します。それはパイプラインに残され、出力は暗黙的です。%!(...)$a[0]



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以外)は素数であることが保証されています。そうでない場合、より小さい係数があります
ジョーキング

@JoKing D'oh!もちろん、私がそれを見逃したとは信じられません。ありがとう!
ブライアンJ


0

Pythonの347 45 44バイト

JavaでのKevin Cruijssenの回答に触発されました

2 Jo Kingのおかげで3バイトが削除されました

lambda n:[i+1for i in range(n)if n%-~i<1][1]

オンラインでお試しください!


1
の前に余分なスペースがifあり、条件は次の<1
ジョーキング

1
あなたはできる1つのバイトを保存することによって、range(n)およびインクリメントi場所で
ジョー・キングを




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.