Batalkan sisipan baris log [duplikat]

Aug 18 2020

Anda mewarisi server yang menjalankan beberapa aplikasi yang semuanya menghasilkan log yang sama.

Tugas Anda adalah untuk memisahkan baris dari file log berdasarkan sumber. Untungnya, setiap baris dimulai dengan tag yang menunjukkan aplikasi asalnya.

Log

Setiap baris akan terlihat seperti ini:

[app_name] Something horrible happened!
  • Tag aplikasi selalu berada di antara tanda kurung siku dan hanya akan berisi karakter alfanumerik dan garis bawah.
  • Semua baris akan memiliki tag aplikasi di awal. Tidak akan ada spasi sebelumnya atau karakter lainnya.
  • Akan selalu ada setidaknya satu spasi setelah tag aplikasi
  • Tag aplikasi tidak kosong
  • Mungkin nanti ada tanda kurung siku lain di baris mana pun.
  • Mungkin ada atau mungkin tidak ada pesan setelah tag
  • Log mungkin kosong
  • Tidak ada batasan berapa banyak tag aplikasi unik yang akan ada di file.

Contoh

Seluruh log mungkin terlihat seperti ini:

[weather] Current temp: 83F
[barkeep] Fish enters bar
[barkeep] Fish orders beer
[stockmarket] PI +3.14
[barkeep] Fish leaves bar
[weather] 40% chance of rain detected

Yang seharusnya menghasilkan tiga log berbeda:

[weather] Current temp: 83F
[weather] 40% chance of rain detected
[barkeep] Fish enters bar
[barkeep] Fish orders beer
[barkeep] Fish leaves bar
[stockmarket] PI +3.14

Anda tidak akan diberi nama tag aplikasi sebelumnya. Anda harus menentukannya hanya dengan menganalisis file log.

Aturan dan Penilaian

  • Ini adalah kode-golf , jadi kode terpendek menang.
  • Aturan dan celah standar berlaku
  • Gunakan format IO yang nyaman, asalkan setiap baris masukan direpresentasikan sebagai string, bukan tag + pesan yang telah diuraikan sebelumnya. Daftar tidak lengkap dari keluaran yang diizinkan:
    • Beberapa file diberi nama setelah setiap tag
    • Beberapa daftar string
    • Satu daftar rangkaian string berisi baris yang dikelompokkan berdasarkan tag dengan atau tanpa pemisah (pemisah tidak boleh dimulai dengan tag)
    • Sama seperti di atas, tetapi untuk stdout atau file.
  • Urutan keluaran log yang terpisah tidak relevan, namun baris log dalam setiap grup harus mempertahankan urutan seperti yang ditemukan di file asli

Jawaban

9 Noodle9 Aug 18 2020 at 03:22

Bash , 4 11 byte

Menambahkan 7 byte untuk memperbaiki bug yang ditunjukkan oleh Shaggy .

sort -sk1,1

Cobalah secara online!

Melakukan pengurutan stabil ( sargumen baris perintah) berdasarkan bidang pertama ( k1,1) yang dipisahkan oleh spasi.

7 Giuseppe Aug 18 2020 at 01:35

R , 50 46 byte

function(r)split(r,substr(r,1,regexpr("]",r)))

Cobalah secara online!

Output sebagai a listdengan setiap elemen named dengan [tag]. Setiap elemen daftar mempertahankan urutan di dalam tagnya. Mengembalikan daftar nama named list()kosong untuk input kosong.

-2 byte masing-masing berkat Robin Ryder dan Dominic van Essen!

5 isaacg Aug 18 2020 at 04:48

Pyth , 3 byte

ohc

Cobalah secara online!

Format masukan adalah daftar string:

["[weather] Current temp: 83F","[barkeep] Fish enters bar","[barkeep] Fish orders beer","[stockmarket] PI +3.14","[barkeep] Fish leaves bar","[weather] 40% chance of rain detected"]

Bagaimana kode bekerja:

  • o: Dipesan oleh

  • h: Elemen pertama dari

  • c: Setiap string dipisahkan menjadi spasi

4 JonathanAllan Aug 18 2020 at 01:55

Python , 44 byte

lambda a:sorted(a,key=lambda l:l.split()[0])

Cobalah secara online!

I / O longgar memungkinkan kita untuk mengambil, dan menghasilkan, daftar baris. Karena kita tidak harus memisahkan grup, masalahnya dikurangi menjadi jenis garis yang stabil pada awalan setiap baris hingga spasi pertama, split()akan terpecah pada beberapa karakter spasi juga tetapi tidak ada yang dapat ditampilkan di bagian tag aplikasi.

