Casiers numériques!


25

Étant donné un entier positif <100 (de 1 à 99, y compris 1 et 99), sortez autant de casiers.

Un casier est défini comme suit:

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

nnest le numéro du casier, en base 10. S'il y a un nombre à 1 chiffre, il est exprimé avec un 0 devant. Par exemple, le casier numéro 2 affiche le numéro 02.

Les casiers peuvent être empilés, mais seulement jusqu'à 2 de haut:

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

ondésigne un nombre impair, enun nombre pair. Les casiers peuvent également être placés côte à côte.

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

Notez que le casier numéro 5 est un casier de numéro impair qui se trouve en bas. En effet, lorsque vous avez une entrée impaire, le dernier casier doit être placé sur le sol (car un casier en vol stationnaire coûte trop cher). L'exemple ci-dessus est donc la sortie attendue pour n = 5. n = 0 devrait retourner un rien.

Règles: méthodes standard d'entrée / sortie. Entrée dans n'importe quel format pratique, sortie sous forme de chaîne. Des échappatoires standard s'appliquent.

Cas de test:

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

C'est le , donc le code le plus court gagne!



15
Il est temps de dire aux constructeurs de mettre les casiers impairs sur le fond.
mbomb007

3
Les nouvelles lignes en attente 1doivent-elles être produites?
dzaima

@ComradeSparklePony ne m'a pas du tout affecté :). Désolé pour le ton dur utilisé, j'essaie juste d'aider.
Urne de poulpe magique

Réponses:




4

PHP, 191 octets

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

Essayez-le en ligne!

PHP, 235 octets

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

Cas 1 avec des nouvelles lignes optionnelles

Essayez-le en ligne!

Étendu

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 octets

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

remplacer ["","",""]par ["\n","\n","\n"]si vous voulez des nouvelles lignes pour le cas1

Essayez-le en ligne!


2

Rubis, 256 239 201 191 183 octets

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

C'est terriblement long. Je travaillerai plus sur le golf.


2

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

Cela doit vraiment être joué au golf

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

Essayez-le en ligne!


Suggérer à la -~n/2place den/2+n%2
plafondcat

1

Lot, 305 octets

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

+----+et | |sont tous deux similaires + +en ce qu'ils peuvent être générés via une seule substitution, et il s'avère être légèrement plus court que de les générer séparément (la citation supplémentaire nécessaire pour |s n'aide pas).



1

JavaScript ES6, 224 octets

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)

Utilisé quelques idées de la réponse Python de junkie mathématique

Extrait de test

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>

Nettoyé

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

Bienvenue chez PPCG!
caird coinheringaahing

0

Fusain , 37 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

Nθ

Entrez le nombre de casiers dans q.

F…·¹θ«

Faites une boucle sur les casiers du 1au qinclus.

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

Calculez la direction vers le casier suivant et répétez cette opération 5 fois (golfeur plutôt que d'utiliser des mouvements de saut).

B⁶±⁶

Dessinez le casier, en commençant par le coin inférieur gauche. (Le coin inférieur droit prend également 4 octets tandis que le coin supérieur droit en prend 5. Le coin supérieur gauche ne prend que 3 octets mais le numéro du casier prendrait plus de temps à dessiner.)

↗→→0

Dessinez le zéro de tête du numéro de casier, si nécessaire.

P←⮌Iι

Dessinez le numéro de casier inversé et de droite à gauche, ce qui le justifie à droite.

←←↙

Revenez dans le coin inférieur gauche, prêt à calculer la direction du prochain casier.

Edit: les versions ultérieures de Charcoal prennent en charge cette solution de 32 octets:

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

F⪪…·¹N²«

Prenez les nombres de 1au nombre d'entrée inclus par paire. (Si le numéro d'entrée est impair, le dernier tableau n'aura qu'un seul élément.)

F⮌ι«

Faites une boucle sur chaque paire dans l'ordre inverse.

↗→→0

Dessinez le zéro de tête du numéro de casier, si nécessaire.

P←⮌Iι

Dessinez le numéro de casier inversé et de droite à gauche, ce qui le justifie à droite.

↖↖↖↑UR⁶

Déplacez-vous en haut à gauche du casier et dessinez-le. C'est également en bas à gauche du casier suivant, nous sommes donc prêts à dessiner le deuxième casier de la paire, le cas échéant.

»M⁵χ

Passez à la prochaine paire de casiers. (Cela devrait être avant la boucle intérieure pour une économie de 1 octet, mais le charbon de bois génère une sortie incorrecte pour une entrée de 1 pour une raison quelconque.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.