DCSS मुर्दाघर फ़ाइल पार्सर


9

इस चुनौती में, आपको रग्गुलाइक गेम डंगऑन क्रॉल स्टोन सूप से मुर्दाघर फ़ाइलों को पार्स करने और इसे एसटीडीयूएसटी में आउटपुट करने की आवश्यकता है।

क्या हैं ये मुर्दाघर की फाइलें ??

जब आप मर जाते हैं, तो उस चरित्र के डेटा के साथ एक पाठ फ़ाइल उत्पन्न होती है। आप देख सकते हैं कि चरित्र में कौन से उपकरण थे, पिछले कुछ मोड़ के दौरान क्या हुआ और उसने कितने राक्षसों को मार डाला।

आप यहाँ एक उदाहरण मुर्दाघर फ़ाइल पा सकते हैं

चुनौती

आपका काम एक ऐसा प्रोग्राम बनाना है जो STDIN की उन फ़ाइलों में से एक को लेता है, उसे पार्स करता है, और डेटा को STDOUT में आउटपुट करता है।

इस चुनौती को थोड़ा आसान बनाने के लिए, आपको केवल पाठ के पहले ब्लॉक को पार्स करना होगा। (जब तकThe game lasted <time> (<turns> turns).

आपको निम्नलिखित जानकारी को पार्स और आउटपुट करने की आवश्यकता है:

  • संस्करण संख्या।
  • स्कोर।
  • चरित्र का नाम, शीर्षक, जाति और वर्ग।
  • चरित्र का स्तर।
  • मृत्यु / विजय का कारण।
  • रन की राशि चली।

उदाहरण:

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

परीक्षण के मामलों

टेस्ट केस 1 - विजय

इनपुट फ़ाइल

उदाहरण आउटपुट - विजय:

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

टेस्ट केस 2 - मौत

इनपुट फ़ाइल

उदाहरण आउटपुट - मृत्यु:

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

नियम

  • ये है इसलिए सबसे छोटा कोड जीतता है।
  • एक टाई की स्थिति में, सबसे पुराना उत्तर जीत जाता है।
  • कोई मानक खामियां नहीं हैं।
  • फ़ाइल इनपुट STDIN से लिया जाना चाहिए
  • आउटपुट को STDOUT पर भेजा जाना चाहिए
  • आउटपुट (पूर्व Turns:) से पहले के लेबल वैकल्पिक हैं।

प्रेरणा के लिए Ungolfed नमूना कोड

DCSS में Morgue फ़ाइल पीढ़ी कोड


क्या आउटपुट को वास्तव में लाइन लेबल्स की आवश्यकता होती है जैसे Version:या एक ही क्रम में सूचना के टुकड़ों को एक पंक्ति में आउटपुट करने के लिए पर्याप्त है?
मार्टिन एंडर

@ MartinBüttner लेबल वैकल्पिक हैं।
डीजेगमेर 98

क्या जाति और वर्ग हमेशा एक-एक शब्द होंगे?
मार्टिन एंडर

@ मार्टिनबटनर कुछ दौड़ और कक्षाएं दो शब्द हैं, जैसे वाइन स्टाकर, एबिसल नाइट और डीप एल्फ।
डीजेगमर 9898

2
क्या इस मुर्दाघर फ़ाइल प्रारूप का एक विनिर्देश है, या सिर्फ इन उदाहरण हैं?
पाओलो एबरमन

जवाबों:


3

पर्ल, 151 बाइट्स

148 कोड + 3 स्विच ( -0, -l, -p)। मुझे यकीन है कि इसमें सुधार किया जा सकता है :)

एसटीडीआईएन से इनपुट लेता है और ईओएफ प्राप्त करने पर परिणाम प्रिंट करता है।

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

Ungolfed:

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

एफ #, 377 बाइट्स

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

जावास्क्रिप्ट (ES6), 297 230 बाइट्स

अभी के लिए, यह एक परीक्षण-संचालित नियमित अभिव्यक्ति है।

यह केवल अवांछित जानकारी को बदल देता है और महत्वपूर्ण सामान रखता है।

यह एक अनाम फ़ंक्शन बनाता है जो बस वांछित पाठ लौटाता है।

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

क्या यह जानवर नहीं है?


वैकल्पिक होने के बारे में sysreq की टिप के लिए धन्यवाद । कि मुझे 67 बाइट्स बचा लिया !


आप resulgar अभिव्यक्ति का परीक्षण: https://regex101.com/r/zY0sQ0/1 पर कर सकते हैं


लेबल वैकल्पिक हैं; आप उन्हें छोड़ कर काफी कुछ बाइट्स बचा सकते हैं।
बिल्ली

1
@sysreq क्या ...?
इस्माइल मिगुएल


2
मैं कह रहा हूं कि _=>_.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} ?)?/,' ')सिर्फ 230 बाइट्स में एक स्वीकार्य समाधान है
बिल्ली

1
@sysreq कुछ भी कहने के लिए इतना समय लेने के लिए क्षमा करें। मैं पोस्ट देख रहा हूं लेकिन मैं एक टैबलेट पर था। आपको इस बात का कोई अंदाजा नहीं है कि टैबलेट में कुछ भी करना कितना दर्दनाक है। मैंने अपना कोड आपके लेबल-कम संस्करण के साथ बदल दिया है। टिप के लिए बहुत बहुत धन्यवाद।
इस्माइल मिगुएल

2

पायथन 3, 472 बाइट्स

मैंने सोचा कि मैं इसे बहुत कम समय में प्राप्त कर सकूंगा। आश्चर्य नहीं कि मैंने अपनी अधीनता को हरा दिया, हालाँकि। इसे वैसे ही चलाएं 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

गो, 589 502 489 487 बाइट्स

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

चलाने के बाद go fmt, go fixऔर go vetयहाँ "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))
}

संपादित करें: डॉट-आयात का उपयोग करने से बहुत मदद मिलती है।

सुंदर आत्म-व्याख्यात्मक लेकिन मैं समझा सकता हूं कि अगर जरूरत हो। यह मेरा पहला 'वास्तविक' गो कार्यक्रम है और मैं अभी भी कोडगुल्फ़ में एक शुरुआत कर रहा हूँ, इसलिए सुझावों का स्वागत है!

संपादित करें: आपने कहा कि "STDIN से एक फ़ाइल ले लो", और आप इस स्क्रिप्ट को चला सकते हैं (यदि आप स्थापित हो गए हैं) go install <foldername>और फिर <binaryname> morgue-file.txtयाgo run main.go morgue.txt

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.