Thu gọn các bản sao liền kề


22

Thử thách

Đưa ra một danh sách các số nguyên, trả về danh sách các số nguyên này sau khi liên tục xóa tất cả các cặp vật phẩm bằng nhau liền kề.

Lưu ý rằng nếu bạn có một chuỗi số lẻ bằng nhau, một trong số chúng sẽ vẫn còn, không phải là một phần của một cặp.

Thí dụ:

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

Trước tiên, bạn nên loại bỏ 0, 0, 4, 41, 1để có được:

[0, 1, 2, 2, 0]

Bây giờ, bạn nên loại bỏ 2, 2:

[0, 1, 0]

Và đây là kết quả cuối cùng.

Các trường hợp thử nghiệm

[] -> []
[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]

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng!


Hộp cát cho những người có thể xem các bài đăng đã bị xóa
Musicman523

Không thành vấn đề, tất cả đều như nhau. Ý nghĩa của cụm từ này là [14, 14, 14]sụp đổ thành[14]
musicman523

Đọc sai thử thách, xin lỗi. Nghĩ rằng bạn phải loại bỏ tất cả các cặp số tăng 1 ( 1,2, 11,12, vv)
Stephen

Chúng ta có thể lấy đầu vào là một chuỗi phân cách không?
Xù xì

2
Bạn có thể thêm một trường hợp thử nghiệm như -89,89,-87,-8,-88? Cả giải pháp Japt (chưa được đăng) của tôi và giải pháp Retina của Fry đều thất bại ở đó, xuất ra --87,8.
Shaggy

Câu trả lời:


5

Thạch , 10 byte

Œgœ^/€FµÐL

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Œ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.

Sử dụng thay vì Fsẽ làm cho bạn danh sách hỗ trợ trong danh sách của bạn quá.
Erik the Outgolfer 22/07/17

Không, œ^dựa vào quảng cáo số nguyên đến mảng ở đây. Vì mảng 1D không được thăng cấp thành mảng 2D, nên nó sẽ không hoạt động cho bất cứ thứ gì ngoại trừ một mảng số.
Dennis

Heh ... ý tôi là bạn chỉ có thể sử dụng ŒgWẎ$œ^/$€ẎµÐL... oh chờ đã quá ngây thơ. : P
Erik the Outgolfer 22/07/17

4

Võng mạc ,17 15 byte

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

Hãy thử trực tuyến!

Đã lưu 2 byte nhờ Neil và Martin!

Thay thế mỗi cặp số không có gì. Quá trình này lặp lại cho đến khi không có thay đổi được thực hiện.


Đã tìm ra một giải pháp giống hệt trong Japt trước khi phát hiện ra điều này. Thật không may, cả hai chúng ta đều thất bại với các đầu vào như -89 89 -87 -88 -88, đầu ra nào --87.
Xù xì

1
@Shaggy Cảm ơn, tôi đã sửa nó bằng cách thêm kiểm tra ranh giới và sử dụng _để biểu thị các phủ định, như thường thấy trong một số ngôn ngữ.
FryAmTheEggman

Kể từ đó tôi đã phát hiện ra rằng điều này cũng sẽ thất bại _89 89 _87 _8 _88, xuất ra _89 89 _87 8. Xin lỗi: \
Shaggy

@Shaggy Đừng xin lỗi! Cảm ơn vì đã tìm ra vấn đề! Tôi đã thêm một kiểm tra ranh giới để khắc phục trường hợp đó.
FryAmTheEggman

1
@FryAmTheEggman Không chắc đó là ý của Neil nhưng sau đó bạn cũng có thể sử dụng mđể biến \bs thành ^$.
Martin Ender

3

Toán học 29 byte

Điều này liên tục loại bỏ các cặp phần tử liền kề bằng nhau, a_,a_cho đến khi không còn lại.

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

3

Python 2 , 57 byte

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

Hãy thử trực tuyến!

