Armários de número!

25

Dado um número inteiro positivo <100 (de 1 a 99, incluindo 1 e 99), gera muitos cacifos.

Um armário é definido da seguinte maneira:

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

onde nnestá o número do armário, na base 10. Se houver um número de 1 dígito, ele será expresso com um 0 na frente. Por exemplo, o número do armário 2 exibe o número 02.

Os armários podem ser empilhados, mas com altura até 2:

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

ondenota um número ímpar, enum número par. Armários também podem ser colocados um ao lado do outro.

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

Observe que o armário número 5 é um armário com números ímpares que fica na parte inferior. Isso ocorre porque, quando você tem uma entrada com números ímpares, o último armário deve ser colocado no chão (porque um armário suspenso custa muito). O exemplo acima, portanto, é a saída esperada para n = 5. n = 0 deve retornar um nada.

Regras: Métodos padrão de entrada / saída. Entrada em qualquer formato conveniente, saída como uma string. Aplicam-se brechas padrão.

Casos de teste:

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

Isso é , então o código mais curto vence!

Camarada SparklePony
fonte
Relacionado
Shaggy
15
É hora de dizer aos construtores para colocar os armários estranhos no fundo.
mbomb007
3
As novas linhas anexas do caso 1precisam ser exibidas?
Dzaima 27/04
@ComradeSparklePony não me impactou em nada :). Desculpe pelo tom áspero usado, apenas tentando ajudar.
Magic Octopus Urn

Respostas:

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

Experimente Online!

viciado em matemática
fonte
Atualmente, isso falha no primeiro caso de teste.
precisa saber é o seguinte
@ComradeSparklePony Fixed
math junkie
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]:"";

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

Caso 1 com novas linhas opcionais

Experimente online!

Expandido

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

substitua ["","",""]por ["\n","\n","\n"]se você quiser novas linhas para o caso1

Experimente online!

Jörg Hülsermann
fonte
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'+|'

Isso é muito longo. Vou trabalhar mais no golfe.

Peter Lenkefi
fonte
2

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

Isso realmente precisa ser jogado para baixo

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

Experimente online!

cleblanc
fonte
Sugerir em -~n/2vez den/2+n%2
tetocat 29/11
1

Lote, 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% |

+----+e | |são semelhantes ao + +fato de poderem ser gerados por meio de uma única substituição, e acaba sendo um pouco mais curto do que gerá-los separadamente (a citação extra necessária para |s não ajuda).

Neil
fonte
1

Pitão - 97 74 86 80 75 bytes

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

Experimente aqui

Maria
fonte
1
Desculpe, mas esta falha atualmente na entrada do 1.
o camarada SparklePony
@ComradeSparklePony Fixed it. Obrigado.
Maria
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)

Utilizamos algumas idéias da resposta em Python do viciado em matemática

Snippet de teste

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>

Limpo

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
fonte
Bem-vindo ao PPCG!
caird coinheringaahing
0

Carvão , 37 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

Nθ

Insira o número de armários em q.

F…·¹θ«

Passe os cacifos de 1até qinclusivo.

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

Calcule a direção para o próximo armário e repita isso 5 vezes (jogando golfe do que usando movimentos de salto).

B⁶±⁶

Desenhe o armário, começando no canto inferior esquerdo. (O canto inferior direito também ocupa 4 bytes, enquanto o canto superior direito ocupa 5. O canto superior esquerdo leva apenas 3 bytes, mas o número do armário demoraria mais para ser desenhado.)

↗→→0

Desenhe o zero inicial do número do armário, se necessário.

P←⮌Iι

Desenhe o número do armário invertido e da direita para a esquerda, efetivamente justificando-o.

←←↙

Volte para o canto inferior esquerdo pronto para calcular a direção para o próximo armário.

Edit: Versões posteriores do Charcoal suportam esta solução de 32 bytes:

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

Experimente online! Link é a versão detalhada do código. Explicação:

F⪪…·¹N²«

Leve os números de 1para o número de entrada inclusive em pares. (Se o número de entrada for ímpar, a última matriz terá apenas um elemento.)

F⮌ι«

Faça um loop sobre cada par na ordem inversa.

↗→→0

Desenhe o zero inicial do número do armário, se necessário.

P←⮌Iι

Desenhe o número do armário invertido e da direita para a esquerda, efetivamente justificando-o.

↖↖↖↑UR⁶

Mova para o canto superior esquerdo do armário e desenhe-o. Este também é o canto inferior esquerdo do próximo armário, então estamos prontos para desenhar o segundo armário do par, se aplicável.

»M⁵χ

Vá para o próximo par de armários. (Isso deve ocorrer antes do loop interno para economizar 1 byte, mas o carvão vegetal gera uma saída incorreta para uma entrada de 1 por algum motivo.)

Neil
fonte