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.


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:



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.

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


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

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

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.


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


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

2

Dyalog APL , 9 byte

⊢⊂⍨1,2≠/⊢

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


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.


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.
}%


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

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

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

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)

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.


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


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.


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

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.


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


1

Ruby , 24 byte

Dalam Ruby Arraycontoh memiliki metode bawaangroup_by

Jadi solusinya adalah:

a.group_by{|x| x}.values

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


0

Perl 5 - 39 Bytes

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

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


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

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

0

Clojure, 19 byte

#(partition-by + %)

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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.