그것을 분해하십시오! …심하게


15

호기심 많은 아이는 숫자 나 표현을 다음과 같은 형태로 분해 할 수있는 프로그램을 사용합니다 p1^e1 * p2^e2 * ... * pn^en. 같은 지수 1는 생략360 = 2^3 * 3^2 * 5

아이는이 입력을 프로그램에 새로운 입력으로 입력하지만 ^부호를 이해하지 못하기 때문에 때때로 해당 소수와 지수를 연결하는 사람들 중 하나 이상을 건너 뜁니다. 예 :(360 =) 2^3 * 3^2 * 5 => 2^3 * 32 * 5 (= 1280)

이러한 실수로 인해 다시 입력 할 수있는 다른 인수 분해를 얻을 수 있습니다 (0 이상 건너 뛰기 ^). 인수 분해가 더 이상 변경되지 않을 때까지 프로세스를 반복합니다 (더 이상의 결과가 없거나 ^출력을 올바르게 복사했을 수 있음).

정수 n( n>1) 가 주어지면 가능한 모든 숫자를 순서대로 증가시키는 프로그램이나 함수를 작성해야합니다 n. 예를 들어 입력 16가능한 최종 분해는 다음과 같습니다.(16 =) 2^4, (24 =) 2^3 * 3, (23*3 =) 3 * 23

입력 세부 사항 :

  • 입력이보다 큰 단일 정수 1
  • 보다 큰 출력 번호를 생성하는 입력이 제공되지 않습니다 2^31-1
  • 1000출력 수 보다 많은 수를 생성하는 입력이 제공되지 않습니다

출력 세부 사항 :

  • 귀하의 언어에 편리한 형태의 정수 목록

예 :

입력 => 출력

11    => 11
16    => 16 24 69
360   => 140 360 770 1035 1219 1280 2875 3680
605   => 560 605 840 2415
2048  => 211 2048
58564 => 230 456 1311 2508 9975 12768 13794 20748 58564 114114 322102

이것은 코드 골프이므로 가장 짧은 프로그램이 승리합니다.


우리는 이미 그것을 인수 화하지 않았습니까?
Optimizer

5
@Optimizer 이것은 매우 다릅니다.
randomra

1
360의 마지막 숫자는 3 6 80 이어야합니다 . 2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange

@blutorange 감사합니다.
randomra

답변:


5

CJam-66

ria{_{:XmF{1=1>},La\{a1$\f++}/La-{XI{~#}%:*/I{si}%:**}fI}%|}1e3*$p

http://cjam.aditsu.net/ 에서 시도 하십시오

설명:

ria                       read token, convert to integer and wrap in array
{…}1e3*                   repeat 1000 times
    _                     duplicate array
    {…}%                  transform each array item (number) using the block
        :X                store the number in X
        mF                factorize with exponents
        {1=1>},           keep only the factors with exponent > 1
        La\{a1$\f++}/     get all the subsets (*)
        La-               remove the empty subset
        {…}fI             for I = each subset of prime factors with exponent > 1
            XI{~#}%:*/    divide X by all the factors in I
            I{si}%:**     multiply with the primes from I
                          concatenated with their exponents
    |                     add the new numbers to the array, removing duplicates
$                         sort
p                         print the final array

(*) 고마워 마틴


잼 신의 잼 코드
kaine

^한 단계에서 모든 양을 제거 할 수 있습니다. 따라서 58564 = 2^2 * 11^4생성 할 수 있어야합니다 2508 = 22 * 114.
randomra

@randomra 이런 종류의 예제를 추가해야합니다
aditsu

@randomra는 이제 좋아질 것입니다
aditsu

큰! 예제를 추가했습니다. 건너 뛰셔서 죄송합니다.
randomra

4

루비, 219

이것을 시작하려면 :

s=->(x){A=[];def k(x)A<<x
y=Prime.prime_division x;n=0..y.size-1
n.each{|i|n.to_a.combination(i+1).each{|c|c.each{|z|v=y.dup
v[z][1]>1?v[z]=[v[z].join.to_i,1]:next
k v.inject(1){|s,b|s*b[0]**b[1]}}}}end;k x;A.uniq.sort}

숫자 배열을 반환하는 함수를 만듭니다.

https://ideone.com/iOMGny

다음과 같이 사용하십시오.

#usage

#load from the standard library
require"prime"

#read from stdin and print to stdout
p s.call $<.read.to_i

이 모든 것을 휴대 전화에 쓰는 것이 정말 재미 있습니다 ...


3

펄, 193 바이트

sub R{my($k,$v,@z)=@_;map{$k**$v*$_,$v>1?($k.$v)*$_:()}@z?R(@z):1}
@q=(0+<>);
while($x=pop@q){
my%f;@r=sort{$a<=>$b}@r,$x;
for(2..$x){$x/=$_,$f{$_}++while$x%$_<1}
$_~~@r||push@q,$_ for R%f
}
print"@r"

가독성을 위해 줄 바꿈이 추가되었습니다.

for 루프는 다음 수 ( $x)를 %f소수와 제곱의 해시 ( ) 로 분해합니다 . 재귀 함수 (R )는이 해시를 사용하여 ^부호 를 제거하여 얻을 수있는 모든 숫자를 생성합니다 . 이 숫자는 대기열에 추가되고 ( @q) 외부 while 루프에 의해 프로세스가 반복됩니다. 대기열의 각 번호는 @r인쇄를 위해 고유 한 정렬 된 배열 ( )로 유지됩니다.


3

피스, 46 45 44

Su{smmu*/N^T/PdTv+`T`/PdTkdyft/PdT{PdGU^T3]Q

여기에서 시도하십시오.

여러 수정 ^ 버그가 . 예를 들어 :

Input:  58564
Output: [230, 456, 1311, 2508, 9975, 12768, 13794, 20748, 58564, 114114, 322102]

이 코드는 질문이 제기 된 후 푸시 된 공식 컴파일러에 대한 몇 가지 버그 수정에 의존합니다. 그러나 새로운 언어 기능은 사용하지 않습니다.


58564를 위해 무엇을 얻습니까?
aditsu

[230, 456, 1311, 58564, 322102], 잘못되었습니다.
isaacg

@aditsu 문제를 해결했습니다.
isaacg

Pyth가 (내 연구 결과를 바탕으로) 엄격하게 문서화되지 않았기 때문에 버그 수정과 새로운 기능을 구분하기가 어려우므로이 항목을 성공 답변으로 선택하지 않기로 결정했습니다.
randomra

@randomra이 답변을 수락하지 않기로 한 귀하의 결정을 이해합니다. 그러나 버그 수정이 무엇인지 언급하고 싶습니다 u. 다른 reduce 내 에서 reduce ( )를 사용하는 것은 불가능했습니다. 적절한 위치에서 2를 3으로 변경하여 줄임은 2 대신 3 개의 입력을 사용합니다. 그게 전부입니다.
isaacg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.