素因数を計算する


27

私たちは持っていた素因数分解の挑戦をしばらく前に、しかし、その挑戦は、ほぼ6歳で、私は新しいもののためにそれの時間を信じているので、やっと、私たちの現在の要件を満たしています。

チャレンジ

入力として1より大きい整数を取り、その素因数のリストを出力または返すプログラムまたは関数を作成します。

ルール

  • 入力と出力は、任意の標準的な方法と標準的な形式で提供されます。
  • 重複する要因を出力に含める必要があります。
  • 出力の順序は任意です。
  • 入力が2未満又は2以上ではありません31 1 - 。
  • 組み込みは許可されていますが、非組み込みソリューションを含めることをお勧めします。

テストケース

2 -> 2
3 -> 3
4 -> 2, 2
6 -> 2, 3
8 -> 2, 2, 2
12 -> 2, 2, 3
255 -> 3, 5, 17
256 -> 2, 2, 2, 2, 2, 2, 2, 2
1001 -> 7, 11, 13
223092870 -> 2, 3, 5, 7, 11, 13, 17, 19, 23
2147483646 -> 2, 3, 3, 7, 11, 31, 151, 331
2147483647 -> 2147483647

得点

これはであるため、バイト単位の最短コードが優先されます。


2
ビルトインを許可しない方がずっとよかったでしょう。
バッファーオーバーリード

2
ビルトインを許可しない@TheBitByteチャレンジは、特にソリューションが技術的にビルトインであるかどうかを見分けるのが難しい場合があるため、一般にDo XなしYチャレンジと見なされます。
ETHproductions 16

1
それでは、5バイト未満のソリューションの流入をお楽しみください!私がこれを書いているとき、Pythはすでに1バイトでそれを行っています。
バッファーオーバーリード

2
@TheBitByteは、主に言語ごとの課題と考えてください。Pythonのソリューション、または組み込み機能のない他の言語に打ち勝つようにしてください。
isaacg 16

1
@isaacgまあ、言語ごとの方がより良い見方だと思います。
バッファーオーバーリード

回答:


15

Pyth、1バイト

P

このチャレンジでのPythのチャンスが好きです。


16
「P」言語が登場して0バイトで実行されるまで
downrep_nation


10

Python 2、53バイト

f=lambda n,i=2:n/i*[f]and[f(n,i+1),[i]+f(n/i)][n%i<1]

各潜在的な除数iを順番に試行します。iが除数の場合、先頭に追加し、で再起動しn/iます。そうでなければ、次に高い除数を試みます。除数は昇順でチェックされるため、主なもののみが検出されます。

プログラムとして、55バイトの場合:

n=input();i=2
while~-n:
 if n%i:i+=1
 else:n/=i;print i

8

Mathematica 38 30バイト

8バイトありがとう@MartinEnder!

Join@@Table@@@FactorInteger@#&

どうFactorInteger[#][[All, 1]]&26バイト
David G. Stork

そのパワーが1より大きい場合、それは素因数を繰り返さないため動作しませんDavidG.Stork @
JungHwan分



4

JavaScript(ES6)、44バイト

f=(n,x=2)=>n-1?n%x?f(n,x+1):[x,...f(n/x)]:[]

2から最後を含むすべての素因数まで反復するという事実のため、恐ろしく非効率的です。5バイトのコストで時間の複雑さを劇的に削減できます。

f=(n,x=2)=>x*x>n?[n]:n%x?f(n,x+1):[x,...f(n/x,x)]






2

音痴、3バイト

この言語は非常に若く、まだ主要なものには対応していませんが、素因数分解を行うことができます。

A/D

これはユーザー入力を待ってから、素因数のリストを出力します。


2

MATLAB、6バイト

これには説明は必要ないと思います。

factor

1

Bash + coreutils、19バイト

factor|sed s/.*:.//

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


を使用して、出力で空白が問題にならない場合は、バイトを削ることができfactor|sed s/.*://ます。またfactor|cut -d: -f2(またはfactor|cut -d\ -f2現在の出力と一致させるため)同じバイト長ですが、より高速に実行され、メモリオーバーヘッドが少なくなります。
カレブ

空白についてOPに尋ねます。悲しいことに、factor|cut -d\ -f2-1バイト長い先頭のスペースを削除する必要があります。
デニス

1

バッチ、96バイト

@set/an=%1,f=2,r=0
:l
@set/af+=!!r,r=n%%f
@if %r%==0 echo %f%&set/an/=f
@if %n% gtr 1 goto l


1

六角形、58バイト

まだゴルフはしていませんが、@ MartinEnderはとにかくこれを破壊できるはずです

スペースで区切られた要素を末尾にスペースを付けて出力します

ゴルフ:

2}\..}$?i6;>(<...=.\'/})."@...>%<..'':\}$"!>~\{=\)=\}&<.\\

レイアウト:

     2 } \ . .
    } $ ? i 6 ;
   > ( < . . . =
  . \ ' / } ) . "
 @ . . . > % < . .
  ' ' : \ } $ " !
   > ~ \ { = \ )
    = \ } & < .
     \ \ . . .

