ASCII标尺生成


11

挑战在于生成以下格式的ASCII字符计数标尺:

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

标尺的长度应可扩展为10的任意倍数。

规则:

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

而且,只需打印到控制台就可以了

准备,开始,打高尔夫球!


程序如何知道制作尺子需要多长时间?它在STDIN上以数字形式提供吗?
PhiNotPi'2

是的,我想像往常一样!
user2398029'2

1
标尺必须水平还是垂直?如果它是水平的,我们是否可以假设最多80个字符,还是将其输出到文件中以避免换行?还是在写入标准输出时必须调整控制台/终端的大小?
开拓者

5
代码高尔夫球的要点之一是必须明确地确定问题的100%(请参阅常见问题)。在实际输出中几乎没有创造力的空间,因为创造力在于代码本身。将来,在发布问题之前,请尝试仔细考虑所有可能的情况,但是由于您是新手,我们正在为您提供帮助:)
mellamokb 2012年

3
您能否编辑挑战以包含注释中指定的规则?
flesk

Answers:


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
main=interact$unlines.m.map read.words
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

我可以自由地将实际的ASCII字符与外观更好的unicode框绘图字符进行交换。

$ 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

返回每个行字符串的元组,然后您可以将其打印或保存到文件中(我更喜欢后者的长度大于70,因为控制台将使它看起来像包裹起来一样混乱)

假设y一个字符串(如果您希望通过cmd调用,则为python的raw_input()n或sys.argv [1])一个整数(例如,在2.x中使用input()或在3.x中使用int(input())) )

我将此功能设为更灵活

编辑:减少到266个字符。不再返回元组,而是返回一个字符串。现在将整数而不是字符串作为参数

edit2:减少到260个字符,单行功能

注意:确实处理负数,但不正确地说明理由(我真的不认为说明理由太重要了


或仅使用非换行控制台(例如Terminator)。
停止旋转逆时针

@leftaroundabout我不确定是否存在这样的东西
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"

您可以再打几个角色,这里我减少了12个角色
Gordon Bailey

感谢@GordonBailey,但是无论如何已经有一个赢家,它比我的代码短,并且支持完整的规范。
ugoren

0

C ++,392

这是使用Windows控制台编程的,因此我只选择了最大标尺大小为70,对于任何更大的标尺都会崩溃。负数(最多-70)和0正确处理。

#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

编辑:编辑为输入为“ NaR”时死,0并支持负范围。

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


@louism:我的答案不符合所有规则。如果可能,应该选择另一个答案。
flesk '02
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.