Lặp lại xây dựng danh sách đầu ra bằng cách nối thêm phần tử tiếp theo, sau đó cắt bỏ phần cuối nếu phần tử nối thêm bằng với phần tử trước nó. Việc kiểm tra phần tử thứ hai đến cuối cùng r[-2:-1]!=[x]trở nên khó xử vì có thể danh sách chỉ có độ dài 1.


Câu trả lời tuyệt vời, được thực hiện tốt :)
sĩ523

2

Thạch , 15 byte

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

Hãy thử trực tuyến!

Giải trình

Œ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 byte nhờ dặm, và cố định :)


@FryAmTheEggman Đã sửa; cảm ơn!
HyperNeutrino

Tôi không chắc chắn nếu ném lỗi và để trống đầu ra là một giải pháp chính xác. Bạn ném chương trình ValueError: not enough values to unpack (expected 2, got 0)cho trường hợp thử nghiệm [1,2,2,1]. Cũng lưu ý rằng đầu ra trống khác []2khác với [2].

13 byte với Œr;ṪḂ$$€ŒṙµÐL. Để tránh lỗi, thay thế Œṙbằng x/€Fgiải mã độ dài chạy đang đưa ra lỗi khi đưa ra một danh sách trống. Để xem đầu ra dưới dạng một danh sách, tacking ŒṘsẽ hiển thị nó.
dặm

@ThePirateBay Jelly đại diện cho một danh sách trống là - trống, của một mục - chỉ mục đó và nhiều mục - danh sách được phân tách bằng dấu phẩy và dấu phẩy. Việc gửi là một liên kết (chức năng) không phải là một chương trình đầy đủ (giống như lambda sẽ có trong Python) - để xem một vị trí xem "bình thường" hơn ÇŒṘở chân trang để gọi liên kết cuối cùng ( Ç) và in một đại diện Python ( ŒṘ) . Các lỗi có thể không được chấp nhận tuy nhiên.
Jonathan Allan

@Jonathan Allan. Ok, tôi nhận ra rằng đại diện chuỗi của Jelly trong danh sách là chấp nhận được. Điểm chính của bình luận đầu tiên của tôi là đề cập rằng lỗi được đưa ra khi danh sách trống.

2

JavaScript (ES6), 54 53 byte

Đã lưu 1 byte nhờ @ThePirateBay

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

Giải pháp đệ quy ngây thơ, có thể là ngẫu hứng.


Bạn có thể kiểm tra phần tử hiện tại và trước đó thay vì phần tử hiện tại và phần tiếp theo, vì vậy bạn có thể thay thế i=0bằng i=-2i-1itổng số byte byte.

@ guest44851 Cảm ơn, nhưng ... điều đó có nghĩa là tôi cần thay đổi nó thành i+1? (Tôi đã thử điều này trước đây với việc di chuyển ++cũng như vậy và không thể tìm ra nó, mặc dù tôi chỉ có khoảng một phút để làm như vậy)
ETHproductions 21/07/17

Bạn có thể thấy rằng nó hoạt động đúng .

@ThePirateBay Bởi golly, bạn đã đúng! Nhưng bằng cách nào?
Sản phẩm ETH

2

Python 2 , 73 byte

Vì tôi không đủ danh tiếng để bình luận: Tôi chỉ thay đổi câu trả lời của @officialaimm để sử dụng r! = [] Thay vì len (r) để lưu một byte. Giải pháp rất thông minh cho bạn, @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

Hãy thử trực tuyến!

Đó là, một lần nữa, quá muộn ... tại sao tôi vẫn còn dậy?



2

MATL , 7 byte

t"Y'oY"

Đối với một số trường hợp kiểm tra trong đó kết quả trống, chương trình thoát có lỗi, nhưng trong mọi trường hợp, nó tạo ra đầu ra (trống) chính xác.

Hãy thử trực tuyến! Hoặc xác minh các trường hợp thử nghiệm với đầu ra không trống .

Giải trình

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

Xem xét đầu vào

0 0 0 1 2 4 4 2 1 1 0

