Günlük satırlarını ayırma [yineleme]

Aug 18 2020

Tümü aynı günlüğe çıktı veren birkaç uygulamayı çalıştıran bir sunucuyu miras aldınız.

Göreviniz, günlük dosyasının satırlarını kaynağa göre serpiştirmektir. Neyse ki, her satır hangi uygulamadan geldiğini gösteren bir etiketle başlar.

Kütükler

Her satır şunun gibi görünecek:

[app_name] Something horrible happened!
  • Uygulama etiketleri her zaman köşeli parantezler arasındadır ve yalnızca alfasayısal karakterler ve alt çizgiler içerir.
  • Tüm satırların başında bir uygulama etiketi olacaktır. Önünde boşluk veya başka herhangi bir karakter olmayacaktır.
  • Uygulama etiketinden sonra her zaman en az bir boşluk olacaktır
  • Uygulama etiketleri boş değil
  • Herhangi bir satırda daha sonra başka köşeli parantezler olabilir.
  • Etiketinden sonra bir mesaj olabilir veya olmayabilir
  • Günlük boş olabilir
  • Dosyada kaç tane benzersiz uygulama etiketinin bulunacağına dair bir sınır yoktur.

Misal

Günlüğün tamamı şöyle görünebilir:

[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

Üç farklı günlük çıktı vermelidir:

[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

Size önceden uygulama etiketlerinin adları verilmez. Bunları yalnızca günlük dosyasını analiz ederek belirlemelisiniz.

Kurallar ve Puanlama

  • Bu kod golf , bu yüzden en kısa kod kazanır.
  • Standart kurallar ve boşluklar geçerlidir
  • Her giriş satırının önceden ayrıştırılmış bir etiket + mesaj olarak değil, bir dize olarak gösterilmesi koşuluyla, herhangi bir uygun GÇ biçimini kullanın. İzin verilen çıktıların kapsamlı olmayan listesi:
    • Her etiketin adını taşıyan birkaç dosya
    • Birkaç dizge listesi
    • Ayırıcı içeren veya içermeyen etikete göre gruplanmış satırları içeren birleştirilmiş dizeler listesi (ayırıcı bir etiketle başlamamalıdır)
    • Yukarıdaki ile aynı, ancak standart çıktıya veya bir dosyaya.
  • Ayrılmış günlüklerin çıkış sırasının önemi yoktur, ancak her gruptaki günlük satırları orijinal dosyada bulundukları sırayı korumalıdır.

Yanıtlar

9 Noodle9 Aug 18 2020 at 03:22

Bash , 4 11 bayt

Shaggy'nin nazikçe işaret ettiği bir hatayı düzeltmek için 7 bayt eklendi .

sort -sk1,1

Çevrimiçi deneyin!

Boşluklarla ayrılmış silk alana ( k1,1) dayalı olarak kararlı bir sıralama ( komut satırı argümanı) gerçekleştirir .

7 Giuseppe Aug 18 2020 at 01:35

R , 50 46 bayt

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

Çevrimiçi deneyin!

Bir olarak çıktılar list, her eleman ile namebirlikte d [tag]. Her liste öğesi, etiketi içinde sırayı korur. named list()Boş giriş için boş bir adlandırılmış liste döndürür .

Robin Ryder ve Dominic van Essen sayesinde her biri -2 bayt!

5 isaacg Aug 18 2020 at 04:48

Pyth , 3 bayt

ohc

Çevrimiçi deneyin!

Giriş biçimi, dizelerden oluşan bir listedir:

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

Kod nasıl çalışır:

  • o: Tarafından sipariş

  • h: İlk öğesi

  • c: Her dize boşluklara bölünür

4 JonathanAllan Aug 18 2020 at 01:55

Python , 44 bayt

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

Çevrimiçi deneyin!

Gevşek G / Ç, bir satır listesi almamızı ve sonuç vermemizi sağlar. Grupları ayırmamız gerekmediğinden, sorun ilk boşluğa kadar her satırın önekindeki satırların istikrarlı bir çeşidini gerçekleştirmeye indirgenmiştir, split()diğer bazı beyaz boşluk karakterlerinde de bölünecektir, ancak hiçbiri içinde bulunamaz. uygulama etiketi kısmı.

3 Adám Aug 18 2020 at 01:49

APL (Dyalog Genişletilmiş) , 10 bayt ( SBCS )

Anonim zımni önek işlevi. Bağımsız değişken olarak karakter listelerinin bir listesini alır. Her satırda bir günlük bulunan bir karakter listeleri matrisi döndürür.

⊢⊢⌸⍨≠⊃⍤⊆¨⊢

Çevrimiçi deneyin!

 tartışmada,

 boşluk olmayanları kullanmak için ...

⊆¨ her listeyi bir liste listesine ayırın (boşlukları kaldırır, boşluk olmayan dizileri tutar),

⊃⍤ sonra ilkini [her birinin] (yani etiketleri) saklayın,

⊢⌸⍨ bunları gruplama anahtarı olarak kullanın…

 argüman

3 nmjcman101 Aug 18 2020 at 03:14

vim, 13 11 bayt

:sor/\w\+/r

@Dingus sayesinde hata düzeltme ve bayt kaydetme!

Çevrimiçi deneyin!

3 user Aug 18 2020 at 01:28

Scala, 26 bayt

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

List[String]Arasında ayırıcı olmayan bir döndürür , ancak etikete göre sıralanır.

Scastie'de deneyin


A Map[String,List[String]], 26 bayt döndürür

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

Dizelerin bir listesini alır ve Map[List[String]]anahtarların etiketler ve değerlerin bu etiketle ilişkili günlükler olduğu bir yer döndürür .

Scastie'de deneyin


Önceki çözüm, 66 bayt

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

Scastie'de deneyin (her ne sebeple olursa olsun , TIO'das çalışmıyor)

Her uygulamanın günlükleri 2 yeni satırla ayrılmıştır (yalnızca bir satırsonu karakteri olması gerekiyorsa 2 bayt kaydedebilirim). Giriş, dizelerin bir listesidir ve çıktı büyük bir dizedir.

2 SomoKRoceS Aug 18 2020 at 04:41

05AB1E , 3 bayt

Σ#¬

Girdi ve Çıktı , günlüklerin bir listesidir.

Açıklama:

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

Bu, gerektiği şekilde günlüklerin sırasını da tutar.

Çevrimiçi deneyin!

2 Neil Aug 18 2020 at 02:27

Retina 0.8.2 , 14 13 bayt

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

Çevrimiçi deneyin! Açıklama: Çıktı grubu ayırıcı gerekmediğinden, satırlar uygulama etiketine göre sıralanır; bu, eşleşmeyi yakalayıp sıralama anahtarı olarak \w+belirleyerek elde edilir $1. Retina'da sıralama kararlıdır, böylece aynı öneke sahip satırlar sıralarını korurlar. Düzenleme: @FryAmTheEggman sayesinde uygulama etiketiyle eşleştirmenin daha kolay bir yolunu işaret ettiği için 1 bayt kaydedildi. Eşleşmede baştaki karakter bulunmasa da [, tüm satırların başladığını ve [bu durumun sıralamanın sonucunu etkilemediğini unutmayın.

2 Noodle9 Aug 18 2020 at 03:42

AWK , 62 58 bayt

Dominic van Essen sayesinde 4 bayt tasarruf etti !!!

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

Çevrimiçi deneyin!

Tüm satırları bir 2D ilişkilendirilebilir dizide saklar a. İlk anahtar ilk alandır (boşlukla ayrılmış). Böylece aynı alanla başlayan tüm satırlar birlikte saklanır. İkinci anahtar, artan bir tamsayı indeksidir. En ayrıntılı kısım, birinci alana göre gruplanmış ENDiçerikleri agörünüm sırasına göre yazdıran eylemdir .

1 Shaggy Aug 18 2020 at 01:32

Japt , 4 bayt

Girdiyi satır dizisi olarak alır, 2D dizi çıkarır.

ü_¸g

Dene

1 Noname Aug 18 2020 at 07:14

Io , 73 bayt

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

Çevrimiçi deneyin!

1 JoKing Aug 18 2020 at 21:44

Perl 6 , 16 bayt

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

Çevrimiçi deneyin!

Uygulama adı olması gereken alfanümerik karakterlerden oluşan ilk dizeye göre sıralar

1 DanielH. Aug 18 2020 at 01:11

Python 3 , 148127 bayt

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

Çevrimiçi deneyin!

1 JonathanAllan Aug 19 2020 at 01:02

V (vim) , 5 bayt

úr/?]

