2009-04-13 9 views
1

ゴルフ - 簡単なテンプレートスキームを実装します。ゴルフ - テンプレートをテキストファイルに展開

展開は、次のとおりです。

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

コマンドライン引数:

  • ARG1:辞書ファイル、でフォーマットkey=valueスタイルは例のように
  • ARG2:templファイルを受け取った

ここで私のゴルフではない試み(パイソン):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 

TEMPLATE

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

RESULT

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

はい、私はこれを短くし、よりよいのために、 "スナップ" の不良テンプレートシステムを実現実装。

答えて

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バイトまで。 (多分けれども引数/ファイルIOのものが本当にゴルフチャレンジの一部であってはならない?)

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 = %%"のようなものをフィードすると予期しない結果になることがあることに注意してください(%%を%にさらに崩壊させます)。しかし、単純なアルゴリズムであれば、いくつかの順序で文字列の置換を行います。

+0

+1ニース、私はそのような何かを投稿しようとしていました –

0

ルビー、114文字VCで

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

++ ...最速の方法:)

かもしれません
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); 
} 
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 
関連する問題