Kelompok item yang berulang

10

Deskripsi tantangan

Diberikan daftar / larik item, tampilkan semua grup item berulang berulang.

Deskripsi input / output

Input Anda adalah daftar / larik item (Anda bisa berasumsi semuanya bertipe sama). Anda tidak perlu mendukung setiap jenis bahasa Anda, tetapi harus mendukung setidaknya satu (lebih disukai int, tetapi jenis seperti boolean, meskipun tidak terlalu menarik, juga baik-baik saja). Output sampel:

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

Adapun daftar kosong, output tidak ditentukan - itu bisa apa-apa, daftar kosong, atau pengecualian - apa pun yang paling sesuai dengan tujuan golf Anda. Anda juga tidak perlu membuat daftar daftar yang terpisah, jadi ini juga merupakan keluaran yang benar-benar valid:

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

1 1 1
2 2
3 3 3
4
9

Yang penting adalah menjaga kelompok tetap terpisah.

shooqie
sumber
Mungkin kita mengeluarkan daftar yang memiliki nilai pemisah khusus?
xnor
@ xnor: Bisakah Anda memberikan contoh? Array ints dipisahkan oleh, misalnya, 0s akan menjadi ide yang buruk karena ada 0s di input ...
shooqie
Misalnya, [4, 4, '', 2, 2, '', 9, 9]atau [4, 4, [], 2, 2, [], 9, 9].
xnor
Sebenarnya, jenis apa yang harus kita dukung. Bisakah elemen itu sendiri menjadi daftar? Saya membayangkan beberapa bahasa memiliki tipe bawaan yang tidak dapat dicetak atau pengecekan kesetaraan yang aneh.
xnor
@ xnor: Ya, itulah yang menjadi perhatian saya - jika input Anda memiliki daftar di dalamnya, maka menggunakan daftar kosong sebagai pemisah mungkin membingungkan. Itu sebabnya saya memasukkan "Anda dapat menganggap semua item dari jenis yang sama", sehingga dapat menggunakan jenis yang berbeda sebagai pemisah.
shooqie

Jawaban:

15

Mathematica, 5 byte

Split

... ada built-in untuk itu.

Martin Ender
sumber
9
…benar-benar kejutan!
Fatalkan
11
@Fatalize Kejutan sebenarnya adalah betapa singkatnya itu.
Martin Ender
8

Jelly , 5 byte

I0;œṗ

Berfungsi untuk semua jenis numerik. Cobalah online! atau verifikasi semua uji numerik .

Bagaimana itu bekerja

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.
Dennis
sumber
8

Retina , 15 8 byte

Terima kasih kepada Lynn untuk menyarankan format I / O yang lebih sederhana.

!`(.)\1*

Memperlakukan input sebagai daftar karakter (dan menggunakan umpan baris untuk memisahkan grup).

Cobalah online!

Ini hanya bekerja dengan mencocokkan grup dan mencetak semuanya (yang menggunakan pemisahan linefeed secara otomatis).

Martin Ender
sumber
Saya bertanya tentang abbcccddda bb ccc dddmenjadi format I / O yang dapat diterima, dan OP menyetujuinya, jadi saya kira !`(.)\1*tidak apa-apa?
Lynn
@ Lynn Oh, itu memang lebih sederhana, terima kasih.
Martin Ender
4

JavaScript (ES6), 39 37 byte

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

Bekerja pada token seperti-kata yang dipisahkan oleh ruang. Disimpan 2 byte berkat @ MartinEnder ♦. Terbaik yang bisa saya lakukan untuk input array dan kembali adalah 68:

a=>a.reduce((l,r)=>(l==r?c.push(r):b.push(c=[r]),r),b=[c=[a[0]]])&&b
Neil
sumber
1
Saya menambahkan jawaban larik di 56
edc65
4

MATL , 9 byte

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

Input adalah deretan baris angka , dengan spasi atau koma sebagai pemisah.

Cobalah online! Tes dengan angka non-integer .


MATL, 11 byte

lidgvYsG7XQ

Input adalah array kolom baik angka atau karakter , menggunakan ;sebagai pemisah.

