ยกเลิกการสลับบรรทัดบันทึก [ซ้ำกัน]

Aug 18 2020

คุณได้รับช่วงเซิร์ฟเวอร์ที่รันแอพหลายตัวซึ่งส่งออกไปยังบันทึกเดียวกันทั้งหมด

งานของคุณคือการยกเลิกการแทรกระหว่างบรรทัดของไฟล์บันทึกตามแหล่งที่มา โชคดีที่แต่ละบรรทัดขึ้นต้นด้วยแท็กที่ระบุว่ามาจากแอปใด

บันทึก

แต่ละบรรทัดจะมีลักษณะดังนี้:

[app_name] Something horrible happened!
  • แท็กแอปจะอยู่ระหว่างวงเล็บเหลี่ยมเสมอและจะมีเฉพาะอักขระที่เป็นตัวอักษรและตัวเลขคละกันและขีดล่างเท่านั้น
  • ทุกบรรทัดจะมีแท็กแอพที่จุดเริ่มต้น จะไม่มีช่องว่างนำหน้าหรืออักขระอื่นใด
  • จะมีช่องว่างหลังแท็กแอปอย่างน้อยหนึ่งช่องเสมอ
  • แท็กแอปไม่ว่างเปล่า
  • อาจมีวงเล็บเหลี่ยมอื่น ๆ ในภายหลังในบรรทัดใดก็ได้
  • อาจมีหรือไม่มีข้อความหลังแท็ก
  • บันทึกอาจว่างเปล่า
  • ไม่มีการ จำกัด จำนวนแท็กแอปที่ไม่ซ้ำกันในไฟล์

ตัวอย่าง

บันทึกทั้งหมดอาจมีลักษณะดังนี้:

