# ASCII标尺生成

11

``````+-------------------------------------------------------------------------+
||    |    |    |    |    |    |    |    |    |    |    |    |    |    |  |
|0         10        20        30        40        50        60        70 |
|                                                                         |
+-------------------------------------------------------------------------+
``````

• 标尺必须水平。
• 假设为了简化起见，标尺必须工作到1000标记，所有数字都左对齐，最后一个数字之后一个空格
• 要求长度为零的标尺应打印NaR
• 负数应打印与右对齐数字相反的标尺（-90，-80，-70，...），否则格式应与上述相同

PhiNotPi'2

user2398029'2

1

5

mellamokb 2012年

3

flesk

8

# 蟒蛇- 227 232

``````b,p,d,w,='|+- '
g=input
s=''.join(('%'+d[:i>0]+'10s')%i+['',9*w][i==0] for i in range(g(),g()+1,10)).strip()+w
m,n=s[0]==d and s.find(w)-1,len(s)
t=p+n*d+p
print['\n'.join([t,b+(w*m+'|    '*n)[:n]+b,b+s+b,b+n*w+b,t]),'NaR'][n<9]
``````

-30 30

``````+-----------------------------------------------------------------+
|  |    |    |    |    |    |    |    |    |    |    |    |    |  |
|-30       -20       -10         0         10        20        30 |
|                                                                 |
+-----------------------------------------------------------------+
``````

-30 -30

``````NaR
``````

100150

``````+------------------------------------------------------+
||    |    |    |    |    |    |    |    |    |    |   |
|100       110       120       130       140       150 |
|                                                      |
+------------------------------------------------------+
``````

-1000 -950

``````+--------------------------------------------------------+
|    |    |    |    |    |    |    |    |    |    |    | |
|-1000      -990      -980      -970      -960      -950 |
|                                                        |
+--------------------------------------------------------+
``````

10

## 哈斯克尔（341）

``````import Data.List
m[l,r]|r>l=ᴛ.("┌│││└":).(++["┬   ─","┐│││┘"]).ʀ.t.ʀ.t.takeWhile((>4).length).ᴛ\$[c"┬",c"│    ",[l,l+10..r]>>=h.show,c" ",c"─"]|True=["NaR"]
h s=p s\$length s;p s@('-':_)l=r(6-l)ꜱ++s++r 4ꜱ;p s l=r 5ꜱ++s++r(5-l)ꜱ
ᴛ=transpose;ʀ=reverse;r=replicate;c=cycle
ꜱ=' ';t l@(c:o)|c!!2==ꜱ=t o|True=l
``````

``````\$ echo "-50 30" | runhaskell  def0.hs
┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│  │    │    │    │    │    │    │    │    │    │    │    │    │    │    │    │    │  │
│-50       -40       -30       -20       -10         0         10        20        30 │
│                                                                                     │
└─────────────────────────────────────────────────────────────────────────────────────┘
``````

2

user2398029 2012年

3

Python 2.7、342266260个字符

``````a,b,c,d,m='+|- \n'
def f(y):x=map(str,(range(0,y+1,10)if y>0 else range(y,1,10)));h,g=len(x[-1])+1,len(x)-1;u=a+(c*10)*g+c*h+a;return'NaR'if y==0 else u+m+b+(b+d*4)*2*g+b+d*(h-1)+b+m+b+''.join(i.ljust(10)for i in x[:-1])+x[-1].ljust(h)+b+m+b+(d*10)*g+d*h+b+m+u
``````

edit2：减少到260个字符，单行功能

Blazer

Blazer 2012年

@Blazer，您的外壳没有管道和重定向吗？

1

# PowerShell中，256个253 233 225 222字节

``````param(\$a,\$b)('NaR',\$(\$d=@{}
\$a..\$b|%{\$d.\$_=' ';0..(\$l=(\$s="\$(\$_-\$_%10)").Length-1)|%{\$d[\$_+\$s-\$l*(0-gt\$s)]=\$s[\$_]}}
\$d.Keys|sort|%{\$e+='-';\$p+='|    '[\$_%5];\$r+=\$d.\$_;\$w+=' '}
@"
+\$e-+
|\$p |
|\$r |
|\$w |
+\$e-+
"@))[\$a-lt\$b]``````

``````param(\$a,\$b)
(
'NaR',
\$(
# {key, value} := {position, digit|minus|space}
\$d=@{}
\$a..\$b|%{
\$d.\$_=' '

# draw a nearest left number
\$n=\$_-\$_%10
\$s="\$n"
\$l=\$s.Length-1
0..\$l|%{
\$d[\$_+\$s-\$l*(0-gt\$s)]=\$s[\$_]
}
}

# edge, points, ruler, whitespaces
\$d.Keys|sort|%{
\$e+='-'
\$p+='|    '[\$_%5]
\$r+=\$d.\$_
\$w+=' '
}

# output the multiline string
@"
+\$e-+
|\$p |
|\$r |
|\$w |
+\$e-+
"@
)
)[\$a-lt\$b]``````

0

## Python，291241个字符

``````import sys
def p(b,a="|"):print a+b+a
j="".join
l=int(sys.argv[1])//10*10
if l:
d=j(["%-10d"%n for n in range(0,l,10)])+"%d "%l
L=len(d)
h="-"*L
p(h,"+")
p(j(["|    "[n%5] for n in range(L)]))
p(d)
p(" "*L)
p(h,"+")
else: print "NaR"
``````

Gordon Bailey

ugoren

0

## C ++，392

``````#include<ios>
#define q s[2][i
#define v ,memset(&s
char g,o,i,n,s[5][80];int main(int a,char**b){a=atoi(b[1])v,32,400);n=0<a;for(a=abs(a)v[0][1],45,a+3)v[4][1],45,a+3);i<a+4;++i)o=i-n,!(o%5)?s[1][n?i:i+3]='|',(o%2-1?(n?q]=i/10+48,i>9?q+1]=48:0:((a-i)>9?q+2]=(a-i)/10+48,q+1]=45:0,q+3]=48)):0):0;for(;g-5;g++)for(s[g][a+4]=s[g][i=0]=g&g-4?'|':43;i-80;i++)printf(a?"%c":g+i?"":"NaR",s[g][i]);}
``````

0

# 蟒蛇-208

（不支持右对齐的负数）

`````` l,u=map(int,raw_input().split())
n=u-l
q="+%s+\n"
q=q+"|%s|\n"*3+q
print q%('-'*n,(''.join("|    "for i in range(n)))[:n],(''.join("{:<10d}".format(i)for i in range(l,u,10)))[:n],' '*n,'-'*n)if n>0 else"NaR"
``````

`````` ''.join("|    "for i in range(n)))[:n]
``````

0

Perl的5.14，198 224个字符

``````\$l=shift||die"NaR\n";
@n=grep!(\$_%10),\$l>0?0..\$l:\$l..0;
\$l=9-length\$n[\$#n];
@f=('-'x10,'|    'x2,'@'.'<'x9,' 'x10);
@f=map\$_ x@n,@f;
map\$_=~s/.{\$l}\$//,@f;
eval"format=\n+\$f[0]+\n|\$f[1]|\n|\$f[2]|\n\@n\n|\$f[3]|\n+\$f[0]+\n.\n";
write
``````

EDIT2：我没有机会对此做更多的工作，我只是现在才注意到负数规则正确对齐，我的代码不支持该规则，因此，如果截止日期已到。

@louism：我的答案不符合所有规则。如果可能，应该选择另一个答案。
flesk '02