배열 분해


13

양의 정수 배열이 주어지면 이러한 정수의 고유 한 소수 요소의 안정적인 배열을 출력하십시오. 즉, 입력의 각 정수에 대해 순서대로 소수를 가져 와서 정렬하고 출력에 아직없는 소수를 출력에 추가합니다.

테스트 사례

[1,2,3,4,5,6,7,8,9,10] -> [2,3,5,7]
[10,9,8,7,6,5,4,3,2,1] -> [2,5,3,7]
[100,99,98,1,2,3,4,5] -> [2,5,3,11,7]
[541,60,19,17,22] -> [541,2,3,5,19,17,11]
[1,1,2,3,5,8,13,21,34,45] -> [2,3,5,13,7,17]
[6,7,6,7,6,7,6,5] -> [2,3,7,5]
[1] -> []
[8] -> [2]
[] -> []

출력은 정수 또는 문자열의 배열 또는 목록, 구분 된 출력 또는 순서가 지정된 숫자 목록을 출력하는 기타 표준 수단 일 수 있습니다.

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.



5
이것은“너무 단순하다”고 생각하는 도전 중 하나입니다. 거의 모든 대답은 다음 중 하나와 비슷할 것입니다. (b) 4 개의 내장 체인. 창의성을위한 공간이 많지 않습니다. 어쩌면 대답이 나를 잘못 증명할 수도 있지만 의심합니다. 여기에 주요 인수 분해보다 골프에 대한 것이 거의 없으며, 그 일이 끝났습니다.
Lynn

1
@Lynn은 골프 랭귀지에게는 사소한 것이지만, 거의 모든 것에는 사소한 것이 아닙니다. 그것이 사소한 근거인지 확실하지 않은 경우 : /
Stephen

1의 "고유 한 주요 요인"이 무엇인지 말해 줄 수 있습니까?
J42161217

1
@DigitalTrauma 예. 그렇지 않으면 "입력의 모든 주요 요소의 집합을 출력합니다"
Stephen

답변:



5

껍질 , 3 바이트

@Zgarb 덕분에 1 바이트가 절약 되었습니다 .

uṁp

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


설명

전체 프로그램입니다.

  p 각각의 주요 요인.
 over 목록에 기능을 매핑하고 결과를 연결합니다.
유일합니다. 

3
Σ†일 수 있습니다 .
Zgarb

@ Zgarb 감사합니다. 당신이 알 수 있듯이, 그것은 나의 첫 번째 껍질 답변입니다 :)
Mr. Xcoder

Husk를 사용하는 새로운 사람들을 만나게되어 기쁩니다. :)
Zgarb

1
@ Zgarb 그것은 아주 좋은 것 같습니다 (특히 그것이 젤리를 뛰어 넘을 때 : P)
Mr. Xcoder

5

배쉬 + GNU 유틸리티, 37

  • @muru 덕분에 21 바이트가 절약되었습니다 (wow!)
factor|tr \  \\n|awk '!/:/&&!a[$0]++'

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


1
나는 15 바이트를 절약하면서 : (이전에 보지 않은 경우 인쇄; 순서가 손실되지 않음)를 nl|sort|...사용하여 수행 할 수 있다고 생각합니다 . 그런 다음 명령은 약간 더 사용하여 제거 할 수있다 : 하나 (레코드를 건너 공백과 줄 바꿈에 대한 분할 기록을 또 다른 4 바이트를 저장). awkawk '!a[$0]++'sedawkfactor|awk '!/:/&&!a[$0]++' RS='[ \n]+':
muru

1
방금 이전 주석에서 다른 두 바이트를 절약 할 수 있음을 깨달았습니다 tr. factor|tr \ \\n|awk '!/:/&&!a[$0]++'(첫 번째 백 슬래시 다음에 두 칸)
muru

@muru awesome-감사합니다! (이 답변을 본인의 답변으로 게시했다면 화가 났을 것입니다. 내 원본을 크게 뛰어 넘었습니다.)
Digital Trauma

4

MATL , 6 바이트

"@Yfvu

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

설명:

"      % Loop over input
 @     % Push the array element
  Yf   % Prime factors
    v  % Concatenate entire stack vertically (does nothing the first iteration)
     u % Stably get distinct (unique, in MATLAB terminology) elements. Does so every loop but this is code golf, not fastest code.

