로그 줄 인터리브 해제 [중복]
모두 동일한 로그에 출력되는 여러 앱을 실행하는 서버를 상속했습니다.
당신의 임무는 소스별로 로그 파일의 행을 디 인터리브하는 것입니다. 다행히 각 줄은 해당 앱의 출처를 나타내는 태그로 시작합니다.
로그
각 줄은 다음과 같습니다.
[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 또는 파일입니다.
- 분리 된 로그가 출력되는 순서는 관련이 없지만 각 그룹 내의 로그 행은 원본 파일에서 찾은 순서를 유지해야합니다.
답변
Bash , 4 11 바이트
Shaggy가 친절하게 지적한 버그를 수정하기 위해 7 바이트를 추가했습니다 .
sort -sk1,1
온라인으로 시도하십시오!
공백으로 구분 된 s
첫 번째 필드 ( k1,1
)를 기준으로 안정적인 정렬 ( 명령 줄 인수)을 수행합니다 .
R , 50 46 바이트
function(r)split(r,substr(r,1,regexpr("]",r)))
온라인으로 시도하십시오!
list
각 요소 name
d와 함께 a 로 출력 합니다 [tag]
. 각 목록 요소는 태그 내에서 순서를 유지합니다. named list()
빈 입력에 대해 명명 된 빈 목록 을 반환합니다 .
-Robin Ryder와 Dominic van Essen 덕분에 각각 2 바이트!
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])
온라인으로 시도하십시오!
느슨한 I / O를 사용하면 라인 목록을 가져올 수 있습니다. 그룹을 분리 할 필요가 없기 때문에 문제는 각 줄의 접두사에서 첫 번째 공백까지 안정된 종류의 줄을 수행하는 것으로 축소되고 split()
다른 공백 문자에서도 분할되지만 아무것도 존재할 수 없습니다. 애플리케이션 태그 부분.
APL (Dyalog 확장) , 10 바이트 ( SBCS )
익명의 암묵적인 접두사 기능. 문자 목록을 인수로받습니다. 각 행에 로그가 하나씩있는 문자 목록 행렬을 반환합니다.
⊢⊢⌸⍨≠⊃⍤⊆¨⊢
온라인으로 시도하십시오!
⊢
논쟁에서
≠
공백이 아닌 것을 사용하여…
⊆¨
각 목록을 목록 목록으로 분할 (공백 제거, 공백이 아닌 실행 유지),
⊃⍤
그런 다음 첫 번째 [각각] (즉, 태그)을 유지합니다.
⊢⌸⍨
그룹화 할 키로 사용 ...
⊢
논쟁 거리
vim, 13 11 바이트
:sor/\w\+/r
@Dingus 덕분에 버그 수정 및 바이트 저장!
온라인으로 시도하십시오!
스칼라, 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에서 시도해보세요 (어떤 이유로 든 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의 정렬은 안정적이므로 접두사가 같은 줄의 순서가 유지됩니다. 편집 : 앱 태그를 일치시키는 더 쉬운 방법을 지적한 @FryAmTheEggman 덕분에 1 바이트가 저장되었습니다. 일치 항목에 선행은 포함되지 않지만 [
모든 행은로 시작 [
하므로 정렬 결과에 영향을주지 않습니다.
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
되는 순서대로 인쇄 하는 작업입니다 .
Japt , 4 바이트
입력을 라인 배열로 취하고 2D 배열을 출력합니다.
ü_¸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 (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
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 코어) ,
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);}})
온라인으로 시도하십시오!
첫 번째 솔루션이 코드 걸프를 준수하는지 확실하지 않으므로 두 번째 솔루션은 람다 식을 사용합니다.
Haskell, 37 바이트
import Data.List
f=sortOn(head.words)
온라인으로 시도하십시오!
Rust, 40 바이트
|a|a.sort_by_key(|x|x.split("]").next())
문자열 조각에 대한 가변 참조를 가져 와서 정렬합니다.
녹 놀이터에서 시도해보세요
Perl 5 -M5.10.0 -Msort = stable, 53 바이트
say sort{(split('\]',$a))[0]cmp(split('\]',$b))[0]}<>
온라인으로 시도하십시오!