ยุบรายการที่อยู่ติดกัน


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]

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในแต่ละภาษาจะชนะ!


Sandboxสำหรับผู้ที่สามารถดูโพสต์ที่ถูกลบ
musicman523

ไม่สำคัญหรอกพวกเขาทุกคนเท่าเทียมกัน ความหมายของวลีนี้คือการ[14, 14, 14]ยุบไปที่[14]
musicman523

เข้าใจผิดการท้าทายขอโทษ คิดว่าคุณมีการลบทุกคู่ของตัวเลขที่เพิ่มขึ้นโดยที่ 1 ( 1,2, 11,12ฯลฯ )
สตีเฟ่น

เราสามารถรับอินพุตเป็นสตริงแบบมีตัวคั่นได้หรือไม่?
Shaggy

2
คุณสามารถเพิ่มกรณีทดสอบได้-89,89,-87,-8,-88ไหม ทั้งโซลูชัน Japt ของฉัน (ที่ยังไม่โพสต์) และโซลูชัน Retina ของ Fry ล้มเหลวนั่นทำให้การส่ง--87,8ออก
Shaggy

คำตอบ:


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จะทำให้คุณสนับสนุนรายการในรายการของคุณด้วย
Erik the Outgolfer

ไม่œ^ต้องอาศัยการส่งเสริมการขายจำนวนเต็มถึงอาร์เรย์ที่นี่ เนื่องจากอาร์เรย์ 1D ไม่ได้รับการเลื่อนระดับเป็นอาร์เรย์ 2 มิติมันจะไม่ทำงานอะไรเลยยกเว้นอาร์เรย์ของตัวเลข
Dennis

เฮ้ ... ฉันหมายความว่าคุณจะใช้มันได้แล้วŒgWẎ$œ^/$€ẎµÐL... โอ้เดี๋ยวก่อนไร้เดียงสาเกินไป : P
Erik the Outgolfer

4

จอประสาทตา17 15 ไบต์

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

ลองออนไลน์!

บันทึก 2 ไบต์ด้วย Neil และ Martin!

แทนที่ตัวเลขแต่ละคู่ด้วยไม่มีอะไร กระบวนการนี้จะวนซ้ำจนกว่าจะไม่มีการเปลี่ยนแปลง


ทำงานแก้ปัญหาที่เหมือนกันใน Japt ก่อนที่จะพบสิ่งนี้ น่าเสียดายที่เราทั้งคู่ล้มเหลวในอินพุตเช่น-89 89 -87 -88 -88เอาต์พุต--87ใด
Shaggy

1
@Shaggy ขอบคุณฉันแก้ไขโดยการเพิ่มการตรวจสอบขอบเขตและการใช้_เพื่อแสดงถึงเชิงลบตามปกติในบางภาษา
FryAmTheEggman

ฉันได้ค้นพบแล้วว่าสิ่งนี้จะล้มเหลว_89 89 _87 _8 _88เช่น_89 89 _87 8กัน ขออภัย: \
Shaggy

@Shaggy อย่าเสียใจ! ขอบคุณที่ค้นหาปัญหา! ฉันได้เพิ่มการตรวจสอบขอบเขตอื่นเพื่อแก้ไขกรณีดังกล่าว
FryAmTheEggman

1
@FryAmTheEggman ไม่แน่ใจว่านั่นคือสิ่งที่นีลหมาย แต่คุณสามารถแล้วยังใช้mเพื่อเปิด\bs เข้าและ^ $
Martin Ender

3

Mathematica 29 ไบต์

สิ่งนี้จะลบองค์ประกอบที่อยู่ติดกันจำนวนเท่ากันซ้ำ ๆa_,a_จนกว่าจะไม่มีใครเหลือ

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

3

Python 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เนื่องจากตัวถอดรหัสรันไทม์กำลังส่งข้อผิดพลาดเมื่อได้รับรายการว่าง หากต้องการดูผลลัพธ์เป็นรายการการตรึงŒṘจะแสดง
ไมล์

@ThePirateBay Jelly เป็นตัวแทนของรายการที่ว่างเปล่าคือ - ที่ว่างเปล่าของหนึ่งรายการ - เพียงแค่รายการนั้นและของหลายรายการ - รายการที่คั่นด้วยวงเล็บและเครื่องหมายจุลภาค การส่งเป็นลิงค์ (ฟังก์ชั่น) ไม่ใช่โปรแกรมเต็มรูปแบบ (เหมือนกับแลมบ์ดาจะอยู่ใน Python) - เพื่อดูสถานที่มุมมอง "ปกติ" มากขึ้นÇŒṘในส่วนท้ายเพื่อเรียกลิงก์สุดท้าย ( Ç) และพิมพ์การแทน Python ( ŒṘ) . ข้อผิดพลาดอาจไม่สามารถยอมรับได้
Jonathan Allan

