배열 요소 사이의 모든 비 순차 쌍


11

직무:

배열 요소 사이에 가능한 모든 쌍을 가진 배열을 반환합니다 .

에서 a=["a", "b", "c", "d"];반환 b=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]].

가능한 모든 조합이 포함되고 명백하게 ["b","d"]동일한 한 쌍은 순서에 상관없이 사용할 수 있습니다 ["d","b"].

입력

클래스의 문자로 구성된 고유 한 문자열 요소의 배열입니다 [a-z].

산출

가능한 모든 입력 배열 요소 쌍을 포함하는 2D 배열.

테스트 사례

input=["a","b","c"];
//output=[["a","b"],["a","c"],["b","c"]]

input=["a","b","c","d","e"];
//output=[["a","b"],["a","c"],["a","d"],["a","e"],["b","c"],["b","d"],["b","e"],["c","d"],["c","e"],["d","e"]]

참고 : 이 과제에 대한 사본 을 찾을 수 없습니다 . 질문이 있으면 의견을 알려주십시오.


2
입력 값이 반복되거나 정렬되지 않은 경우 어떻게되는지 명확하지 않습니다. 좀 더 일반적인 테스트 사례가 도움이 될 것입니다.
xnor

@ Adám 속임수가 아니며, 2 개의 목록이 있습니다.
Mr. Xcoder 2016 년

이 문제는 요소를 자신과 짝을 이루는 것을 제외하고 더 중복되지 않습니다.
CalculatorFeline

@xnor는 직장에서의 원래 문제가 독특한 개인 집합과 관련이 있기 때문에 값을 반복하는 것에 대해 생각하지 않았습니다. 조건으로 고유성을 추가해야한다고 생각합니까?
alexandros84

@ alexandros84 독창성은 괜찮을 것입니다. 무엇을 ["c","b","a"]반환 해야 합니까?
xnor

답변:



8

하스켈 , 29 바이트

f(a:b)=map((,)a)b++f b
f _=[]

온라인으로 사용해보십시오! 사용법 예 : f ["a","b","c"]yields [("a","b"),("a","c"),("b","c")].


플래그를 사용하면 -XTupleSections27 바이트로 단축 할 수 있지만 플래그를 세어야합니다.

f(a:b)=map(a,)b++f b
f _=[]

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


be case를로 수정하여 1 바이트를 절약 할 수 있다고 생각합니다 f l=l.
Kritzefitz 2016 년

@Kritzefitz 두 개의 빈 목록이 다른 유형을 가지므로 Haskell의 유형 검사기가 불평하기 때문에 이것이 작동하지 않을까 걱정됩니다.
Laikoni 2016 년

좋은 지적. 나는 그것을 생각하지 않았다.
Kritzefitz 2016 년




5

정력, 50 48

AX<esc>qqYplX@qq@qqrYpllDkxh@rq:g/./norm@r<cr>:g/X/d<cr>dG

형태로 입력을받습니다

abcd

다음과 같이 출력

ad
ac
ab
bd
bc
cd

설명

먼저, 2 길이 입력을 처리하기 위해 입력에 AX<esc>an X을 추가합니다 .

그런 다음 형식의 첫 번째 재귀 매크로가 제공됩니다 qq...@qq@q. (매크로 q기록, 끝에서 다시 실행, 기록을 종료 한 다음 한 번 실행) 매크로 본문 Yp에서 현재 줄을 복제 l하고 줄이 이제 한 문자 길이 인 경우 매크로를 X끊고 삭제합니다. 줄의 첫 문자. 이것은 생산의 최종 결과가 있습니다

abcdX
abcX
abX
aX
X
X

무시 X지금들, 우리가해야 할 모든 차례 abcdX에, 예를 들어, ab / ac / ad / aX. 이것은 두 번째 재귀 매크로로 수행 qr...@rq됩니다.

이 매크로에서는 먼저 행 ( Yp)을 복제 한 다음 오른쪽 두 개 ( ll) 를 이동 하고 행 끝 ( )으로 삭제 하여 처음 두 문자를 제외한 모든 문자를 삭제합니다 D. 커서가 이제 행 kx의 두 번째 문자에 있으므로 이전 행에서 두 번째 문자를 삭제합니다. 이는 이전 행에서 첫 번째 문자와 쌍을 이루는 문자입니다. 그런 다음이 프로세스는 h매크로의 재귀 적 특성으로 인해 줄의 시작 부분 ( ) 부터 다시 여러 번 시작 하여 반복됩니다.

지금은 달성 할 수있는 모든 라인에 매크로를 실행 단지 문제 :g/./norm@r(이 동작합니다 다른 이상이 있는지 왜 아니에요 :%norm@r,하지만 충분할 말을 의도 한대로 후자는 작동하지 않습니다.)와 라인 X으로 삭제됩니다 :g/X/d, r매크로 의 구성으로 인해 왼쪽 끝에있는 빈 줄 은으로 정리됩니다 dG.


좋은 대답입니다. 그것을 통과하는 데 시간이 걸릴 것입니다.
alexandros84






3

옥타브 , 49 48 바이트