Cobalah online! Tes dengan angka acak . Uji dengan karakter .

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
Luis Mendo
sumber
3

gs2, 2 byte

c-

Cobalah online!

cadalah pengelompokan bawaan yang melakukan hal ini, jadi kami menyebutnya di STDIN (yang merupakan string, yaitu, daftar karakter) dan mendapatkan daftar string. Sayangnya, hasilnya tidak dapat dibedakan dari input, jadi kita perlu menambahkan pemisah! -(Gabung dengan spasi) melakukan trik.

Jawaban alternatifnya adalah (2 byte dari CP437), yang hanya membungkus cdengan fungsi anonim.

Lynn
sumber
2

Brachylog , 13 byte

:{s.dl1}fs.c?

Peringatan: ini sangat tidak efisien, dan Anda akan mengerti mengapa dalam penjelasannya.

Ini mengharapkan daftar (misalnya [1:1:2:2:2]) sebagai input. Elemen-elemen di dalam daftar dapat berupa apa saja.

Penjelasan

:{     }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

Ini bekerja hanya karena cara s - Subsetmenyatukan: set terkecil ada di akhir. Oleh karena itu, hal pertama yang ditemukan yang menyatukan dengan Input adalah proses terpanjang, misalnya [[1:1]:[2:2:2]]dan bukan misalnya [[1:1]:[2:2]:[2]].

Fatalisasi
sumber
2

J , 13 byte

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

Karena J tidak mendukung array yang tidak rata, setiap proses elemen yang sama dilakukan dalam kotak. Input adalah array nilai dan output array array kotak.

Pemakaian

   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│
└─┘

Penjelasan

<;.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
mil
sumber
2

Dyalog APL , 9 byte

⊢⊂⍨1,2≠/⊢

argumen
⊂⍨dipartisi pada
1pada elemen pertama
,dan kemudian di
2≠/mana pasangan berikutnya berbeda
dalam argumen

Adm
sumber
2

Python 2, 43 byte

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

Bekerja pada daftar boolean. Contoh:

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

Iterasi melalui daftar input, menyimpan elemen yang terakhir terlihat. Bilah pemisah dicetak sebelum setiap elemen yang berbeda dari sebelumnya, diperiksa sebagai bitwise xor ^dari 0. Inisialisasi p=-1menghindari pemisah sebelum elemen pertama.

Tidak
sumber
Sayang sekali groupbyitu
menyebalkan
2

CJam, 9 byte

Dua solusi:

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

Uji di sini.

Penjelasan

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.

Atau

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.
}%
Martin Ender
sumber
2

Haskell, 22 byte

import Data.List
group

Ada built-in. Bekerja pada semua jenis yang mendukung kesetaraan.

Tidak
sumber
2
Ada alasan mengapa ini adalah wiki komunitas?
Fatalkan tanggal
1
Itu mulia tetapi karena tidak ada orang lain yang melakukannya, mengapa Anda tidak bertanya tentang itu pada meta?
Fatalkan tanggal
2

MATL, 8 7 byte

Dihapus 1 byte berkat @Suever

ly&Y'Y{

Bekerja dengan integer / float / karakter / boolean / titik unicorn / input imajiner lainnya.
Untuk boolean, inputnya adalah T/F, outputnya 1/0.

Cobalah online!


Dikelompokkan dan Diulang

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
gelas kimia
sumber
1

C #, 117 byte

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 (tidak juga)

    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)));
    }
downrep_nation
sumber
1

Pyth, 9 7 byte

mr9]dr8

Kredit ke @LeakyNun selama 2 byte!

Penjelasan:

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

Jawaban lama, 12 byte

hf.Am!t{dT./

Lupa tentang run length built-in, tapi saya pikir ini adalah pendekatan yang oke, jadi saya menyimpannya.

Penjelasan:

                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
busukxuan
sumber
Ini adalah 7 byte
Leaky Nun
@ LeakyNun Oh benar! Itu keren.
busukxuan
1
Saya percaya ini bekerja untuk 6.
FryAmTheEggman
@FryAmTheEggman bagus penyalahgunaan dari m.
Leaky Nun
@FryAmTheEggman Wow, saya tidak mengerti oO
busukxuan
1

Pyth , 36 35 byte

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

Tautan uji

Edit: penjelasan:

                                      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)