Mỗi lần lặp loại bỏ các cặp liên tiếp. Lặp lại đầu tiên làm giảm mảng

0 1 2 2 0

Hai giá trị 2liền kề không liền kề trong mảng ban đầu. Đó là lý do tại sao cần phải lặp lại lần thứ hai, điều này mang lại:

0 1 0

Lặp đi lặp lại sẽ không thay đổi này. Số lần lặp được yêu cầu được giới hạn trên bởi kích thước đầu vào.

Một kết quả trung gian trống khiến hàm giải mã độ dài chạy ( Y") bị lỗi trong phiên bản hiện tại của ngôn ngữ; nhưng ouput trống rỗng theo yêu cầu.


Bạn có thể thêm một lời giải thích? Tôi muốn hiểu làm thế nào bạn đánh tôi rất tốt. : P
Dennis

@Dennis Chắc chắn rồi! Tôi đã quên mất. Xong :-)
Luis Mendo

1
Ah, RLE đẩy hai mảng. Điều đó hữu ích.
Dennis

2

Mã máy x86 (chế độ được bảo vệ 32 bit), 36 byte

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

Các byte trên của mã máy xác định một hàm lấy một mảng làm đầu vào, thu gọn các bản sao liền kề tại chỗ và trả về cho người gọi mà không trả về kết quả. Nó tuân theo __fastcallquy ước gọi , lần lượt chuyển hai tham số trong ECXvà các EDXthanh ghi.

Tham số đầu tiên ( ECX) là một con trỏ tới phần tử đầu tiên trong mảng các số nguyên 32 bit (nếu mảng trống, nó có thể trỏ bất cứ nơi nào trong bộ nhớ). Tham số thứ hai ( EDX) là một con trỏ tới số nguyên 32 bit chứa độ dài của mảng.

Hàm sẽ sửa đổi các phần tử của mảng tại chỗ, nếu cần và cũng cập nhật độ dài để chỉ ra độ dài mới của mảng bị sập. Đây là một chút của một phương pháp bất thường để lấy đầu vào và trả lại đầu ra, nhưng bạn thực sự không có lựa chọn nào khác trong ngôn ngữ lắp ráp. Như trong C, các mảng thực sự được biểu diễn bằng ngôn ngữ như một con trỏ tới phần tử đầu tiên và độ dài . Điều duy nhất hơi kỳ lạ ở đây là lấy độ dài bằng cách tham chiếu , nhưng nếu chúng ta không làm điều đó, sẽ không có cách nào để rút ngắn mảng. Mã sẽ hoạt động tốt, nhưng đầu ra sẽ chứa rác, vì người gọi sẽ không biết nơi dừng các phần tử in từ mảng bị sập.

Ma thuật lắp ráp bất khả xâm phạm:

; 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

Việc thực hiện được lấy cảm hứng từ câu trả lời C ++ 11 của tôi , nhưng được viết lại một cách tỉ mỉ trong lắp ráp, tối ưu hóa kích thước. Hội là một ngôn ngữ chơi golf tốt hơn nhiều. :-)

Lưu ý: Bởi vì mã này sử dụng các hướng dẫn chuỗi, là không cho rằng lá cờ hướng rõ ràng ( DF== 0). Đây là một giả định hợp lý trong hầu hết các môi trường hoạt động, vì ABI thường yêu cầu DF rõ ràng. Nếu điều này không thể được đảm bảo, thì một lệnh 1 byte CLD( 0xFC) cần được chèn vào đầu mã.

Nó cũng, như đã lưu ý, giả định cụ thể là chế độ được bảo vệ 32 bit, một mô hình bộ nhớ "phẳng", trong đó phân đoạn phụ ( ES) giống như phân đoạn dữ liệu ( DS).


1

Mẻ, 133 byte

