プライムまたは最高因子


14

チャレンジ:

の範囲の0 to Infinity非負の整数の配列が与えられた場合、それらのすべてが素数であるかどうかを確認します。(必要に応じて入力を文字列として受け取ることもできます)

入力:

入力:数字の配列

出力:すべての要素が次のいずれかに置き換えられた配列:

-1                 -----> If 0, 1
1                  -----> If it is a prime number greater than 1
the highest factor -----> If that number is not prime

-1(0、1)、1(素数> = 2の場合)、または指定された数の最大因子(非素数の場合)を返します

例:

[1, 2, 3, 4, 10, 11, 13]                        ---> [-1, 1, 1, 2, 5, 1, 1]
[100, 200, 231321, 12312, 0, 111381209, 123123] ---> [50, 100, 77107, 6156, -1, 1, 41041]

注意:

入力は常に有効です。つまり、数字のみで構成され、小数はテストされません。配列は空でもかまいませんが、空の場合は空の配列を返します。

制限:

これはので、各言語のバイト単位の最短コードが優先されます。

リーダーボード:

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


2
私は非常に使用することをお勧めサンドボックスをそれらを投稿する前に質問にフィードバックを提供するために、将来の質問のために
ジョー・キング

@Joking:無限大の場合、無限大までのすべての数値を出力する必要があります。これはあなたのためだけのものであり、あなたはそれがタイムアウトまたは何もしないことを確認する必要があります。JK:タイムアウトエラーは、無限の場合に発生する可能性が最も高いものです

4
ちょうど1より大きい「それは1よりも大きい素数である場合は、」素数は常に1より大きくしているために本当に必要ではないことに注意することは望んでいた
イヴォ・ベッカー

5
最高の要因を定義します。番号自体を返す必要がありますか?最高の割り切れる素数?それ自体ではない最高の要因は?
ニッサ

2
私は、我々のプログラムのみ(任意に大きな整数をサポートしていないもののために)私たちの選択した言語の最大整数サイズの整数までの作業に必要とされるそれを取る
JDL

回答:


9

ゼリー 7 6 バイト

ÆḌṪ€o-

負でない整数のリストを受け入れ、-1以上の整数のリストを取得するモナドリンク。

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

どうやって?

ご了承ください:

  • すべての素数には単一の適切な除数(1)があります
  • すべてのコンポジットには、複数の適切な除数があります(1つに他の除数)
  • 適切な除数としての数字はありません
  • Jellyのget-proper-divisorsアトムはÆḌ、昇順で適切な除数のリストを生成します
  • 0と1には適切な除数がありません(それらは素数でも合成でもありません)
  • 空のリストにJellyのテールアトムを適用すると、ゼロになります
  • ゼロの適切な除数を持つ数値はありません(最大値であることは言うまでもありません)
  • ゼリーではゼロ以外の数字はすべて真実ですが、ゼロは偽です

ÆḌṪ€o- | Link: list of integers   e.g. [ 0, 1,  2,  5,     10,    5183]
ÆḌ     | proper divisors (vectorises)  [[],[],[1],[1],[1,2,5],[1,71,73]]
  Ṫ€   | tail €ach                     [ 0, 0,  1,  1,      5,      73]
     - | literal minus one
    o  | logical OR (vectorises)       [-1,-1,  1,  1,      5,      73]

8

ゼリー9 8バイト

@Dennisのおかげで1バイト節約

:ÆfṂ€$~~

オンラインでお試しください!またはすべてのテストケースを実行する

コメント済み

我々は両方のその事実を利用nanしてinfなる0ビット単位が適用されないときはゼリーに。

:ÆfṂ€$~~ - main link, taking the input list
 ÆfṂ€$   - treat these two links as a monad:
 Æf      -   get the lists of prime factors (0 --> 0; 1 --> empty list; prime --> itself)
    €    -   for each list,
   Ṃ     -   isolate the minimum prime factor (turns empty lists into 0)
:        - divide each entry by its minimum prime factor (0/0 --> nan; 1/0 --> inf)
      ~~ - bitwise NOT x2 (nan or inf --> 0 --> -1; other entries are unchanged)

3
今回はJavaScriptを使用しませんでしたか?良い答えbtw

3
私は本当に好き~~です。:ÆfṂ€$~~ヘルパーリンクを削除してバイトを節約します。
デニス

@デニスああ!$私が探していたものです。:)ありがとう!
アーナウルド

7

R、68 62バイト

Map(function(n,v=rev(which(!n%%1:n)))"if"(n<2,-1,v[2]),scan())

