กลุ่มของรายการที่เกิดซ้ำ


10

คำอธิบายการท้าทาย

ให้ลิสต์ / อาร์เรย์ของไอเท็มแสดงกลุ่มรายการที่เกิดซ้ำตามลำดับทั้งหมด

คำอธิบายอินพุต / เอาต์พุต

ข้อมูลที่คุณป้อนเป็นรายการ / อาเรย์ของรายการ (คุณสามารถถือว่าทั้งหมดเป็นประเภทเดียวกัน) คุณไม่จำเป็นต้องสนับสนุนภาษาทุกประเภทของคุณ แต่จะต้องสนับสนุนอย่างน้อยหนึ่งภาษา (โดยเฉพาะอย่างยิ่งintแต่ประเภทที่ต้องการbooleanแม้ว่าจะไม่น่าสนใจก็ยังใช้ได้เช่นกัน) ตัวอย่างผลลัพธ์:

[4, 4, 2, 2, 9, 9] -> [[4, 4], [2, 2], [9, 9]]
[1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4] -> [[1, 1, 1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]
[1, 1, 1, 3, 3, 1, 1, 2, 2, 2, 1, 1, 3] -> [[1, 1, 1], [3, 3], [1, 1], [2, 2, 2], [1, 1], [3]]
[9, 7, 8, 6, 5] -> [[9], [7], [8], [6], [5]]
[5, 5, 5] -> [[5, 5, 5]]
['A', 'B', 'B', 'B', 'C', 'D', 'X', 'Y', 'Y', 'Z'] -> [['A'], ['B', 'B', 'B'], ['C'], ['D'], ['X'], ['Y', 'Y'], ['Z']]
[True, True, True, False, False, True, False, False, True, True, True] -> [[True, True, True], [False, False], [True], [False, False], [True, True, True]]
[0] -> [[0]]

สำหรับรายการที่ว่างเปล่าเอาท์พุทจะไม่ได้กำหนด - มันอาจจะไม่มีอะไรรายการที่ว่างเปล่าหรือข้อยกเว้น - สิ่งที่เหมาะสมกับวัตถุประสงค์การเล่นกอล์ฟของคุณที่ดีที่สุด คุณไม่จำเป็นต้องสร้างรายการแยกต่างหากดังนั้นจึงเป็นผลลัพธ์ที่ถูกต้องสมบูรณ์เช่นกัน:

[1, 1, 1, 2, 2, 3, 3, 3, 4, 9] ->

1 1 1
2 2
3 3 3
4
9

สิ่งสำคัญคือให้แยกกลุ่มในบางวิธี


บางทีเราส่งออกรายการที่มีค่าตัวคั่นพิเศษบางอย่างหรือไม่
xnor

@xnor: คุณสามารถให้ตัวอย่างได้หรือไม่ เช่นอาร์เรย์ของints คั่นด้วย0s จะเป็นความคิดที่ไม่ดีเนื่องจากสามารถมี0s ในอินพุต ...
shooqie

ยกตัวอย่างเช่นหรือ[4, 4, '', 2, 2, '', 9, 9] [4, 4, [], 2, 2, [], 9, 9]
xnor

ที่จริงแล้วเราต้องให้การสนับสนุนประเภทใด องค์ประกอบสามารถเป็นรายการได้หรือไม่? ฉันคิดว่าบางภาษามีประเภทในตัวที่ไม่สามารถพิมพ์หรือตรวจสอบความเท่าเทียมกันที่แปลก
xnor

@xnor: ใช่นั่นคือสิ่งที่ฉันเป็นห่วง - ถ้าข้อมูลของคุณมีรายการอยู่ข้างในนั้นใช้รายการเปล่าเพราะตัวคั่นอาจจะสับสน นั่นเป็นเหตุผลที่ฉันรวม "คุณสามารถถือว่ารายการทั้งหมดเป็นประเภทเดียวกัน" เพื่อให้สามารถใช้ประเภทที่แตกต่างกันเป็นตัวแยก
shooqie

คำตอบ:


15

Mathematica ขนาด 5 ไบต์

Split

... มีสิ่งที่อยู่ภายในสำหรับสิ่งนั้น


9
…ช่างน่าประหลาดใจ!
เสียชีวิต

11
@ ทำให้ประหลาดใจที่แท้จริงคือระยะสั้นแค่ไหน
Martin Ender

8

เยลลี่ 5 ไบต์

I0;œṗ

ใช้งานได้กับตัวเลขทุกประเภท ลองออนไลน์! หรือตรวจสอบกรณีทดสอบที่เป็นตัวเลขทั้งหมด

มันทำงานอย่างไร

I0;œṗ  Main link. Argument: A (array)

I      Increments; compute the differences of consecutive elements.
 0;    Prepend a zero.
   œṗ  Partition; split A at truthy values in the result to the left.

8

เรติน่า15 15ไบต์

ขอบคุณ Lynn ที่แนะนำรูปแบบ I / O ที่ง่ายขึ้น

!`(.)\1*

ถือว่าอินพุตเป็นรายการของอักขระ (และใช้ linefeeds เพื่อแยกกลุ่ม)

ลองออนไลน์!

สิ่งนี้สามารถทำงานได้โดยการจับคู่กลุ่มและพิมพ์ทั้งหมด (ซึ่งใช้การแยก linefeed โดยอัตโนมัติ)


ฉันถามเกี่ยวกับabbcccddda bb ccc dddเป็นรูปแบบ I / O ที่ยอมรับได้และ OP อนุมัติแล้วดังนั้นฉันจึงเดา!`(.)\1*ได้ไหม
ลินน์

@ ลินน์โอ้มันง่ายกว่ามากจริงๆขอบคุณ
Martin Ender

4

JavaScript (ES6), 39 37 ไบต์

f=
s=>s.replace(/(\w+) (?!\1\b)/g,`$1
`)
;
<input oninput=o.textContent=f(this.value);><pre id=o>

ใช้งานได้กับโทเค็นคำที่คล้ายช่องว่างใด ๆ บันทึก 2 ไบต์ขอบคุณ @ MartinEnder ♦ ดีที่สุดที่ฉันสามารถทำได้เพื่อการป้อนข้อมูลอาร์เรย์และกลับมาคือ 68:

a=>a.reduce((l,r)=>(l==r?c.push(r):b.push(c=[r]),r),b=[c=[a[0]]])&&b

1
ฉันเพิ่มคำตอบอาร์เรย์ที่ 56
edc65

4

MATL , 9 ไบต์

Y'v"@Z}Y"

Y'     % Take input. Run-length encoding. Gives two row arrays: values and run lengths
v      % Concatenate vertically   
"      % For each column
  @Z}  %   Push column and split into its two elements
  Y"   %   Run-length decoding
       % End for. Implicitly display