Arfie
sumber
1

Retina , 24 22 byte

2 byte, terima kasih kepada Martin Ender.

Jawaban 15 byte sudah ada, jadi ini hanyalah pendekatan lain yang membutuhkan lebih banyak byte.

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

Cobalah online!

Itu terbagi pada spasi yang nomor sebelumnya berbeda dari proses.

Ini adalah demonstrasi pencarian.

Biarawati Bocor
sumber
1

05AB1E, 13 byte

¬svyÊi¶}yðJ?y

Dijelaskan

¬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

Harus bekerja untuk daftar apa pun.
Diuji pada int dan char.

Cobalah online

Emigna
sumber
1

Swift, 43 byte

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

Menganggap saya sebagai array dari objek yang setara; bekerja untuk apa pun mulai dari int hingga string ke objek kustom. Agak kurang sopan karena outputnya mengandung banyak baris baru, tetapi menjadikannya lebih cantik akan dikenakan biaya byte.

Versi yang lebih cantik dan tidak diserang:

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
}

Versi ini mencetak setiap grup pada baris baru dengan mengorbankan lebih banyak kode.

Gagasan untuk Peningkatan

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

Versi ini memiliki 47 byte, tetapi ini pendekatan yang berbeda, jadi mungkin ada sesuatu untuk dioptimalkan di sana? Masalah terbesar adalah pernyataan pengembalian.

Juliuli665
sumber
1

C, 88 77 byte

Memindahkan bagian strmcmp dalam yang printf menyimpan 11 byte

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

Pemakaian:

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

Input sampel:

(parameter baris perintah)

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

Output sampel:

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

Diuji pada:

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

Saya mencoba untuk memperbaiki kesalahan Segmetation 5.3.0.

Versi 88

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

Java 134 byte

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

beralih melalui, dan memutuskan apakah akan terpisah dengan garis baru atau spasi.

Rohan Jhunjhunwala
sumber
untuk pemula Anda bisa menghapus publicdan statickata kunci. Anda juga dapat menghapus kurung keriting untuk loop
user902383
Selesai @ user902383
Rohan Jhunjhunwala
1

ListSharp , 134 byte

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 tidak mendukung fungsi sehingga array disimpan dalam file lokal bernama l.txt mengajukan

downrep_nation
sumber
1

Ruby , 24 byte

Dalam Ruby Arraycontoh memiliki metode bawaangroup_by

Jadi solusinya adalah:

a.group_by{|x| x}.values
Farkhat Mikhalko
sumber
0

TSQL, 132 byte

Ini sedikit berbeda dari jawaban lain - sql tidak memiliki array, input yang jelas untuk sql adalah sebuah tabel.

Golf:

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)

Tidak Disatukan:

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)

Biola

t-clausen.dk
sumber
0

Perl 5 - 39 Bytes

print$_.($/)[$_ eq@a[++$-]]for@a=sort@a
Kaundur
sumber
0

Pyke, 2 byte (tidak kompetitif)

Hanya mendukung bilangan bulat

$f

Coba di sini!

split_at(input, delta(input))

Menambahkan node split_at, membagi input ketika argumen ke-2 benar

Biru
sumber
0

sed, 33 23 + 1 = 24 byte

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

Perlu -ropsi.

Contoh penggunaan:

$ 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
Marco
sumber
0

JavaScript (ES6), 56

Input: array angka atau string

Output: array array

Pertama kali menggunakan perbandingan yang tepat dalam kode golf

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

Clojure, 19 byte

#(partition-by + %)

Ini built-in, tetapi dibutuhkan fungsi pemetaan. Dalam hal ini, +berfungsi sebagai fungsi identitas.

MattPutnam
sumber
0

Javascript (menggunakan perpustakaan eksternal) (178 byte)

(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:[]})

Penafian: Saya menggunakan perpustakaan yang saya tulis untuk mengimplementasikan LINQ dari C # ke JS. Itu tidak benar-benar membantu saya menang, tetapi oh well

Gambar

Gambar2

applejacks01
sumber