소울 메이트를 찾아서


40

출력, 정수의 비어 있지 않은 유한 목록을 감안할 때 truthy의 가 정확히 두 개의 동일한 항목이며 다른 모든 항목이 서로 다른 경우 값 및 falsey의 다른 값.

truthy:
[1,1]
[1,2,1]
[1,6,3,4,4,7,9]

falsey:
[0]
[1,1,1]
[1,1,1,2]
[1,1,2,2]
[2,1,2,1,2]
[1,2,3,4,5]

정수가 항상 10보다 작을 것이라고 가정 할 수 없다고 생각합니까?
Martin Ender

1
언어가 더 큰 정수를 지원하지 않는 경우를 제외하고는 그렇습니다.
flawr

1
당신은 일관된 의미로 무엇을 설명 할 수 있습니까 ?
flawr

33
HNQ의 상단에 이것을보고는 및 우리가 최종 interpersonal.se 질문에 도달했던 생각
gntskn

3
@Walfrat 나만의 도전으로 게시하십시오. 또한 이러한 피드백은 일반적으로 샌드 박스에서 인정됩니다.
flawr

답변:


22

파이썬 3, 30 28 바이트

lambda m:len({*m})+1==len(m)

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

{*m}set중복되지 않은 정렬되지 않은 항목의 목록 인 객체로 목록을 캐스트합니다 . 이 작업을 수행하면 목록의 길이가 항상 중복 횟수만큼 줄어 듭니다. 길이가 얼마나 변했는지 계산하여 목록에 단일 복제본이 있는지 쉽게 확인하고 테스트 결과를 반환 할 수 있습니다.

ovs 덕분에 -2 바이트


정확히 내가 가진 솔루션이지만 골프 {*m}대신 바로 가기를 잊어 버렸습니다 set!
FlipTack

부정에 대한 27 바이트 . (Falsey는 Truthy 등이어야 할 때)
mbomb007

3
여기에 또 다른 이상한 방법이 있습니다 (부정) :lambda m:~-len(m[len({*m}):])
mbomb007


7

MATL , 7 , 6 바이트

&=sp4=

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

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

설명:

&=  % Table of pair-wise equality comparisons
    %
    % [1 0 0 0 0 0 0
    %  0 1 0 0 0 0 0
    %  0 0 1 0 0 0 0
    %  0 0 0 1 1 0 0
    %  0 0 0 1 1 0 0
    %  0 0 0 0 0 1 0
    %  0 0 0 0 0 0 1]
    %
s   % Sum each Column. Stack:
    %
    % [1 1 1 2 2 1 1]
    %
p   % Product of the array. Stack:
    %
    % [4]
    %
4=  % Compare the stack to '4'

1
이후를 s입니다 sumsum이 단지 수 없습니다, 첫 번째 싱글 톤이 아닌 차원에 따라 합계 (열), 그리고 매트릭스는 대칭 s대신 Xs?
Giuseppe

1
@ 주세페 아, TIL. 감사합니다!
DJMcMayhem


6

젤리 , 8 5 바이트

QL‘=L

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

설명

QL‘=L  - Main link, argument L (a list)   e.g [1,6,3,4,4,7,9]
Q      - Deduplicated elements                [1,6,3,4,7,9]
 L     - Length                               6
  ‘    - Increment                            7
    L  - Length of the input                  7 ([1,6,3,4,4,7,9])
   =   - Are they equal?                      1

출력 값이 일관된 값일 수 있으면 QL_L작동합니다.이 값 -1은 진실을 나타내고 다른 양수가 아닌 숫자를 거짓으로 출력합니다 (@JonathanAllan 덕분에)


QL_L-1진실과 일부보다 작 -1거나 적은 숫자로 출력 할 것입니다 0(예 : [1,6,3,4,4,7,9,9,9]return -3, 반면 [1,6,3,4,7,9]return 0).
Jonathan Allan

@JonathanAllan 오 예. 나는 그것을 테스트 한 예제가 모두 돌아온 것 같아요 -2.
caird coinheringaahing


4

Pushy , 8 바이트

여부를 확인하는 간단한 구현 len(set(list)) == len(list)-1:

LtvuL^=#

설명:

       \ Implicit: Put all input on stack
Ltv    \ Get the stack length - 1, save in auxiliary stack
u      \ Remove non-unique elements
L      \ Get the new length
^=     \ Compare with the previously saved length
#      \ Print result