흥미로운 MATL tidbits : 일반적으로 모든 함수는 벡터 (배열)에 쉽게 적용됩니다. 그러나이 경우 계수의 수는 각 입력에 대해 가변적이며 Matlab과 확장에 의해 MATL은 일반적으로 정사각 행렬 만 다루므로 for 루프를 사용해야했습니다 ".

: 또한, 두 가지 주요 MATL 연결 연산자 보유 h하고 v, 수평 및 수직 연결한다. 그들의 동작은 크게 다릅니다 v. 첫 번째 반복에서와 같이 하나의 요소 만 있어도 전체 스택을 연결합니다. h정확히 두 가지 요소를 취하며 하나만있는 경우 실패하므로이 응용 프로그램에 적합하지 않습니다.




3

PowerShell , 102 바이트

param($x)$a=@();$x|%{$a+=(2..($z=$_)|?{!($z%$_)-and'1'*$_-match'^(?!(..+)\1+$)..'}|sort)};$a|select -u

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

(TessellatingHeckler의 답변 에서 "사탄-프라임을 사로 잡으십시오!"

리터럴 배열로 입력을 $x받습니다. 새로운 빈 배열을 작성 $a합니다. 반복합니다 $x. 우리가 반복 할 때마다 2현재 숫자까지 반복 하여 인자 -and가 소수 인지 확인한 다음 |sort그 결과를 확인하고에 추가합니다 $a. 우리가 겪고을 완료 $x, 우리는 출력 $a하지만, |select단지 -u그 nique 번호. 이것은 고유 화가 왼쪽에서 오른쪽으로 진행되어 문제 설명과 일치하는 첫 번째 발생을 유지한다는 사실을 이용합니다. 이 숫자는 파이프 라인에 남아 있으며 출력은 암시 적입니다.


3

CJam, 11 바이트

{:mfe__&1-}

int 배열을 가져 와서 int 배열을 출력하는 함수입니다.

테스트 버전


여러 문자로 출력을 어떻게 구별합니까? 적어도 내 (온라인) 테스트에서는 int 배열이 아닌 문자열을 출력합니다.
Stephen

함수로서 출력 데이터 유형은 정수 배열입니다. CJam은 자동으로 스택을 인쇄하고 디 리미터가없는 어레이를 인쇄합니다. 그것이 당신의 목적에 충분한 지 모르겠습니다. 델리 미터를 원하면 S*닫는 괄호 안에 추가하십시오 .
geokavel

어쨌든 스택 기반 랭은 ToS가 출력 할 수 있다고 생각하므로 괜찮습니다. 감사.
Stephen




2

Mathematica, 64 바이트

Select[DeleteDuplicates[First/@FactorInteger@#~Flatten~1],#>1&]&

입력

[{100, 99, 98, 1, 2, 3, 4, 5}]


Select[#&@@@Gather[#&@@@Join@@FactorInteger@#],#>1&]&
matrix89

2

하스켈, 77 바이트

import Data.List
x!y|y>x=[]|x`mod`y<1=y:(x`div`y)!y|1<2=x!(y+1)
nub.((!2)=<<)

설명:

  • x!y운영자는 모든 주요 요소의 목록을 반환x 그보다 큰거나 같음y
  • 그만큼 (!2) 함수는 인수의 모든 주요 요소 목록을 반환합니다
  • 마지막 줄의 함수는 필요한 기능을 구현합니다.

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


2

Brachylog , 6 바이트

ḋᵐoᵐcd

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

설명

ḋᵐ         Map prime decomposition
  oᵐ       Map order
    c      Concatenate
     d     Remove duplicates

에 대한 요금 [10,9,8,7,6,5,4,3,2,1]. 그것은해야 [2, 5, 3, 7]하지[2, 3, 5, 7]
씨 Xcoder

+1 바이트의 경우이를 고칠 수 있습니다 :ḋᵐoᵐcd
Mr. Xcoder

@ Mr.Xcoder 감사합니다. 그럼에도 불구하고 매우 의미가없는 요구 사항입니다.
페이탈 라이즈

작고 작지만 사소한 것이기 때문에 실제로는 무의미하지 않습니다 . 나는 내 자신의 답변도 게시했지만 순서 대신 먼저 역전을 사용했습니다. 소인수가 왜 역순으로 생성되는지 확실하지 않습니까?
Mr. Xcoder

@Fatalize well-도전은 "목록의 여러 가지 주요한 요소"가 아니라 "목록을 반복하고 다른 주요한 요소를 추가하는 것"입니다.
Stephen


2

Japt , 6 바이트

mk c â

그것을 테스트


설명

배열의 암시 적 입력 U. 각 요소 m의 요소 ( k)를 가져 와서 그 위에 맵 ( )을 배치하십시오 . 평탄화 ( c)하고 고유 한 요소 ( â)를 가져오고 내재적으로 출력합니다.


2

파이썬 (3) , 128 (125) 116 바이트

이것은 순수한 파이썬 솔루션입니다. 패키지가 없습니다. 9 바이트를 절약 해 준 Halvard에게 감사합니다.

def f(l):y=[k for i in l for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))];print(sorted({*y},key=y.index))

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

파이썬 2 , 133127126 바이트

def f(l):y=sum([[k for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))]for i in l],[]);print sorted(set(y),key=y.index)

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

