数字储物柜!


25

给定正整数<100(从1到99,包括1和99),输出那么多的储物柜。

储物柜的定义如下:

+----+
|    |
|    |
|    |
| nn |
+----+

其中nn的储物柜号码以10为底。如果有1位数字,则其前面用0表示。例如,2号储物柜显示数字02

储物柜可以堆放,但最多只能堆放2个:

+----+
|    |
|    |
|    |
| on |
+----+
|    |
|    |
|    |
| en |
+----+

on表示奇数,en偶数。储物柜也可以彼此相邻放置。

+----+----+
|    |    |
|    |    |
|    |    |
| 01 | 03 |
+----+----+----+
|    |    |    |
|    |    |    |
|    |    |    |
| 02 | 04 | 05 |
+----+----+----+

请注意,5号储物柜是底部的奇数储物柜。这是因为当您输入奇数输入时,应将最后一个储物柜放在地板上(因为盘旋的储物柜花费太多)。因此,上面的示例是n = 5时的预期输出。n = 0应该不返回任何值。

规则:输入/输出的标准方法。以任何方便的格式输入,以字符串形式输出。有标准漏洞。

测试用例:

Input
Output
---------------------
1






+----+
|    |
|    |
|    |
| 01 |
+----+
--------------------- (newlines optional in case 1)
4
+----+----+
|    |    |
|    |    |
|    |    |
| 01 | 03 |
+----+----+
|    |    |
|    |    |
|    |    |
| 02 | 04 |
+----+----+
---------------------
5
+----+----+
|    |    |
|    |    |
|    |    |
| 01 | 03 |
+----+----+----+
|    |    |    |
|    |    |    |
|    |    |    |
| 02 | 04 | 05 |
+----+----+----+
---------------------
16
+----+----+----+----+----+----+----+----+
|    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |
| 01 | 03 | 05 | 07 | 09 | 11 | 13 | 15 |
+----+----+----+----+----+----+----+----+
|    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |
| 02 | 04 | 06 | 08 | 10 | 12 | 14 | 16 |
+----+----+----+----+----+----+----+----+

这是,所以最短的代码获胜!



15
现在该告诉建筑商将奇怪的储物柜放在最下面了。
mbomb007 '17

3
是否1需要输出案件的前置换行符?
dzaima

@ComradeSparklePony完全没有影响我:)。很抱歉使用刺耳的语气,只是想提供帮助。
魔术章鱼缸

Answers:



6

Python 2中,201 191 185 175 171 166个 164 163字节

n=input()
for j in 0,1:c=n/2+n%2*j;m='+----'*c+'+\n';print['\n',m+('|    '*c+'|\n')*3+''.join('| %02d '%-~i for i in range(j,n-n%2,2)+n%2*j*[~-n])+'|\n'+m*j][c>0],

在线尝试!


当前,这在第一个测试用例上失败。
“ SparklePony同志” 17年

@ComradeSparklePony固定
数学迷

4

PHP,191字节

for(;a&$k="01112344453"[$i++];print"$l\n")for($l="",$b="+||"[$k%3],$n=0;$n++<$a=$argn;)$l.=$i<6&$n%2&$n!=$a|$i>5&($n%2<1|$n==$a)?($l?"":"$b").["----+","    |",sprintf(" %02d |",$n)][$k%3]:"";

在线尝试!

PHP,235字节

for(;$i++<$a=$argn;)$r[$i==$a|1-$i&1][]=($p=str_pad)($i,2,0,0);for(;$j<6;)$l[]=($a<2&$j<3?"":[$p("+",$c=($j<3?floor:ceil)($a/2)*5+1,"----+"),$p("|",$c,"    |"),"| ".join(" | ",$r[$j/3])." |"])[$j++%3]."\n";echo strtr("01112344453",$l);

情况1与可选的换行符

在线尝试!

展开式

for(;$i++<$a=$argn;)
  $r[$i==$a|1-$i&1][]=($p=str_pad)($i,2,0,0); # make an 2D array 0:odd values 1:even values and last value  
for(;$j<6;) # create 6 strings for each different line
  $l[]=($a<2&$j<3 # if last value =1 and line number under 3 
    ?"" # make an empty string empty [] as alternative
    :[$p("+",$c=($j<3 # else make the 0 or 3 line and store the count for next line
      ?floor # if line number =0 count=floor ($a/2)  multiply 5 and add 1
      :ceil)($a/2)*5+1,"----+") # else count= ceil($a/2) multiply 5 and add 1
    ,$p("|",$c,"    |") # make lines 1 and 4
    ,"| ".join(" | ",$r[$j/3])." |"])[$j++%3]."\n"; #make lines 2 odd values and 5 even values and last value
echo strtr("01112344453",$l); # Output after replace the digits with the 6 strings

PHP,300字节

for(;$i++<$a=$argn;)$r[$i==$a||!($i%2)][]=($p=str_pad)($i,2,0,0);echo strtr("01112344453",($a>1?[$p("+",$c=($a/2^0)*5+1,"----+")."\n",$p("|",$c,"    |")."\n","| ".join(" | ",$r[0])." |\n"]:["","",""])+[3=>$p("+",$c=ceil($a/2)*5+1,"----+")."\n",$p("|",$c,"    |")."\n","| ".join(" | ",$r[1])." |\n"]);

更换["","",""]["\n","\n","\n"],如果你想的情况下换行1

在线尝试!


2

Ruby,256 239 201 191 183字节

