Pengurai file kamar mayat DCSS

9

Dalam tantangan ini, Anda perlu mengurai file kamar mayat dari game roguelike Dungeon Crawl Stone Soup dan meng -output-nya ke STDOUT.

Apa file kamar mayat ini ??

Ketika Anda mati, file teks dihasilkan dengan data karakter di dalamnya. Anda dapat melihat peralatan apa yang dimiliki karakter, apa yang terjadi selama beberapa putaran terakhir, dan berapa banyak monster yang telah dia bunuh.

Anda dapat menemukan contoh file kamar mayat di sini

Tantangan

Tugas Anda adalah membuat program yang mengambil salah satu file dari STDIN, mem-parsingnya, dan menampilkan data ke STDOUT.

Untuk membuat tantangan ini sedikit lebih mudah, Anda hanya perlu menguraikan blok teks pertama. (hinggaThe game lasted <time> (<turns> turns).

Anda perlu mengurai dan menampilkan informasi berikut:

  • Nomor versi.
  • Nilai.
  • Nama karakter, judul, ras, dan kelas.
  • Tingkat karakter.
  • Penyebab kematian / kemenangan.
  • Jumlah putaran proses berlangsung.

Contoh:

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

Uji Kasus

Uji kasus 1 - Kemenangan

Masukkan file

Contoh hasil - Kemenangan:

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

Uji kasus 2 - Kematian

Masukkan file

Contoh output - Kematian:

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

Aturan

  • Ini adalah sehingga kode terpendek menang.
  • Dalam hal seri, jawaban tertua menang.
  • Tidak ada celah standar.
  • Input file harus diambil dari STDIN
  • Output harus dikirim ke STDOUT
  • Label sebelum output (mis. Turns:) Adalah opsional.

Kode sampel tidak terinspirasi untuk inspirasi

Kode pembuatan file Morgue dalam DCSS

DJgamer98
sumber
Apakah output benar-benar perlu mengandung label garis suka Version:atau cukup untuk menampilkan potongan-potongan informasi dalam urutan yang sama, satu per baris?
Martin Ender
@ MartinBüttner Label adalah opsional.
DJgamer98
Apakah perlombaan dan kelas akan selalu menjadi satu kata masing-masing?
Martin Ender
@ MartinBüttner Beberapa ras dan kelas adalah dua kata, seperti Vine Stalker, Abyssal Knight, dan Deep Elf.
DJgamer98
2
Apakah ada spesifikasi format file kamar mayat ini, atau hanya contoh-contoh ini?
Paŭlo Ebermann

Jawaban:

3

Perl, 151 byte

148 kode + 3 sakelar ( -0, -l, -p). Saya yakin ini bisa diperbaiki :)

Mengambil input dari STDIN dan mencetak hasilnya saat menerima 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]'

Tidak Disatukan:

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

svsd
sumber
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")
surut
sumber
3

Javascript (ES6), 297 230 byte

Untuk saat ini, ini adalah ekspresi reguler yang digerakkan oleh tes.

Itu hanya menggantikan info yang tidak diinginkan dan menyimpan hal-hal penting.

Ini menciptakan fungsi anonim yang hanya mengembalikan teks yang diinginkan.

_=>_.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} ?)?/,' ')

Bukankah itu binatang buas?


Terima kasih atas tip sysreq tentang label yang opsional. Itu menyelamatkan saya 67 byte !


Anda dapat menguji ekspresi resulgar di: https://regex101.com/r/zY0sQ0/1

Ismael Miguel
sumber
Label itu opsional; Anda dapat menyimpan beberapa byte dengan menghilangkannya.
kucing
1
@sysreq Apa ...?
Ismael Miguel
2
Saya katakan _=>_.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} ?)?/,' ')adalah solusi yang dapat diterima hanya dengan 230 byte
cat
1
@sysreq Maaf sudah terlalu lama mengatakan sesuatu. Saya telah melihat posting tetapi saya sedang menggunakan tablet. Anda tidak tahu betapa menyakitkannya melakukan apa pun di tablet. Saya telah mengganti kode saya dengan versi tanpa label Anda. Terima kasih banyak atas tipnya.
Ismael Miguel
2

Python3, 472 byte

Saya pikir saya bisa mendapatkan ini jauh lebih pendek. Tidak heran saya mengalahkan kiriman saya sendiri. Jalankan seperti 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))
kucing
sumber
2

Pergi, 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))}

setelah berjalan go fmt,, go fixdan go vetini adalah versi "ungolfed:

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

Sunting: menggunakan dot-impor sangat membantu.

Cukup jelas tetapi saya bisa menjelaskan jika perlu. Ini adalah program Go 'nyata' pertama saya dan saya masih pemula di codegolf sehingga tipsnya dapat diterima!

Sunting: Anda mengatakan "ambil file dari STDIN", dan Anda dapat menjalankan skrip ini (jika sudah diinstal) dengan menjalankan go install <foldername>lalu <binaryname> morgue-file.txtataugo run main.go morgue.txt

kucing
sumber