Liczba szafek!


25

Biorąc pod uwagę dodatnią liczbę całkowitą <100 (od 1 do 99, w tym 1 i 99), wyprowadza tyle szafek.

Szafkę definiuje się następująco:

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

gdzie nnjest numer szafki, w bazie 10. Jeśli jest 1-cyfrowy numer, jest on wyrażony przed nim 0. Na przykład szafka numer 2 wyświetla numer 02.

Szafki można ustawiać jeden na drugim, ale tylko do 2 wysokości:

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

onoznacza liczbę nieparzystą, liczbę enparzystą. Szafki można również umieścić obok siebie.

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

Zauważ, że szafka numer 5 to nieparzysta szafka, która znajduje się na dole. Dzieje się tak dlatego, że gdy wprowadzasz nieparzyste dane, ostatnia szafka powinna zostać umieszczona na podłodze (ponieważ unosząca się szafka kosztuje zbyt dużo). Powyższy przykład jest zatem oczekiwaną wydajnością dla n = 5. n = 0 powinno zwrócić nic.

Zasady: Standardowe metody wejścia / wyjścia. Wprowadź w dowolnym dogodnym formacie, wyślij jako ciąg. Obowiązują standardowe luki.

Przypadki testowe:

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

To jest , więc wygrywa najkrótszy kod!



15
Czas powiedzieć budowniczym, aby postawili dziwne szafki na dole.
mbomb007

3
Czy należy wydać nowe linie sprawy 1?
dzaima 27.04.17

@ComradeSparklePony w ogóle mnie nie wywarło :). Przepraszam za ostry ton, po prostu próbuję pomóc.
Magic Octopus Urn

Odpowiedzi:




4

PHP, 191 bajtów

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

Wypróbuj online!

PHP, 235 bajtów

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

Przypadek 1 z opcjonalnymi znakami nowej linii

Wypróbuj online!

Rozszerzony

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 bajtów

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

wymienić ["","",""]ze ["\n","\n","\n"]jeśli chcesz nowe linie dla sprawy1

Wypróbuj online!


2

Rubinowy, 256 239 201 191 183 bajtów

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

To jest okropnie długie. Popracuję nad golfem.


2

C (gcc) , 426 335 300 294 282 252 249 246 244 237 bajtów

To naprawdę wymaga gry w golfa

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

Wypróbuj online!


Zaproponuj -~n/2zamiastn/2+n%2
ceilingcat

1

Partia, 305 bajtów

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

+----+i | |oba są podobne do + +tego, że można je wygenerować za pomocą pojedynczego podstawienia, i okazuje się, że jest nieco krótszy niż generowanie ich osobno (dodatkowe cytowanie wymagane dla |s nie pomaga).



1

JavaScript ES6, 224 bajty

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)

Wykorzystałem kilka pomysłów z odpowiedzi Python z matematyki ćpuna

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>

Oczyszczone

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

Witamy w PPCG!
caird coinheringaahing

0

Węgiel drzewny , 37 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

Nθ

Wprowadź liczbę szafek do q.

F…·¹θ«

Pętla nad szafkami od 1do qwłącznie.

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

Oblicz kierunek do następnej szafki i powtórz to 5 razy (bardziej golfowo niż za pomocą ruchów skoku).

B⁶±⁶

Narysuj szafkę, zaczynając od lewego dolnego rogu. (Prawy dolny róg zajmuje również 4 bajty, podczas gdy prawy górny róg zajmuje 5. Lewy górny róg zajmuje tylko 3 bajty, ale wtedy numer szafki rysowałby dłużej).

↗→→0

W razie potrzeby narysuj wiodące zero numeru szafki.

P←⮌Iι

Narysuj numer szafki odwrócony i od prawej do lewej, skutecznie uzasadniając go.

←←↙

Wróć do lewego dolnego rogu, aby obliczyć kierunek do następnej szafki.

Edycja: Późniejsze wersje Charcoal obsługują to 32-bajtowe rozwiązanie:

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

F⪪…·¹N²«

Przenieś liczby od 1na liczbę wejściową łącznie parami. (Jeśli liczba wejściowa jest nieparzysta, ostatnia tablica będzie miała tylko jeden element.)

F⮌ι«

Pętlę nad każdą parą w odwrotnej kolejności.

↗→→0

W razie potrzeby narysuj wiodące zero numeru szafki.

P←⮌Iι

Narysuj numer szafki odwrócony i od prawej do lewej, skutecznie uzasadniając go.

↖↖↖↑UR⁶

Przejdź do lewej górnej części szafki i narysuj ją. Jest to również dolny lewy róg następnej szafki, więc jesteśmy gotowi narysować drugą szafkę z pary, jeśli dotyczy.

»M⁵χ

Przejdź do następnej pary szafek. (Powinno to nastąpić przed wewnętrzną pętlą, aby zaoszczędzić 1 bajt, ale węgiel drzewny generuje niepoprawne wyjście dla wejścia 1 z jakiegoś powodu.)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.