显示一个提示(以不同为基准)


16

Tallying是一个简单的计数系统,可在基础5中使用。全世界使用了各种不同的计数系统,但是在大多数英语国家中使用的计数系统可能是最简单的-通过标记垂直线来计数单位,然后每个第5个标记在前面的四个集合中放置一条水平线。这会将计数标记分为5组(并使它们更容易快速计数)。

您将要编写一个程序,该程序显示到一个给定值的计数标记。但是,仅以5为基数就很无聊!因此,您的程序还应该能够显示不同基准的计数。

输入值

输入将是一个或两个用逗号分隔的非负整数值(例如98,4)。第一个数字是理货应显示的值。第二个值是计数的基础。如果未提供第二个值,请使用5为底

输出量

输出将是输入的值,表示为ASCII艺术标记。这是一些示例,您可以根据这些示例测试程序-输出应与它们完全匹配!

输入:1212,5

 | | | |   | | | |   | |
-+-+-+-+- -+-+-+-+-  | |
 | | | |   | | | |   | |

输入: 7,3

 | |   | |   |
-+-+- -+-+-  |
 | |   | |   |

输入: 4,2

 |   |
-+- -+-
 |   |

输入:6,16,10(注意前导空格)

 | | | | | |
 | | | | | |
 | | | | | |

另请注意,基数1旨在不一致-仅应使用垂直线。

如果两个输入值中的任何一个为0,则将不存在任何输出(并且程序应正常结束)。

规则

  • 这是,因此最短的正确实现(以字节为单位)获胜。
  • 输入/输出可以在任何合适的介质中(例如stdin / stdout,file ...)。
  • 如果输入更适合您的目标语言,则输入可以采用多个命令行参数的形式,也可以用空格等分隔。
  • 输出中允许尾随换行符。尾随空格不是。该规则仅在有输出时适用(即,在输入值为0时不适用)。
  • 如果没有输入基数,则您的代码必须默认为基数5。

3
6,1看起来的输出不应该更像-+- -+- -+- -+- -+- -+-吗?
彼得·泰勒

3
如果您声明“输入将是一个或两个正整数值,并用逗号分隔(例如9或8,4)”。那么我们应该能够将其作为给定值,而不必担心“您的程序应该健壮-您应该验证输入...”,而不需要处理一个或两个数字。
AndoDaan 2014年

1
@PeterTaylor -+-代表两个,因为其中有一条垂直线和一条水平线。基数1仅具有垂直线。@AndoDaan进行了修正。
肖恩·拉瑟姆

好吧,--- --- --- --- --- ---那么。为了与其他基准保持一致,您应该通过b-1垂直线放置水平打击。如果打算不一致,则应明确声明。
彼得·泰勒

我已经做到了。抱歉,我认为这是隐含的。
肖恩·莱瑟姆

Answers:


4

CJam 103 85 72个字符

http://cjam.aditsu.net/上尝试一下。

原版的