อินพุตคืออาร์เรย์ของตัวเลขโดยมีช่องว่างหรือเครื่องหมายจุลภาคเป็นตัวคั่น

ลองออนไลน์! ทดสอบด้วยตัวเลขที่ไม่ใช่จำนวนเต็ม


MATL 11 ไบต์

lidgvYsG7XQ

อินพุตเป็นอาร์เรย์คอลัมน์ของตัวเลขหรืออักขระโดยใช้;เป็นตัวคั่น

ลองออนไลน์! ทดสอบกับตัวเลขโดยพลการ ทดสอบกับตัวละคร

l     % Push 1
i     % Take input, say [4;4;2;2;9;9]
d     % Consecutive differences of input: [0;-2;0;7;0]
g     % Convert to logical: gives 1 if consecutive entries were different: [0;1;0;1;0]
v     % Concatenate vertically with the initial 1: [1;0;1;0;1;0]
Ys    % Cumulative sum. Each value is a group label: [1;1;2;2;3;3]
G     % Push input again
7XQ   % Split into horizontal arrays as indicated by group labels: {[4 4];[2 2];[9 9]}
      % Implicitly display

3

gs2, 2 ไบต์

c-

ลองออนไลน์!

cคือการจัดกลุ่มภายในที่ทำสิ่งนี้เราจึงเรียกมันว่า STDIN (ซึ่งเป็นสตริงคือรายการของตัวอักษร) และรับรายการสตริง น่าเศร้าที่ผลลัพธ์ไม่สามารถแยกออกจากอินพุตดังนั้นเราจำเป็นต้องเพิ่มตัวคั่น! -(เข้าร่วมโดยช่องว่าง) ทำเคล็ดลับ

