고유하지 않은 요소


24

부호있는 정수 배열의 고유하지 않은 요소를 찾는 프로그램을 작성하십시오. 결과 배열은 임의의 순서로있을 수 있습니다.

귀하의 답변은 입력이 변수에 저장되는 것으로 가정 d하고 올바른 결과로 평가 되는 스 니펫 일 수 있습니다 .

테스트 사례

각 테스트 케이스는 형식이 한 줄입니다 input => output. 출력의 다른 순열도 유효합니다.

[]                        => []
[-1, 0, 1]                => []
[1, 1]                    => [1]
[3, 0, 0, 1, 1, 0, 5, 3]  => [3, 0, 1]
[-34, 0, 1, -34, 4, 8, 4] => [-34, 4]

요소의 순서는 중요하지 않습니다.

이것은 코드 골프이므로 가장 짧은 대답 (바이트)이 이깁니다.



1
이것은 정수 배열이므로 코드가 다를 수 있습니다. 나는 훨씬 짧게 생각합니다. 그것은 문자열입니다.
garg10may

1
배열 대신 입력을 입력으로 받아 들일 수 있습니까? 예를 들어, 대신에 [-1, 0, 1]입력 할 수 있습니다 (\ n을 개행 문자로 대체) : "-1\n0\n1"?
애디슨 크럼

1
출력이 목록이어야합니까, 아니면 세트가 허용됩니까?
Dennis

그리고 그 형식으로 출력해야합니까?
애디슨 크럼

답변:


16

K5 , 5 바이트

입력이 이미라는 변수에 있다고 가정하면 d,

?d^?d

별개의 요소 (가라 ?제외의 D)을 ( d^) (D)의 별개의 요소 ( ?d). 멋지게 대칭인가요? "except"연산자는 왼쪽 인수에서 오른쪽 인수의 첫 번째 항목 만 제거하기 때문에 작동합니다.

더 일반적으로,

nu: {?x^?x}

실제로 :

  nu'(();-1 0 1;1 1;3 0 0 1 1 0 5 3;-34 0 1 -34 4 8 4)
(()
 ()
 ,1
 0 1 3
 -34 4)

편집하다:

고유하지 않은 요소가 처음 나타나는 순서를 유지하려면 4 바이트의 추가 비용을 제외하고 고유 요소를 제거하기 전후에 소스 목록을 되돌릴 수 있습니다.

  nu: {?|(|x)^?x}
  nu'(();-1 0 1;1 1;3 0 0 1 1 0 5 3;-34 0 1 -34 4 8 4)
(()
 ()
 ,1
 3 0 1
 -34 4)

10

CJam, 10

배열이 이미 변수 D에 있다고 가정합니다 ( 이 주석을 기반으로 함 ).

