Trình phân tích tệp morgue DCSS


9

Trong thử thách này, bạn cần phân tích các tập tin nhà xác từ trò chơi roguelike Dungeon Crawl Stone Soup và xuất nó thành STDOUT.

Những tập tin nhà xác này là gì ??

Khi bạn chết, một tệp văn bản được tạo với dữ liệu của ký tự đó bên trong. Bạn có thể thấy nhân vật có trang bị gì, những gì đã xảy ra trong vài lượt cuối cùng và anh ta đã giết bao nhiêu quái vật.

Bạn có thể tìm thấy một tập tin nhà xác ví dụ ở đây

Các thách thức

Công việc của bạn là tạo một chương trình lấy một trong những tệp đó từ STDIN, phân tích cú pháp và xuất dữ liệu thành STDOUT.

Để làm cho thử thách này dễ dàng hơn một chút, bạn chỉ phải phân tích khối văn bản đầu tiên. (lên cho đến khiThe game lasted <time> (<turns> turns).

Bạn cần phân tích và xuất các thông tin sau:

  • Số phiên bản.
  • Điểm số.
  • Tên nhân vật, tiêu đề, chủng tộc và đẳng cấp.
  • Cấp độ nhân vật.
  • Nguyên nhân của cái chết / chiến thắng.
  • Số lượt chạy kéo dài.

Thí dụ:

Dungeon Crawl Stone Soup version <version number> character file.

<score> <name> the <title> (level <level>, 224/224 HPs)
         Began as a <race> <class> on Mar 16, 2015.
         Was the Champion of the Shining One.
         <cause of death/victory>

         The game lasted 16:11:01 (<turns> turns).

Các trường hợp thử nghiệm

Trường hợp thử nghiệm 1 - Chiến thắng

Tập tin đầu vào

Ví dụ đầu ra - Chiến thắng:

Version: 0.16.0-8-gd9ae3a8 (webtiles)
Score: 16059087
Name: Ryuzilla the Conqueror
Character: Gargoyle Berserker
Level: 27
Cause of Death/Victory: Escaped with the Orb and 15 runes on Mar 17 2015!
Turns: 97605

Trường hợp thử nghiệm 2 - Cái chết

Tập tin đầu vào

Ví dụ đầu ra - Cái chết:

Version: 0.16-a0-3667-g690a316 (webtiles)
Score: 462
Name: 8Escape the Ruffian
Character: Bearkin Transmuter
Level: 6
Cause of Death/Victory: Slain by an orc wielding a +0 trident (3 damage) on level 4 of the Dungeon.
Turns: 3698

Quy tắc

  • Đây là nên mã ngắn nhất sẽ thắng.
  • Trong trường hợp hòa, câu trả lời cũ nhất sẽ thắng.
  • Không có sơ hở tiêu chuẩn.
  • Nhập tệp phải được lấy từ STDIN
  • Đầu ra phải được gửi đến STDOUT
  • Các nhãn trước đầu ra (ví dụ Turns:) là tùy chọn.

Mã mẫu cho cảm hứng

Mã tạo tập tin Morgue trong DCSS


Liệu đầu ra thực sự cần phải chứa các nhãn dòng như Version:hoặc đủ để xuất các mẩu thông tin theo cùng một thứ tự, mỗi dòng trên mỗi dòng?
Martin Ender

@ MartinBüttner Các nhãn là tùy chọn.
DJgamer98

Cuộc đua và đẳng cấp sẽ luôn luôn là một từ?
Martin Ender

@ MartinBüttner Một số chủng tộc và lớp học có hai từ, như Vine Stalker, Abyssal Knight và Deep Elf.
DJgamer98

2
Có một đặc điểm kỹ thuật của định dạng tập tin nhà xác này, hoặc chỉ những ví dụ này?
Paŭlo Ebermann

Câu trả lời:


3

Perl, 151 byte

148 mã + 3 công tắc ( -0, -l, -p). Tôi chắc chắn rằng điều này có thể được cải thiện :)

Lấy đầu vào từ STDIN và in kết quả khi nhận EOF.

