高尔夫 - 在文本文件中展开模板

时间:2009-04-13 17:25:18

标签: code-golf

高尔夫 - 实施简单的模板方案。

扩展是:

  • %KEY% - > VALUE
  • %% - > %

命令行参数:

  • ARG1:字典文件,格式为key=value样式,如示例
  • ARG2:模板文件

这里我不太高尔夫球(python):261个角色。

import sys
dd = dict([ll.split("=",2) for ll in open( sys.argv[1],'r') if len(ll.split("=", 2)) == 2])
tt = "".join([ ll for ll in open( sys.argv[2],'r')])
sys.stdout.write("".join([(((s == "") and "%") or ((s in dd) and dd[s]) or s) for s in tt.split("%")]))

DICT

NAME=MyName
ODDS=100

模板

I, %NAME% am %ODDS% %% sure that that this a waste of time.

结果

I, My Name am 100 % sure that this is a waste of time.

是的,我意识到这是一个有缺陷的模板系统,“快照”以实现更短更好的实施。

5 个答案:

答案 0 :(得分:2)

在Python中,您可以利用内置的字符串格式来缩短它。只需要一点正则表达式黑客来获得匹配的语法。

import sys, re
sys.stdout.write(re.sub(r'%(.+?)%',r'%(\1)s',open(sys.argv[2]).read())%dict(l.split("=",2) for l in open(sys.argv[1],'r')))

低至139个字节。 (虽然args / file-IO的东西可能不应该成为高尔夫挑战的一部分吗?)

答案 1 :(得分:1)

C#。

string s = "NAME=MyName ODDS=100"; // any whitespace separates entries
string t = "I, %NAME% am %ODDS% %% sure that that this a waste of time.";

foreach(var p in s.Split().Select(l=>l.Split('=')).ToDictionary(
e=>"%"+e[0]+"%",e=>e[1]))t=t.Replace(p.Key,p.Value);t=t.Replace("%%","%");
Console.WriteLine(t);

我认为这是算法部分的159。请注意,如果您输入类似“NAME = %%”的内容(它会将%%进一步折叠为%),这可能会产生意外结果,但任何简短的算法都会表现出这样或那样的行为,因为您有以某种顺序进行字符串替换。

答案 2 :(得分:1)

在vc ++ ..中可能是最快的方式:)

void customFormat(const char* format, char dicItemSep, char dicValueSep, const char* dic, char* out)
{
    if(out)
    {
        const char x = '%';
        while(*format)
        {
            while(*format && *format != x)*out++=*format++;
        if(!*format || !*(++format))goto exit;
            if(*format == x)
            {
                *out++=x;
                continue;
            }
            const char *first = format;
            const char *d = dic;
            while(*first)
            {
                while(*d)
                {
                    while(*d && (*d != *first))d++;
                    if(*d == *first)
                    {
                        while((*first++ == *d++) && (*d != dicValueSep));
                        if(!*first)goto exit;
                        if(*d != dicValueSep || *first != x)
                        {
                            first = format;
                            while(*d && (*d != dicItemSep))d++;
                            continue;
                        }
                        break;
                    }
                }
                if(!*d)break;
                d++;
                while((*d != dicItemSep) && *d && (*out++ = *d++));
                format = ++first;
                break;
            }
        }
    exit:
        *out = 0;
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    char t[1024];
    customFormat
        (
            "%NAME% am %ODDS% %% sure that that this a waste of time.",
            '\n',
            '=',
            "NAME=MyName\nODDS=100",
            t
        );
    printf("%s", t);
}

答案 3 :(得分:0)

Ruby,114个字符

d=Hash[*[open(ARGV[0]).read.scan(/(.+)=(.*)/),'','%'].flatten]
print open(ARGV[1]).read.gsub(/%([^%]*)%/){d[$1]}

答案 4 :(得分:0)

这个问题并不是真正的答案,但我希望你意识到,如果你需要这个任何类型的真实任务,Python有一个更易读的模板格式{{1} }

{variable}

如果需要,您可以保留字典格式:

 # MyDict.py
 dict = {
     some : 'every',
     p : '?', 
     q : '?..'
 }

 # main file
 import MyDict
 print """
    What is {some}thing{p} 
    Who values this mysterious {some}thing{q}
 """.format(**dict)