Tủ khóa số!


25

Cho một số nguyên dương <100 (từ 1 đến 99, bao gồm 1 và 99), xuất ra nhiều khóa.

Một tủ khóa được định nghĩa như sau:

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

trong đó nnlà số khóa, trong cơ sở 10. Nếu có số có 1 chữ số, nó được biểu thị bằng số 0 ở phía trước. Ví dụ, tủ khóa số 2 hiển thị số 02.

Tủ khóa có thể được xếp chồng lên nhau, nhưng chỉ cao tối đa 2:

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

onbiểu thị một số lẻ, enmột số chẵn. Tủ khóa cũng có thể được đặt cạnh nhau.

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

Lưu ý rằng tủ khóa số 5 là một tủ khóa số lẻ ở phía dưới. Điều này là do khi bạn có đầu vào số lẻ, khóa cuối cùng phải được đặt trên sàn (vì một tủ khóa lơ lửng có giá quá cao). Do đó, ví dụ trên là đầu ra dự kiến ​​cho n = 5. n = 0 sẽ không trả lại gì cả.

Quy tắc: Phương pháp tiêu chuẩn đầu vào / đầu ra. Đầu vào trong bất kỳ định dạng thuận tiện, đầu ra như một chuỗi. Tiêu chuẩn áp dụng.

Các trường hợp thử nghiệm:

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

Đây là , vì vậy mã ngắn nhất sẽ thắng!



15
Đã đến lúc nói với các nhà xây dựng để đặt các tủ khóa lẻ ở phía dưới.
mbomb007

3
Các dòng mới chuẩn bị của trường hợp 1phải được xuất ra?
dzaima

@ComradeSparklePony hoàn toàn không ảnh hưởng đến tôi :). Xin lỗi về giai điệu khắc nghiệt được sử dụng, chỉ cố gắng để giúp đỡ.
Bạch tuộc ma thuật Urn

Câu trả lời:




4

PHP, 191 byte

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

Hãy thử trực tuyến!

PHP, 235 byte

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

Trường hợp 1 với các dòng mới tùy chọn

Hãy thử trực tuyến!

Mở rộng

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 byte

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

thay thế ["","",""]bằng ["\n","\n","\n"]nếu bạn muốn dòng mới cho trường hợp1

Hãy thử trực tuyến!


2

Ruby, 256 239 201 191 183 byte

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

Điều này là rất dài. Tôi sẽ làm việc với nó nhiều hơn


2

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

Điều này thực sự cần phải được đánh xuống

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

Hãy thử trực tuyến!


Đề xuất -~n/2thay vìn/2+n%2
trần mèo

1

Hàng loạt, 305 byte

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

+----+| |cả hai đều tương tự như + +ở chỗ chúng có thể được tạo ra thông qua một sự thay thế duy nhất, và hóa ra nó ngắn hơn một chút so với việc tạo chúng một cách riêng biệt (trích dẫn thêm cần thiết cho |s không giúp ích).



1

JavaScript ES6, 224 byte

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)

Đã sử dụng một số ý tưởng từ câu trả lời Python của toán học

Kiểm tra đoạn trích

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>

Làm sạch

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

Chào mừng đến với PPCG!
caird coinheringaahing

0

Than , 37 byte

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

Hãy thử trực tuyến!Liên kết là phiên bản dài dòng của mã. Giải trình:

Nθ

Nhập số lượng tủ khóa vào q .

F…·¹θ«

Vòng qua các tủ khóa từ 1đếnq toàn diện.

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

Tính hướng đến tủ khóa tiếp theo và lặp lại 5 lần (chơi gôn hơn là sử dụng các động tác nhảy).

B⁶±⁶

Vẽ tủ khóa, bắt đầu ở góc dưới bên trái. (Góc dưới bên phải cũng mất 4 byte trong khi góc trên bên phải mất 5. Góc trên cùng bên trái chỉ mất 3 byte nhưng sau đó số khóa sẽ mất nhiều thời gian hơn để vẽ.)

↗→→0

Vẽ số 0 đứng đầu của số khóa, nếu cần.

P←⮌Iι

Vẽ số của tủ khóa đảo ngược và từ phải sang trái, hiệu quả bên phải nó.

←←↙

Di chuyển trở lại góc dưới bên trái sẵn sàng để tính hướng đến tủ khóa tiếp theo.

Chỉnh sửa: Các phiên bản sau của Char than hỗ trợ giải pháp 32 byte này:

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

F⪪…·¹N²«

Lấy các số từ 1đến số đầu vào được bao gồm theo cặp. (Nếu số đầu vào là số lẻ, mảng cuối cùng sẽ chỉ có một phần tử.)

F⮌ι«

Lặp lại trên mỗi cặp theo thứ tự ngược lại.

↗→→0

Vẽ số 0 đứng đầu của số khóa, nếu cần.

P←⮌Iι

Vẽ số của tủ khóa đảo ngược và từ phải sang trái, hiệu quả bên phải nó.

↖↖↖↑UR⁶

Di chuyển đến phía trên bên trái của tủ khóa và vẽ nó. Đây cũng là góc dưới bên trái của tủ khóa tiếp theo, vì vậy chúng tôi sẵn sàng vẽ tủ khóa thứ hai của cặp nếu có.

»M⁵χ

Di chuyển đến cặp khóa tiếp theo. (Điều này nên ở trước vòng lặp bên trong để tiết kiệm 1 byte nhưng Char than tạo đầu ra không chính xác cho đầu vào là 1 vì một số lý do.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.