คำตอบทางเลือกคือ(2 ไบต์ของ CP437) ซึ่งจะcใส่เข้าไปในฟังก์ชันที่ไม่ระบุชื่อ


2

Brachylogขนาด 13 ไบต์

:{s.dl1}fs.c?

คำเตือน:นี่ไม่มีประสิทธิภาพอย่างยิ่งและคุณจะเข้าใจว่าทำไมในคำอธิบาย

สิ่งนี้คาดว่าจะเป็นรายการ (เช่น[1:1:2:2:2]) เป็นอินพุต องค์ประกอบในรายการสามารถเป็นอะไรก็ได้

คำอธิบาย

:{     }f       Find all ordered subsets of the Input with a unique element in them
  s.                Output is a subset of the input
    dl1             Output minus all duplicates has a length of 1 (i.e. one unique value)
         s.     Output is an ordered subset of those subsets
           c?   The concatenation of those subsets is the Input

สิ่งนี้ใช้งานได้เพียงเพราะวิธีs - Subsetรวมกัน: ชุดที่เล็กที่สุดอยู่ท้าย ดังนั้นสิ่งแรกที่พบว่า concatenates การป้อนข้อมูลที่มีการทำงานที่ยาวที่สุดเช่นไม่ยกตัวอย่างเช่น[[1:1]:[2:2:2]][[1:1]:[2:2]:[2]]


2

J , 13 ไบต์

<;.1~1,2~:/\]

เนื่องจาก J ไม่สนับสนุนอาร์เรย์ที่ขาดการใช้งานแต่ละอิลิเมนต์ที่เท่ากันจะถูกบรรจุไว้ในกล่อง อินพุตเป็นอาร์เรย์ของค่าและเอาต์พุตเป็นอาร์เรย์ของกล่องที่บรรจุอยู่

การใช้

   f =: <;.1~1,2~:/\]
   f 4 4 2 2 9 9
┌───┬───┬───┐
│4 4│2 2│9 9│
└───┴───┴───┘
   f 1 1 1 3 3 1 1 2 2 2 1 1 3
┌─────┬───┬───┬─────┬───┬─┐
│1 1 1│3 3│1 1│2 2 2│1 1│3│
└─────┴───┴───┴─────┴───┴─┘
   f 'ABBBCDXYYZ'
┌─┬───┬─┬─┬─┬──┬─┐
│A│BBB│C│D│X│YY│Z│
└─┴───┴─┴─┴─┴──┴─┘
   f 0
┌─┐
│0│
└─┘

คำอธิบาย

<;.1~1,2~:/\]  Input: s
            ]  Identify function to get s
       2       The constant 2
           \   Operate on each overlapping sublist of size 2
        ~:/      Are the two values unequal, 1 if true else 0
     1,        Prepend a 1 to it
<;.1~          Using the list just made, chop s at each index equal to 1 and box it
               Return this as the result


2

Python 2, 43 ไบต์

p=-1
for x in input():print"|"[:x^p],x,;p=x

ทำงานกับรายการบูลีน ตัวอย่าง:

>> [True,True,False,False,False,True,False,True,False]
 True  True | False  False  False | True | False | True | False

วนซ้ำผ่านรายการอินพุตจัดเก็บองค์ประกอบที่เห็นล่าสุด แถบตัวคั่นจะถูกพิมพ์ก่อนองค์ประกอบแต่ละรายการที่แตกต่างจากก่อนหน้านี้ถูกตรวจสอบว่ามีบิตเรท xor เป็น^0 การเริ่มต้นp=-1หลีกเลี่ยงตัวคั่นก่อนองค์ประกอบแรก


