ডিসিএসএস মর্গ ফাইল পার্সার


9

এই চ্যালেঞ্জে আপনাকে রোগুয়ালাইক গেম ডানজিওন ক্রল স্টোন স্যুপ থেকে মুরগের ফাইলগুলি পার্স করে এটিকে স্টটআউটে আউটপুট করতে হবে।

এই মর্গ ফাইলগুলি কি ??

আপনি যখন মারা যান, তখন একটি অক্ষরের ফাইল ভিতরে character অক্ষরের ডেটা তৈরি হয় generated আপনি দেখতে পাচ্ছেন চরিত্রটি কী সরঞ্জাম ছিল, শেষ কয়েকটি টার্নের সময় কী ঘটেছিল এবং তিনি কত দানবকে হত্যা করেছেন।

আপনি এখানে মর্গ ফাইলের একটি উদাহরণ খুঁজে পেতে পারেন

চ্যালেঞ্জ

আপনার কাজটি এমন একটি প্রোগ্রাম তৈরি করা যা 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:) এর আগে লেবেলগুলি al চ্ছিক।

অনুপ্রেরণার জন্য অবহেলিত নমুনা কোড

ডিসিএসএস-এ মর্গ ফাইল জেনারেশন কোড


আউটপুটটিতে আসলে লাইন লেবেলগুলির মতো লাইন লেবেল থাকা দরকার Version:বা একই ক্রমে তথ্যের টুকরো আউটপুট দেওয়ার জন্য যথেষ্ট, প্রতি লাইনে একটি?
মার্টিন ইন্ডার

@ মার্টিনব্যাটনার লেবেলগুলি alচ্ছিক।
DJgamer98

প্রতিযোগিতা এবং শ্রেণি সর্বদা প্রতিটি শব্দ হবে?
মার্টিন ইন্ডার

@ মার্টিনব্যাটনার কিছু রেস এবং ক্লাস দুটি শব্দ দুটি যেমন ভাইন স্ট্যালকার, অ্যাবিসাল নাইট এবং ডিপ এলফ।
DJgamer98

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

এটা কি জন্তু নয়?


লেবেলগুলি alচ্ছিক হওয়া সম্পর্কে সিসেরেকের পরামর্শের জন্য ধন্যবাদ । এটি আমাকে 67 বাইট বাঁচিয়েছে !


আপনি পুনঃসংশ্লিষ্ট এক্সপ্রেশনটি এখানে পরীক্ষা করতে পারেন: https://regex101.com/r/zY0sQ0/1


লেবেলগুলি alচ্ছিক; আপনি বাদ দিয়ে বেশ কয়েকটি বাইট সংরক্ষণ করতে পারেন।
বিড়াল

1
@ সিসেরিক কি ...?
ইসমাইল মিগুয়েল


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
@ সিসেরেক কিছু বলার জন্য এত দিন দেওয়ার জন্য দুঃখিত। আমি পোস্টটি দেখতে পেয়েছি তবে আমি একটি ট্যাবলেটে ছিলাম। ট্যাবলেটে কিছু করা কত কষ্টকর তা আপনার ধারণা নেই idea আমি আমার কোডটি আপনার লেবেল-কম সংস্করণ দিয়ে প্রতিস্থাপন করেছি। টিপটির জন্য অনেক ধন্যবাদ।
ইসমাইল মিগুয়েল

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.