3 Adám Aug 18 2020 at 01:49

APL (Dyalog Extended) , 10 byte ( SBCS )

Fungsi awalan diam-diam anonim. Mengambil daftar daftar karakter sebagai argumen. Mengembalikan matriks daftar karakter, dengan satu log di setiap baris.

⊢⊢⌸⍨≠⊃⍤⊆¨⊢

Cobalah secara online!

 pada argumen,

 gunakan non-spasi untuk…

⊆¨ partisi setiap daftar menjadi daftar daftar (menghapus spasi, tetap menjalankan non-spasi),

⊃⍤ kemudian pertahankan yang pertama [dari masing-masing] (yaitu tag),

⊢⌸⍨ gunakan itu sebagai kunci untuk mengelompokkan…

 argumen

3 nmjcman101 Aug 18 2020 at 03:14

vim, 13 11 byte

:sor/\w\+/r

perbaikan bug dan penyimpanan byte berkat @Dingus!

Cobalah secara online!

3 user Aug 18 2020 at 01:28

Scala, 26 byte

_.sortBy(_.split("]")(0))

Mengembalikan a List[String]tanpa pemisah di antaranya, tetapi diurutkan berdasarkan tag.

Cobalah di Scastie


Mengembalikan a Map[String,List[String]], 26 byte

_ groupBy(_.split("]")(0))

Mengambil daftar string dan mengembalikan di Map[List[String]]mana kuncinya adalah tag dan nilainya adalah log yang terkait dengan tag itu.

Cobalah di Scastie


Solusi sebelumnya, 66 byte

_ groupBy{case s"[$t]$r"=>t}map(_._2 mkString "\n")mkString "\n"*2

Cobalah di Scastie (untuk alasan apa pun, stidak berfungsi di TIO)

Setiap log aplikasi dipisahkan oleh 2 baris baru (saya mungkin dapat menghemat 2 byte jika itu hanya menjadi satu karakter baris baru). Inputnya adalah daftar string, dan outputnya adalah satu string besar.

2 SomoKRoceS Aug 18 2020 at 04:41

05AB1E , 3 byte

Σ#¬

Input dan Output adalah daftar log.

Penjelasan:

Σ#¬
Σ          Sort by:
 #         Split (each log) by spaces
  ¬        Head (which is the tagname)

Ini juga menjaga urutan log, sesuai kebutuhan.

Cobalah secara online!

2 Neil Aug 18 2020 at 02:27

Retina 0.8.2 , 14 13 byte

O$`(\w+).*
$1

Cobalah secara online! Penjelasan: Karena tidak diperlukan pemisah grup keluaran, garis-garis tersebut hanya diurutkan berdasarkan tag aplikasi, yang diperoleh dengan menangkap kecocokan \w+dan menetapkannya $1sebagai kunci pengurutan. Urutan di Retina stabil, sehingga baris dengan awalan yang sama akan mempertahankan urutannya. Edit: Disimpan 1 byte berkat @FryAmTheEggman karena menunjukkan cara yang lebih mudah untuk mencocokkan tag aplikasi. Perhatikan bahwa meskipun pertandingan tidak menyertakan awalan [, semua baris dimulai dengan [, jadi itu tidak memengaruhi hasil pengurutan.

2 Noodle9 Aug 18 2020 at 03:42

AWK , 62 58 byte

Menyimpan 4 byte berkat Dominic van Essen !!!

{a[$1][i++]=$0}END{for(k in a)for(j in a[k])print a[k][j]}

Cobalah secara online!

Menyimpan semua baris dalam array asosiatif 2D a. Kunci pertama adalah kolom pertama (dipisahkan oleh spasi). Jadi semua baris yang dimulai dengan bidang yang sama disimpan bersama. Kunci kedua adalah indeks integer yang meningkat. Bagian yang paling bertele-tele adalah ENDtindakan yang mencetak konten yang adikelompokkan berdasarkan kolom pertama dalam urutan tampilan.

1 Shaggy Aug 18 2020 at 01:32

Japt , 4 byte

Mengambil masukan sebagai larik garis, menghasilkan larik 2D.

ü_¸g

Cobalah

1 Noname Aug 18 2020 at 07:14

Io , 73 byte

method(i,i map(split first)unique map(I,i select(split first==I))flatten)

Cobalah secara online!

1 JoKing Aug 18 2020 at 21:44

Perl 6 , 16 byte

*.sort:{~m/\w+/}

Cobalah secara online!

Mengurutkan berdasarkan string pertama karakter alfanumerik, yang seharusnya merupakan nama aplikasi

1 DanielH. Aug 18 2020 at 01:11

Python 3 , 148127 byte

a={}
try:
 while 1:
  b=input();c=b.split("]")[0]
  if 1-(c in a):a[c]=[]
  a[c]+=[b]
except:[print(e)for k in a for e in a[k]]

Cobalah secara online!

1 JonathanAllan Aug 19 2020 at 01:02

V (vim) , 5 byte

úr/?]

Catatan: Yang di ?atas menggantikan byte yang tidak dapat dicetak \$\text{\x}81\$ (karakter kontrol "No Break Here").

Cobalah secara online!

Perhatikan bahwa ini berfungsi dengan kurangnya spasi (bahkan satu spasi langsung setelah tanda ]kurung pertama ), dengan adanya []tanda kurung di pesan log, dan dengan adanya aplikasi tanpa tanda, Cobalah secara online!

Bagaimana?

úr/?]
ú     - sort by:
 r    -   with flag=r: use match (default behaviour is to use what's after the match)
  /   -     with the pattern:
   ?  -       (byte 83) a shortcut for .\{-}
                                       .     - match any character
                                        \{-} - 0 or more times matching as few times as possible
    ] -       match a literal ']' character
1 EngineerToast Aug 19 2020 at 03:09

AutoHotkey, 74 byte

Loop,Read,f
{
s:=A_LoopReadLine
FileAppend,%s%`n,% StrSplit(s,"]","[")[1]
}