@(x)[imag(y=(y=triu(x+j*x',1))(~~y)) real(y) '']

내장 ( nchoosek) 을 피하는 익명 함수 .

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

설명

x+j*x'브로드 캐스팅을 사용하여 실수 부와 허수 부가 모두 입력의 코드 포인트 쌍인 복소수 행렬을 만듭니다 x.

y=triu(...,1)대각선을 제외한 위쪽 삼각형 부분을 유지하여 나머지 요소를 0으로 만듭니다. 결과는 variable에 할당됩니다 y.

y=(...)(~~y)변수에 할당 된 열 벡터의 형태로 0이 아닌 요소를 유지합니다 y.

imag(...)그리고 real(...)실수 부와 허수 부분을 추출합니다.

[... ... ''] 출력을 빌드하기 위해 char로 다시 변환합니다.


좋은! 모든 도전은 정말 흥미 롭습니다. 내 es5 코드 (아래에 나와있는 기능)를 만드는 데 약 1 시간 30 분이 걸렸습니다. 나는 행복이 .. 많은 흥미로운 답변을 생성하고
alexandros84



2

펄 6 , 17 바이트

*.combinations(2)

휴, 그것은 긴 방법 이름입니다.





1

자바 스크립트 ES6, 52 바이트

a=>a.map((x,i)=>a.slice(0,i).map(y=>[x,y])).slice(1)

그런 것이 있다면 flatMap많은 바이트를 절약 할 수 있습니다.


좋은 대답 이네요! 원하는 경우 귀하의 답변을 공부하는 동안 es5 답변을 확인하십시오. 모든 의견을
alexandros84

1
Firefox 30의 배열 이해는 평면 맵을 시뮬레이션 할 수 있습니다 (예 :) a=>[for(x of[...a])for(y of(a.shift(),a))[x,y]].
Neil

@ Neil, 정말 고급 구문이 있습니다 ... 표현을 이해하려면 적어도 세 가지를 Google에해야합니다. 즉, 확산 연산자, 배열 이해 및 끝의 [x, y]는 무엇입니까 (아직도 답을 찾지 못했습니다).
alexandros84

1
@ alexandros84 [x,y]마지막은 쉬운 비트입니다. 단지 배열 리터럴입니다.
Neil

1
또한 스프레드 연산자는 루프 내에서 배열을 변경하기 때문에 배열을 복사하기 만합니다.
Neil

1

파이썬 , 55 바이트

f=lambda s:[(s[0],j)for j in s[1:]]+f(s[1:])if s else[]

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

다른 Python 답변보다 길지만 다른 기술을 사용하므로 게시 할 가치가 있다고 생각합니다.


확인할 시간이 없어, 나는 내가 다른 투표를 한 이유가 정말 다르기를 바랍니다.
alexandros84

나는 이것이 @ovs의 Python 3 답변과 매우 비슷한 접근법이라고 생각합니다.
Neil


1

파이썬, 64 바이트

f=lambda a:sum((list(zip(a, a[i:]))for i in range(1,len(a))),[])


1

클로저, 42 바이트

#(set(for[i % j(remove #{i}%)](set[i j])))

세트를 반환합니다 :)


1

파이썬, 74 바이트

f=lambda a:[(c,d) for i,c in enumerate(a) for j,d in enumerate(a) if i<j]

1
PPCG에 오신 것을 환영합니다! 당신은 골프이 있습니다 : 1) 1-문자 2)를 제거 불필요한 공백 3)이이 코드 조각으로 2 문자 변수 이름을 대체, 당신은 람다, 기능 또는 전체 프로그램으로 만들 필요
에릭 Outgolfer

10 바이트 골프 : 64 바이트
Mr. Xcoder

1

108 바이트에서 78 바이트 사이의 Javascript (ES 5)

나는 오늘 내 답변을 게시하지만 분명히 내 자신의 답변을 수락하지 않을 것을 약속합니다.

x=input;
a=[];

for(n=0;n<(x.length-1);n++){for(i=n+1;i<(x.length);i++){a.push([x[n],x[i]]);}}

1
PPCG에 오신 것을 환영합니다. 불필요한 공백 제거를 포함하여 제출물이 골프화 될 것으로 예상합니다.
HyperNeutrino

타이 나는 또한 이것을 궁금해했다 : x = 입력을 포함시켜야한다. a = []; 내 대답에? 나는 내일 편집 할 것이다.
alexandros84

기능을 제출하거나 전체 프로그램을 수행 할 수 있습니다. 을 사용 a하므로이를 정의해야하지만의 기능을 수행 할 수 있습니다 x.
HyperNeutrino 2016 년

이제 @HyperNeutrino보다 훨씬 낫습니다.
alexandros84

1
공간을 절약하기 위해 세미콜론과 빈 줄을 제외 할 수 있다고 생각합니다. 또한 변경할 수 있다고 생각 for(i=n+1;i<(x.length);i++)for(i=n;++i<x.length;). 마찬가지로 다음과 같이 변경할 수 있습니다 n<(x.length-1);n++.n++<x.length-1
musicman523

0

J , 17 바이트

({~$#:I.@,)#\</#\

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

설명

({~$#:I.@,)#\</#\  Input: string S
               #\  Get the length of each prefix of S
           #\      Get the length of each prefix of S again
             </    Test using greater than (<) between each
         ,         Flatten
      I.@          Find the indices where the value is 1
   $               Shape of that table
    #:             Convert the indices to the base represented by the shape
 {~                Index into S at those values
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.