高尔夫 - 实施简单的模板方案。
扩展是:
命令行参数:
key=value
样式,如示例这里我不太高尔夫球(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.
是的,我意识到这是一个有缺陷的模板系统,“快照”以实现更短更好的实施。
答案 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)