Membaca dari file bernama fdan menghasilkan beberapa file berdasarkan tag.

1 IsmaelMiguel Aug 19 2020 at 19:09

SimpleTemplate 0,84, 109 byte

Ya, itu cukup panjang, tapi berhasil!

{@callexplode intoL EOL,argv.0}{@eachL}{@if_ matches"@^(\[.*\])@"M}{@setS.[M.1]S.[M.1],_,EOL}{@/}{@/}{@echoS}

Kode ini menghasilkan array dengan <old content>, line, <end of line>.

{@echoS} secara otomatis meratakan array dan menampilkannya.


Ungolfed:

Ya, memang berantakan, tapi ini versi yang lebih bersih:

{@call explode into lines EOL, argv.0}
{@set storage null}
{@each lines as line}
    {@if line matches "@^(\[.*\])@" match}
        {@set storage.[match.1] storage.[match.1], line, EOL}
    {@/}
{@/}
{@echo storage}

Fungsinya explodeadalah fungsi PHP standar, tetapi dapat diakses dari bahasa saya.


Anda dapat mencobanya di: http://sandbox.onlinephpfunctions.com/code/9c66f8bacc6315ae56e7c193170e430f9cf9d902

1 BlackPanther Aug 18 2020 at 20:56

C # (NET Core) , 181 162 160 bytes

input.GroupBy(l=>l.Split()[0]).ToList().ForEach((g)=>{using(var sw = new StreamWriter(g.Key.Trim('[').Trim(']')+".log")){foreach(var v in g)sw.WriteLine(v);}});

Cobalah secara online!

C # (Visual C # Interactive Compiler) , 179 byte

i=>i.GroupBy((l)=>{return l.Split(' ')[0];}).ToList().ForEach((g)=>{using(var sw = new StreamWriter(g.Key.Trim(new char[]{'[',']'})+".log")){foreach(var v in g)sw.WriteLine(v);}})

Cobalah secara online!

Saya tidak yakin solusi pertama sesuai dengan code gulf, jadi solusi kedua menggunakan ekspresi lambda.

1 corvus_192 Aug 20 2020 at 03:43

Haskell, 37 byte

import Data.List
f=sortOn(head.words)

Cobalah secara online!

1 corvus_192 Aug 20 2020 at 03:57

Rust, 40 byte

|a|a.sort_by_key(|x|x.split("]").next())

Mengambil referensi yang bisa berubah ke sepotong string dan mengurutkannya.

Cobalah di taman bermain karat

DominicvanEssen Aug 18 2020 at 20:30

Perl 5 -M5.10.0 -Msort = stabil, 53 byte

say sort{(split('\]',$a))[0]cmp(split('\]',$b))[0]}<>

Cobalah secara online!