파이썬 2 , 142138134 바이트

l=input();r=[]
for i in sum([[k for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))]for i in l],[]):r+=[i]*(i not in r)
print r

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

아직 파이썬 답변이 없다는 것에 매우 놀랐습니다. 골프 작업.



@HalvardHummel 감사합니다
Mr. Xcoder

2

Deorst , 16 바이트

EDkE]l1FeFPkEQE_

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

에 @cairdcoinheringaahing의 도움으로 완료 Deorst 채팅방 (솔루션이 다르다는 것을 참고).


설명

EDkE] l1FeFPkEQE_ 전체 프로그램.

ED 각 요소의 제수 목록을 누릅니다.
  k 스택이 재정렬되지 않도록합니다.
   E] 스택을 평평하게합니다.
     l1Fe 스택에서 1을 제거합니다 (캐러 드가 돌진하여 1 개의 소수를 만들었습니다!)-향후 언어 릴리스에서 제거해야합니다.
         FP 소수를 유지하십시오.
           k 스택이 재정렬되지 않도록합니다.
            EQ 중복 제거.
              E_ 결과를 출력합니다.

2

Deorst , 16 바이트

EDkE]EQFPkl1FeE_

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

@ Mr.Xcoder의 도움으로 완료되었습니다. 의사 골프 언어에 비해 너무 길다.

작동 원리

EDkE]EQFPkl1FeE_ - Full program, implicit input: [1,2,3,4,5]

ED               - Get divisors. Vectorizes. STACK = [[1], [1,2], [1,3], [1,2,4], [1,5]]
  k              - Turn off sorting for the next command
   E]            - Flatten the stack. STACK = [1, 1, 2, 1, 3, 1, 2, 4, 1, 5]
     EQ          - Deduplicate stack in place. STACK = [1, 2, 3, 4, 5]
       FP        - Filter by primality 1 is considered prime. STACK = [1, 2, 3, 5]
         k       - Turn off sorting for the next command
          l1     - Push 1. STACK = [1, 2, 3, 5, 1]
            Fe   - Filter elements that are equal to the last element. STACK = [2, 3, 5]
              E_ - Output the whole stack

1

파이크 , 4 바이트

mPs}

여기 사용해보십시오!

mP   -   map(factorise, input)
  s  -  sum(^)
   } - uniquify(^)

흠, 난 당신을 심하게 닌자-우리는 다른 접근 방식이 있습니다 :)
Mr. Xcoder

: P 1 바이트 차이. 나는 그것이 내가 읽은 마지막 합의에 따라 또는 적어도 허용 된 것 같아요
Blue

예, 중복 답변, 심지어 바이트 단위로도 허용
Mr. Xcoder


1

MY, 17 바이트

