ยกเลิกการสลับบรรทัดบันทึก [ซ้ำกัน]
คุณได้รับช่วงเซิร์ฟเวอร์ที่รันแอพหลายตัวซึ่งส่งออกไปยังบันทึกเดียวกันทั้งหมด
งานของคุณคือการยกเลิกการแทรกระหว่างบรรทัดของไฟล์บันทึกตามแหล่งที่มา โชคดีที่แต่ละบรรทัดขึ้นต้นด้วยแท็กที่ระบุว่ามาจากแอปใด
บันทึก
แต่ละบรรทัดจะมีลักษณะดังนี้:
[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 หรือไฟล์
- ลำดับที่เอาต์พุตบันทึกที่แยกจากกันเป็นเอาต์พุตไม่เกี่ยวข้องอย่างไรก็ตามรายการบันทึกภายในแต่ละกลุ่มจะต้องรักษาลำดับที่พบในไฟล์ต้นฉบับ
คำตอบ
Bash , 4 11 ไบต์
เพิ่ม 7 ไบต์เพื่อแก้ไขข้อผิดพลาดกรุณาแหลมออกโดยปุย
sort -sk1,1
ลองออนไลน์!
ดำเนินการจัดเรียงแบบคงที่ ( s
อาร์กิวเมนต์บรรทัดคำสั่ง) ตามฟิลด์แรก ( k1,1
) คั่นด้วยช่องว่าง
R , 50 46 ไบต์
function(r)split(r,substr(r,1,regexpr("]",r)))
ลองออนไลน์!
เอาต์พุตเป็น a list
กับแต่ละองค์ประกอบname
d พร้อมด้วย[tag]
. องค์ประกอบรายการแต่ละรายการรักษาลำดับภายในแท็ก ส่งกลับรายการที่มีชื่อnamed list()
ว่างสำหรับอินพุตว่าง
-2 ไบต์ขอบคุณ Robin Ryder และ Dominic van Essen!
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
: แต่ละสตริงแบ่งช่องว่าง
Python 44 ไบต์
lambda a:sorted(a,key=lambda l:l.split()[0])
ลองออนไลน์!
Loose I / O ช่วยให้เราสามารถรับและส่งผลให้รายการบรรทัด เนื่องจากเราไม่ต้องแยกกลุ่มปัญหาจึงลดลงเป็นการจัดเรียงบรรทัดที่มั่นคงบนคำนำหน้าของแต่ละบรรทัดจนถึงช่องว่างแรกsplit()
จะแบ่งที่อักขระเว้นวรรคอื่น ๆ ด้วย แต่ไม่มีเลยใน ส่วนแท็กแอปพลิเคชัน
APL (Dyalog Extended) , 10 ไบต์ ( SBCS )
ฟังก์ชันคำนำหน้าโดยปริยายแบบไม่ระบุชื่อ รับรายชื่อรายการอักขระเป็นอาร์กิวเมนต์ ส่งคืนเมทริกซ์ของรายการอักขระโดยมีบันทึกหนึ่งรายการในแต่ละแถว
⊢⊢⌸⍨≠⊃⍤⊆¨⊢
ลองออนไลน์!
⊢
ในการโต้แย้ง
≠
ใช้ช่องว่างเพื่อ ...
⊆¨
แบ่งแต่ละรายการออกเป็นรายการ (ลบช่องว่างเก็บข้อมูลที่ไม่ใช่ช่องว่าง)
⊃⍤
จากนั้นเก็บ [ของแต่ละรายการ] (เช่นแท็ก)
⊢⌸⍨
ใช้เป็นกุญแจในการจัดกลุ่ม ...
⊢
การโต้แย้ง
เป็นกลุ่ม13 11 ไบต์
:sor/\w\+/r
bugfix และ byte บันทึกขอบคุณ @Dingus!
ลองออนไลน์!
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 ไบต์หากต้องเป็นอักขระขึ้นบรรทัดใหม่เพียงตัวเดียว) อินพุตคือรายการสตริงและเอาต์พุตคือสตริงขนาดใหญ่หนึ่งสตริง
05AB1E , 3 ไบต์
Σ#¬
อินพุตและเอาต์พุตคือรายการบันทึก
คำอธิบาย:
Σ#¬
Σ Sort by:
# Split (each log) by spaces
¬ Head (which is the tagname)
นอกจากนี้ยังรักษาลำดับของบันทึกตามความจำเป็น
ลองออนไลน์!
Retina 0.8.2 , 14 13 ไบต์
O$`(\w+).* $1
ลองออนไลน์! คำอธิบาย: เนื่องจากไม่จำเป็นต้องใช้ตัวคั่นกลุ่มเอาต์พุตบรรทัดจะถูกจัดเรียงตามแท็กแอปซึ่งทำได้โดยการจับคู่ที่ตรงกัน\w+
และระบุ$1
เป็นคีย์การจัดเรียง การจัดเรียงใน Retina มีความเสถียรดังนั้นบรรทัดที่มีคำนำหน้าเหมือนกันจะยังคงลำดับ แก้ไข: บันทึก 1 ไบต์ขอบคุณ @FryAmTheEggman ที่ชี้ให้เห็นวิธีที่ง่ายกว่าในการจับคู่แท็กแอป โปรดทราบว่าแม้ว่าการจับคู่จะไม่มีการนำหน้า[
แต่บรรทัดทั้งหมดจะเริ่มต้นด้วย[
ดังนั้นจึงไม่ส่งผลต่อผลลัพธ์ของการจัดเรียง
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
จัดกลุ่มตามฟิลด์แรกตามลำดับการปรากฏ
Japt , 4 ไบต์
รับอินพุตเป็นอาร์เรย์ของบรรทัดเอาต์พุต 2D-array
ü_¸g
ลองมัน
Io , 73 ไบต์
method(i,i map(split first)unique map(I,i select(split first==I))flatten)
ลองออนไลน์!
Perl 6 , 16 ไบต์
*.sort:{~m/\w+/}
ลองออนไลน์!
จัดเรียงตามสตริงแรกของอักขระที่เป็นตัวเลขและตัวอักษรซึ่งควรเป็นชื่อแอป
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]]
ลองออนไลน์!
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
AutoHotkey 74 ไบต์
Loop,Read,f
{
s:=A_LoopReadLine
FileAppend,%s%`n,% StrSplit(s,"]","[")[1]
}
อ่านจากไฟล์ที่ตั้งชื่อf
และส่งออกเป็นไฟล์หลายไฟล์ตามแท็ก
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
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 ดังนั้นโซลูชันที่สองจึงใช้นิพจน์แลมบ์ดา
Haskell, 37 ไบต์
import Data.List
f=sortOn(head.words)
ลองออนไลน์!
สนิม 40 ไบต์
|a|a.sort_by_key(|x|x.split("]").next())
ใช้การอ้างอิงที่ไม่แน่นอนไปยังส่วนของสตริงและจัดเรียง
ลองในสนามเด็กเล่นสนิม
Perl 5 -M5.10.0 -Msort = เสถียร 53 ไบต์
say sort{(split('\]',$a))[0]cmp(split('\]',$b))[0]}<>
ลองออนไลน์!