@JonathanAllan ตกลงฉันตระหนักว่าการแสดงสตริงของรายการเป็นที่ยอมรับได้ จุดหลักของความคิดเห็นแรกของฉันคือการพูดถึงว่าข้อผิดพลาดจะถูกโยนเมื่อรายการว่างเปล่า

2

JavaScript (ES6), 54 53 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @ThePirateBay

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

วิธีแก้ปัญหาแบบเรียกซ้ำไร้เดียงสาอาจแก้ไขได้


คุณสามารถตรวจสอบองค์ประกอบปัจจุบันและก่อนหน้าแทนองค์ประกอบปัจจุบันและองค์ประกอบถัดไปดังนั้นคุณสามารถแทนที่i=0ด้วยi=-2และi-1รวมiเป็น -1 ไบต์

@ guest44851 ขอบคุณ แต่ ... นั่นไม่ได้หมายความว่าฉันจะต้องเปลี่ยนเป็นi+1เหรอ? (ฉันพยายามทำสิ่งนี้มาก่อนด้วยการเคลื่อนย้าย++เช่นกันและไม่สามารถคิดออกได้ แต่ฉันมีเวลาเพียงแค่นาทีเดียวเท่านั้นที่จะทำได้)
ETHproductions

คุณจะเห็นว่ามันทำงานอย่างถูกต้อง

@ThePirateBay โดย golly คุณพูดถูก! แต่อย่างไร
ETHproductions

2

Python 2 , 73 ไบต์

เนื่องจากฉันมีชื่อเสียงไม่เพียงพอที่จะแสดงความคิดเห็น: ฉันเพิ่งเปลี่ยนคำตอบของ @officialaimm เพื่อใช้ r! = [] แทน len (r) เพื่อบันทึกไบต์ ทางออกที่ฉลาดมากสำหรับคุณ @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") มีข้อผิดพลาดในรุ่นปัจจุบันของภาษา แต่ ouput ว่างเปล่าตามที่ต้องการ


คุณสามารถเพิ่มคำอธิบายได้ไหม? ฉันต้องการที่จะเข้าใจวิธีการที่คุณเอาชนะฉันอย่างเต็มที่ : 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แบบการเรียกผ่านพารามิเตอร์ทั้งสองในECXและEDXลงทะเบียนตามลำดับ