초기 목록에 명확하지 않은 정수가 정확히 1 개만 있으면 길이가 1 씩 줄어들 기 때문에 작동합니다.

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


1
와우, 몇 년 동안 Pushy 답변을 보지 못했습니다! +1
caird 공동

1
@cairdcoinheringaahing Pushy는 결코 죽지 않을 것입니다. 다시 강해질 것입니다.
FlipTack

4

옥타브 , 25 바이트

이것은 사용하지 않는 group또는 unique다른 답변의 많은으로 접근이 아니라 가능한 모든 comparisions의 "카티 제품".

@(x)nnz(triu(x==x',1))==1

설명

             x==x'        %create a matrix where the entry at (i,j) compares whether x(i) == x(ju)
        triu(x==x',1)     %only consider the strict upper triangular matrix
    nnz(triu(x==x',1))    %count the number of nonzero entries
@(x)nnz(triu(x==x',1))==1 %check whether this number is actually 1

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

그리고 컨볼 루션 없이는 어떤 프로그램도 완성되지 않기 때문에 (실수를 고쳐 준 @LuisMendo에게 감사드립니다) :

옥타브 , 40 바이트

@(x)nnz(~conv(sort(x),-1:2:1,'same'))==1

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


당신은 저 에게이 접근법 을 생각해 낼 수 있도록 영감을주었습니다 :)
Stewie Griffin

2
@StewieGriffin MATL 답변이 귀하의 정확한 접근 방식을 사용 했다고 생각합니다 :)
flawr

4

J , 7 6 바이트

=&#0,=

=모든 고유 한 요소와 동일한 지 모든 요소를 ​​확인하고 m 개의  고유 한 요소에 대해 m 개의 행이  있는 행렬을 만듭니다 .
0,위에 빈 행을 추가하십시오.
=&#행 수가 입력 길이와 동일합니까?

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


나는 당신이 바꿀 수 있다고 생각 .~=
H.PWiz

@ H.PWiz 니스, 편집했습니다.
FrownyFrog

4

망막 , 15 12 11 바이트

1 바이트를 절약 해 준 Neil에게 감사드립니다.

D`
Mm2`^$
1

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

입력이 줄 바꿈으로 구분됩니다. 테스트 스위트는 편의를 위해 쉼표로 구분합니다.

설명

D`

입력에서 행을 중복 제거하면 이전에 나타난 모든 정수가 제거되지만 주변 줄 바꿈은 남습니다.

Mm2`^$

빈 줄의 수를 세십시오. 이것은 우리가 제거한 중복 수와 같지만 처음 두 개의 일치 만 고려하십시오. 따라서 출력은 0(중복 없음), 1(하나의 중복), 2(두 개 이상의 중복)입니다.

1

정확히 하나의 사본이 제거되었는지 확인하십시오.


줄 바꾸기를 2로 제한하여 바이트를 저장하면 세 번째 줄의 입력이 항상 0, 1 또는 2가되어 테스트가 간단 해집니다. ( A`.마지막으로 줄 바꿈을하기 때문에 줄 바꿈 계산에 사용할 수 없습니다 .)
Neil

@ Neil 감사합니다, 한도는 깔끔한 아이디어입니다. 나는 또한 사용하려고 A`.했지만 문제는 오히려 하나의 빈 줄을 전혀 줄이없는 것과 구별 할 수 없다는 것입니다. 어쩌면 줄이 있으면 줄 바꿈으로 종료 A하고 G출력하는 것을 고려해야 합니다. 다른 시나리오에서는 줄 바꿈이 성가신 것으로 상상할 수 있기 때문에 아마도 옵션 일 것입니다.
Martin Ender

하나의 빈 줄을 일치시키는 것은 쉽습니다 ^$¶.
Neil

@Neil 아니오, A하나의 빈 줄을 유지하거나 모든 줄을 버리는 지 여부에 관계없이 출력 이 동일하다는 것을 의미합니다 .
Martin Ender

죄송합니다. "마지막 줄을 삭제합니다"라는 의미입니다. 빈 줄이 하나 더 적게 반환되지만 0과 1을 구분할 수 없습니다.
Neil

3

05AB1E , 4 바이트

{¥_O

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

1진실로 출력 하고 다른 음이 아닌 정수를 거짓으로 출력합니다. 05AB1E에서는 1유일하게 진실한 숫자입니다 (@Emigna에게 감사를 표합니다!).

설명

{       Implicit input. Sort
 ¥      Consecutive differences
  _     Boolean negate
   O    Sum. Implicit display

3

루비, 32 바이트

->(s){s.uniq.length==s.length-1}

PPCG에 오신 것을 환영합니다! 이것은 코드 골프이기 때문에 프로그램의 바이트 수를 포함해야합니다. 나는 이번에 당신을 위해 그것을 할 자유를 가져 왔습니다.
Pavel

어때요 Array#size?
Travis

->s{s.uniq.size==s.size-1}
Conor O'Brien


3

엑셀, 42 바이트

덴마크어 버전

=TÆLV(A:A)=SUM(--(FREKVENS(A:A,A:A)>0))+1

목록의 각 정수를 별도의 셀에있는 열로 가정 A합니다.
일관되지 않은 잘못된 값 이 허용되면 3 바이트를 절약 할 수 있습니다.

=TÆLV(A:A)+SUM(-(FREKVENS(A:A,A:A)>0))

영어 버전 (44 바이트)

=COUNTA(A:A)=SUM(--(FREQUENCY(A:A,A:A)>0))+1

3

R , 32 31 바이트

@JarkoDubbeldam 덕분에 -1 바이트

cat(sum(duplicated(scan()))==1)

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

stdin에서 읽고 stdout에 씁니다.

duplicated의 값을 교체리스트를 반복하여 l함께 TRUE그 값리스트의 이전 및 발생하는 경우 FALSE그렇지. 고유 한 소울 메이트 쌍이있는 경우 정확히 하나의 TRUE값 이 있어야 하므로 합계는이어야합니다 1.



1
물론 @JarkoDubbeldam 아. 다시 만나서 반가워요! 오랜만이야.
Giuseppe

내가 아직 완전히 돌아 왔는지 확실하지 않은 다른 것들로 바빴습니다.
JAD

@ 주세페, 난 그냥이 질문을 읽고 즉시 당신의 독창적 인 접근 방식을 생각 .... 아주 좋은! 나는 그 scan()접근법을 결코 생각하지 않았을 것 입니다.
Joseph Wood

3

PowerShell , 40 37 바이트

($args|sort -u).count-eq$args.count-1

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

nique 플래그가 있는 Sort-Object명령 (alias sort) -u은 입력의 고유 한 구성 요소 만 가져옵니다. 예를 들어 input의 @(1,3,3,2)경우 결과는 @(1,2,3)입니다.

따라서, 우리는 확인해야 그 .count객체의 (즉, 얼마나 많은 요소가있다)는 -eq연간는에 .count우리의 입력 배열의 -1(즉, 우리가 정확히 하나의 중복 된 항목이 있습니다).

Sinusoid 덕분에 3 바이트를 절약했습니다.
TessellatingHeckler의 버그 수정.


그룹 대신 get-unique 별칭 'gu'를 사용하여 동일한 결과를 얻을 수 있습니까?
사인파

@Sinusoid 예, 우리는 할 수 있습니다. 감사!
AdmBorkBork

이것은 두 번째 테스트 케이스에 대한 작업을하지 않습니다 1,2,1- get-unique단지 미리 정렬 된 입력에서 작동합니다. 방법에 대해 ($args|sort -u).count-eq$args.count-1당신처럼 호출하면 이는, 테스트 케이스도 37이지만 모든 작업을 수행 f 1 2 1하는 대신 f 1,2,1?
TessellatingHeckler

@TessellatingHeckler 아, 잘 잡아. 내가 한 모든 테스트는 사전 분류 된 입력으로 수행되었습니다. 감사!
AdmBorkBork



2

옥타브 / MATLAB (통계 패키지 / 툴박스 포함), 21 바이트

@(x)nnz(~pdist(x))==1

익명의 기능. 입력은 열 벡터입니다. 출력이 true(로 표시됨 1) 또는 false(로 표시됨 0).

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

설명

pdist(x)의 모든 행 쌍 사이의 유클리드 거리 벡터를 계산합니다 x. 각 쌍을 한 번만 고려하고 (두 행의 순서는 중요하지 않음) 동일한 행으로 두 번 형성된 쌍을 고려하지 않습니다.

우리의 경우 x열 벡터이므로 두 행 사이의 유클리드 거리는 두 숫자의 절대 차이입니다.

~논리 (부울) 부정, 0 nnz이 아닌 수,와 ==1비교합니다 1. 따라서 결과는 true거리가 0 인 쌍이 하나만있는 경우에만 발생합니다.



2

줄리아, 39 26 바이트

!a=sum(a.==a')==endof(a)+2

설명

이 코드는 2 차원 부울 테이블을 생성 한 다음 sum 함수를 사용하여 수집하여 A의 데카르트 제곱에있는 동일한 요소 쌍의 수를 계산합니다. 그런 다음 문자열 길이에 2를 더한 값과 비교합니다. 정확히 하나의 반복 문자가있는 경우에만 수량이 동일합니다.

이 코드는 NOT 연산자를 재정의합니다.


!a=sum(a.==a')==endof(a)+2몇 바이트를 절약합니다. 온라인으로 사용해보십시오!
Dennis


2

옥타브 , 23 26 바이트

@(x)prod(sum(x==x'))==4

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

x==x'부분은 flawr의 답변 에서 영감을 얻었습니다 . 이것은 Luis의 답변보다 길지만 도구 상자를 사용하지 않습니다.

설명:

이것은 벡터 x를 입력으로 사용하여 전치 된 것과 비교 하는 익명 함수입니다 . 이것은 모든 대각선 요소가있는 행렬을 제공하며 1, 대각선 이외의 요소는 중복 요소가 있음을 나타냅니다.

주어진 열의 합계는 해당 숫자의 중복 수를 나타냅니다. 우리는 두 개의 숫자가 중복되기를 원하므로 두 개의 값은 2와 같고 나머지는 2와 다릅니다.

이 행렬의 곱을 취하면 4두 개의 동일한 요소 ( 2*2*1*1*1*1*...) 만 4있고 중복 요소 가 없거나 두 개 이상이 아닌 다른 요소가 있으면 얻을 수 있습니다 .


2

PHP, 46 바이트

<?=count(array_unique($argv))==count($argv)-1;

항목 수를 세고 $argv고유 항목 수와 비교합니다. 전자가 후자보다 1보다 높으면 진실하고 그렇지 않으면 거짓입니다.

eval.in에서 사용해보십시오!


변수 이름 $ argv를 사용해야합니까? 대신 $ a 만 사용할 수 있습니까?
dading84

3
@ dading84 $argv는 명령 줄 매개 변수 목록입니다. 따라서 : 그는 단지 사용할 수 없습니다 $a.
Titus

2

05AB1E , 6 5 바이트

{¥>ΘO

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

{¥>ΘO   # example input:               [1, 6, 3, 4, 4, 7, 9]
{       # sort                      -> [1, 3, 4, 4, 6, 7, 9]
 ¥      # get deltas                -> [  2, 1, 0, 2, 1, 2 ]
  >     # increment                 -> [  3, 2, 1, 3, 2, 3 ]
   Θ    # truthify (only 1 gives 1) -> [  0, 0, 1, 0, 0, 0 ]
    O   # sum                       -> 1

105AB1E에서 유일하게 진실 된 가치이므로 여기서 멈출 수 있습니다. (@Emigna에게 지적 해 주셔서 감사합니다.)

두 개의 고유 한 값만 얻으려면 선택적으로 다음을 추가 할 수 있습니다.

     Θ  # equals 1?                 -> 1

1
잘못된 경우에 대해 잘못된 값을 반환해도 괜찮은 경우 05AB1E의 유일한 잘못된 값 Θ처럼을 건너 뛸 수 있습니다 1.
Emigna

@Emigna 감사합니다! OP의 승인 여부는 확실하지 않지만 그럴 것 같습니다.
Arnauld

¢작동하지 않을 수 있으므로 이전 솔루션으로 되돌려 야 할 것 같습니다. in을 찾은 후 [19,4,4,9]false 및 [19,9]true 로 계산 됩니다 . 010
Emigna

@Emigna 그것을 발견해 주셔서 감사합니다. 나는 그것이 고정되어 있다고 생각합니다.
Arnauld

{¥_O괜찮을 것입니다.
Emigna



1

apt, 7 바이트

â ʶUÊÉ

시도 해봐


설명

중복 ( â)을 제거 하고 길이 ( Ê)를 얻고 입력 ( )에서 1 ( ) 의 길이 ( Ê) 와 동등 ( )을 비교 하십시오 .UÉ


12 바이트 아닌가요? 수없는 âÊɶ멀티 바이트 문자는?
RedClover


1

05AB1E , 5 바이트

gIÙg-

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

g     # Get number of elements in input
 IÙg  # Get number of unique elements in input
    - # Subtract

05AB1E에서 1은 유일무이 한 값이므로, 유일무이 한 결과에 대해 정확히 1 개의 중복 요소가 제거되어야합니다.

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