ベースRのみを使用し、ライブラリを使用しないソリューション!6バイトのゴルフをしてくれたGiuseppeに感謝します。

scanスペースで区切られた数字のリストを読み取り、%%要因を特定するために使用します。v次に、すべての因子のベクトルが昇順で含まれます(1とnを含む)。これには、reverseのときに必要なv数が2番目になり、lengthまたはtailnprimeの場合、vcontains n 1、それ以外の場合にn (factors in descending order) 1)の呼び出しを回避するという素晴らしい特性があります。

出力例(TIOリンクはこちら):

> Map(function(n,v=rev(which(!n%%1:n)))"if"(n<2,-1,v[2]),scan())
1: 0 1 2 3 4 5 6 7 8 9
11: 
Read 10 items
[[1]]
[1] -1

[[2]]
[1] -1

[[3]]
[1] 1

[[4]]
[1] 1

[[5]]
[1] 2

[[6]]
[1] 1

[[7]]
[1] 3

[[8]]
[1] 1

[[9]]
[1] 4

[[10]]
[1] 3

リストが受け入れ可能な戻り値の型ではないと思う場合は、3バイトを交換しMapsapply追加します。



素晴らしい—初期化することを考えていなかった!
JDL

6

05AB1E11 9 8 バイト

Ñε¨àDd<+

-3のおかげバイト@Emigna変化、©d1-®+Dd<+€¨€àしますε¨à

私の2番目の05AB1Eの回答のみなので間違いなくゴルフをすることができます

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

説明:

Ñ           # Divisors of each item in the input-list (including itself)
            #  [1,2,10,3] → [[1],[1,2],[1,2,5,10],[1,2,3]]
 ε          # For each:
  ¨         #  Remove last item (so it's now excluding itself)
            #   [[1],[1,2],[1,2,5,10],[1,2,3]] → [[],[1],[1,2,5],[1,2]]
   à        #  And get the max
            #   [[],[1],[1,2,5],[1,2]] → ['',1,5,2]
    D       # Duplicate the list
     d      # Is it a number (1 if it's a number, 0 otherwise)
            #  ['',1,5,2] → [0,1,1,1]
      <     # Subtract 1
            #  [0,1,1,1] → [-1,0,0,0]
       +    # Add both lists together
            #  ['',1,5,2] and [-1,0,0,0] → ['-1',1,5,2]

1
Dd<+の代わりに動作するはずです©d1-®+。またï、これらはまだintなので、必要ありません。ただし、より見栄えの良い出力を得るためにフッターに含めることもできます。
エミグナ

@Emignaああ、1-代わり<にかなり愚かだった.. D代わりにありがとう©...®!そして、実際にïフッターに入れました。
ケビンクルーイッセン

1
またはそれ以上:Ñε¨àDd<+
エミグナ

私の12バイトよりもずっといい。
魔法のタコ




3

Java 8、105 103 87バイト

a->{for(int i=a.length,n,x;i-->0;a[i]=n<2?-1:n/x)for(n=a[i],x=1;++x<n;)if(n%x<1)break;}

バイトを節約するために新しい配列を返す代わりに、入力配列を変更します。

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

説明:

a->{                  // Method with integer-array parameter and no return-type
  for(int i=a.length,n,x;i-->0;
                      //  Loop backward over the array
      a[i]=           //    After every iteration: change the current item to:
           n<2?       //     If the current item is 0 or 1:
            -1        //      Change it to -1
           :          //     Else:
            n/x)      //      Change it to `n` divided by `x`
     for(n=a[i],      //   Set `n` to the current item
         x=1;++x<n;)  //   Inner loop `x` in range [2,`n`)
       if(n%x<1)      //    If `n` is divisible by `x`:
         break;}      //     Stop the inner loop (`x` is now the smallest prime-factor)
                      //   (if the loop finishes without hitting the `break`,
                      //    it means `n` is a prime, and `x` and `n` will be the same)

3

Haskell、52 49バイト

map(\x->last$[d|d<-[1..x-1],mod x d<1]++[-1|x<2])

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

map                     -- for each element in the input array
  \x->                  -- apply the lambda function
    last                -- pick the last element of the following list
     [d|d<-[1..x-1]     --  all d from 1 to x-1 
           ,mod x d<1]  --    where d divides x 
     ++[-1|x<2]         --  followed by -1 if x<2


3

アタッシュ、23バイト

@{Max&-1!Divisors@_@-2}

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

29バイト、ポイントフリー: @(Max&-1@Last@ProperDivisors)