เลวร้ายเกินไปgroupbyมันเจ็บปวดเช่นกัน ...
Sp3000

2

CJam, 9 ไบต์

สองวิธี:

{e`:a:e~}
{e`{(*}%}

ทดสอบที่นี่

คำอธิบาย

e`   e# Run-length encode (gives a list of pairs [run-length value]).
:a   e# Wrap each pair in a singleton list.
:e~  e# Run-length decode each list.

หรือ

e`   e# Run-length encode.
{    e# Map this block over each pair...
  (  e#   Pull out the run length.
  *  e#   Repeat the list containing only the value that many times.
}%

2

Haskell, 22 ไบต์

import Data.List
group

มีในตัว ทำงานบนประเภทใดก็ได้ที่รองรับความเท่าเทียมกัน


2
เหตุผลใดที่เป็นชุมชน wiki
เสียชีวิต


1
นั่นเป็นเกียรติ แต่เนื่องจากไม่มีใครทำมันทำไมเจ้าไม่ถามเกี่ยวกับเรื่องนี้ใน meta?
ทำให้เสียชีวิต

2

MATL, 8 7 ไบต์

นำออก 1 ไบต์ด้วย @Suever

ly&Y'Y{

ทำงานร่วมกับจำนวนเต็ม / ลอย / ตัวอักษร / บูลีน / ยูนิคอร์นคะแนน / ปัจจัยการจินตนาการอื่น ๆ
สำหรับ booleans ปัจจัยการผลิตที่มีผลผลิตอยู่T/F1/0

ลองออนไลน์!


จัดกลุ่มและทำซ้ำ

ly&Y'Y{
l          % push 1 onto the stack
 y         % duplicate the input
  &Y'      % run-length encoding (secondary output only)
     Y{    % break up array into cell array of subarrays

1

C #, 117 ไบต์

void f(List<String>m){Console.Write(m[0]+String.Join("",m.GetRange(1,m.Count()-1).Select((i,j)=>i==m[j]?i:"\n"+i)));}

ungolfed (ไม่ได้จริงๆ)

    public static void f(List<String>m)
    {
        Console.Write(m[0]+String.Join("",m.GetRange(1,m.Count()-1).Select((i,j)=>i==m[j]?i:"\n"+i)));
    }

1

Pyth, 9 7 ไบต์

mr9]dr8

มอบเครดิตให้แก่ @LeakyNun เพียง 2 ไบต์!

คำอธิบาย:

             input
     r8      run-length decode
m            for each...
   ]d        ...treat each run as standalone encoded form...
 r9          ...decode 
             print

คำตอบเก่า 12 ไบต์

hf.Am!t{dT./

ลืมเกี่ยวกับระยะเวลาในตัว แต่ฉันคิดว่านี่เป็นวิธีการที่ใช้ได้ดังนั้นฉันจึงเก็บมันไว้

คำอธิบาย:

                input
          ./    all possible partitions
 f       T      filter by...
  .A            ...whether all groups of integers...
    m!t{d       ...have length one after deduplication
h               get the first element (first one has no adjacent [1,1] and [1])
                print

นี่คือ 7 ไบต์
Leun Nun

@LeakyNun โอ้ถูกต้อง! มันเท่ห์มาก
busukxuan

1
ผมเชื่อว่านี้ทำงานสำหรับ 6
FryAmTheEggman

@FryAmTheEggman mนีละเมิดของ
Leun Nun

@FryAmTheEggman ว้าวฉันไม่เข้าใจ oO
busukxuan

1

Pyth , 36 35 ไบต์

VQIqNk=hZ).?=+Y]*]kZ=Z1=kN;t+Y]*]kZ

ลิงก์ทดสอบ

แก้ไข: คำอธิบาย:

                                      standard variables: Y=[], Z=0, k='', Q=input
