로그 줄 인터리브 해제 [중복]

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

미리 앱 태그의 이름이 제공되지 않습니다. 로그 파일을 분석하여 확인해야합니다.

규칙 및 점수

  • 이것은 code-golf 이므로 가장 짧은 코드가 이깁니다.
  • 표준 규칙 및 허점 적용
  • 각 입력 행이 미리 구문 분석 된 태그 + 메시지가 아닌 문자열로 표시된다면 편리한 IO 형식을 사용하십시오. 허용되는 출력의 전체 목록 :
    • 각 태그 뒤에 이름이 지정된 여러 파일
    • 여러 문자열 목록
    • 구분 기호가 있거나없는 태그로 그룹화 된 행을 포함하는 하나의 연결된 문자열 목록 (구분자는 태그로 시작하면 안 됨)
    • 위와 동일하지만 stdout 또는 파일입니다.
  • 분리 된 로그가 출력되는 순서는 관련이 없지만 각 그룹 내의 로그 행은 원본 파일에서 찾은 순서를 유지해야합니다.

답변

9 Noodle9 Aug 18 2020 at 03:22

Bash , 4 11 바이트

Shaggy가 친절하게 지적한 버그를 수정하기 위해 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)))

온라인으로 시도하십시오!

list각 요소 named와 함께 a 로 출력 합니다 [tag]. 각 목록 요소는 태그 내에서 순서를 유지합니다. named list()빈 입력에 대해 명명 된 빈 목록 을 반환합니다 .

-Robin Ryder와 Dominic van Essen 덕분에 각각 2 바이트!

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

온라인으로 시도하십시오!

느슨한 I / O를 사용하면 라인 목록을 가져올 수 있습니다. 그룹을 분리 할 필요가 없기 때문에 문제는 각 줄의 접두사에서 첫 번째 공백까지 안정된 종류의 줄을 수행하는 것으로 축소되고 split()다른 공백 문자에서도 분할되지만 아무것도 존재할 수 없습니다. 애플리케이션 태그 부분.

3 Adám Aug 18 2020 at 01:49

APL (Dyalog 확장) , 10 바이트 ( SBCS )

익명의 암묵적인 접두사 기능. 문자 목록을 인수로받습니다. 각 행에 로그가 하나씩있는 문자 목록 행렬을 반환합니다.

⊢⊢⌸⍨≠⊃⍤⊆¨⊢

온라인으로 시도하십시오!

 논쟁에서

 공백이 아닌 것을 사용하여…

⊆¨ 각 목록을 목록 목록으로 분할 (공백 제거, 공백이 아닌 실행 유지),

⊃⍤ 그런 다음 첫 번째 [각각] (즉, 태그)을 유지합니다.

⊢⌸⍨ 그룹화 할 키로 사용 ...

 논쟁 거리

3 nmjcman101 Aug 18 2020 at 03:14

vim, 13 11 바이트

:sor/\w\+/r

@Dingus 덕분에 버그 수정 및 바이트 저장!

온라인으로 시도하십시오!

3 user Aug 18 2020 at 01:28

스칼라, 26 바이트

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

List[String]사이에 구분 기호가없는를 반환 하지만 태그별로 정렬됩니다.

Scastie에서 시도


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에서 시도해보세요 (어떤 이유로 든 sTIO에서 작동하지 않음)

각 앱의 로그는 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의 정렬은 안정적이므로 접두사가 같은 줄의 순서가 유지됩니다. 편집 : 앱 태그를 일치시키는 더 쉬운 방법을 지적한 @FryAmTheEggman 덕분에 1 바이트가 저장되었습니다. 일치 항목에 선행은 포함되지 않지만 [모든 행은로 시작 [하므로 정렬 결과에 영향을주지 않습니다.

2 Noodle9 Aug 18 2020 at 03:42

AWK , 62 58 바이트

Dominic van Essen 덕분에 4 바이트 절약 !!!

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

온라인으로 시도하십시오!

모든 선을 2D 연관 배열에 저장합니다 a. 첫 번째 키는 첫 번째 필드 (공백으로 구분)입니다. 따라서 동일한 필드로 시작하는 모든 행이 함께 저장됩니다. 두 번째 키는 증가하는 정수 인덱스입니다. 가장 장황한 부분은 첫 번째 필드별로 그룹화 된 END내용을 표시 a되는 순서대로 인쇄 하는 작업입니다 .

1 Shaggy Aug 18 2020 at 01:32

Japt , 4 바이트

입력을 라인 배열로 취하고 2D 배열을 출력합니다.

ü_¸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 (vim) , 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 코어) , 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 # 대화 형 컴파일러) , 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);}})

온라인으로 시도하십시오!

첫 번째 솔루션이 코드 걸프를 준수하는지 확실하지 않으므로 두 번째 솔루션은 람다 식을 사용합니다.

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

Rust, 40 바이트

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

문자열 조각에 대한 가변 참조를 가져 와서 정렬합니다.

녹 놀이터에서 시도해보세요

DominicvanEssen Aug 18 2020 at 20:30

Perl 5 -M5.10.0 -Msort = stable, 53 바이트

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

온라인으로 시도하십시오!