n=gets.to_i;a=n/2;z=a+n%2;t=a*2;q="+----+";r=->x{q*x+?\n+("|    |"*x+?\n)*3+"| n |"*x+?\n};u=r[a]+r[z]+q*z;n.times{|i|j=2*i+1;u[?n]="%02d"%(i<a ?j:i>=t ?j-t:j-t+1)};puts u.squeeze'+|'

这太长了。我会继续打高尔夫球。


2

C(GCC) 426 335 300 294 282 252 249 246 244 237字节

这真的需要打下去

#define L puts("")
#define P(s)printf(&s[i>1]
#define F(x)for(i=0;i++<x;)P(
#define O(x,y)F(x)"+----+"));for(j=0;L,j++<3;)F(x)"|    |"));j=y;F(x)"| %02d |")
e,i,j;f(n){e=n/2+n%2;O(n/2,-1),j+=2);L;O(e,0),j+=i^e?2:2-n%2);L;F(e)"+----+"));}

在线尝试!


建议-~n/2而不是n/2+n%2
ceilingcat '18

1

批次,305个字节

@echo off
set/a"n=%1&-2
if %1 gtr 1 call:l %n% 1
call:l %1 2
echo %s: =-%
exit/b
:l
set s=+
set "t=|
for /l %%i in (%2,2,%n%)do call:c %%i
if %1 gtr %n% call:c %1
for %%s in ("%s: =-%" "%s:+=|%" "%s:+=|%" "%s:+=|%" "%t%")do echo %%~s
exit/b
:c
set s=%s%    +
set i=0%1
set "t=%t% %i:~-2% |

+----+| |两者都相似+ +,因为它们可以通过一次替换生成,并且结果要比分别生成它们短一些(|s 所需的额外引号无济于事)。



1

JavaScript ES6,224个字节

n=>(r=(s,k)=>s.repeat(k),s="",[0,1].map(i=>(c=(n/2+n%2*i)|0,c&&(s+="+"+r(l="----+",c)+`
|`+r(r("    |",c)+`
|`,3),[...Array(c).keys()].map(j=>s+=` ${(h=2*j+(i+!(i&j>c-2&n%2)))>9?h:"0"+h} |`),s+=`
`+(i?`+${r(l,c)}
`:"")))),s)

使用了数学迷的Python答案中的一些想法

测试片段

f=
n=>(r=(s,k)=>s.repeat(k),s="",[0,1].map(i=>(c=(n/2+n%2*i)|0,c&&(s+="+"+r(l="----+",c)+`
|`+r(r("    |",c)+`
|`,3),[...Array(c).keys()].map(j=>s+=` ${(h=2*j+(i+!(i&j>c-2&n%2)))>9?h:"0"+h} |`),s+=`
`+(i?`+${r(l,c)}
`:"")))),s)

O.innerHTML=f(I.value);
<input id="I" value="5" type="number" min="0" max="99" oninput="O.innerHTML=f(this.value)">
<pre id="O"></pre>

清理了

n => {
    r=(s,k)=>s.repeat(k);
    s="";
    [0,1].map(i => {
        c = (n/2 + n%2 * i)|0;
        if (c) {
            s += "+" + r(l="----+", c) + "\n|" + r(r("    |",c) + "\n|", 3);
            [...Array(c).keys()].map(j => {
                s += ` ${(h = 2*j + (i + !(i & j>c-2 & n%2))) > 9 ? h:"0"+h} |`;
            });
            s += "\n" + (i ? `+${r(l,c)}\n` : "");
        }
    });
    return s;
};

欢迎来到PPCG!
Caird coinheringaahing

0

木炭,37字节

NθF…·¹θ«F⁵¿﹪ι²¿⁼ιθ→↗↓B⁶±⁶↗→→0P←⮌Iι←←↙

在线尝试!链接是详细版本的代码。说明:

Nθ

在中输入储物柜的数量q

F…·¹θ«

将储物柜从圈1q包容。

F⁵¿﹪ι²¿⁼ιθ→↗↓

计算到下一个储物柜的方向,然后重复5次(比使用跳跃运动要高得多)。

B⁶±⁶

从左下角开始绘制储物柜。(右下角也需要4个字节,而右上角也需要5个字节。左上角仅需要3个字节,但是更衣室编号需要更长的绘制时间。)

↗→→0

如有必要,画出储物柜编号的前导零。

P←⮌Iι

将储物柜编号从左到右绘制,从右到右对齐。

←←↙

返回左下角准备计算到下一个储物柜的方向。

编辑:木炭的更高版本支持此32字节解决方案:

F⪪…·¹N²«F⮌ι«↗→→0P←⮌Iκ↖↖↖↑UR⁶»M⁵χ

在线尝试!链接是详细版本的代码。说明:

F⪪…·¹N²«

将数字从1配对到输入数字(含两端)。(如果输入数字为奇数,则最后一个数组将只有一个元素。)

F⮌ι«

以相反的顺序遍历每对。

↗→→0

如有必要,画出储物柜编号的前导零。

P←⮌Iι

将储物柜编号从左到右绘制,从右到右对齐。

↖↖↖↑UR⁶

移动到储物柜的左上方并绘制它。这也是下一个储物柜的左下角,因此我们准备绘制该对中的第二个储物柜(如果适用)。

»M⁵χ

移至下一个储物柜。(这应该在内部循环之前保存1个字节,但是出于某种原因,木炭会因输入1而生成错误的输出。)

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.