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可以与我的比赛相提并论:在return语句中使用e=enumerate
,替换pass
为0
,并使用'0'
代替['0']
应该节省4 + 3 + 2 = 9字节!将其降低到187。我敢肯定,可以在某个地方将其他几个字节切掉...
编辑新方法(156字节)。但是,它只能处理高达6dp的精度,类似于@ jimmy23013的CJam条目,因此它无法通过最终测试。我不能强迫它打印更多的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]