Not: ?Yukarıdakiler, yazdırılamayan bayt yerine \$\text{\x}81\$ ("Burada Kırılma Yok" denetim karakteri).

Çevrimiçi deneyin!

Bunun boşluk eksikliğinde (ilk ]parantezin hemen arkasından bir tane bile olsa ), []günlük mesajında ​​köşeli parantezlerin varlığında ve etiketsiz bir uygulamanın varlığında çalıştığını unutmayın, Çevrimiçi deneyin!

Nasıl?

ú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 bayt

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

Adlı bir dosyadan okur fve etikete bağlı olarak birden çok dosyaya çıktı verir.

1 IsmaelMiguel Aug 19 2020 at 19:09

SimpleTemplate 0,84, 109 bayt

Evet, oldukça uzun ama işini yapıyor!

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

Bu kod ile bir dizi oluşturur <old content>, line, <end of line>.

{@echoS} diziyi otomatik olarak düzleştirir ve görüntüler.


Golfsüz:

Evet, bu bir karmaşa, ama işte daha temiz bir versiyon:

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

İşlev explodestandart bir PHP işlevidir, ancak benim dilimden erişilebilir.


Bunu deneyebilirsiniz: http://sandbox.onlinephpfunctions.com/code/9c66f8bacc6315ae56e7c193170e430f9cf9d902

1 BlackPanther Aug 18 2020 at 20:56

C # (.NET Çekirdek) , 181 162 160 bayt

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

Çevrimiçi deneyin!

C # (Visual C # Etkileşimli Derleyici) , 179 bayt

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

Çevrimiçi deneyin!

İlk çözümün kod gulf uyumlu olduğundan emin değilim, bu nedenle ikinci çözüm bir lambda ifadesi kullanıyor.

1 corvus_192 Aug 20 2020 at 03:43

Haskell, 37 bayt

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

Çevrimiçi deneyin!

1 corvus_192 Aug 20 2020 at 03:57

Pas, 40 bayt

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

Bir dizi dizeye değiştirilebilir bir referans alır ve bunu sıralar.

Paslı oyun alanında deneyin

DominicvanEssen Aug 18 2020 at 20:30

Perl 5 -M5.10.0 -Msort = kararlı, 53 bayt

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

Çevrimiçi deneyin!