인접 중복 축소


22

도전

정수 목록이 주어지면 인접한 동일한 항목의 모든 쌍을 반복적으로 제거한 후 이러한 정수 목록을 반환하십시오.

홀수 길이의 같은 수의 런이 있으면 그 중 하나가 쌍의 일부가 아닌 그대로 유지됩니다.

예:

[0, 0, 0, 1, 2, 4, 4, 2, 1, 1, 0]

첫째, 당신은 제거해야합니다 0, 0, 4, 4그리고 1, 1얻을 :

[0, 1, 2, 2, 0]

이제 다음을 제거해야합니다 2, 2.

[0, 1, 0]

그리고 이것이 최종 결과입니다.

테스트 사례

[]-> []
[1]-> [1]
[1, 1]-> []
[1, 2]-> [1, 2]
[11, 11, 11]-> [11]
[1, 22, 1]-> [1, 22, 1]
[-31, 46, -31, 46]-> [-31, 46, -31, 46]
[1, 0, 0, 1]-> []
[5, 3, 10, 10, 5]-> [5, 3, 5]
[5, 3, 3, 3, 5]-> [5, 3, 5]
[0, -2, 4, 4, -2, 0]-> []
[0, 2, -14, -14, 2, 0, -1]-> [-1]
[0, 0, 0, 1, 2, 4, 4, 2, 1, 1, 0]-> [0, 1, 0]
[3, 5, 4, 4, 8, 26, 26, 8, 5]-> [3]
[-89, 89, -87, -8, 8, 88]-> [-89, 89, -87, -8, 8, 88]

채점

이것은 이므로 각 언어에서 가장 짧은 답변이 이깁니다!


삭제 된 게시물을 볼 수있는 사용자를위한 샌드 박스
musicman523

중요하지 않습니다. 모두 동일합니다. 이 문구의 의미는 다음과 같이 [14, 14, 14]무너집니다.[14]
musicman523

도전 과제를 오해하십시오. 죄송합니다. 당신은 (1 씩 증가하는 숫자 모든 쌍을 제거하는 줄 알았는데 1,2, 11,12등)
스티븐

구분 된 문자열로 입력을받을 수 있습니까?
얽히고 설킨

2
-89,89,-87,-8,-88? 와 같은 테스트 사례를 추가 할 수 있습니까? 내 (포스트되지 않은) Japt 솔루션과 Fry 's Retina 솔루션이 모두 실패하여 출력 --87,8합니다.
얽히고 설킨

답변:


5

젤리 , 10 바이트

Œgœ^/€FµÐL

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

작동 원리

Œgœ^/€FµÐL  Main link. Argument: A (array)

       µ    Combine all links to the left into a chain.
Œg              Group all adjacent equal items.
    /€          Reduce each group by...
  œ^                symmetric multiset difference.
                In each step, this maps ([], n) to [n] and ([n], n) to [], so the
                group is left with a single item if its length is odd, and no items
                at all if its length if even.
      F         Flatten the resulting array of singleton and empty arrays.
        ÐL  Apply the chain until the results are no longer unique. Return the last
            unique result.

대신에 사용하면 F목록의 목록도 지원할 수 있습니다.
아웃 골퍼 에릭

아니요, œ^여기에서 정수 대 배열 승격에 의존합니다. 1D 배열은 2D 배열로 승격되지 않으므로 숫자 배열 이외의 다른 경우에는 작동하지 않습니다.
데니스

허 .. 네가 방금 사용할 수 있었어 ŒgWẎ$œ^/$€ẎµÐL. :피
Outgolfer 에릭

4

망막 ,17 15 바이트