VQ                                    iterate over input
  IqNk                                if the current entity is equal to k:
      =hZ)                            increase Z.
          .?                          else:
               ]*]kZ                  list of length Z filled with k
            =+Y                       add it to Y
                    =Z1               set Z to 1
                       =kN            set k to the current entity
                          ;           end loop
                              ]*]kZ   list of length Z filled with k
                            +Y        add it to Y
                           t          implicitly print the tail of Y (removing the first element)

1

เรติน่า24 24ไบต์

2 ไบต์ขอบคุณ Martin Ender

มีคำตอบขนาด 15 ไบต์อยู่แล้วดังนั้นนี่เป็นอีกวิธีหนึ่งที่มีค่าใช้จ่ายมากกว่า

S-`(?<=(\d+)) (?!\1\b)

ลองออนไลน์!

มันแยกช่องว่างที่มีหมายเลขก่อนหน้าแตกต่างจากการดำเนินการ

นี่คือการสาธิตของ lookarounds


1

05AB1E, 13 ไบต์

¬svyÊi¶}yðJ?y

อธิบาย

¬s             # push first element of list to stack and swap with input
  v            # for each X in input
   yÊi¶}       # if X is different from last iteration, push a newline
        yðJ?   # push X followed by a space to stack and join stack to string
            y  # push X to stack for next iterations comparison

ควรทำงานกับรายการใด ๆ
ผ่านการทดสอบกับ int และ char

ลองออนไลน์


1

Swift, 43 ไบต์

var p=0;i.map{print($0==p ?"":",",$0);p=$0}

สมมติว่าฉันเป็นอาร์เรย์ของวัตถุที่เท่าเทียมกัน; ใช้ได้กับทุกสิ่งตั้งแต่ ints ไปจนถึงสตริงไปยังวัตถุที่กำหนดเอง ชนิดที่หน้าด้านในที่เอาท์พุทที่มีขึ้นบรรทัดใหม่จำนวนมาก แต่การที่สวยกว่าจะเสียค่าใช้จ่ายไบต์

เวอร์ชั่นที่สวยกว่าและไม่อัปโหลด:

var prev = Int.max // unlikely to be the first element, but not the end of the world if it happens to be.
i.map { n in
    print(n == prev ? " " : "\n•", n, terminator: "")
    prev = n
}

รุ่นนี้พิมพ์ทุกกลุ่มในบรรทัดใหม่ด้วยรหัสเพิ่มเติม

แนวคิดสำหรับการปรับปรุง

i.reduce(0){print($0==$1 ?"":"•",$1);return $1}

รุ่นนี้มี 47 ไบต์ แต่มันเป็นวิธีการที่แตกต่างกันดังนั้นอาจมีบางสิ่งบางอย่างในการเพิ่มประสิทธิภาพที่นั่น? ปัญหาที่ใหญ่ที่สุดคือคำสั่งการส่งคืน


1

C, 88 77 ไบต์

ย้าย strmcmp ด้านใน printf ขนาด 11 ไบต์ที่บันทึกไว้

f(char**a){*a++;char*x;for(;*a;x=*a++)printf(strcmp(*a,x)?"\n%s ":"%s ",*a);}

การใช้งาน:

f(char**a){*a++;char*x;for(;*a;x=*a++)printf(strcmp(*a,x)?"\n%s ":"%s ",*a);}
main(c,v)char**v;{f(v);}

ตัวอย่างอินพุต:

(พารามิเตอร์บรรทัดคำสั่ง)

1 1 1 1 2 2 2 2 3 3 3 3 4 5 6 7777

ตัวอย่างผลลัพธ์:

1 1 1 1
2 2 2 2
3 3 3 3
4
5
6
7777

ทดสอบเมื่อ:

gcc 4.4.7 (Red Hat 4.4.7-16)  - OK
gcc 5.3.0 (Cygwin)            - Segmetation Fault
gcc 4.8.1 (Windows)           - OK

ฉันกำลังพยายามแก้ไขข้อผิดพลาด Segmetation 5.3.0

88 เวอร์ชั่น

f(char**a){*a++;char*x;for(;*a;x=*a++)strcmp(*a,x)?printf("\n%s ",*a):printf("%s ",*a);}

1

Java 134 ไบต์

void a(String[]a){int i=0,l=a.length;for(;i<l-1;i++)System.out.print(a[i]+((a[i].equals(a[i+1]))?" ":"\n"));System.out.print(a[l-1]);}

วนซ้ำผ่านและตัดสินใจว่าจะแยกด้วยบรรทัดใหม่หรือเว้นวรรค


สำหรับผู้เริ่มต้นคุณสามารถลบpublicและstaticคำหลักได้ นอกจากนี้คุณสามารถลบเครื่องหมายวงเล็บปีกกาสำหรับวง
user902383

เสร็จสิ้น @ user902383
Rohan Jhunjhunwala

1

ListSharp , 134 ไบต์

STRG l = READ[<here>+"\\l.txt"]
[FOREACH NUMB IN 1 TO l LENGTH-1 AS i]
{
[IF l[i] ISNOT l[i-1]]
STRG o=o+"\n"
STRG o=o+l[i]
}
SHOW = o

ListSharp ไม่รองรับฟังก์ชั่นดังนั้นอาร์เรย์จะถูกบันทึกในไฟล์ท้องถิ่นที่เรียกว่า l.txt ไฟล์



0

TSQL, 132 ไบต์

นี่แตกต่างจากคำตอบอื่น ๆ เล็กน้อย - sql ไม่มีอาร์เรย์อินพุตที่ชัดเจนสำหรับ sql คือตาราง

แข็งแรงเล่นกอล์ฟ:

DECLARE @ table(i int identity, v varchar(20))
INSERT @ values(1),(1),(1),(3),(3),(1),(1),(2),(2),(2),(1),(1),(3)

SELECT REPLICATE(v+' ',COUNT(*))FROM(SELECT i,i-row_number()over(partition
by v order by i)x,v FROM @)z GROUP BY x,v ORDER BY max(i)

Ungolfed:

DECLARE @ table(i int identity, v varchar(20))
INSERT @ values(1),(1),(1),(3),(3),(1),(1),(2),(2),(2),(1),(1),(3)

SELECT
  REPLICATE(v+' ',COUNT(*))
FROM 
  (
     SELECT
       i,
       i-row_number()over(partition by v order by i)x,
       v
     FROM @
  )z
GROUP BY
  x,v
ORDER BY
  max(i)

ซอ




0

sed, 33 23 + 1 = 24 ไบต์

s/([^ ]+)( \1)* */&\n/g

มันต้องการ-rตัวเลือก

ตัวอย่างการใช้งาน:

$ echo '1 1 1 2 2 3 3 3 4 9 9' | sed -r 's/([^ ]+)( \1)* */&\n/g'
1 1 1 
2 2 
3 3 3 
4 
9 9

0

JavaScript (ES6), 56

อินพุต: อาร์เรย์ของตัวเลขหรือสตริง

เอาต์พุต: อาร์เรย์ของอาร์เรย์

ครั้งแรกที่เคยใช้การเปรียบเทียบที่แน่นอนในโค้ดกอล์ฟ

a=>a.map(x=>x!==p?o.push(g=[p=x]):g.push(x),p=o=g=[])&&o

0

Clojure, 19 ไบต์

#(partition-by + %)

มันเป็นอุปกรณ์ในตัว แต่ใช้ฟังก์ชั่นการแมป ในกรณีนี้+ทำหน้าที่เป็นฟังก์ชันตัวตน


0

Javascript (ใช้ไลบรารีภายนอก) (178 ไบต์)

(s)=>_.From(s).Aggregate((t,e)=>{if(0===t.Items.length)return t.Items.push([e]),t;var s=t.Items[t.Items.length-1];return s[0]===e?(s.push(e),t):(t.Items.push([e]),t)},{Items:[]})

คำเตือน: ฉันใช้ห้องสมุดฉันเขียนเพื่อใช้ LINQ จาก C # เป็น JS มันไม่ได้ช่วยให้ฉันชนะ แต่ก็ดี

ภาพ

ภาพที่ 2

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.