답변:
,ajJ'|
여기 사용해보십시오! 내 박스 내장이 마침내 편리해졌습니다! :디
,ajJ'|
,a draw a box
j with width (input 1)
J and height (input 2)
' with options
| - corner
- the rest are defaults
,þ%,ỊḄị“-|| ”Y
온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인 .
,þ%,ỊḄị“-|| ”Y Main link. Left argument: w. Right argument: h
,þ Pair table; yield a 2D array of all pairs [i, j] such that
1 ≤ i ≤ w and 1 ≤ j ≤ h.
, Pair; yield [w, h].
% Take the remainder of the element-wise division of each [i, j]
by [w, h]. This replaces the highest coordinates with zeroes.
Ị Insignificant; map 0 and 1 to 1, all other coordinates to 0.
Ḅ Unbinary; convert each pair from base 2 to integer.
[0, 0] -> 0 (area)
[0, 1] -> 1 (top or bottom edge)
[1, 0] -> 2 (left or right edge)
[1, 1] -> 3 (vertex)
“-|| ” Yield that string. Indices are 1-based and modular in Jelly, so the
indices of the characters in this string are 1, 2, 3, and 0.
ị At-index; replace the integers by the correspoding characters.
Y Join, separating by linefeeds.
바이트에 대해 @WeeingIfFirst와 @LuisMendo에게 감사드립니다 =)
function z=f(a,b);z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])='|'
이것은 Matlab에서 정말 간단합니다. 먼저 원하는 크기의 행렬을 만든 다음을 삽입하기 위해 첫 번째와 마지막 행을 인덱싱하고 삽입 할 -
첫 번째와 마지막 열과 동일하게 수행하십시오 |
.
예를 들어 f(4,3)
반환
|--|
| |
|--|
z([1,b],1:a)=45;z(1:b,[1,a])=124;z=[z,'']
z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])=124
z(b,a)=' '
은 char로 초기화됩니다. 그 후에 숫자를 채울 수 있으며 자동으로 문자로 캐스트됩니다. z
원래 유형 유지
f[a,b]n=a:(b<$[3..n])++[a]
g i=unlines.f[f"|-"i,f"| "i]
사용 예 :
*Main> putStr $ g 10 3
|--------|
| |
|--------|
helper 함수 f
는 두 개의 요소 목록 [a,b]
과 숫자 n
를 가져오고 하나 a
뒤에 n-2
b
s 뒤에 하나의 목록을 리턴합니다 a
. 우리는 f
thrice :를 사용하여 상단 / 하단 라인 : f "|-" i
, 중간 라인 : f "| " i
및 그 둘로부터 전체 직사각형을 만들 수 있습니다 :f [<top>,<middle>] j
(주 : j
매개 변수와 같이 표시되지 않습니다g i
부분 적용 인해 ).
편집 : @dianne은 두 개의 Char
인수를 String
길이 2 중 하나로 결합하여 바이트를 절약했습니다 . 대단히 감사합니다!
#
아이디어를 좋아한다 !
(a:b)#n=a:([3..n]>>b)++[a]
하고 기록 함으로써 약간의 바이트를 절약 할 수 있다고 생각한다["|-"#i,"| "#i]#j
@flornquake 덕분에 -3 바이트 (불필요한 괄호 제거 h
, 카운터로 사용 )
def f(w,h):exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h
테스트 사례는 아이디어입니다
('- '[1<i<h])
괄호가 필요하지 않습니다.
exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h
h
카운터로 사용 하는 것이 현명합니다! 감사.
fu A(...)
exe "norm ".a:1."i|\ehv0lr-YpPgvr dd".a:2."p2dd"
endf
:call A(3,3)
fun A(...) " a function with unspecified params (a:1 and a:2)
exe " exe(cute) command - to use the parameters we must concatenate :(
norm " run in (norm) al mode
#i| " insert # vertical bars
\e " return (`\<Esc>`) to normal mode
hv0l " move left, enter visual mode, go to the beginning of the line, move right (selects inner `|`s)
r- " (r)eplace the visual selection by `-`s
YpP " (Y) ank the resulting line, and paste them twice
gv " re-select the previous visual selection
r<Space> " replace by spaces
dd " Cut the line
#p " Paste # times (all inner rows)
2dd " Remove extra lines
사용하지 않으므로 norm!
vim 사용자 정의 맵핑을 방해 할 수 있습니다!
'|-| '2:"iqWQB]E!+)
이 접근법은 이 다른 답변 에서 사용 된 것과 비슷합니다 . 코드는 다음과 같은 형식의 숫자 형 배열을 만듭니다.
3 2 2 2 3
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
3 2 2 2 3
그리고 그 값은 '|-| '
원하는 결과를 산출하기 위해 문자열 에 (1 기반, 모듈 식) 인덱스로 사용됩니다 .
'|-| ' % Push this string
2:" ] % Do this twice
i % Take input
q % Subtract 1
W % 2 raised to that
Q % Add 1
B % Convert to binary
E % Multiply by 2
! % Transpose
+ % Add with broadcast
) % Index (modular, 1-based) into the string
높이로 입력 한 다음 너비로 입력합니다.
F„ -N_N¹<Q~è²Í×'|.ø,
설명
F # height number of times do
N_ # current row == first row
~ # OR
N¹<Q # current row == last row
„ - è # use this to index into " -"
²Í× # repeat this char width-2 times
'| # push a pipe
.ø # surround the repeated string with the pipe
, # print with newline
Adnan 덕분에 2 바이트 절약
F„ -N_N¹<Q~è²Í×'|.ø,
.
w,h=input()
for c in'-%*c'%(h-1,45):print'|'+c*(w-2)+'|'
flornquake는 1 바이트를 절약했습니다.
%c
변환을 사용하여 바이트를 저장할 수 있습니다 .'-%*c'%(h-1,45)
%*c
조차하지 않았다! 고맙습니다. :)
'-%%%dc'%~-h%45
같은 길이로 작동합니다.
골프 :
(defun a(w h)(flet((f(c)(format t"|~v@{~A~:*~}|~%"(- w 2)c)))(f"-")(loop repeat(- h 2)do(f" "))(f"-")))
언 골프 드 :
(defun a (w h)
(flet ((f (c) (format t "|~v@{~A~:*~}|~%" (- w 2) c)))
(f "-")
(loop repeat (- h 2) do
(f " "))
(f "-")))
통역은 없습니다 약간 더 이상 도청
?;,u[*'|u]'|?@-[*:l'|l[|,l]d@ ],ur[|'-r]
? - input integer into register
; - move down by the contents of register
, - write the char variable, default *
u - move up
[* ] - while current cell is not *
'| - write |
u - move up
'| - write | again
? - input other integer into register
@- - set char variable to -
[* ] - while current char is not *
:l'|l - move right by amount in register, move left, write |, move left again
[|,l] - while current cell is not |, write char variable, move left
d@ - move down, set char variable to space (this means all but first iteration of loop writes space)
,ur -write char variable, move up, right
[| ] -while current char is not |
'-r - write -, move right
(@ mbomb007의 피드백 : -9 바이트)
def d(x,y):return'\n'.join(('|'+('-'*(x-2)if n<1or n==~-y else' '*(x-2))+'|')for n in range(y))
(내 첫 번째 코드 골프, 피드백 감사)
range(y)
대신 대신 사용할 수 있으며 음수가 아닌 range(0,y)
경우 n
다음을 사용할 수 있습니다.if n<1or n==~-y else
public String rect(int x, int y){
String o="";
for(int i=-1;++i<y;){
o+="|";
for(int j=2;++j<x)
if(i<1||i==y-1)
o+="-";
else
o+=" ";
o+="|\n";
}
return o;
}
골프 :
String r(int x,int y){String o="";for(int i=-1;++i<y;){o+="|";for(int j=2;++j<x;)if(i<1||i==y-1)o+="-";else o+=" ";o+="|\n";}return o;}
o+=x "|\n"
? Did you mean to put an +
there?
param($a,$b)1..$b|%{"|$((' ','-')[$_-in1,$b]*($a-2))|"}
Takes input $a
and $b
. Loops from 1
to $b
. Each iteration, we construct a single string. The middle is selected from an array of two single-length strings, then string-multiplied by $a-2
, while it's surrounded by pipes. The resulting strings are left on the pipeline, and output via implicit Write-Output
happens on program completion, with default newline separator.
Alternatively, also at 55 bytes
param($a,$b)1..$b|%{"|$((''+' -'[$_-in1,$b])*($a-2))|"}
This one came about because I was trying to golf the array selection in the middle by using a string instead. However, since [char]
times [int]
isn't defined, we lose out on the savings by needing to cast as a string with parens and ''+
.
Both versions require v3 or newer for the -in
operator.
PS C:\Tools\Scripts\golfing> .\draw-an-ascii-rectangle.ps1 10 3
|--------|
| |
|--------|
PS C:\Tools\Scripts\golfing> .\draw-an-ascii-rectangle.ps1 7 6
|-----|
| |
| |
| |
| |
|-----|
list(,$w,$h)=$argv;for($p=$h--*$w;$p;)echo$p--%$w?$p%$w?$p/$w%$h?" ":"-":"|
":"|";
indexing a static string including the newline
list(,$w,$h)=$argv; // import arguments
for($p=$h--*++$w;$p;) // loop $p through all positions counting backwards
// decrease $h and increase $w to avoid parens in ternary conditions
echo" -|\n"[
$p--%$w // not (last+1 column -> 3 -> "\n")
? $p%$w%($w-2) // not (first or last row -> 2 -> "|")
?+!($p/$w%$h) // 0 -> space for not (first or last row -> 1 -> "-")
:2
:3
];
Oh, that's a lot simpler :)
->x,y{y.times{|i|puts"|#{(-~i%y<2??-:' ')*(x-2)}|"}}
\n
.
i
and j
. Replace i
's definition with x-=2
. Instead of j
, just use (y-2)
.
Includes +1 for -n
Give sizes as 2 lines on STDIN
perl -nE 'say"|".$_ x($`-2)."|"for"-",($")x(<>-1-/$/),"-"'
3
8
^D
Just the code:
say"|".$_ x($`-2)."|"for"-",($")x(<>-1-/$/),"-"
Saved quite a few bytes by removing stupid over complexities.
function(w,h)function g(s)return'|'..s:rep(w-2)..'|\n'end b=g'-'print(b..g' ':rep(h-2)..b)end
Ungolfed:
function(w,h) -- Define Anonymous Function
function g(s) -- Define 'Row Creation' function. We use this twice, so it's less bytes to function it.
return'|'..s:rep(w-2)..'|\n' -- Sides, Surrounding the chosen filler character (' ' or '-'), followed by a newline
end
b=g'-' -- Assign the top and bottom rows to the g of '-', which gives '|---------|', or similar.
print(b..g' ':rep(h-2)..b) -- top, g of ' ', repeated height - 2 times, bottom. Print.
end
Z"45ILJhY('|'5MZ(
This is a slightly different approach than the one of the MATL-God.
Z" Make a matrix of spaces of the given size
45ILJhY( Fill first and last row with '-' (code 45)
'|'5MZ( Fill first and last column with '|' (using the automatic clipboard entry 5M to get ILJh back)
Thanks @LuisMendo for all the help!
<?$R=str_repeat;echo$l="|{$R('-',$w=$W-2)}|
",$R("|{$R(' ',$w)}|
",$H-2),$l;
This assumes you have the default php.ini
settings for this version, including short_open_tag
and register_globals
enabled.
This requires access through a web server (e.g.: Apache), passing the values over session/cookie/POST/GET variables.
The key W
controls the width and the key H
controls the height.
For example: http://localhost/file.php?W=3&H=5
p="|"
def r(w,h):m=w-2;b=p+"-"*m+p;return b+"\n"+(p+m*" "+p+"\n")*(h-2)+b
let v = {(c:String,n:Int) -> String in var s = "";for _ in 1...n {s += c};return s;};_ = {var s = "|"+v("-",$0-2)+"|\n" + v("|"+v(" ",$0-2)+"|\n",$1-2) + "|"+v("-",$0-2)+"|";print(s);}(10,5)
I think Swift 3 could golf this a lot more but I don't feel like downloading Swift 3.
Ị
:)