+m`^(.+)¶\1$¶?

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

Neil과 Martin 덕분에 2 바이트를 절약했습니다!

각 숫자 쌍을 아무것도없는 것으로 바꿉니다. 이 프로세스는 변경 사항이 없을 때까지 반복됩니다.


이것을 발견하기 전에 Japt에서 동일한 솔루션을 개발했습니다. 불행히도, 둘 다 같은 -89 89 -87 -88 -88출력 에서 실패 합니다 --87.
얽히고 설킨

1
@Shaggy 감사 _합니다. 일부 언어에서 와 같이 경계 검사를 추가하고 음수를 나타내는 데 사용하여 수정했습니다 .
FryAmTheEggman

그 후에도 이것도 실패하고 _89 89 _87 _8 _88출력 한다는 것을 발견했습니다 _89 89 _87 8. 죄송합니다 : \
얽히고 설킨

@Shaggy 죄송합니다! 문제를 찾아 주셔서 감사합니다! 이 사례를 해결하기 위해 다른 경계 검사를 추가했습니다.
FryAmTheEggman

1
@FryAmTheEggman 이것이 Neil의 의미인지 확실하지 않지만 s를 및 m로 바꾸는 데 사용할 수도 있습니다 . \b^$
Martin Ender

3

매스 매 티카 29 바이트

이것은 동일한 인접 요소 쌍을 반복적으로 제거합니다. a_,a_ 남은 것이 없을 때까지 .

#//.{b___,a_,a_,c___}:>{b,c}&

3

파이썬 2 , 57 바이트

r=[]
for x in input():r+=x,;r[-2:]*=r[-2:-1]!=[x]
print r

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

다음 요소를 추가하여 출력 목록을 반복적으로 생성 한 다음 추가 요소가 이전 요소와 같으면 끝을 잘라냅니다. 두 번째부터 마지막까지의 요소를 확인하면 r[-2:-1]!=[x]목록의 길이가 1 일 수 있기 때문에 어색합니다.


멋진 답변, 잘 했어요 :)
musicman523

2

젤리 , 15 바이트

Œr;ṪḂ$$€x/€FµÐL

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

설명

Œr;ṪḂ$$€x/€FµÐL  Main Link
Œr               Run-length encode
  ;              Concatenate (?)
       €         For each element
   ṪḂ$$          Is the last element odd?
          €      For each element    // Non-breaking alternative
        x/       Reduce by repeating // for run-length decode
           F     Flatten
            µ    (New monadic link)
             ÐL  Repeat until results are no longer unique

마일 덕분에 -1 바이트, 고정 :)


@FryAmTheEggman 고정; 감사!
HyperNeutrino

오류가 발생하고 출력을 비워 두는 것이 올바른 해결책인지 잘 모르겠습니다. ValueError: not enough values to unpack (expected 2, got 0)테스트 케이스를위한 프로그램 던지기 [1,2,2,1]. 또한 빈 출력은 []2다르고 다릅니다 [2].

로 13 바이트 Œr;ṪḂ$$€ŒṙµÐL. 오류를 방지하기 위해 교체 Œṙ와 함께 x/€F빈리스트에 근거 해 실행시 길이 디코딩 오류를 던지고 있기 때문이다. 출력을 목록으로 보려면 tacking에서 출력을 ŒṘ보여줍니다.
마일

@ThePirateBay Jelly의 빈 목록 표현은 비어 있고, 한 항목은 해당 항목 만, 여러 항목은 괄호와 쉼표로 구분 된 목록입니다. 제출가 링크 (기능)하지 (람다는 파이썬에있을 것입니다 훨씬처럼) 전체 프로그램이다 - 더 "정상"보기 장소보고 ÇŒṘ마지막 링크를 (호출하는 바닥 글을 Ç)과 파이썬 표현을 인쇄 ( ŒṘ) . 그러나 오류가 허용되지 않을 수 있습니다.
Jonathan Allan

@JonathanAllan. 자, Jelly의 문자열 표현 목록이 허용된다는 것을 깨달았습니다. 첫 번째 의견의 주요 요점은 목록이 비어있을 때 오류가 발생한다는 것입니다.

2

자바 스크립트 (ES6), 54 53 바이트

@ThePirateBay 덕분에 1 바이트 절약

f=a=>1/a.find(q=>q==a[++i],i=-2)?f(a,a.splice(i,2)):a

순진한 재귀 솔루션은 불가능할 수 있습니다.


당신이 대체 할 수 있도록, 현재 및 이전 요소 대신에 현재와 다음을 확인하실 수 있습니다 i=0i=-2i-1함께 i총 -1 바이트.

@ guest44851 고마워요,하지만 ...로 바꾸어야한다고 생각하지 i+1않습니까? (이것은 이전에도 시도했지만 ++그것을 알아낼 수 없었습니다. 단 1 분 밖에
걸리지 않았습니다

당신은 그것이 제대로 작동 하는 것을 볼 수 있습니다 .

@ThePirateBay Golly, 당신 말이 맞아요! 그러나 어떻게?
ETHproductions

2

파이썬 2 , 73 바이트

언급할만한 평판이 충분하지 않기 때문에 바이트를 저장하기 위해 len (r) 대신 r! = []를 사용하도록 @officialaimm의 대답을 변경했습니다. @officialaimm 당신에게 매우 영리한 솔루션!

r=[]                            # create list that will hold final results. A new list is important because it needs to be removable.
for i in input():               
 if r!=[]and r[-1]==i:r.pop()   # Ensure that we have at least 1 char added to the list (r!=[])... or that the last character of our final result isn't the current character being scanned. If that is, well, remove it from the final list because we do not want it anymore
 else:r+=[i]                    # Shorthand for r.append(i). This adds i to the final result
print r

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

다시 말하지만 너무 늦었습니다. 왜 아직도 일어 났습니까?



2

MATL , 7 바이트

t"Y'oY"

결과가 비어있는 일부 테스트 케이스의 경우 프로그램이 오류와 함께 종료되지만 어떤 경우에도 올바른 (빈) 출력이 생성됩니다.

온라인으로 사용해보십시오! 또는 비어 있지 않은 출력으로 테스트 사례를 확인하십시오 .

설명

t     % Implicit input. Duplicate
"     % For each (i.e. do as many times as input size)
  Y'  %   Run-length encode. Gives array of values and array of run lengths
  o   %   Parity, element-wise. Reduces run-lengths to either 0 or 1
  Y"  %   Run-length decode. Gives array of values appearing 0 or 1 times;
      %   that is, removes pairs of consecutive values
      % Implicit end. Implicit display

입력 고려

0 0 0 1 2 4 4 2 1 1 0

각 반복은 연속 쌍 쌍을 제거합니다. 첫 번째 반복은 배열을

0 1 2 2 0

2현재 인접한 두 값 은 초기 배열에서 인접하지 않았습니다. 이것이 두 번째 반복이 필요한 이유입니다.

0 1 0

추가 반복은 변경되지 않습니다. 필요한 반복 횟수는 입력 크기에 의해 상한이됩니다.

빈 중간 결과로 인해 Y"현재 버전의 언어에서 런 렝스 디코딩 함수 ( )가 오류가 발생합니다. 그러나 출력은 필요에 따라 비어 있습니다.


설명을 추가해 주시겠습니까? 어떻게 당신이 나를 이길 건장한 지 이해하고 싶습니다. : P
Dennis

트윗 담아 가기 나는 잊어 버렸었다. 완료 :-)
Luis Mendo

1
아, RLE는 두 개의 배열을 푸시 합니다. 유용합니다.
Dennis

2

x86 머신 코드 (32 비트 보호 모드), 36 바이트

52
8B 12
8D 44 91 FC
8B F9
8D 71 04
3B F0
77 10
A7
75 F9
83 EF 04
4A
4A
A5
3B F8
75 FB
97
EB E7
58
89 10
C3

위의 바이트의 머신 코드는 배열을 입력으로 취하고 인접한 중복을 제자리에서 접은 다음 결과를 반환하지 않고 호출자에게 반환하는 함수를 정의합니다. __fastcall호출 규칙을 따르고 두 개의 매개 변수를 각각 ECXEDX레지스터 에 전달합니다 .

첫 번째 매개 변수 ( ECX)는 32 비트 정수 배열의 첫 번째 요소에 대한 포인터입니다 (배열이 비어 있으면 메모리의 아무 곳이나 가리킬 수 있음). 두 번째 매개 변수 ( EDX)는 배열의 길이를 포함하는 32 비트 정수에 대한 포인터입니다.

이 함수는 필요한 경우 배열 요소를 제자리에서 수정하고 축소 된 배열의 새 길이를 나타내도록 길이를 업데이트합니다. 이것은 입력을 가져오고 출력을 반환하는 특이한 방법이지만 어셈블리 언어에서 다른 선택은 없습니다. C에서와 같이 배열은 실제로 언어에서 첫 번째 요소에 대한 포인터와 길이로 표시 됩니다. 여기서 조금 이상한 점은 참조로 길이 취하는 것입니다. .하지만 그렇게하지 않으면 배열을 단축 할 수있는 방법이 없습니다. 코드는 정상적으로 작동하지만 호출자는 축소 된 배열에서 요소 인쇄를 중지 해야하는 위치를 알지 못하기 때문에 출력에 쓰레기가 포함됩니다.

ungolfed 어셈블리 니모닉 :

; void __fastcall CollapseAdjacentDuplicates(int * ptrArray, int * ptrLength);
; ECX = ptrArray              ; ECX = fixed ptr to first element
; EDX = ptrLength
   push  edx                  ; save pointer to the length
   mov   edx, [edx]           ; EDX = actual length of the array
   lea   eax, [ecx+edx*4-4]   ; EAX = fixed ptr to last element 

FindAdjacentPairs:
   mov   edi, ecx             ; EDI = ptr to element A
   lea   esi, [ecx+4]         ; ESI = ptr to element B
FindNext:
   cmp   esi, eax             ; is ptr to element B at end?
   ja    Finished             ; if we've reached the end, we're finished
   cmpsd                      ; compare DWORDs at ESI and EDI, set flags, and increment both by 4
   jne   FindNext             ; keep looping if this is not a pair

; Found an adjacent pair, so remove it from the array.
   sub   edi, 4               ; undo increment of EDI so it points at element A
   dec   edx                  ; decrease length of the array by 2
   dec   edx                  ;  (two 1-byte DECs are shorter than one 3-byte SUB)
RemoveAdjacentPair:
   movsd                      ; move DWORD at ESI to EDI, and increment both by 4
   cmp   edi, eax             ; have we reached the end?
   jne   RemoveAdjacentPair   ; keep going until we've reached the end
   xchg  eax, edi             ; set new end by updating fixed ptr to last element
   jmp   FindAdjacentPairs    ; restart search for adjacent pairs from beginning

Finished:
   pop   eax                  ; retrieve pointer to the length
   mov   [eax], edx           ; update length for caller
   ret

구현은 내 C ++ 11 답변 에서 영감을 얻었습니다. 에서 지만 크기를 최적화하여 어셈블리에서 꼼꼼하게 다시 작성했습니다. 조립은 훨씬 나은 골프 언어입니다. :-)

참고 : 이 코드는 문자열 명령어를 사용하기 때문에,이다 않는 방향 플래그 (분명 가정 DF== 0). ABI에서는 일반적으로 DF가 명확해야하므로 이는 대부분의 운영 환경에서 합리적인 가정입니다. 이것이 보장되지 않으면 1 바이트 CLD명령어 ( 0xFC)를 코드 맨 위에 삽입해야합니다.

또한 언급 한 바와 같이 32 비트 보호 모드, 특히 "플랫 (flat)"메모리 모델을 가정합니다. 여기서 여분의 세그먼트 ( ES)는 데이터 세그먼트 ( DS)와 같습니다.


1

배치, 133 바이트

@set s=.
:l
@if "%1"=="%2" (shift/1)else set s=%s% %1
@shift/1
@if not "%1"=="" goto l
@if not "%s:~2%"=="%*" %0%s:~1%
@echo(%*

.중복이있는 경우 배치가 혼란 스럽기 때문에 s를 설정했습니다 . 또한 인수 목록을 새 배열 및 루프로 설정하는 데 shift/1사용할 수 있도록 사용해야 %0%s:~1%합니다.


물어봐야하는데 ... 왜? 좋은 대답 ...하지만 왜?
Zacharý

@ Zacharý 그것이 있기 때문에.
Neil

1
@ Zacharý 부분적으로 골프가 아닌 언어로 골프를 치는 좋은 이유는 이것이 실제로 유용 할 수 있기 때문 입니다. 이 작업을 수행하기 위해 실생활에서 아무도 젤리 인터프리터를 실행하지는 않지만 배치 파일로 처리해야 할 수도 있습니다!
코디 그레이

오. 말이 되네요
Zacharý

1

젤리 , 12 바이트

ŒgṁLḂ$$€ẎµÐL

숫자 목록을 가져오고 반환하는 모나드 링크.

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오

방법?

ŒgṁLḂ$$€ẎµÐL - Link: list
         µÐL - perform the chain to the left until no changes occur:
Œg           -   group runs (yield a list of lists of non-zero-length equal runs)
      $€     -   last two links as a monad for €ach run:
     $       -     last two links as a monad:
   L         -       length (of the run)
    Ḃ        -       modulo 2 (1 if odd, 0 if even)
  ṁ          -     mould (the run) like (1 or 0) (yields a list of length 1 or 0 lists)
        Ẏ    -   tighten (make the list of lists into a single list)

ṁLḂ$$€동등에 ḣLḂ$$€있는 것과 같습니다 ṫḊ¿€3$있는 당신이 대체 할 수 ṫḊ¿€3다이 애드 / nilad 쌍을 형성하려면 여기를.
Outgolfer Erik

예를 들어, 길이가 4 인 입력에서는 작동하지 않습니다. while 루프의 각 반복에서 대기열에 대한 입력은 무엇입니까?
Jonathan Allan

0 개 또는 1 개의 요소가있는 목록이 남아 있어야합니다. len (x) == 1이면을 반환 []하고 len (x) == 0 을 반환 0하면 둘 다 잘못된 값입니다. 에 대한 입력 은 물론 현재 값이며 현재 값은 왼쪽 인수 및 3오른쪽으로 표시됩니다. len (x) == 4 인 경우와 같 ṫ3ṫ3거나 ṫ5나옵니다 [].
Outgolfer Erik

나는 그것이 무엇을 해야하는지 알 수 있지만 x설명에 실제로 현재 가치가 있습니까? 보십시오 크기 아웃.
Jonathan Allan

솔직히 말해서 그것이 코드인지 버그인지는 모르겠습니다 :)
Jonathan Allan


1

05AB1E , 15 바이트

[γʒgÉ}€нÐγ‚€gË#

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

설명

[γʒgÉ}€нÐγ‚€gË#
[               # Start infinite loop
 γ              # Group Array into consecutive equal elements
  ʒgÉ}          # Keep the subarrays with an uneven amount of elements
      €н        # Keep only the first element of each subarray
        Ð       # Triplicate the result on the stack
         γ      # Group the top element into consecutive equal elements
          ‚     # Wrap the top two items of the stack in an array
           €g   # Get the length of each subarray
             Ë# # Break if they are equal
                # Implicit print          

1

05AB1E , 13 바이트

[DγʒgÉ}€нDŠQ#

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

설명:

[DγʒgÉ}€нDŠQ# Implicit input
[             Start infinite loop
 D            Duplicate
  γ           Split into chunks of equal elements
   ʒ  }       Filter by
    g           Length
     É          Odd? (0=falsy 1=truthy)
       €      Foreach command
        н     Head
         D    Duplicate
          Š   Push c, a, b
           Q  Equal? (0=falsy 1=truthy)
            # Break if true (i.e. equal to 1)


1

파이썬 2 , 74 70 66 바이트

  • 4 바이트에 대해 @SteamyRoot에게 감사드립니다 : r대신 len(r)목록 / 스택의 공허함을 확인하기에 충분합니다.
  • 4 바이트에 대한 @ovs 감사합니다. 조건이 좋을 경우 [i]==r[-1:]

파이썬 2 , 66 바이트

r=[]
for i in input():
 if[i]==r[-1:]:r.pop()
 else:r+=[i]
print r

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


1
목적이 len(r)목록이 비어 있는지 여부를 확인하는 것이라면 목록으로 바꿀 수 있어야합니다 r.
SteamyRoot

네, 고마워요
officialaimm


@ovs 감사합니다, 정말 대단합니다! (y)
officialaimm

1
3 줄만 있으면되지만 대체 66 바이트 길이 입니다.
Jonathan Frech

0

클로저, 100 바이트

#(loop[i % j[]](if(= i j)i(recur(mapcat(fn[p](repeat(mod(count p)2)(last p)))(partition-by + i))i)))

이것이 가장 짧은 지 확실하지 않습니다.


0

배쉬, 82 바이트

cat>b
while cat b>a
perl -pe 's/(\d+) \1( |$)//g' a>b
! diff a b>c
do :
done
cat a

아마도 그 모든 것에서 벗어날 수있는 방법이 cat있지만 그것을 모르겠습니다.


0

껍질 , 10 바이트

ωoṁS↑o%2Lg

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

설명

ωoṁS↑o%2Lg
ω           Repeat until fixed point
 o          the following two functions:
         g   a) group adjacent elements
  ṁ          b) map over groups and concatenate:
        L     length of group
     o%2      mod 2
   S↑         take that many elements of group

0

PHP, 81 바이트

    function f(&$a){for($i=count($a);--$i;)$a[$i]-$a[$i-1]||array_splice($a,$i-1,2);}

기능, 참조로 전화하거나 온라인으로 시도하십시오 .

빈 입력에 실패; 삽입 $i&&하거나 수정 $a&&하기 전에 --$i.


0

V , 10 바이트

òͨ.«©î±î*

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

압축 정규식 : :%s/\(.\+\)\n\1\n*. 선택적 줄 바꿈은 파일 끝에서도 작동합니다. 마지막에 개행 문자가 있다고 가정하면 8 바이트가됩니다 ...하지만 그것은 스트레칭처럼 보입니다.


0

dc , 84 78 바이트

[L.ly1-dsy0<A]sA[LtLtS.ly1+sy]sP[dStrdStr!=Pz1<O]sO[0syzdsz1<Oly0<Azlz>M]dsMxf

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

명확성을 기하기 위해 순서에 관계없이 약간의 포장을 풉니 다.

  • [0syzdsz1<Olydsx0<Alx1+lz>M]dsMxf기본 매크로는 M카운터 y를 0으로 재설정 하고 스택에서 항목 수를 검색하여이를 레지스터에 저장 z한 다음 O스택에 두 개 이상의 항목이 있으면 매크로를 실행 합니다. 완료되면 O카운터를로드 y하고 레지스터에 복사하여 0이 x아닌지 확인합니다 y(스택 .에 데이터가 있음). 이 경우 매크로를 실행 A합니다. 마지막으로 원래 스택 크기가 현재 스택 크기보다 큰지 확인한 다음 다시 실행됩니다. 완료되면를 사용하여 스택을 인쇄합니다 f.
  • [dStrdStr!=Pz1<O]sO매크로 O는 스택의 상위 2 개 항목을 임시로 스택에 저장합니다 t. 그런 다음 상위 두 항목을 비교하고 매크로를 실행합니다.P 같지 않으면 합니다. 마지막으로 스택에 두 개 이상의 항목이 있는지 확인하고 필요한 경우 자체 실행됩니다.
  • [LtLtS.ly1+sy]sP매크로 P는 스택에서 두 항목을 가져 와서 t맨 위를 기본 스택으로 다시 밀고 다음 항목을 스택 으로 푸시합니다 .. 그런 다음 counter를 증가시킵니다 y.
  • [L.ly1-dsy0<A]sA매크로 A는 스택을 가져 와서 .기본 스택으로 되돌립니다. y아무것도 남지 않을 때까지 카운터를 감소시킵니다 .

설명을 위해 편집하고, 불필요하게 스택 크기를 저장했기 때문에 6 바이트를 사용하지 않았습니다.


0

C ++ 11, 161 바이트

#include<vector>
#include<algorithm>
using V=std::vector<int>;void f(V&v){V::iterator i;while((i=std::adjacent_find(v.begin(),v.end()))!=v.end())v.erase(i,i+2);}

위의 코드는 함수를 정의합니다.이 함수 는 참조로 f가져 와서 std::vector<int>사양에 따라 인접한 중복 항목을 축소하도록 해당 위치를 수정 한 다음 반환합니다.

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

바이트 수를 확인하기 전에이 코드가 매우 빠르다고 생각했습니다. 그러나 150 바이트 이상은 그렇게 좋지 않습니다! 골프에 능숙하지 않거나 C ++는 골프에 능숙하지 않습니다…

언 골프 드 :

#include <vector>
#include <algorithm>

using V = std::vector<int>;

void f(V& v)
{
   V::iterator i;

   // Use std::adjacent_find to search the entire vector for adjacent duplicate elements.
   // If an adjacent pair is found, this returns an iterator to the first element of the
   // pair so that we can erase it. Otherwise, it returns v.end(), and we stop.
   while ((i=std::adjacent_find(v.begin(), v.end())) != v.end())
   {
        v.erase(i, i+2);   // erase this adjacent pair
   }
}

C ++는 최고의 골프 ​​언어가 아닙니다. 의 좋은 사용 std::adjacent_find! 제거 할 수 있기 때문에이 짧은 것 경우이 기능을 직접 구현 궁금 #include <algorithm>뿐만 아니라
musicman523

@ musicman523 첫 번째 시도 약간 다른 알고리즘을 사용했지만 수동으로 구현했습니다. 나는 std::unique필요한 것을 수행하기 위해 구현을 조정하고있었습니다 . 그러나 모든 논리를 수행하려면 많은 코드가 필요합니다 std::adjacent_find.
코디 그레이

0

PHP, 74 바이트

function c(&$a){foreach($a as$k=>$v)$a[$k+1]===$v&&array_splice($a,$k,2);}

함수 c는 배열을 줄이기 위해 참조로 호출합니다. 온라인으로 사용해보십시오 .

흥미롭게도 이것은 Php5.6에서는 작동하지만 7에서는 작동하지 않습니다.





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