พารามิเตอร์แรก ( 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 มีความชัดเจน หากไม่สามารถรับประกันได้คุณจะต้องใส่CLDคำแนะนำ1 ไบต์( 0xFC) ที่ด้านบนของรหัส

นอกจากนี้ยังถือว่าโหมดการป้องกันแบบ 32 บิตโดยเฉพาะรุ่นหน่วยความจำแบบ "แฟลต" โดยที่เซ็กเมนต์พิเศษ ( 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(%*

ฉันตั้งค่าเป็น.เพราะแบทช์สับสนหากมีรายการซ้ำเท่านั้น ฉันยังต้องใช้shift/1เพื่อให้ฉันสามารถใช้%0%s:~1%เพื่อตั้งค่ารายการอาร์กิวเมนต์เป็นอาร์เรย์และลูปใหม่


ฉันต้องถาม ... เพราะอะไร คำตอบที่ดี ... แต่ทำไม?
Zacharý

@ Zacharýเพราะมันอยู่ที่นั่น
Neil

1
@ Zachary ในส่วนเหตุผลที่ดีที่กอล์ฟในภาษาที่ไม่ใช่การเล่นกอล์ฟเป็นเพราะอานุภาพนี้จริงจะเป็นประโยชน์ ไม่มีใครจะจุดไฟขึ้นล่าม Jelly ในชีวิตจริงเพื่อทำสิ่งนี้ แต่พวกเขาอาจต้องทำมันในไฟล์แบทช์!
โคดี้เกรย์

โอ้ ที่เหมาะสม
Zacharý

1

เยลลี่ 12 ไบต์

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

ลิงก์ monadic ที่รับและส่งคืนรายการตัวเลข

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

Œ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ที่นี่เพื่อสร้างคู่ dyad / nilad
Erik the Outgolfer

ที่ไม่สามารถใช้งานได้ตัวอย่างเช่นอินพุตที่มีความยาว 4 อินพุตสำหรับ dequeue ที่วนซ้ำของลูปในขณะใด
Jonathan Allan

คุณควรจะเหลือรายการที่มีองค์ประกอบ 0 หรือ 1 หาก len (x) == 1 แล้วจะส่งกลับ[]ในขณะที่ถ้า len (x) == 0 จะกลับมา0ทั้งคู่จะเป็นค่าที่ผิดพลาด อินพุตเป็นค่าปัจจุบันแน่นอนและจะมีค่าปัจจุบันเป็นอาร์กิวเมนต์ซ้ายและ3ขวา หาก len (x) == 4 มันจะเหมือนกับṫ3ṫ3หรือṫ5ทิ้งคุณ[]ไว้
Erik the Outgolfer

ฉันสามารถดูสิ่งที่ควรทำ แต่xในคำอธิบายของคุณมีค่าปัจจุบันจริง ๆ ลองนี้ออกขนาด
Jonathan Allan

จะซื่อสัตย์ผมไม่ทราบว่าเป็นรหัสหรือข้อผิดพลาด :)
โจนาธานอัลลัน

1

Japt , 34 ไบต์

ó¥ k_l vîò k_l É}Ãc
ó¥ l ¥Ul ?U:ß

ลบคู่ของตัวเลขที่เท่ากันซ้ำ ๆ จนกว่าจะไม่มีอยู่

ลองออนไลน์! ด้วย-Qแฟล็กเพื่อจัดรูปแบบอาร์เรย์เอาต์พุต

เรียกใช้กรณีทดสอบทั้งหมดโดยใช้ WIP CodePen ของฉัน


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

Python 2 , 74 70 66 ไบต์

  • ขอบคุณ @SteamyRoot สำหรับ 4 ไบต์: rแทนที่จะlen(r)เพียงพอที่จะตรวจสอบความว่างของรายการ / สแต็ก
  • ขอบคุณ @ovs สำหรับ 4 ไบต์: ดีกว่าถ้ามีเงื่อนไข [i]==r[-1:]

Python 2 , 66 ไบต์

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

ลองออนไลน์!


1
ถ้าวัตถุประสงค์ของการlen(r)เป็นเพียงการตรวจสอบหรือไม่รายการเป็นที่ว่างเปล่าคุณควรจะสามารถที่จะแทนที่โดยเพียงแค่rผมคิดว่า?
SteamyRoot

โอ้ใช่ขอบคุณ
อย่างเป็นทางการ


@ovs ขอบคุณมากมันยอดเยี่ยมมาก! (y)
ทางราชการ

1
ทางเลือกรุ่น 66 ไบต์ยาวแต่ต้องการเพียงสามบรรทัด
Jonathan Frech

0

Clojure 100 ไบต์

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

ไม่แน่ใจว่าสั้นที่สุดหรือไม่


0

Bash, 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

Huskขนาด 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*Regex: ขึ้นบรรทัดใหม่ที่เป็นทางเลือกเพื่อให้ทำงานในตอนท้ายของไฟล์ด้วย ถ้าฉันคิดว่ามีการขึ้นบรรทัดใหม่หลังจากสิ้นสุดมันจะเป็น 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และคัดลอกลงในการลงทะเบียนxก่อนตรวจสอบเพื่อให้แน่ใจว่าyไม่ใช่ศูนย์ (หมายถึงสแต็ก.มีข้อมูล) Aหากเป็นกรณีนี้มันวิ่งแมโคร ในที่สุดมันจะตรวจสอบว่าขนาดสแต็กเดิมมีขนาดใหญ่กว่าขนาดสแต็กปัจจุบันและเรียกใช้อีกครั้งหากเป็นเช่นนั้น fเมื่อเสร็จแล้วจะพิมพ์สแต็คที่มี
  • [dStrdStr!=Pz1<O]sOแมโครOจะเก็บรายการสองรายการแรกสุดบนสแต็กไว้ในสแต็กtชั่วคราว จากนั้นจะเปรียบเทียบรายการสองอันดับแรกและเรียกใช้แมโครPหากรายการไม่เท่ากัน ในที่สุดมันจะตรวจสอบว่ามีไอเท็มอย่างน้อยสองรายการบนสแต็กหรือไม่และรันตัวเองถ้าเป็นเช่นนั้น
  • [LtLtS.ly1+sy]sPมาโครPนำไอเท็มสองรายการจากสแต็tกผลักกลับด้านบนหนึ่งไปยังสแต็กหลักและผลักรายการต่อไปนี้ลงบนสแต็.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>โดยอ้างอิงปรับเปลี่ยนในสถานที่ที่จะยุบซ้ำกันที่อยู่ติดกันตามข้อกำหนดแล้วส่งกลับ

ลองออนไลน์!

ก่อนที่ฉันจะตรวจสอบจำนวนไบต์ฉันคิดว่านี่เป็นรหัส svelte ที่สวย อย่างไรก็ตามมากกว่า 150 ไบต์นั้นไม่ค่อยดีเท่าไหร่! ไม่ว่าฉันจะเล่นกอล์ฟเก่งหรือ C ++ ไม่ใช่ภาษากอล์ฟที่ดีมาก ...

Ungolfed:

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