後で説明します。




1

C、92バイト

int p(int n){for(int i=2;i<n;i++)if(n%i==0)return printf("%d, ",i)+p(n/i);printf("%d\n",n);}

ゴルフされていないバージョン:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int prime(int number) {
    for (int i = 2; i < number; i++) {
        if (number % i == 0) {
            printf("%d, ", i);
            return prime(number / i); //you can golf away a few bytes by returning the sum of your recursive function and the return of printf, which is an int
        }                             //this allow you to golf a few more bytes thanks to inline calls
    }
    printf("%d\n", number);
}

int main(int argc, char **argv) {
    prime(atoi(argv[1]));
}




0

Perl 6の77の 64バイト  

{my$a=$_;.is-prime??$_!!map ->\f{|({$a%f||($a/=f)&&f}...^*!= f)},(2... *>$a)}

それを試してみてください

{my$a=$_;map ->\f{|({$a%f||($a div=f)&&f}...^ f>*)},(2... *>$a)}

それを試してみてください(注:終了するのに十分な時間がありません)


より高性能なバージョンは、100バイトでわずかに長くなります。

{my$a=$_;map ->\f{|({$a.is-prime??($/=$a)&&($a=0)||$/!!($a%f||($a div=f)&&f)}...^ f>*)},(2... *>$a)}

それを試してみてください


拡張:(64バイトバージョン)

{
  my $a = $_;  # the input 「$_」 is read-only by default
  map
    -> \f {
      |(              # slip ( flattens into outer list )

        # generate sequence of 0 or more 「f」s
        {
          $a % f      # is it not evenly divisible

          ||          # if it is evenly divisible
          ($a div=f)  # divide it
          &&          # and
          f           # return 「f」
        }
        ...^   # keep doing that until
        f > *  # 「f」 is bigger
      )

    },

    # do that over the following list

    (2 ... * > $a) # generate a sequence from 2
                   # up to whatever the value of $a
                   # is at the time of the check
}

0

VB.NET、86バイト

これは、いくつかのProject Eulerプログラムから離れていました。短縮のために最適化を削除しました。これが結果です。当然、VBは非常に冗長であるため、かなり長くなります。先頭の空白をカウントしていません。省略できますが、読みやすくなります。

これはパラメーターとして整数を取り、その後にコンマを付けて素因数を出力します。最後に末尾のコンマがあります。

Sub A(a)
    For i=2To a ' VB re-evaluates a each time, so the /= at the end of the loop shortens this
        While a Mod i=0 ' this is a factor. We've grabbed primes before this, so this must be a prime factor
            Console.Write(i &",") ' output
            a/=i ' "mark" the prime as "used"
        End While
    Next
End Sub


0

Java(OpenJDK)、259バイト

import java.util.*;interface g{static void main(String[]z){int a=new Scanner(System.in).nextInt();int b=0;int[]l={};for(int i=2;i<=a;i++){for(;a%i<1;l[b-1]=i){l=Arrays.copyOf(l,b=l.length+1);a/=i;}}for(int i=0;i<b;i++)System.out.print(l[i]+(i<b-1?", ":""));}}

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


:この提出はさらにgolfedことができるかを確認するには、この主旨を参照してくださいgist.github.com/kritixilithos/fde37dc5a8ae54852aa134a6e70ea495を。何かを明確にする必要がある場合は、19バイト目でお気軽にpingしてください:)
Kritixi Lithos

0

Ruby、61バイト

require'prime';->x{x.prime_division.flat_map{|x|[x[0]]*x[1]}}

私が考えることができる最短の組み込みバージョン。


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