Dolap Sayısı!


25

<100 olan bir pozitif tamsayı verildiğinde (1 ve 99 dahil 1'den 99'a kadar), birçok dolabı çıktı.

Bir soyunma aşağıdaki gibi tanımlanır:

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

burada nn1 haneli bir sayı ise, taban 10 içinde, bunun önünde bir 0 ile dolap sayısı olarak ifade edilir. Örneğin, 2 numaralı dolap, numarayı görüntüler 02.

Dolaplar üst üste istiflenebilir, ancak yalnızca 2'ye kadar çıkabilir:

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

ontek bir sayıyı, bir çift sayıyı belirtir en. Dolaplar yan yana da konulabilir.

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

5 numaralı dolabın, altta bulunan tek numaralı bir dolap olduğuna dikkat edin. Bunun nedeni, tek numaralı girişiniz olduğunda, son soyunma zemine yerleştirilmelidir (çünkü bir asılı dolabın maliyeti çok fazladır). Bu nedenle yukarıdaki örnek n = 5 için beklenen çıktıdır. n = 0 hiçbir şey döndürmemelidir.

Kurallar: Standart girdi / çıktı yöntemleri. Herhangi bir uygun formatta giriş yapın, dizge olarak çıktı alın. Standart boşluklar uygulanır.

Test durumları:

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

Bu , yani en kısa kod kazanır!



15
İnşaatçılara garip dolapları altına koyma zamanı.
mbomb007

3
Davanın hazırlanan yeni hatları 1çıkarılmalı mı?
dzaima

@ComradeSparklePony beni hiç etkilemedi :). Kullanılan sert ton için üzgünüm, sadece yardım etmeye çalışıyorum.
Magic Octopus Urn,

Yanıtlar:




4

PHP, 191 Bayt

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

Çevrimiçi deneyin!

PHP, 235 Bayt

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

İsteğe bağlı yeni hatları olan 1. Durum

Çevrimiçi deneyin!

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 Bayt

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

yerine ["","",""]birlikte ["\n","\n","\n"]size dava için yeni satır istiyorsanız1

Çevrimiçi deneyin!


2

Ruby, 256 239 201 191 183 bayt

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

Bu çok uzun. Daha çok golf oynamaya çalışacağım.


2

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

Bu gerçekten aşağı golf gerekiyor

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

Çevrimiçi deneyin!


Öner -~n/2yerinen/2+n%2
ceilingcat

1

Toplu iş, 305 bayt

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

+----+ve | |her ikisi de + +tek bir sübstitüsyon yoluyla üretilebildiklerine benzemektedir ve bunların ayrı ayrı üretilmesinden biraz daha kısa olduğu ortaya çıkmaktadır ( |s için gereken fazladan alıntı yardımcı olmamaktadır).


1

Pyth - 97 74 86 80 75 bayt

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

Burada dene


1
Üzgünüz, ama bu şu anda 1'in girişinde başarısız oluyor.
Yoldaş SparklePony

@ComradeSparklePony Sabitledi. Teşekkürler.
Maria,

1

JavaScript ES6, 224 bayt

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)

Matematik bağımlısının Python cevabından bazı fikirler kullandı.

Test Parçacığı

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>

Temizledik

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'ye Hoşgeldiniz!
caird coinheringaahing

0

Kömür , 37 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

Nθ

Dolap sayısını girin q.

F…·¹θ«

Dolapların üzerinden kaynaştırıcıya 1geçiş yapın q.

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

Bir sonraki soyunma yönünü hesaplayın ve bunu 5 kez tekrarlayın (atlama hareketlerini kullanmaktan daha golfçü).

B⁶±⁶

Sol alt köşeden başlayarak dolabı çekin. (Sağ alt köşede 4 bayt, sağ üst köşede 5 alır. Sol üst köşede yalnızca 3 bayt ancak daha sonra soyunma numarasının çizilmesi daha uzun sürecektir.)

↗→→0

Gerekirse, dolap numarasının başındaki sıfırı çizin.

P←⮌Iι

Soyunma numarasını tersine çevrilmiş ve sağdan sola çizerek etkili bir şekilde doğrulayın.

←←↙

Bir sonraki dolabın yönünü hesaplamak için sol alt köşeye geri dönün.

Düzenleme: Kömürün sonraki sürümleri bu 32 baytlık çözümü destekler:

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

F⪪…·¹N²«

Sayıları 1çift ​​olarak dahil olan giriş numarasına götürün . (Giriş numarası tek ise, son dizide sadece bir eleman bulunur.)

F⮌ι«

Her bir çift için ters sırada döngü yapın.

↗→→0

Gerekirse, dolap numarasının başındaki sıfırı çizin.

P←⮌Iι

Soyunma numarasını tersine çevrilmiş ve sağdan sola çizerek etkili bir şekilde doğrulayın.

↖↖↖↑UR⁶

Dolabın sol üst tarafına gidin ve onu çizin. Bu aynı zamanda bir sonraki dolabın sol alt kısmıdır, bu yüzden eğer uygunsa çiftin ikinci dolabını çizmeye hazırız.

»M⁵χ

Bir sonraki dolap çiftine geçin. (Bu, 1 baytlık bir tasarruf için iç döngüden önce olmalıdır, ancak Kömür bazı nedenlerden dolayı 1 girişi için hatalı çıktı üretir.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.