부호 변경을 사용하여 중복 항목을 피하십시오


14

이 일화 에는 다음과 같은 흥미로운 교환 포함되어 있습니다.

"Fine, Fred"Avi가 중단되었습니다. "그런 다음 중복 항목을 피하기 위해 어떻게 변경 하시겠습니까?"

"아, 그냥 저것을 부정적인 것으로 바꾸세요."

이 주장은 문맥 상 정확하지 않지만, 이해하기 쉬운 그럴듯한 코드가 있는지 궁금합니다.

이 기준에 맞는 코드 (프로그램, 함수 등)를 작성해야합니다.

  1. 두 개의 입력 목록을 하나로 병합하여 중복을 유지합니다. [편집 : 선택적으로 정수라고 가정하거나 목록 자체가 고유하다고 가정 할 수 있습니다. 정수가 양수라고 가정 할 수는 없습니다.
  2. 코드 어딘가에 리터럴 "1"이 나타납니다. 이것을 리터럴 "-1"로 변경하면 코드는 동일한 작업을 수행하지만 중복을 제거합니다.
  3. 코드는 단순히 1 / -1에서 분기되지 않습니다. 우리는 찾고하지 않는 if (1 < 1) removeDuplicates()또는 [do_nothing, merge_with_dups, merge_without_dups][1].call()예를 들어,.

입력 및 출력은 원하는 형식으로 구성 할 수 있습니다. 한 가지 예는

[1,2],[2,3]->[1,2,2,3]부호가 바뀌기 전과 [1,2,3]후에

이것은 인기 콘테스트입니다. 과시하고 싶지 않다면 코드 골프아닙니다 . 약 2 주 만에 가장 높은 투표 응답을받습니다.


입력은 무엇입니까-정수만? 긍정적 또는 부정적? 입력 목록에 중복 항목이 포함 된 -1경우 사례 에서 제거해야 합니까?
Monica Reinstate Monica

1
입력 목록이 정렬되어 있고 중복 된 내용이 포함되어 있지 않다고 가정해야합니까?
ugoren

내가 DailyWTF에서 그것을 보았을 때의 나의 첫번째 생각은 그들이 "병합"을 정의해야한다는 것이었다. 이 질문은 또한 그 정의가 필요합니다.
피터 테일러

"그들을 보리스를 총알 다저라고 부릅니다." "... 그는 총알을 피하기 때문에 Avi". CodeGolf의 스내치 팬이 있습니까?
Bojangles

답변:


11

자바 스크립트

일반적인 알고리즘을 사용하여 버그로 작성하십시오.

function merge(a, b) {
  var ai = 0, bi = 0, oi = 0;
  var o = [];
  while (ai < a.length && bi < b.length) {
    var v = a[ai] < b[bi] ? a[ai++] : b[bi++];
    if (v !== o[oi + 1]) {
      o[oi++] = v;
    }
  }
  while (ai < a.length) o[oi++] = a[ai++];
  while (bi < b.length) o[oi++] = b[bi++];
  return o;
}

이 코드에는 정확히 하나의 리터럴이 포함됩니다 1. 로 변경되면 -1복제본이 제거됩니다. 모든 비교 가능한 값에 사용할 수 있습니다.


5

APL 22/23

← ⎕를 통해 화면을 입력하라는 메시지를 표시하고 선행 병합 목록이 음수로 설정된 경우 중복없이 정렬 된 병합 목록을 반환합니다.

(~1=0,-2=/v)/v←v[⍋v←⎕]

⎕:
    (1 2),(2 3)
1 2 2 3

(~¯1=0,-2=/v)/v←v[⍋v←⎕]

⎕:
    (1 2),(2 3)
1 2 3

바이트 카운터는 단일 바이트 APL 문자가이 사이트에서 올바르게 렌더링되도록 UTF8로 변환되었습니다.


-1은 어떻게 모든 것을 바꾸나요?
Johannes Kuhn

@Johannes Kuhn 위의 예에서 코드 0, -2 = / v는 중복 항목의 위치를 ​​나타내는 ¯1과 함께 벡터 0 0 ¯1 0을 생성합니다. 이 벡터를 1 및 ¯1에 대해 테스트하면 0 0 0 0 또는 0 0 1 0 부울 요소를 반전하면 1 1 1 1 또는 1 1 0 1이됩니다.이 벡터는 병합 된 벡터에서 적절한 요소를 선택하는 데 사용됩니다.
Graham

4

k (18)

유효한 모든 유형의 목록에서 작동해야합니다.

{(*1#(::;?:))@x,y}

예:

k){(*-1#(::;?:))@x,y}[1 2 3 4;3 4 5 6]
1 2 3 4 5 6
k){(*1#(::;?:))@x,y}[1 2 3 4;3 4 5 6]
1 2 3 4 3 4 5 6

3

파이썬

def merge(a, b):
    return a + [i for i in b if i not in a*- 1]

2

세게 때리다

당신은 소문자 전에 마이너스 기호를 추가하는 경우 문맥의 정신,이 프로그램은 중복을 제거 lgrep라인. I이전 줄 의 대문자 앞에 또는 1다음 줄 의 숫자 앞에 빼기 부호를 추가 하면 프로그램이 다르게 동작하지 않습니다.

입력 파일은 한 줄에 하나의 정수를 포함합니다 (일반적으로 목록을 텍스트 파일로 나타냄). 그것들은 두 개의 인수로 전달되어야합니다. 결과 목록은 표준 ouptut에 기록됩니다.

# Create temp file for working
temp=$(mktemp -d)
# Copy left and right file to merge into same
cp $1 $temp/l
cp $2 $temp/r
cd $temp

while read num
do
  # I remove the output
  set `grep -Lax -e $num l ` <r> /dev/null
  if [ $# != 1 ]
  then echo $num >>r
  fi
done <l

cp r /dev/stdout
cd
rm -r $temp

면접에서 가장 좋은 코드의 예로이 프로그램을 자유롭게 사용하십시오. 내가 묻는 것은 그것이 내 최고의 코드라고 말하지 않는다는 것입니다.


1

Tcl

인용의 정신으로

foreach item $list1 {
    if {$item in $list2} {set item [expr {$item * 1}]}
    lappend list2 $item
}
foreach item $list2 {
    if {$item >= 0} {lappend result $item}
}

중복 된 경우 음수 값을 필터링 한 후 (-) 1을 곱하십시오.


이 답변은 질문이 변경되기 전에 그렇게 작성되었습니다. 인용의 정신으로, 나는 여전히 항목을 부정적으로 만드는 것을 선호합니다.
Johannes Kuhn

-1

PHP 초보자입니다. 정확한지 모르겠습니다.

$list1=explode(',',$_GET['list1']);
$list2=explode(',',$_GET['list2']);
$list_merged=array_merge($list1,$list2);
print_r($list_merged);
$list_unique=array_unique($list_merged);
print_r($list_unique);

7
이것이 실제로 도전에 답하는 것처럼 보이지는 않습니다-코드의 어느 곳에서도 리터럴 1이 보이지 않습니다.
Riking
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.