perl -lp0e 's/\.{3}|\s/ /g;y/ //s;$_=join$\,(/(\d.*?).{15}\..(\d+).(.+?).\(.+?(\d+).+?\b(?:a|an) (.+?) o.+? ([^.!]+[.!])[^.!]*?(\d+)[^(]+\)..\3/)[0..2,4,3,5..7]'

Ung dung:

use strict;
use warnings;

# set the input record separator to undef (the -0 switch)
$/=undef;
# read the text (the -l switch)
$_=<STDIN>;

# replace all '...' and spaces by a ' '
s/\.{3}|\s/ /g;
# squeeze all contiguous spaces into a single space
y/ //s;
# collect the captured groups into @p
my @p=
/(\d.*?).{15}\..      # version is the first string starting with a digit and ending 15 characters before the period
 (\d+).               # points is the next string with only digits
 (.+?).\(.+?          # name starts after a gap of one character
 (\d+).+?\b(?:a|an)\s # level is inside the next open paranthesis
 (.+?)\so.+?\s        # race, class occur after the 'a' or 'an' and end before ' o' i.e. (' on')
 ([^.!]+[.!])[^.!]*?  # cause of death is the a sentence ending with '.' or '!'
 (\d+)[^(]+\)..\3     # turns is the next sentence with digits within parantheses, followed by 2 characters and the player's name
/x;
$_=join"\n",@p[0..2,4,3,5..7]; # the level and race lines need to be swapped

# print the output (the -p switch)
print $_;

ideone.com


3

F #, 377 byte

open System.Text.RegularExpressions
let s=System.String.IsNullOrWhiteSpace>>not
let m f=Regex.Match((f+"").Split[|'\r';'\n'|]|>Seq.filter s|>Seq.take 8|>Seq.reduce(fun a z->a+z.Trim()), ".*n (.*) c.*\.([0-9]+) (.*) \(l.* (.*),.*a (.*) o.*\.(?:(S.*)|W.*(E.*)).*.T.*\((.*) .*\).").Groups|>Seq.cast<Group>|>Seq.skip 1|>Seq.map(fun z ->z.Value)|>Seq.filter s|>Seq.iter(printfn"%s")

3

Javascript (ES6), 297 230 byte

Cho đến nay, đây là một biểu thức chính quy hướng thử nghiệm.

Nó chỉ đơn giản là thay thế các thông tin không mong muốn và giữ những thứ quan trọng.

Nó tạo ra một hàm ẩn danh chỉ đơn giản trả về văn bản mong muốn.

_=>_.replace(/^.+version(.*) character file\.([\n\r]+)(\d+)([^\(]+) \([^\d]+( \d+),.+\n\s+.+as a(.+) on.+\n\s+(?:Was.+One\.\n)?((?:.|\n)+[!.])\n(?:.|\n)+\((\d+)(?:.|\n)+$/,'$1\n$3\n‌​$4\n$6\n$5\n$7\n$8').replace(/\s+(\.{3} ?)?/,' ')

Nó không phải là một con thú?


Cảm ơn lời khuyên của sysreq về các nhãn là tùy chọn. Điều đó đã tiết kiệm cho tôi 67 byte !


Bạn có thể kiểm tra biểu thức resulgar trên: https://regex101.com/r/zY0sQ0/1


Các nhãn là tùy chọn; bạn có thể lưu khá nhiều byte bằng cách bỏ qua chúng.
con mèo

1
@sysreq Cái gì ...?
Ismael Miguel


2
Tôi đang nói _=>_.replace(/^.+version(.*) character file\.([\n\r]+)(\d+)([^\(]+) \([^\d]+( \d+),.+\n\s+.+as a(.+) on.+\n\s+(?:Was.+One\.\n)?((?:.|\n)+[!.])\n(?:.|\n)+\((\d+)(?:.|\n)+$/,'$1\n$3\n$4\n$6\n$5\n$7\n$8').replace(/\s+(\.{3} ?)?/,' ')là một giải pháp chấp nhận được chỉ với 230 byte
con mèo

1
@sysreq Xin lỗi vì mất quá nhiều thời gian để nói bất cứ điều gì. Tôi đã nhìn thấy bài viết nhưng tôi đang ở trên một máy tính bảng. Bạn không biết làm thế nào là đau đớn để làm bất cứ điều gì trong một máy tính bảng. Tôi đã thay thế mã của tôi bằng phiên bản không có nhãn của bạn. Cảm ơn rất nhiều cho tiền boa.
Ismael Miguel

2

Python3, 472 byte

Tôi nghĩ rằng tôi có thể có được điều này ngắn hơn nhiều. Không ngạc nhiên khi tôi đánh bại sự phục tùng của chính mình. Chạy nó như thế nào python3 dcss.py morgue-file.txt.

import sys
n="\n"
s=" "
f=open(sys.argv[1],'r').read().split(n)[:11]
m=range
a=len
d=","
for i in m(a(f)):
 f[i]=f[i].split(s)
 for x in m(a(f[i])):
  f[i][x]=f[i][x].strip()
h=f[0]
g=f[10]
k=f[2]
def r(j,u):
 j=list(j)
 while u in j:
  j.remove(u)
 return"".join(j)
def l(x):
 c=s
 for i in m(a(x)):
  c+=x[i]+s
 return c.strip()
print(h[6]+s+h[7]+n+k[0]+n+g[0]+s+g[1]+s+g[2]+n+r(g[3],"(")+s+r(g[4],")")+n+r(k[5],d)+n+r(l(f[4])+l(f[5])+l(f[6])+l(f[7]),".")+n+r(g[17],d))

2

Đi, 589 502 489 487 byte

package main;import(."fmt";."io/ioutil";"os";."strings");func d(z,ch string)string{return Map(func(r rune)rune{if IndexRune(ch,r)<0{return r};return -1},z)};func main(){x:=Split;f,_:=ReadFile(os.Args[1]);n:="\n";l:=" ";m:=",";h:=".";q:=x(string(f),n)[:11];k:=x(q[0],l);y:=x(q[10],l);u:=x(q[2],l);g:="";for _,e:=range Fields(d(q[4],n+h)+l+d(q[5],n+h)+l+d(q[6],n+h)+l+d(q[7],n+h)){g=g+e+l};Print(k[6]+l+k[7]+n+u[0]+n+y[0]+l+y[1]+l+y[2]+n+d(y[3]+l+y[4],"()")+n+d(u[5],m)+n+g+n+d(y[17],m))}

sau khi chạy go fmt, go fixgo vetđây là phiên bản "vô dụng":

package main

import (
    . "fmt"
    . "io/ioutil"
    "os"
    . "strings"
)

func d(z, ch string) string {
    return Map(func(r rune) rune {
        if IndexRune(ch, r) < 0 {
            return r
        }
        return -1
    }, z)
}
func main() {
    x := Split
    f, _ := ReadFile(os.Args[1])
    n := "\n"
    l := " "
    m := ","
    h := "."
    q := x(string(f), n)[:11]
    k := x(q[0], l)
    y := x(q[10], l)
    u := x(q[2], l)
    g := ""
    for _, e := range Fields(d(q[4], n+h) + l + d(q[5], n+h) + l + d(q[6], n+h) + l + d(q[7], n+h)) {
        g = g + e + l
    }
    Print(k[6] + l + k[7] + n + u[0] + n + y[0] + l + y[1] + l + y[2] + n + d(y[3]+l+y[4], "()") + n + d(u[5], m) + n + g + n + d(y[17], m))
}

Chỉnh sửa: sử dụng dấu chấm nhập giúp ích rất nhiều.

Khá tự giải thích nhưng tôi có thể giải thích nếu cần. Đây là chương trình 'thực tế' đầu tiên của tôi và tôi vẫn là người mới bắt đầu học codegolf vì vậy các mẹo được chào đón!

Chỉnh sửa: bạn đã nói "lấy tệp từ STDIN" và bạn có thể chạy tập lệnh này (nếu bạn đã cài đặt) bằng cách chạy go install <foldername>và sau đó <binaryname> morgue-file.txthoặcgo run main.go morgue.txt

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.