Number Lockers!

25

1

Given a positive integer < 100 (from 1 to 99, including 1 and 99), output that many lockers.

A locker is defined as the following:

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

where nn is the locker number, in base 10. If there is 1-digit number, it is expressed with a 0 in front of it. For example, locker number 2 displays the number 02.

Lockers can be stacked, but only up to 2 high:

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

on denotes an odd number, en an even number. Lockers can also be put next to each other.

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

Notice that locker number 5 is an odd-numbered locker that is on the bottom. This is because when you have odd-numbered input, the last locker should be placed on the floor (because a hovering locker costs too much). The above example therefore is the expected output for n=5. n=0 should return an nothing.

Rules: Standard methods of input/output. Input in any convenient format, output as a string. Standard loopholes apply.

Test cases:

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 |
+----+----+----+----+----+----+----+----+

This is , so shortest code wins!

Comrade SparklePony

Posted 2017-04-27T14:06:37.803

Reputation: 5 784

Related – Shaggy – 2017-04-27T14:10:37.087

15It's time to tell the builders to put the odd lockers on the bottom. – mbomb007 – 2017-04-27T14:11:17.627

3Do the prepending newlines of the case 1 have to be outputted? – dzaima – 2017-04-27T14:30:20.733

@ComradeSparklePony didn't impact me at all :). Sorry about the harsh tone used, just trying to help. – Magic Octopus Urn – 2017-04-27T18:48:40.883

Answers

7

Pyth, 66 bytes

A.[Y2m+.rKXJr6j" | "++km.[\02`kdkjkUT;" -|+"+*3]KJ_.T_McSQ2js[GHhH

Test suite.

Leaky Nun

Posted 2017-04-27T14:06:37.803

Reputation: 45 011

6

Python 2, 201 191 185 175 171 166 164 163 bytes

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],

Try it Online!

math junkie

Posted 2017-04-27T14:06:37.803

Reputation: 2 490

This currently fails on the first test case. – Comrade SparklePony – 2017-04-27T15:01:32.367

@ComradeSparklePony Fixed – math junkie – 2017-04-27T15:21:17.887

4

PHP, 191 Bytes

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]:"";

Try it online!

PHP, 235 Bytes

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);

Case 1 with optional newlines

Try it online!

Expanded

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 Bytes

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"]);

replace ["","",""] with ["\n","\n","\n"] if you want newlines for case 1

Try it online!

Jörg Hülsermann

Posted 2017-04-27T14:06:37.803

Reputation: 13 026

2

Ruby, 256 239 201 191 183 bytes

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'+|'

This is awfully long. I'll work on golfing it more.

Peter Lenkefi

Posted 2017-04-27T14:06:37.803

Reputation: 1 577

2

C (gcc), 426 335 300 294 282 252 249 246 244 237 bytes

This really needs to be golfed down

#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)"+----+"));}

Try it online!

cleblanc

Posted 2017-04-27T14:06:37.803

Reputation: 3 360

Suggest -~n/2 instead of n/2+n%2 – ceilingcat – 2018-11-29T02:41:46.500

1

Batch, 305 bytes

@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% |

+----+ and | | are both similar to + + in that they can be generated via a single substitution, and it turns out to be slightly shorter than generating them separately (the extra quoting needed for |s doesn't help).

Neil

Posted 2017-04-27T14:06:37.803

Reputation: 95 035

1

Pyth - 97 74 86 80 75 bytes

V3K+:?&NtQ2 1Q2?NQYIlK+*+\+*\-4lK\+IqN2BFTU4+sm?qT3.F"| {:02d} "d+\|*\ 4K\|

Try it here

Maria

Posted 2017-04-27T14:06:37.803

Reputation: 644

1Sorry, but this currently fails on input of 1. – Comrade SparklePony – 2017-04-27T19:06:00.050

@ComradeSparklePony Fixed it. Thanks. – Maria – 2017-04-27T19:32:22.253

1

JavaScript ES6, 224 bytes

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)

Used some ideas from math junkie's Python answer

Test Snippet

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>

Cleaned up

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;
};

Justin Mariner

Posted 2017-04-27T14:06:37.803

Reputation: 4 746

Welcome to PPCG! – caird coinheringaahing – 2017-05-20T20:15:08.460

0

Charcoal, 37 bytes

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

Try it online! Link is to verbose version of code. Explanation:

Nθ

Input the number of lockers into q.

F…·¹θ«

Loop over the lockers from 1 to q inclusive.

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

Calculate the direction to the next locker, and repeat that 5 times (golfier than using jump movements).

B⁶±⁶

Draw the locker, starting at the bottom left corner. (The bottom right corner also takes 4 bytes while the top right corner takes 5. The top left corner only takes 3 bytes but then the locker number would take longer to draw.)

↗→→0

Draw the leading zero of the locker number, if necessary.

P←⮌Iι

Draw the locker number reversed and right-to-left, effectively right justifying it.

←←↙

Move back to the bottom left corner ready to calculate the direction to the next locker.

Edit: Later versions of Charcoal support this 32-byte solution:

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

Try it online! Link is to verbose version of code. Explanation:

F⪪…·¹N²«

Take the numbers from 1 to the input number inclusive pairwise. (If the input number is odd the last array will only have one element.)

F⮌ι«

Loop over each pair in reverse order.

↗→→0

Draw the leading zero of the locker number, if necessary.

P←⮌Iι

Draw the locker number reversed and right-to-left, effectively right justifying it.

↖↖↖↑UR⁶

Move to the top left of the locker and draw it. This is also the bottom left of the next locker, so we're ready to draw the second locker of the pair if applicable.

»M⁵χ

Move to the next pair of lockers. (This should be before the inner loop for a saving of 1 byte but Charcoal generates incorrect output for an input of 1 for some reason.)

Neil

Posted 2017-04-27T14:06:37.803

Reputation: 95 035