@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(%*

Tôi đặt s thành .vì Batch bị lẫn lộn nếu chỉ có các bản sao. Tôi cũng phải sử dụng shift/1để tôi có thể sử dụng %0%s:~1%để đặt danh sách đối số thành mảng và vòng lặp mới.


Tôi phải hỏi ... tại sao? Câu trả lời tốt ... nhưng tại sao?
Zacharý

@ Zacharý Vì nó đây.
Neil

1
@ Zacharý Một phần, một lý do chính đáng để chơi golf bằng các ngôn ngữ không chơi gôn là vì điều này thực sự có thể hữu ích . Không ai sẽ kích hoạt một trình thông dịch Jelly ngoài đời thực để làm điều này, nhưng họ có thể cần phải làm điều đó trong một tệp bó!
Cody Grey

Oh. Điều đó có ý nghĩa.
Zacharý

1

Thạch , 12 byte

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

Một liên kết đơn lấy và trả về danh sách các số.

Hãy thử trực tuyến!hoặc xem một bộ thử nghiệm

Làm sao?

Œ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Ḃ$$€tương đương với ḣLḂ$$€cái ṫḊ¿€3$mà bạn có thể thay thế bằng ṫḊ¿€3ở đây để tạo thành một cặp dyad / nilad.
Erik the Outgolfer 22/07/17

Điều đó không hoạt động với, ví dụ, một đầu vào có độ dài 4. Đầu vào của dequeue ở mỗi lần lặp của vòng lặp while là gì?
Jonathan Allan

Bạn phải để lại một danh sách có 0 hoặc 1 phần tử. Nếu len (x) == 1, thì sẽ trả về []trong khi nếu len (x) == 0 sẽ trả về 0, cả hai đều là giá trị giả. Tất nhiên, đầu vào là giá trị hiện tại và sẽ có giá trị hiện tại là đối số bên trái và 3bên phải. Nếu len (x) == 4, thì nó sẽ giống ṫ3ṫ3hoặc ṫ5bỏ bạn với [].
Erik the Outgolfer 22/07/17

Tôi có thể thấy những gì nó phải làm, nhưng xtrong mô tả của bạn có thực sự có giá trị hiện tại? Hãy thử điều này cho kích thước.
Jonathan Allan

Thành thật mà nói tôi không biết đó là mã hay lỗi :)
Jonathan Allan


1

05AB1E , 15 byte

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

Hãy thử trực tuyến!

Giải trình