⎕Ḋḟ’⊢f(‘53ǵ'ƒf(ū←

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

어떻게?

  • 평가 된 입력
  • 제수 (벡터화 / 비화)
  • 반음 낮추다
  • ’⊢f(‘감소, 필터, 증가 (제거 1)
  • 53ǵ''P'MY의 코드 페이지에 있는 문자열 로 , 우선 순위 테스트입니다. 슬프게도 0x35=5316 번째 소수이며 16스택> _ <으로 푸시하는 명령이 없습니다 .
  • ƒ 기능으로서
  • f( 그것에 의해 필터링
  • ū 단일화하다
  • 산출

1

C ++, 118 바이트

[](auto n){decltype(n)r;for(int m:n)for(int i=1,j;i++<m;){j=m%i;for(int x:r)j|=!(i%x);if(!j)r.push_back(i);}return r;}

에 입력을 전달해야 하며 출력을 위해 std::vector<int>다른 값 std::vector<int>을 반환합니다 .




1

파이썬 2, 88 119 103 바이트

여기 있습니다 올바른 정렬로.

def f(l,s=[]):[s.append(x) for x in sum([list(primefac(i)) for i in l],[]) if x not in s];print s
from primefac import*

패키지가 지원되지 않기 때문에 TIO에서 작동하도록 할 수 없습니다. 내 컴퓨터에서 실행됩니다. 내 테스트 출력은 다음과 같습니다.

f([1,2,3,4,5,6,7,8,9,10],[])     #[2, 3, 5, 7]
f([10,9,8,7,6,5,4,3,2,1],[])     #[2, 5, 3, 7]
f([100,99,98,1,2,3,4,5],[])      #[2, 5, 3, 11, 7]
f([541,60,19,17,22],[])          #[541, 2, 3, 5, 19, 17, 11]
f([1,1,2,3,5,8,13,21,34,45],[])  #[2, 3, 5, 13, 7, 17]
f([6,7,6,7,6,7,6,5],[])          #[2, 3, 7, 5]
f([1],[])                        #[]
f([8],[])                        #[2]
f([],[])                         #[]

어떻게 든 함수를 람다 함수로 만들 수 없었습니다. 목록 이해를 반환하려고 할 때마다 [없음, 없음, ...]이 반환됩니다. 내가 단지 뭔가를 간과한다면 누군가가 그 실수를 지적 할 수 있습니까? 피드백을 주셔서 감사합니다!


편집하다:

Mr. Xcoders 정렬 알고리즘을 사용하여 코드를 16 바이트로 줄일 수있었습니다. 그 부분에 감사드립니다.

from primefac import*
def f(l):a=sum([list(primefac(i))for i in l],[]);print sorted(set(a),key=a.index)

올바르지 않은 것 같습니다. 두 번째 테스트 사례가 출력되어야합니다 [2, 5, 3, 7]. 출력 순서가 중요합니다.
Mego

sorted(set().union(*map(primefac,l)))
Alex Hall

출력 순서가 중요합니다. 설명을 다시 읽거나 다른 답변을 살펴보십시오. 나는 그것을 설명하는 다른 방법을 정말로 모른다.
Stephen

@ 스티븐. 올바른 출력으로 업데이트 된 루틴. 각 줄의 차이점을 알 때까지 시간이 걸렸습니다. 읽는 동안 집중하면 많은 도움이됩니다.
Simon

@Simon은 parens 다음에 공백을 제거하여 3 바이트를 절약합니다 s.append(x) for--> s.append(x)for, primefac(i)) for-> primefac(i))for, []) if->[])if
Stephen

1

Braingolf , 7 바이트

&(p)u=;

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

오, 봐요, 기본적으로 4 개의 내장 체인입니다

설명

&(p)u=;  Implicit input from commandline args
 (.)     Sandbox loop, sandboxes each item in a separate stack and runs the
         code within the loop.
&        Append the entire sandboxed stack when loop ends, rather than only the
         top of stack after each iteration
  p      Prime factors
    u    Unique
     =   Print stack
      ;  Suppress implicit output

에 실패합니다 [10,9,8,7,6,5,4,3,2,1]. -순서가 중요합니다 : [2, 5, 3, 7]대신에 반품해야합니다 [2, 3, 5, 7].
Mr. Xcoder

그래도 -1 바이트로 해결할 수 있습니다 . K여기에만 해를 끼치기 때문에 .
Mr. Xcoder

@ Mr.Xcoder 아 맞아, 그들이 오름차순이 아니라 발생 순서에 있다는 것을 몰랐다. 수정
Skidsdev

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