[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

ซึ่งควรส่งออกบันทึกที่แตกต่างกันสามรายการ:

[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

คุณไม่ได้รับชื่อของแท็กแอปล่วงหน้า คุณต้องกำหนดโดยการวิเคราะห์ไฟล์บันทึกเท่านั้น

กฎและการให้คะแนน

  • นี่คือโค้ดกอล์ฟรหัสที่สั้นที่สุดจึงชนะ
  • ใช้กฎมาตรฐานและช่องโหว่
  • ใช้รูปแบบ IO ที่สะดวกโดยมีเงื่อนไขว่าแต่ละบรรทัดอินพุตจะแสดงเป็นสตริงไม่ใช่แท็ก + ข้อความที่แยกวิเคราะห์ไว้ล่วงหน้า รายการเอาต์พุตที่อนุญาตไม่ครบถ้วน:
    • ไฟล์หลายไฟล์ที่ตั้งชื่อตามแต่ละแท็ก
    • รายการสตริงหลายรายการ
    • รายการสตริงที่ต่อกันหนึ่งรายการที่มีบรรทัดที่จัดกลุ่มตามแท็กโดยมีหรือไม่มีตัวคั่น (ตัวคั่นต้องไม่ขึ้นต้นด้วยแท็ก)
    • เหมือนกับด้านบน แต่เป็น stdout หรือไฟล์
  • ลำดับที่เอาต์พุตบันทึกที่แยกจากกันเป็นเอาต์พุตไม่เกี่ยวข้องอย่างไรก็ตามรายการบันทึกภายในแต่ละกลุ่มจะต้องรักษาลำดับที่พบในไฟล์ต้นฉบับ

คำตอบ

9 Noodle9 Aug 18 2020 at 03:22

Bash , 4 11 ไบต์

เพิ่ม 7 ไบต์เพื่อแก้ไขข้อผิดพลาดกรุณาแหลมออกโดยปุย

sort -sk1,1

ลองออนไลน์!

ดำเนินการจัดเรียงแบบคงที่ ( sอาร์กิวเมนต์บรรทัดคำสั่ง) ตามฟิลด์แรก ( k1,1) คั่นด้วยช่องว่าง

7 Giuseppe Aug 18 2020 at 01:35

R , 50 46 ไบต์

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

ลองออนไลน์!

เอาต์พุตเป็น a listกับแต่ละองค์ประกอบnamed พร้อมด้วย[tag]. องค์ประกอบรายการแต่ละรายการรักษาลำดับภายในแท็ก ส่งกลับรายการที่มีชื่อnamed list()ว่างสำหรับอินพุตว่าง

-2 ไบต์ขอบคุณ Robin Ryder และ Dominic van Essen!

5 isaacg Aug 18 2020 at 04:48

Pyth , 3 ไบต์

ohc

ลองออนไลน์!

รูปแบบการป้อนข้อมูลคือรายการสตริง:

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

รหัสทำงานอย่างไร:

  • o: สั่งโดย

  • h: องค์ประกอบแรกของ

  • c: แต่ละสตริงแบ่งช่องว่าง

4 JonathanAllan Aug 18 2020 at 01:55

Python 44 ไบต์

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

ลองออนไลน์!

Loose I / O ช่วยให้เราสามารถรับและส่งผลให้รายการบรรทัด เนื่องจากเราไม่ต้องแยกกลุ่มปัญหาจึงลดลงเป็นการจัดเรียงบรรทัดที่มั่นคงบนคำนำหน้าของแต่ละบรรทัดจนถึงช่องว่างแรกsplit()จะแบ่งที่อักขระเว้นวรรคอื่น ๆ ด้วย แต่ไม่มีเลยใน ส่วนแท็กแอปพลิเคชัน

3 Adám Aug 18 2020 at 01:49

APL (Dyalog Extended) , 10 ไบต์ ( SBCS )

ฟังก์ชันคำนำหน้าโดยปริยายแบบไม่ระบุชื่อ รับรายชื่อรายการอักขระเป็นอาร์กิวเมนต์ ส่งคืนเมทริกซ์ของรายการอักขระโดยมีบันทึกหนึ่งรายการในแต่ละแถว

⊢⊢⌸⍨≠⊃⍤⊆¨⊢

ลองออนไลน์!

 ในการโต้แย้ง

 ใช้ช่องว่างเพื่อ ...

⊆¨ แบ่งแต่ละรายการออกเป็นรายการ (ลบช่องว่างเก็บข้อมูลที่ไม่ใช่ช่องว่าง)

⊃⍤ จากนั้นเก็บ [ของแต่ละรายการ] (เช่นแท็ก)

⊢⌸⍨ ใช้เป็นกุญแจในการจัดกลุ่ม ...

 การโต้แย้ง

3 nmjcman101 Aug 18 2020 at 03:14

เป็นกลุ่ม13 11 ไบต์

:sor/\w\+/r

bugfix และ byte บันทึกขอบคุณ @Dingus!

ลองออนไลน์!

3 user Aug 18 2020 at 01:28

Scala, 26 ไบต์

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

ส่งคืน a List[String]โดยไม่มีตัวคั่นอยู่ระหว่าง แต่จะเรียงลำดับตามแท็ก

ลองใช้ใน Scastie


ส่งคืน a Map[String,List[String]], 26 ไบต์

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

รับรายการสตริงและส่งคืนMap[List[String]]ตำแหน่งที่คีย์คือแท็กและค่าคือบันทึกที่เกี่ยวข้องกับแท็กนั้น

ลองใช้ใน Scastie


โซลูชันก่อนหน้า 66 ไบต์

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

ลองใช้ใน Scastie (ไม่ว่าด้วยเหตุผลใดก็ตามsไม่ทำงานใน TIO)

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

2 SomoKRoceS Aug 18 2020 at 04:41

05AB1E , 3 ไบต์

Σ#¬

อินพุตและเอาต์พุตคือรายการบันทึก

คำอธิบาย:

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

นอกจากนี้ยังรักษาลำดับของบันทึกตามความจำเป็น

ลองออนไลน์!

2 Neil Aug 18 2020 at 02:27

Retina 0.8.2 , 14 13 ไบต์

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

ลองออนไลน์! คำอธิบาย: เนื่องจากไม่จำเป็นต้องใช้ตัวคั่นกลุ่มเอาต์พุตบรรทัดจะถูกจัดเรียงตามแท็กแอปซึ่งทำได้โดยการจับคู่ที่ตรงกัน\w+และระบุ$1เป็นคีย์การจัดเรียง การจัดเรียงใน Retina มีความเสถียรดังนั้นบรรทัดที่มีคำนำหน้าเหมือนกันจะยังคงลำดับ แก้ไข: บันทึก 1 ไบต์ขอบคุณ @FryAmTheEggman ที่ชี้ให้เห็นวิธีที่ง่ายกว่าในการจับคู่แท็กแอป โปรดทราบว่าแม้ว่าการจับคู่จะไม่มีการนำหน้า[แต่บรรทัดทั้งหมดจะเริ่มต้นด้วย[ดังนั้นจึงไม่ส่งผลต่อผลลัพธ์ของการจัดเรียง

2 Noodle9 Aug 18 2020 at 03:42

AWK , 62 58 ไบต์

บันทึก 4 ไบต์ขอบคุณDominic van Essen !!!

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

ลองออนไลน์!

aร้านค้าทุกสายในอาเรย์ 2 มิติ คีย์แรกคือฟิลด์แรก (คั่นด้วยช่องว่าง) ดังนั้นทุกบรรทัดที่ขึ้นต้นด้วยฟิลด์เดียวกันจะถูกเก็บไว้ด้วยกัน คีย์ที่สองคือดัชนีจำนวนเต็มที่เพิ่มขึ้น ส่วนที่ละเอียดที่สุดคือการENDดำเนินการที่พิมพ์เนื้อหาของการaจัดกลุ่มตามฟิลด์แรกตามลำดับการปรากฏ

1 Shaggy Aug 18 2020 at 01:32

Japt , 4 ไบต์

รับอินพุตเป็นอาร์เรย์ของบรรทัดเอาต์พุต 2D-array

ü_¸g

ลองมัน

1 Noname Aug 18 2020 at 07:14

Io , 73 ไบต์

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

ลองออนไลน์!

1 JoKing Aug 18 2020 at 21:44

Perl 6 , 16 ไบต์

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

ลองออนไลน์!

จัดเรียงตามสตริงแรกของอักขระที่เป็นตัวเลขและตัวอักษรซึ่งควรเป็นชื่อแอป

1 DanielH. Aug 18 2020 at 01:11

Python 3 , 148127ไบต์

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

ลองออนไลน์!

1 JonathanAllan Aug 19 2020 at 01:02

V (กลุ่ม) 5 ไบต์

úr/?]

หมายเหตุ: ?ข้างบนนี้ใช้แทนไบต์ที่พิมพ์ไม่ได้\$\text{\x}81\$ (อักขระควบคุม "No Break Here")

ลองออนไลน์!

โปรดทราบว่าวิธีนี้ใช้งานได้โดยไม่มีช่องว่าง (แม้แต่อันเดียวหลัง]วงเล็บแรก) โดยมี[]วงเล็บอยู่ในข้อความบันทึกและเมื่อมีแอปพลิเคชันที่ไม่ได้ติดแท็กให้ลองใช้งานออนไลน์!

อย่างไร?

ú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 ไบต์

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

อ่านจากไฟล์ที่ตั้งชื่อfและส่งออกเป็นไฟล์หลายไฟล์ตามแท็ก

1 IsmaelMiguel Aug 19 2020 at 19:09

SimpleTemplate 0.84, 109 ไบต์

ใช่มันค่อนข้างยาว แต่ได้ผล!

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

รหัสนี้สร้างอาร์เรย์ด้วย<old content>, line, <end of line>.

{@echoS} แบนอาร์เรย์โดยอัตโนมัติและแสดง


ไม่พอใจ:

ใช่มันเป็นระเบียบ แต่นี่คือเวอร์ชันที่สะอาดกว่า:

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

ฟังก์ชันexplodeนี้เป็นฟังก์ชัน PHP มาตรฐาน แต่สามารถเข้าถึงได้จากภาษาของฉัน


คุณสามารถลองสิ่งนี้ได้ที่: http://sandbox.onlinephpfunctions.com/code/9c66f8bacc6315ae56e7c193170e430f9cf9d902

1 BlackPanther Aug 18 2020 at 20:56

C # (.NET Core) , 181 162 160 ไบต์

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

ลองออนไลน์!

C # (Visual C # Interactive Compiler) , 179 ไบต์

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

ลองออนไลน์!

ฉันไม่แน่ใจว่าโซลูชันแรกสอดคล้องกับ code gulf ดังนั้นโซลูชันที่สองจึงใช้นิพจน์แลมบ์ดา

1 corvus_192 Aug 20 2020 at 03:43

Haskell, 37 ไบต์

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

ลองออนไลน์!

1 corvus_192 Aug 20 2020 at 03:57

สนิม 40 ไบต์

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

ใช้การอ้างอิงที่ไม่แน่นอนไปยังส่วนของสตริงและจัดเรียง

ลองในสนามเด็กเล่นสนิม

DominicvanEssen Aug 18 2020 at 20:30

Perl 5 -M5.10.0 -Msort = เสถียร 53 ไบต์

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

ลองออนไลน์!