q","/(i:A\_,{~i}{;5}?:B_@*{(_{" |"*S"l"++AB/*AB%}{;MA}?\:J" |l""-+ "er\" |"*N+_J\+@2$+@J\+++"l"Ser}{;}?

通过定义一组带有空格,线和一个l的计数集来工作,这些空格应保留为空格。然后利用er(音译)功能制作第二行。最无效的部分是处理1和0特殊情况。会在我改进时进行编辑。提示我花了很长时间才意识到:由于第二个输入为1等于无穷大或第一个输入+1,因此当它等于1时重新定义它可以节省很多工作。

到目前为止,以逗号分隔的方式有了最大的改进

l",":G/(i:A\_5a?~i:B_@*{(_" |":K*\{SG++AB/*AB%}{A}?\_KG+"-+ "er[\GSer_@@M]\K*N+*}{;}?

迄今为止,最大的改进是使用空格分隔的输入

自然,因为CJam实际上是为空格分隔的输入而设计的。将输入置于20 3而不是20,3是一个巨大的好处。

ri:Aq_5s?S-i(_)A)?:B*{B(" |":K*STs++ABmd@@*_K"-+"er[\_@@M]\K*N+*TsSer}M?

5

蟒2 - 111 108 119 144 140 136 135 134 - 尝试

好的,让我们尝试一下:

i=input()
n,b=[(i,5),i][i>[]]
o=b-1
a=[n,n%b][b>1]*' |'
m=(b>1)*n/b
s=(' |'*o+'  ')*m+a
print(s+'\n'+('-+'*o+'- ')*m+a+'\n'+s)*(b*n>0)

编辑:我忽略了如果n==0或应该没有输出b==0。这花了我11个字符。:(

编辑:好的,解决了评论中提到的第二个问题之后,我的解决方案基本上收敛到BeetDemGuise的解决方案。


当输入中的一个(或两个)均为零时,这将打印换行符,这是不希望的挑战。另外,如果只输入一个数字怎么办?
BeetDemGuise 2014年

1
当省略第二个值(b在这种情况下应为5)时,此操作将失败。我将在问题中更清楚地说明。编辑:哦,没关系,就像我发表此评论一样,您已修复它!
肖恩·莱瑟姆

这是哪个Python?
Beta Decay

是Python 2.7.8。-哦,最后有个小错误...
Falko 2014年

1
如果是Python 2.x,您是否不能使用n/b代替来保存一个字符n//b
埃米尔(Emil)2014年

5

重击 239228199199189 188

这是我的尝试,可以打很多球。

注意:第二行不会从2中减去5,如果为空,则会设置默认值$2

n=$1
b=${2-5}
((n<1&b<1))&&exit
while ((n>b&b>1));do
n=$[n-b]
x+=\
y+=-
for i in `seq $[b-1]`;{
x+='| '
y+=+-
}
x+=\
y+=\
done
for j in `seq $n`;{
x+=' |'
y+=' |'
}
echo -e "$x\n$y\n$x"

是否{1..$n}工作,而不是`seq $n`
2014年

不幸的是,@ FUZxxl没有h=8;echo {1..$h}输出{1..8}

这不好。
2014年

3

蟒蛇- 171 143

i=input();t,b=i if[0]<i else(i,5);b=[b,t+1][b==1];l,d,m,o=' |',t/b,t%b,b-1;r=(l*o+'  ')*d+l*m
if t*b>0:print r,'\n',('-+'*o+'- ')*d+l*m,'\n',r

该程序非常简单:

  • 获取输入并尝试将其拆包t,b。如果失败,只需分配正确的值即可。
  • 如果基数为1,则将其值更改为可以轻松处理所有垂直线的值(t+1)。
  • 设置一些变量,并创建计数的底部和顶部。
  • 如果tb都不为零,则打印出这些计数。

编辑1:使用该input功能,而不是raw_input经过一些反复操作。

编辑2:感谢Falko用我的非零检查指出了一个小错误。现在我们的代码基本上是相同的,只是少了一些变量名和一些小逻辑。

编辑3:由于Python如何比较序列和不同类型,我们可以与ia list进行比较以得到我们的代码try...except块的较短版本。

这是非高尔夫版本:

i=input()

# If True, `i` must be a list
if [0]<i:
    t,b=i
# Otherwise, we know its a number (since `list` comes after `int` lexicographically.)
else:
    b=5
    t=i

b = b if b==1 else t+1
l=' |'
d=t/b
m=t%b
o=b-1

r=(l*o+'  ')*d+l*m
if t and b:
    print r,'\n',('-+'*o+'- ')*d+l*m,'\n',r

我想t&bFalse10,5。否则我们的解决方案将会融合!;)
Falko 2014年

@Falko你在两个方面都对!您知道他们对有头脑的人的评价。
BeetDemGuise 2014年

如果我们能找到一种简短的方法来测试i标量或列表,那真是太好了。然后我们可以放下try ... except怪物。
Falko 2014年

@Falko我想我发现了一个1byte更好的支票。A list总是大于int。同样,lists按字典顺序进行比较。因此,如果我们比较,[0]<i它将始终返回Falseif i是数字和Trueif i是列表(第一个元素非零)。
BeetDemGuise 2014年

1
大!我进一步缩短了您的处理方法。团队合作愉快!:)
Falko 2014年

3

爪哇343

class C{public static void main(String[]a){long n=new Long(a[0])+1,b=a.length>1?new Long(a[1]):5;if(b>0){if(b<2)b=(int)2e9;int i;for(i=1;i<n;i++)p(i%b>0?" |":"  ");p("\n");for(i=1;i<n-n%b;i++)p(i%b>0?"-+":"- ");if(n>b)p("- ");for(i=1;i<n%b;i++)p(" |");p("\n");for(i=1;i<n;i++)p(i%b>0?" |":"  ");}}static void p(String s){System.out.print(s);}}

少打高尔夫球:

class C {
  public static void main(String[] a) {
    long n=new Long(a[0])+1, b=a.length>1 ? new Long(a[1]) : 5;
    if(b>0) {
      if(b<2) b=(int)2e9; // if the base is 1, pretend the base is 2 billion
      int i;
      for(i=1;i<n;i++) p(i%b>0 ? " |" : "  ");
      p("\n");
      for(i=1;i<n-n%b;i++) p(i%b>0 ? "-+" : "- ");
      if(n>b) p("- ");
      for(i=1;i<n%b;i++) p(" |");
      p("\n");
      for(i=1;i<n;i++) p(i%b>0 ? " |" : "  ");
    }
  }
  static void p(String s) {
    System.out.print(s);
  }
}

您可以通过创建i一个来节省一些,long所以您不必单独声明它。通过i++%b>0在循环中执行更多操作,而不是分别递增(i++<n%b在第三个循环中)。使用另一个b=b<2?(int)2e9:b
Geobits

3

Perl- 167 165 156

my($n,$b)=($ARGV[0]=~/(\d+)(?:,(\d+))?/,5);print$b>1?map{join(" ",($_ x($b-1))x int($1/$b)," | "x($1%$b))."\n"}(" | ","-+-"," | "):join" ",("---")x$1if$1*$b

不打高尔夫球

my($n,$b) = ($ARGV[0] =~ /(\d+)(?:,(\d+))?/, 5);
print($b>1 ?
    map{ 
        join(" ",($_ x ($b-1)) x int($1/$b)," | " x ($1%$b))."\n"
    } (" | ","-+-"," | ") :
    join " ", ("---") x $1
) if $1 * $b

为基数1显示水平线,而不是垂直线:(
Chinese perl goth 2014年

@chineseperlgoth是的,这是要求之一。请Q.阅读评论
Fozi

3

C-193

我很抱歉。处理1的特殊情况有点不好,所以我想可以通过更好的方法来解决。另外,此代码在输出的开头包含新行,因此,如果不允许这样做,请告诉我。

当然,非常丑陋的定义总是有帮助的:)

字符数仅包括必要的空格和换行符。

#define P printf(
#define L P" |")
#define A P"\n");for(i=0;i<a;)b==1?i++,L:i++&&i%b==0?P
i;
main(a,b)
{
    scanf("%d,%d",&a,&b)<2?b=5:!b?a=0:a;
    if(a){
    A"  "):L;
    A"- "):a%b&&i>a/b*b?L:P"-+");
    A"  "):L;}
}

当值之一为零时,您的代码似乎会打印换行符。明确禁止这样做。您的解决方案不符合要求。
2014年

@FUZxxl你是对的,我错过了!此错误的快速修复将暂时需要执行。我希望我有时间找到更好的方法。
2014年

我很确定您可以通过替换printfputs,并替换return为三元运算符来保存一些字符。
millinon 2014年

@millinon的问题puts是,它每次都会添加新行:(。对于三元运算符,不可能在其中添加returns或fors!容易被去除return,虽然谢谢!
Allbeert

2

C#271字节

不是最短的,我无法读取输入读数,因为它需要接受0作为输入。

using C=System.Console;class P{static void Main(){var L=C.ReadLine().Split(',');int t=int.Parse(L[0]),f=L.Length>1?int.Parse(L[1]):5,r=3,i;for(var R="";t*f>0&r-->0;C.WriteLine(R.TrimEnd()))for(R="",i=0;i<t;R+=r==1&i++<t-t%f?(i%f<1?"- ":"-|"):i%f<1?"  ":" |")f+=f<2?t:0;}}

格式化代码:

using C=System.Console;

class P
{
    static void Main()
    {
        var L=C.ReadLine().Split(',');
        int t=int.Parse(L[0]),f=L.Length>1?int.Parse(L[1]):5,r=3,i;

        for(var R="";t*f>0&r-->0;C.WriteLine(R.TrimEnd()))
            for(R="",i=0;i<t;R+=r==1&i++<t-t%f?(i%f<1?"- ":"-|"):i%f<1?"  ":" |")
                f+=f<2?t:0;
    }
}

1

Lua- 219203字节

我去复制了“ |”的b个副本的d个副本,然后添加了“ |”的r个副本。在末尾。我觉得也许我应该一次将“ |”“累加”到字符串上。

l=' |'s=string.rep _,_,a,b=io.read():find'(%d+)%D*(%d*)'b=tonumber(b)or 5 d=(a-a%b)/b f=b>1 and s(s(l,b-1)..'  ',d)g=b>1 and s(s('-+',b-1)..'- ',d)r=b>1 and a%b or a e=s(l,r)..'\n'print(f..e..g..e..f..e)

松散

l=' |'          --the base string
s=string.rep    --string.rep will be used a lot, so best shorten it

_,_,a,b=io.read():find'(%d+)%D*(%d*)' --reads a,b I'm probably way of the mark with this one

b=tonumber(b)or 5

d=(a-a%b)/b -- shorter than math.floor(a/b), d equal the vertical mark

f=b>1 and s(s(l,b-1)..'  ',d) or '' --creates d multiples of b multiples of "|" more or less
g=b>1 and s(s('-+',b-1)..'- ',d)or''--same as above but with the middle "-+-"

r=b>1 and a%b or a --idk maybe i should set r before d(a- a%b )/b

e=s(l,r)..'\n'  -- makes the remainder string, notice that if b==1  then e will output all the "|" 

print(f..e..g..e..f..e) -- here's where the real magic happens!

样品:

c:\Programming\AnarchyGolfMine>lua test.lua
13,5
 | | | |   | | | |   | | |
-+-+-+-+- -+-+-+-+-  | | |
 | | | |   | | | |   | | |


c:\Programming\AnarchyGolfMine>lua test.lua
6,2
 |   |   |
-+- -+- -+-
 |   |   |


c:\Programming\AnarchyGolfMine>lua test.lua
18,1
 | | | | | | | | | | | | | | | | | |
 | | | | | | | | | | | | | | | | | |
 | | | | | | | | | | | | | | | | | |

1
您能否发布更加清晰易读的版本?在卢阿打高尔夫球看起来很有趣!

@Alessandro完成了。谢谢,它找到了我错过的几件事。
AndoDaan 2014年

1

JavaScript(193)

这可能过于复杂。

s=prompt().split(",");a=+s[0];b=s[1];b=b?+b:5;o=b>1;v=" | ";q=w="";for(g=~~(a/b),c=o?a-g:a;g+1;g--,q+=" ",w+=" ")for(i=o;c&&i<b;i++)c--,q+=v,w+=g&&o?"-+-":v;if(a&&b)console.log(q+'\n'+w+'\n'+q)

评论版本

s=prompt().split(",");
a=+s[0];
b=s[1];
b=b?+b:5;   // convert b to int and default to 5
o=b>1;      // special handling for b0 and b1
v=" | ";
q=w="";
// calculate number of lines and number of groups
for(g=~~(a/b),c=o?a-g:a;g+1;g--,q+=" ",w+=" ")
    for(i=o;c&&i<b;i++)
        c--,  // decrease line count
        q+=v,
        w+=g&&o?"-+-":v; // use " | " for last group and "-+-" for others
if(a&&b) // handle b0
    console.log(q+'\n'+w+'\n'+q)

1

Python- 127 123 122

只需使用略短的python版本即可。

编辑:固定为0,不打印任何内容并重新抖动,结束时长度相同

k=input()
k=i,j=((k,5),k)[k>[]]
for m in[' |','-+',' |']*all(k):
 print(m*(j-1)+m[0]+' ')*(i/j*(j>1))+' |'*(i%(j+(j<2)*i))

0

C(207个字符)

之前的换行符exit仅供阅读。

#define P printf(
#define t(v)for(a=c;b<=a;a-=b)a-c&&P" "),P v+1),q(b,v);q(a," |");P"\n");
q(n,c){while(n--)P c);}a;b;c;main(){scanf("%d,%d",&c,&b)<2?b=5:0;b&&c||
exit();b==1?b=32767:0;t("| ")t("+-")t("| ")}

scanf用法从Allbeert偷来的无耻。请注意,此解决方案无法使用gcc进行编译,因为它试图强制实施不存在的原型exit。使用像这样的工作C编译器进行编译tcc。此外,此功能可能会或可能不会在64位平台上运行。小心使用。

这是基于此的原始非高尔夫实现:

#include <stdio.h>
#include <stdlib.h>

static void
tally_line(int base, int count, const char *str)
{
     int follower = 0, i;

     /* full tallies first */
     for (; count >= base; count -= base) {
          if (follower++)
               putchar(' ');

          /* only print second character */
          printf(str + 1);

          for (i = 0; i < base; i++)
               printf(str);
     }

     /* partial tally */
     for (i = 0; i < count; i++)
          printf(" |");

     /* newline */
     puts("");
}

extern int
main(int argc, char **argv)
{
     int base, count;

     /* do away with program name */
     count = atoi(*++argv);

     base = argc - 3 ? 5 : atoi(*++argv);

     /* remove 0 later */
     base | count || exit(0);

     /* a crossed-out tally never appears for large numbers */
     if (base == 1)
          base = 32767;

     tally_line(base, count, "| ");
     tally_line(base, count, "+-");
     tally_line(base, count, "| ");

     return (EXIT_SUCCESS);
}

0

Python 2中134 126 123 114字节

lambda i,j=5,a=" |":"\n".join(("",(a*~-j+"  ","-+"*~-j+"- ")[x%2]*(i/j))[j>1]+a*(i,i%j)[j>1]for x in(0,1,2)if i*j)

在线尝试!

我知道一个老问题,但是无论如何还是很有趣。加入后,有机会尝试一些我所学到的技巧。

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.