소인수 계산


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 챌린지는 일반적으로 솔루션이 기술적으로 빌트인인지 여부를 말하기가 어렵 기 때문에 Y 챌린지가 없는 Do X 로 간주 됩니다.
ETHproductions

1
그렇다면 <5 바이트 솔루션의 유입을 즐기십시오! 이 글을 쓸 때 Pyth는 이미 1 바이트로 처리합니다.
버퍼 오버 읽기

2
@TheBitByte 주로 언어 별 문제로 생각하십시오. 파이썬의 솔루션이나 내장 언어가없는 다른 언어를 사용하십시오.
isaacg

1
@isaacg 글쎄, 언어별로 보는 것이 더 좋은 방법입니다.
버퍼 오버 읽기

답변:




10

파이썬 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

매스 매 티카, 38 30 바이트

8 바이트 동안 @MartinEnder에게 감사합니다!

Join@@Table@@@FactorInteger@#&

어때요 FactorInteger[#][[All, 1]]&? 26 바이트
David G. Stork

@ DavidG.Stork는 전력이 1보다 큰 경우 주요 요인을 반복하지 않기 때문에 작동하지 않습니다.
JungHwan Min



4

자바 스크립트 (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

tone-deaf , 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현재 출력과 일치) 바이트 길이는 동일하지만 더 빠르게 실행되고 메모리 오버 헤드가 줄어 듭니다.
Caleb

OP에 공백에 대해 물어볼 것입니다. 슬프게도, 나는 factor|cut -d\ -f2-1 바이트 더 긴 선행 공간을 제거 해야 합니다.
Dennis

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

펄 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 바이트

일부 프로젝트 오일러 프로그램에서이 문제가 발생했습니다. 부족함을 고려하여 최적화를 제거했으며 그 결과입니다. 당연히 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

펄 6 , 51 바이트

재귀 솔루션 :

sub f(\n,\d=2){n-1??n%d??f n,d+1!!(d,|f n/d,d)!!()}

0

자바 (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?", ":""));}}

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


이 제출물이 골프를 더하는 방법을 보려면이 요지를 참조하십시오 : gist.github.com/kritixilithos/fde37dc5a8ae54852aa134a6e70ea495 . 당신이 뭔가를 명확히 해야하는 경우, 19 바이트에서 저를 핑 자유롭게 :)
Kritixi Lithos

0

루비, 61 바이트

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

내가 생각할 수있는 가장 짧은 내장 버전.


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