1

Golf - 实现一个简单的模板方案。

扩展是:

  • %KEY% -> 价值
  • %% -> %

命令行参数:

  • 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("%")]))

信息和通信技术

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.

是的,我意识到这是一个有缺陷的模板系统,“捕捉”了一个更短更好的实现。

4

5 回答 5

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 的东西不应该成为高尔夫挑战的一部分?)

于 2009-04-13T18:38:26.017 回答
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=%%”之类的内容(它会将 %% 进一步折叠为 %),这可能会产生意想不到的结果,但是任何简短的简单算法都会以一种或另一种方式表现出类似的行为,因为您有以某种顺序进行字符串替换。

于 2009-04-13T17:34:42.427 回答
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);
}
于 2009-05-12T09:35:18.530 回答
0

红宝石,114 个字符

d=Hash[*[open(ARGV[0]).read.scan(/(.+)=(.*)/),'','%'].flatten]
print open(ARGV[1]).read.gsub(/%([^%]*)%/){d[$1]}
于 2009-04-28T14:56:17.923 回答
0

不是这个问题的真正答案,但我希望你意识到,如果你需要它来完成任何类型的实际任务,Python 有一个更具可读性的模板格式{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)

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

  with open(dictionary_file, 'r') as f:
      for l in f.readlines():
           k, v = '='.split(l)
           if v: dict[k] = v
于 2009-06-20T04:13:51.587 回答