Pythonの3、187の 180 173 154バイト
上記の@Thomas Kwaの提案のおかげで、19バイトの良いゴルフをすることができましたresult or['0']
。さらに、代数(154バイト)を再配置しました。
def f(n):
*m,=n;o='0'
try:p=m.index('.');m.pop(p)
except:p=len(m)
return'+'.join([['.'+o*(i-p)+d,d+o*(p-i-1)][p>i]for i,d in enumerate(m)if d!=o])or o
これまでの私の最善の試み(173バイト)。新しいアプローチに基づいて、投稿の下部を参照してください:
def f(n):
*m,=n;o='0'
try:p=m.index('.');m.pop(p)
except:p=len(m)
return(o,'+'.join([['.'+o*(-1*(p-i))+d,d+o*(p-i-1)][p-i>0]for i,d in enumerate(m)if d!=o]))[eval(n)!=0]
私のオリジナルを180バイトまでゴルフした:
def f(n):x=n.split('.');a,b=(x+[''],x)[len(x)-1];e=enumerate;return('0',"+".join([d+'0'*i for i,d in e(a[::-1])if d!='0'][::-1]+['.'+'0'*i+d for i,d in e(b)if d!='0']))[eval(n)!=0]
今日、これを行うことで新しい言語機能を学びました!ブールインデックスによる条件付き。少しやり過ぎたかもしれません。
内包表記を抽象化しようとしましたが、短くすることができませんでした(196バイト):
e=lambda s:[d+'0'*(len(s)-i-1) for i,d in enumerate(s) if eval(d)]
def f(n):x=n.split('.');a,b=(x+[''],x)[len(x)-1];return['0',"+".join(e(a)+['.'+d[::-1]for d in e(b[::-1])][::-1])][bool(eval(n))]
(シーケンスの反転は高価です!)
使い方:鉱山は今の短いであるが、私はTanMathはゴルフの彼のダウン鉱山を一致させることができると思いe=enumerate
、交換pass
し0
、そして使用して'0'
の代わりに['0']
return文では4 + 3 + 2 = 9バイトを保存する必要があります!187まで減らします。別の数バイトをどこかで削ることができると確信しています...
編集新しいアプローチ(156バイト)。ただし、@ jimmy23013のCJamエントリと同様に最大6dpの精度しか処理できないため、最終テストに失敗します。もっと多くの0を印刷するように強制することはできませんでした。他の誰かができるかもしれません。代わりに、これを私の最善の試みの基礎として使用しました。topを参照してください(また、このアプローチは小数点の前に0を出力しますが、それも有効なようです)。トックtry:... except:...
TanMathからのアプローチを:
def f(n):
*m,=n
try:p=m.index('.');m.pop(p)
except:p=len(m)
return('0','+'.join([str(eval(d)*10**(p-i-1))for i,d in enumerate(m)if d!='0']))[eval(n)!=0]