D{De=(},_&

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

설명:

D{…},   filter items of D based on the block
  De=   count occurrences in D
  (     decrement (resulting in true/false for duplicate/unique)
_&      remove duplicates from the results

참고 : p예쁜 인쇄를 원하면 a를 추가하십시오. 그렇지 않으면 결과 배열은 기본적으로 구분 기호없이 인쇄됩니다. 질문은 스 니펫이 "올바른 결과로 평가"하기 만하면되기 때문에 허용됩니다.

표준 입 / 출력 버전, 13 :

q~_{1$e=(},&p

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

설명:

q~      read and evaluate the input array
_       duplicate the array
{…},    filter items based on the block
  1$    copy the array
  e=    count occurrences
  (     decrement (resulting in true/false for duplicate/unique)
&       set intersection with the initial array (removes duplicates)
p       pretty print

1
13 :q~$e`{((<~}%p
Sp3000

3
@ Sp3000 귀하의 의견을 읽기 전에 다른 13 바이트 버전을 찾았습니다. :) 순서를 유지합니다.
aditsu

9

하스켈-32

import Data.List;f l=nub$l\\nub l

가져와도 꽤 짧습니다. a \\ b각 요소의 첫 번째 발생 제거 b발을 a하고 nub리스트의 모든 요소가 유일한한다.


7

Pyth, 7 바이트

S{.-Q{Q

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

작동 원리

Pyth는 평가 된 입력을 자동으로 저장하고 Q사용되지 않은 모든 반환 값을 인쇄합니다.

     {Q  Convert Q into a set. This removes duplicates.
  .-Q    Perform "bagwise" difference of Q and set(Q).
         This removes the first occurrence of all elements in Q.
 {       Convert to set to deduplicate.
S        Sort. Returns a list.

7

SQL, 44 42 바이트

SELECT*FROM D GROUP BY I HAVING COUNT(*)>1

정수가 표 D에 저장되어 있다고 가정해도 괜찮습니까? 이것은 SQLServer, PostgreSQL 및 기타에서 모두 작동합니다. 2 바이트의 @manatwork 덕분에.


i가 표 d의 유일한 필드라고 가정하면 PostgreSQL에서는로 줄일 수 있습니다 select*from d group by 1having count(*)>1. (MySQL과 SQLite 파서는 분리되지 않은 select*from부분 도 처리 하지만 이해할 수는 없습니다 1having.)
manatwork

@manatwork는 그것을 응원합니다 .SQL 서버는 또한을 이해합니다 select*from. 1having그래도 좋아하지 않아 .. 그대로 남길 것입니다I having
MickyT

6

Mathematica, 29 26 바이트

입력이 다음에 저장된다고 가정합니다 d.

Select[d⋃d,d~Count~#>1&]

그렇지 않으면 명명되지 않은 함수로 29 바이트입니다.

Cases[#⋃#,n_/;#~Count~n>1]&

여기서 d⋃d(또는 #⋃#)는 복제본을 제거하는 골프 트릭입니다. Mathematica는 집합 조합을 자체로 가져 와서 목록을 집합으로 해석하고 자동으로 복제본을 제거하지만 실제 연합은 아무것도하지 않습니다.

이후 두 방법 모두 원래 목록에 나타나는 요소를 두 번 이상 필터링하면됩니다.


6

자바 스크립트 (ES6), 37 바이트

JavaScript 콘솔에서이를 실행하십시오.

e={};d.filter(x=>(e[x]=1+e[x]||0)==1)

는 일반적으로 자바 스크립트 (예 : 명시 적으로 "출력 / 인쇄"기능의 일종이 필요하다고 인정 것 console.log, alert등) 완료된 것으로 간주되어야한다. 챌린지에 "프로그램 또는 함수 작성"이라고 표시되면 함수도 충분합니다. 그 외에도 매우 효율적인 솔루션!
Mwr247

1
anwer가 될 수 있다는 것을 질문 상태는 Mwr247 @ 조각 올바른 결과로 평가됩니다 .
Cristian Lupascu

1
그 단락을 잘못 해석 한 것 같습니다. 사과 = =
Mwr247

@ Mwr247 문제 없습니다! :)
Cristian Lupascu

6

MATLAB / 옥타브, 40

입력 값이 실제라고 가정합니다 (복잡하지 않음). 입력이 변수에 d있습니다.

unique(d(sum(triu(bsxfun(@eq,d,d')))>1))

옥타브에서 온라인으로 사용해보십시오 .


입력 할 필요가, 당신은 'D'변수의 데이터지지 않습니다
garg10may

1
감사합니다. 업데이트되었습니다. 당신은 게시물에 그것을 지정해야합니다
Luis Mendo

일 때 출력이 올바르지 않습니다 d = [3, 0, 0, 1, 1, 0, 5, 3]. 두 가지 0가 있습니다.
alephalpha

@alephalpha 감사합니다! 수정 (8 개 바이트)
루이스 Mendo

더 짧음 : d(sum(triu(bsxfun(@eq,d,d')))==2). 또는 Octave에서 :d(sum(triu(d==d'))==2)
alephalpha

6

파이썬 3.5, 30

[x for x in{*d}if~-d.count(x)]

Python 3.5의 압축 풀기를 사용합니다. ~-Falsy 1 0의 개수를 감산 한 소요.

이것은 목록을 제공합니다. 세트를주는 것이 괜찮다면, 우리는 세트 이해를 사용하여 1 문자를 저장하고 버전 3.5는 필요하지 않습니다.

{x for x in d if~-d.count(x)}

SyntaxError: invalid syntax파이썬 3의 경우 3.5에서만 유효합니까? 파이썬이 난해 해지기 시작한시기
garg10may


1
@ Sp3000 굉장합니다. 스칼라와 같은 설정입니다. 더 많은 대안보다 훨씬 더 읽기 쉽습니다.
Carcigenicate

6

PowerShell을, 31 29 바이트

($d|group|?{$_.Count-1}).Name

$d이미 주어진 것으로 가정합니다 (예 :) $d=@(-34,0,1,-34,4,8,4).

배열을 Group-Objectcmdlet에 파이프하여 유사 항목을 그룹화하고 본질적으로 배열 배열 인 개체를 뱉어냅니다. 우리는 파이프하는 행 Where-Object합니다 ( ?갖는 오퍼레이터) Count보다 큰 (즉, 중복이있다), 및 출력 .Name그러한 아이템을. 초기 주문을 유지하는 추가 보너스도 있습니다.

편집 -Danko Durbić 덕분에 2 바이트 절약


1
나는 당신이 대체 할 수있는 생각 $_.Count-gt1$_.Count-1있는 어떤 마찬가지 것 Count보다 더 큰.
Danko Durbić

@ DankoDurbić 훌륭합니다!
AdmBorkBork

6

APL (Dyalog Unicode) , 13 9 바이트 SBCS

익명의 암묵적 접두사 기능.

∊(⊂1↓⊣¨)⌸

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

()⌸ 각각의 고유 한 요소 (왼쪽 인수)와 그 발생 위치 (오른쪽 인수)에 대해 다음 암묵적 기능을 적용하십시오.

⊣¨ 오른쪽에 각각의 왼쪽 (고유 한 요소) 중 하나 (인덱스)

1↓ 하나 떨어 뜨리다

 둘러싸 기 (논리 드 매트릭스를 만들기 위해 0으로 패딩 방지)

ε NLIST (편평한)


5

줄리아, 30 29 바이트

∪(d[find(sum(d.==d',1)-1)])

d.==d'i,j이 true이면 대칭 행렬을 작성하고 d[i]==d[j]그렇지 않으면 false를 표시합니다. sum한 차원에서 밍한 다음 1을 빼면 요소 중 하나만있는 경우 0이 생성되고 하나 이상인 경우 0이 아닙니다. find0이 아닌 요소의 인덱스를 얻은 다음 배열 d자체 를 인덱스하는 데 사용 됩니다. (연합)은 unique이런 식으로 사용될 때 처럼 반복을 제거합니다.

오래된 해결책 :

∪(filter(i->sum(d.==i)>1,d))

단순-각 항목마다 배열에 둘 이상의 항목이 있는지 확인합니다. 둘 이상이있는 것은 "필터"에 의해 반환 된 다음 (유니온)은 unique이런 식으로 사용될 때 와 같이 작동 하여 반복을 제거합니다.

참고 : 원래 함수로 사용했지만 질문은 배열을 변수에 저장하도록 허용 d합니다.이 질문에서 제안한대로 선택 했습니다.


5

파이썬 2.7, 36 42

list(set(filter(lambda x:d.count(x)>1,d)))

편집 : 질문에 필요한 형식을 준수하기 위해 식을 목록 (..)으로 묶었습니다.


이것은리스트가 아닌 세트를 출력 할 것이다
garg10may

그러면 내 스 니펫을 list (...) 호출로 둘러 쌀까요?
dieter

예, 출력은 배열 만되어야합니다.
garg10may 1


5

R, 31 24 바이트

7 바이트를위한 flodel 덕분 입니다.

입력이 이미 있다고 가정합니다 d.

암호:

unique(d[duplicated(d)])

편집 : 이제 aditsu가 지적한 것처럼 두 개 이상의 중복이 있으면 올바르게 출력됩니다 .


2
아름다워요! 그러나 4 번째 테스트 사례는 정확하지 않은 것 같습니다.
aditsu

1
논리적 인수도 허용 which하므로 제거 할 수 있습니다 [.
flodel

5

파이썬 3-33 30 바이트

{_ for _ in d if d.count(_)>1}

d입력으로 Repl 출력 .



4

Pyth, 7 바이트

ft/QT{Q

설명:

ft/QT{Q
           Q = eval(input())
     {Q    set(Q) - deduplicate
f          filter - with T as the filter variable.
  /QT      count in Q of T
 t         minus 1.

필터는 요소 집합에서 정확히 한 번 나타나는 모든 요소를 ​​제거합니다.


4

LINQ, 62 54 바이트

여기에 새로운 것이지만 여기에는 아무것도 없습니다.

d.GroupBy(c=>c).Where(g=>g.Count()>1).Select(g=>g.Key)

사이트에 오신 것을 환영합니다! LINQ를 모르지만 점수를 높이기 위해 공백을 제거 할 수 있습니다.
DLosc


3

쉘 + GNU coreutils, 12

sort|uniq -d

테스트 출력 :

$ printf "%s\n" -34 0 1 -34 4 8 4 | ./nonuniq.sh 
-34
4
$ 

3

매스 매 티카, 23 바이트

에 저장된 입력 d:

Pick[#,#2>1]&@@@Tally@d

함수로서 24 바이트 :

Pick[#,#2>1]&@@@Tally@#&

예를 들어

d = {3, 0, 0, 1, 1, 0, 5, 3}
Tally@d

이것을 돌려줍니다 :

   {{3, 2},
    {0, 3},
    {1, 2},
    {5, 1}}

(각 서브리스트의 첫 번째 요소는 요소이고, 두 번째 요소는 발생 빈도입니다.) 이 목록에 적용하기 Pick[#,#2>1]&@@@로 변환

{Pick[3,2>1], Pick[0,3>1], Pick[1,2>1], Pick[5,1>1]}

그리고 두 번째 인수의 Pick평가가 True첫 번째 인수로 리턴됩니다.


3

K (K5 아님), 10 바이트

x@&1<#:'=x

입력이에 있다고 가정합니다 x. K5가 아닌 답변을하는 것이 재미 있다고 생각했습니다!


3

펄 6, 16 바이트

목록이 저장되어 있다고 가정하면 $_다음 스 니펫 중 하나를 사용할 수 있습니다.
(구체적으로 허용되었습니다)

(--«.BagHash).Set.keys # 23 bytes
keys .Bag (-) .Set # 18 bytes
# U+2216 SET MINUS
keys .Bag∖.Set # 16 bytes in utf8

당신은 당신이 가방을 얻을 상관 없어 당신은 떠날 수 있습니다 keys .

$_ = [3, 0, 0, 1, 1, 0, 5, 3];
.Bag∖.Set  3 # True
.Bag∖.Set  5 # False

이들 중 어느 것도 부호있는 정수 또는 그 문제에 대한 숫자로만 작업하는 데 한계가 없습니다.

say keys .Bag∖.Set given |(<a b c d a a c>), 1/3, 2/3 - 1/3;
# (a c 0.333333)



2

공통 리스프, 57 바이트

(remove-duplicates(remove-if(lambda(x)(<(count x d)2))d))

2

옥타브, 33 바이트

[~,a]=unique(d);d(a)=[];unique(d)
  • 각 고유 정수가 처음 나타나는 인덱스를 찾습니다.
  • 그러한 발생을 제거하고
  • 나머지 배열의 고유 한 요소를 찾습니다.

여기는 아이디어 입니다. 스 니펫을 함수로 래핑하여 모든 샘플 입력을 사용하여 호출 할 수 있습니다.


2

자바 8, 80 바이트

x.stream().filter(i->x.indexOf(i)!=x.lastIndexOf(i)).collect(Collectors.toSet())

x에 입력 된 숫자 목록이 있다고 가정합니다.


2

PHP, 35 37 바이트

꽤 직설적 인:

array_diff_key($a,array_unique($a))

참고 사항 :; 질문에 나와 있듯이 줄 끝에 줄을 추가하지 않았습니다 .

귀하의 답변은 입력이 변수 (d, say)에 저장되고 올바른 결과로 평가되는 스 니펫 일 수 있습니다

따라서이 스 니펫은 다음과 같이 사용될 수 있으며 올바른 결과로 평가됩니다.

print implode(' ', array_diff_key($a,array_unique($a)));

다른 메모

위의 코드는 챌린지에서 제공되는 모든 테스트 사례에 적용됩니다. 이 경우 고유하지 않은 모든 문자는 대부분 중복됩니다. 요소가 두 번 이상 발생할 수있는 경우 다른 요소 array_unique()가 필요하므로 길이가 49 바이트로 늘어납니다 .

array_unique(array_diff_key($a,array_unique($a)))

편집

  • 로 교체 하여 2 바이트절약array_diff_assoc 했습니다 array_diff_key. Jörg Hülsermann 에게 감사합니다 .

1
array_diff_key대신array_diff_assoc
Jörg Hülsermann

@ JörgHülsermann 잘 잡았습니다. 감사. 다음 날에 다른 제안을 살펴볼 것입니다.
insertusername 여기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.