24バイト、ポイントフリー: @(Max&-1@`@&-2@Divisors)

これは、単純に最後から2番目の除数を取得し、nその最大値とを取得し-1ます。要素が2つ未満の配列の最後から2番目の要素はnil、およびMax[-1, nil]です-1@この関数を単純にベクトル化し、各アトムに適用します。



2

R + numbers88 79バイト

主に提出方法についてのいくつかのアドバイスに対するコメントに感謝します。

function(y)sapply(y,function(x)"if"(x<2,-1,prod(numbers::primeFactors(x)[-1])))

最小の要素を除くすべての素因数の積を使用し、空のベクトルの要素の積がであると定義されるという事実を使用します1

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


1
library呼び出しを省略してnumbers::primeFactors直接使用するためにバイトを節約します。
JDL

1
JDLが提案していることを確認し、これを匿名関数に交換するTIOリンク次に示します。
ジュゼッペ

2

Brachylog、10バイト

{fkt|∧_1}ˢ

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

以下の説明は、簡潔にするためにほとんどの場合必須であり、ブラキログの宣言的な性質を正確に反映していません。

{          Start of inline predicate.
           Implicit input to the predicate.
 f         Create a list of all of the input's factors (including itself).
  k        Remove the last item of this list so that it no longer contains the original number.
   t       Take the last item of the list with the last item removed.
           Implicitly unify the output with the aforementioned last item.
    |      If that failed, because one of the lists was empty...
     ∧     discarding the input, (there's probably some obvious reason ∨ won't work here but I don't know what it is)
      _1   unify the output with -1 instead.
        }  End of the inline predicate.
         ˢ For every item of the input, unify it with the predicate's input and get a list of the corresponding outputs.

浸透を通じて実際のPrologの動作の一部を学びたいと思って、コードゴルフを楽しみながらブラキログを学ぶことにしました。実行制御文字が機能します。


2
「おそらくここでworkが動作しない明らかな理由がありますが、それが何なのか分かりません」 ->の.∨代わりに使用できます|∧(忘れてしまったと思います.)が、同じバイト数です。ちなみにPPCG(そしてもっと重要なのはBrachylog)へようこそ!
致命的

ああ、もちろん!ありがとう。
関連のない文字列


1

スタックス14 13 バイト

ü±p╞Ö*«òτ♀╣â▀

実行してデバッグする

説明(開梱):

m|fc%c{vsH1?}U? Full program, implicit input-parsing
m               Map
 |fc%c            Get factorisation and length of it (0 and 1 yield [])
      {     } ?   If length != 0:
       v            Decrement
           ?        If still != 0:
        sH            Last element of factorisation
           ?        Else:
          1           Push 1
              ?   Else:
             U      Push -1

マップ内の擬似コード:

f = factorisation(i)
l = length(f)
if l:
    if --l:
        return f[-1]
    else:
        return 1
else:
    return -1

1

Pyth、12バイト

me+_1f!%dTSt

ここで試してみてください

説明

me+_1f!%dTSt
m            Q    For each number d in the (implicit) input...
          Std     ... get the range [1, ..., d - 1]...
     f!%dT        ... take the ones that are factors of d...
  +_1             ... prepend -1...
 e                ... and take the last.

1

J、14バイト

1(%0{q:,-)@>.]

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

nごとに、代わりに最大値(n、1)を取ります。
否定された数をその素因数のリスト(1の空のリスト)に追加し、リストの最初の項目で数を除算します。

また14バイト

(%0{q:) ::_1"0

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

すべての数をその素因数の最初の要素で割ります。0ではドメインエラーが発生しq:、1の空のリストで0番目のアイテムを探します。これもエラーです。エラーが発生した数値の場合、-1を返します。


非常に素晴らしい解決策!
ガレンイワノフ

1

Japt14 11 8バイト

®/k v)ªÉ
®        // For each input number,
 /k v    // return the number divided by it's first prime factor,
     )ªÉ // or -1 if such a number doesn't exist (the previous result is NaN).

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

Shaggyのおかげで、これらの厄介な3バイトを削った


-あなたは素数フィルタリングする必要はありませんk戻っプライムの要因をN:これは8バイトになるように-®/k v)ªÉ
シャギーを

@Shaggyありがとう、メソッドのドキュメントがそれを言っていないので、それが素因数のみを返すことを知りませんでした。
Nit

1
ああ、そう、忘れた。しばらくの間、そのためのPRを送信することを意味していました。まもなくそうします。
シャギー

1

JavaScript(Node.js)61 55バイト

@shaggyのおかげで-6バイト

_=>_.map(_=>eval('for(v=_/(d=_>>1);v!=~~v;v=_/--d);d'))

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


説明 :

_ =>                                     // input i.e : the original array
    _.map(                               // map over all elements of the array
        eval('                           // eval a string
            for(v=_/(d=_>>1);            // set v = _ / _ >> 1 and set that to d
                v!=~~v;                  // and keep going until v !== floor(v)
                        v=_/d--);        // to _ / d again (d was changed)
                    d'                   // return d
            ))                           // end eval and map and function

これはまだ古いコードがこれを更新していないためです。

ES5にも対応:

 const primeOrNot = function(input) { // the function with argument input
      return input.map(function(value) { // returns the array after mapping over them
           d = Math.floor(value * 0.5); // multiply each element by 0.5 and floor it 
           for(let v = value / d; v != Math.floor(v);) { // for loop goes until v!=~~v
                d --; // subtract one from d
                v = value / d; // set v again to value / d
           }
           return d; // return d
      })
 };


@シャギー:ありがとう
ムハンマド・サルマン

1

Bash + GNUユーティリティ、49

  • @Cowsquackのおかげで9バイト節約
factor|sed '/:$/c-1
/: \w+$/c1
s%: %/%
y/ /#/'|bc

説明

  • factor STDINから入力番号を1行に1つずつ読み取り、次の形式で出力します <input number>: <space-separated list of prime factors (ascending)>
  • sed これを次のように処理します。
    • /:$/c-1 入力番号0および1には素因数がなく、次のように置き換えられます -1
    • /: \w+$/c11つの素因数(自分自身)を持つ数は素数です。これらを置き換えます1
    • s%: %/%交換してください:/。これにより、算術式が作成され、(非素数)入力数が最小の素因数で除算され、最大の因数が得られます
    • y/ /#/ 他の(不要な)要因のリストを削除する(コメントアウトする)
  • bc 算術評価と表示

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


1
あなたがドロップすることができるかもしれない-r、と最初の二つはのためにs「あなたが使用することができますよ/regex/cvalue以上保存することができ、さらに、この正規表現を簡素化し、ゴルフにバイトをし、あなただけ置き換えることで、最後の2つの正規表現の中でバイトを保存することができ:/、そして次に、tio.run
##

@Cowsquackとても良い-ありがとう!
デジタル外傷





1

Befunge-98(FBBI)、39バイト

j&:!+f0p1-1:::' -:!j;3k$.nbj;-\%!!j:1+a

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

&数字がなくなると、で終わります。これにより、プログラムはTIOがプログラムを終了するまで60秒間停止します。Befunge-98では、少なくともTIOでは、両方のインタープリターがこれを行うため、これは避けられません。プレイを押した後、少し待ってから出力を確認するために、少し後にプログラムを停止できます。


基本的に、すべての新しい数値が0の場合、1に変わります。その後、スタックに-1を置き、その後に1から始まる数値を入力し、入力数値に達するまでカウントアップします。スタックの2番目の数値(0または1の入力の場合は-1、その他の場合は最高の係数)を出力します。ループを通るたびに、イテレーターの値をif(input % iterator == 0)の背後のスタックに追加します。つまり、入力に到達したら、イテレータを捨てて印刷するだけです。次に、スタックをクリアしnて、読み取り入力関数に戻ります。

私は後で説明を拡大するかもしれません、私たちは見るでしょう...


0

Retina 0.8.2、33バイト

%(`^0|^1$
-1
\d+
$*
^(1+)\1+$
$.1

オンラインでお試しください!リンクには、遅くないテストケースが含まれます。説明:

%(`

各入力番号をループします。

^0|^1$
-1

特殊なケース0および1。

\d+
$*

単項に変換します(-1には影響しません)。

^(1+)\1+$
$.1

各数値を10進数の最大の適切な係数で置き換えます。


0

tinylisp、75バイト

(load library
(q((L)(map(q((N)(i(l N 2)(- 1)(/ N(min(prime-factors N))))))L

オンラインでお試しください!(フッターで呼び出すことができるように、匿名関数に名前を付けるための4バイトが追加されています。)

未ゴルフ/説明

プライムに1を返すことに注意してください n そして、以下の最大因子 n コンポジット用 n 組み合わせて返品可能 n/p どこ p の最小の素因数 n

(load library)               Library gives us map, -, /, min, and prime-factors functions

(lambda (L)                  Anonymous function, takes a list of numbers L
 (map                         Map
  (lambda (N)                  Anonymous function, takes a number N
   (if (less? N 2)              If N < 2
    (- 1)                        -1; else
    (/ N                         N divided by
     (min                        the minimum
      (prime-factors N)))))      of the prime factors of N
  L)))                        ... to L
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.