[γʒ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 byte

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

Hãy thử trực tuyến!

Giải trình:

[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

Python 2 , 74 70 66 byte

  • Cảm ơn @SteamyRoot cho 4 byte: rthay vìlen(r) đủ để kiểm tra sự trống rỗng của danh sách / ngăn xếp.
  • Cảm ơn @ovs cho 4 byte: tốt hơn nếu có điều kiện [i]==r[-1:]

Python 2 , 66 byte

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

Hãy thử trực tuyến!


1
Nếu mục đích của len(r)chỉ là để kiểm tra xem danh sách có trống hay không, bạn có thể thay thế nó chỉ bằng cách r, tôi nghĩ vậy?
SteamyRoot

Ồ vâng, cảm ơn.
chính thức tuyên bố


@ovs Cảm ơn rất nhiều, thật tuyệt vời! (y)
chính thức tuyên bố

1
Phiên bản dài 66 byte thay thế , mặc dù chỉ yêu cầu ba dòng.
Jonathan Frech

0

Clojure, 100 byte

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

Không chắc chắn nếu điều này là ngắn nhất có thể.


0

Bash, 82 byte

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

Có lẽ có một lối thoát cho tất cả những người đó cat, nhưng tôi không biết điều đó.


0

Husk , 10 byte

ωoṁS↑o%2Lg

Hãy thử trực tuyến!

Giải trình

ω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 byte

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

chức năng, gọi bằng cách tham khảo hoặc thử trực tuyến .

thất bại cho đầu vào trống rỗng; chèn $i&&hoặc $a&&trước --$iđể sửa chữa.


0

V , 10 byte

òͨ.«©î±î*

Hãy thử trực tuyến!

Regex nén : :%s/\(.\+\)\n\1\n*. Dòng mới tùy chọn là để nó hoạt động ở cuối tập tin. Nếu tôi giả sử rằng có một dòng mới sau khi kết thúc thì nó sẽ là 8 byte ... nhưng dường như đó là một đoạn


0

dc , 84 78 byte

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

Hãy thử trực tuyến!

Giải nén nó một chút, không theo thứ tự trong một số nỗ lực rõ ràng:

  • [0syzdsz1<Olydsx0<Alx1+lz>M]dsMxfMacro chính Mđặt lại bộ đếm yvề 0, lấy số lượng vật phẩm trên ngăn xếp, lưu trữ này trong thanh ghi z, sau đó chạy macro Onếu có ít nhất hai vật phẩm trên ngăn xếp. Sau khi Okết thúc, nó tải bộ đếm yvà sao chép nó vào thanh ghi xtrước khi kiểm tra để chắc chắn ylà khác không (có nghĩa là ngăn xếp .có dữ liệu). Nếu đây là trường hợp, nó chạy macro A. Cuối cùng, nó kiểm tra xem kích thước ngăn xếp ban đầu có lớn hơn kích thước ngăn xếp hiện tại hay không và tự chạy lại nếu có. Khi nó đã hoàn thành, nó in ngăn xếp vớif .
  • [dStrdStr!=Pz1<O]sOMacro Otạm thời lưu trữ hai mục trên cùng vào ngăn xếp thành ngăn xếp t. Sau đó, nó so sánh hai mục hàng đầu và chạy macro Pnếu chúng không bằng nhau. Cuối cùng, nó kiểm tra xem có ít nhất hai mục trên ngăn xếp hay không và tự chạy nếu có.
  • [LtLtS.ly1+sy]sPMacro Plấy hai mục từ ngăn xếp t, đẩy mục trên cùng trở lại ngăn xếp chính và đẩy mục sau vào ngăn xếp .. Sau đó tăng số lượt truy cập y.
  • [L.ly1-dsy0<A]sAMacro Alấy stack .và biến nó trở lại stack chính. Nó làm điều đó, giảm số lượt truy cập ycho đến khi không còn gì để đẩy.

Đã được chỉnh sửa để giải thích và để loại bỏ 6 byte khi tôi không cần lưu trữ kích thước của ngăn xếp.


0

C ++ 11, 161 byte

#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);}

Đoạn mã trên xác định một hàm, flấy std::vector<int>tham chiếu, sửa đổi nó tại chỗ để thu gọn các bản sao liền kề theo đặc tả và sau đó trả về.

Hãy thử trực tuyến!

Trước khi tôi kiểm tra số byte, tôi nghĩ rằng đây là mã khá mảnh dẻ. Hơn 150 byte, tuy nhiên, không tốt lắm! Hoặc là tôi không giỏi chơi gôn, hoặc C ++ không phải là một ngôn ngữ chơi golf rất tốt

Ung dung:

#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 ++ không phải là ngôn ngữ chơi golf tốt nhất. Sử dụng tốt đẹp std::adjacent_find! Tôi tự hỏi nếu bạn thực hiện chức năng này chính mình nếu nó sẽ ngắn hơn, vì bạn có thể loại bỏ #include <algorithm>cũng
musicman523

@ musicman523 Nỗ lực đầu tiên của tôi đã thực hiện nó bằng tay, mặc dù tôi đã sử dụng một thuật toán hơi khác một chút. Tôi đã thích nghi với việc thực hiện std::uniqueđể làm những gì tôi cần. Nhưng phải mất rất nhiều mã để thực hiện tất cả logic và khi tôi tình cờ thấy std::adjacent_find, một điều khá rõ ràng đó là một người chiến thắng về kích thước mã.
Cody Grey

0

PHP, 74 byte

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

Hàm c gọi theo tham chiếu để giảm mảng. Hãy thử trực tuyến .

Điều thú vị là nó hoạt động trong Php5.6 chứ không phải 7.





Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.