In The Jailhouse Now
Challenge
Given an integer n>=4
as input create an ASCII art "prison door"* measuring n-1
characters wide and n
characters high, using the symbols from the example below.
Example
╔╦╗
╠╬╣
╠╬╣
╚╩╝
The characters used are as follows:
┌───────────────┬─────────┬───────┐
│ Position │ Symbol │ Char │
├───────────────┼─────────┼───────┤
│ Top Left │ ╔ │ 9556 │
├───────────────┼─────────┼───────┤
│ Top │ ╦ │ 9574 │
├───────────────┼─────────┼───────┤
│ Top Right │ ╗ │ 9559 │
├───────────────┼─────────┼───────┤
│ Right │ ╣ │ 9571 │
├───────────────┼─────────┼───────┤
│ Bottom Right │ ╝ │ 9565 │
├───────────────┼─────────┼───────┤
│ Bottom │ ╩ │ 9577 │
├───────────────┼─────────┼───────┤
│ Bottom Left │ ╚ │ 9562 │
├───────────────┼─────────┼───────┤
│ Left │ ╠ │ 9568 │
├───────────────┼─────────┼───────┤
│ Inner │ ╬ │ 9580 │
└───────────────┴─────────┴───────┘
Rules
- You may take input by any reasonable, convenient means.
- For the purposes of this challenge, in languages where the symbols used to build the "door" are multi-byte characters, they may be counted towards your score as a single byte each.
- All other characters (single- or multi-byte) should be counted as normal.
- You may output an array/list of lines instead of a multi-line string.
- Output may not contain any leading or trailing whitespace other than a trailing newline where absolutely necessary.
- This is code-golf so lowest byte count wins.
Test Cases
Input: 4
Output:
╔╦╗
╠╬╣
╠╬╣
╚╩╝
Input: 8
Output:
╔╦╦╦╦╦╗
╠╬╬╬╬╬╣
╠╬╬╬╬╬╣
╠╬╬╬╬╬╣
╠╬╬╬╬╬╣
╠╬╬╬╬╬╣
╠╬╬╬╬╬╣
╚╩╩╩╩╩╝
Input: 20
Output:
╔╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╗
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╚╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╝
* Yes, I'm aware that the bigger it gets the less it looks like a prison door! :D
[C (gcc)], 119 118 116 115 byt …
3y ago
[Python 3], 74 bytes …
3y ago
Scala, 90 89 88 bytes Saved …
3y ago
[Ruby], 53 bytes ```ruby - …
3y ago
[Sclipting], (UTF-16) 80 bytes …
3y ago
[C (clang)], 210 198 183 bytes …
3y ago
6 answers
C (gcc), 119 118 116 115 bytes
#define p(x,y,z) printf(i^1?i^c?#z:#y:#x)
i,j;f(c){for(i=1;i<=c;p(╗\n,╝\n,╣\n),i++)for(j=p(╔,╚,╠);j++<c;)p(╦,╩,╬);}
Function solution.
I started with a recursive solution but it didn't work out well... though I'm still convinced that this can be shaved down quite a bit with recursion.
EDIT:
Recursive version which currently landed at exactly 115 bytes too...
#define p(x,y,z) printf(i^1?i^c?#z:#x:#y);
c,j;f(i){for(c=c?c:i,j=p(╔,╚,╠)j++<c;)p(╦,╩,╬)p(╗\n,╝\n,╣\n)--i?f(i):0;}
Python 3, 74 bytes
lambda n:"╔"+"╦"*(n-3)+"╗\n"+("╠"+"╬"*(n-3)+"╣\n")*(n-2)+"╚"+"╩"*(n-3)+"╝"
0 comment threads
Scala, 90 89 88 bytes
Saved 2 bytes thanks to Shaggy
n=>1 to n map{x=>val s=if(x<2)"╔╦╗"else if(x<n)"╠╬╣"else"╚╩╝";s(0)+(""+s(1))*(n-3)+s(2)}
I feel like there's a nicer way to repeat middle elements of a list n times, but this is all I can golf it for now.
n => //The input
1 to n //Make a range [1..n]
map{x=> //For each x in that range, make a line:
val s= //s is a string in the form "$left$inner$right"
if(x<2)"╔╦╗" //For the top
else if(x<n)"╠╬╣" //For the inner parts
else"╚╩╝"; //For the bottom
s(0)+(""+s(1))*(n-3)+s(2)} //Repeat the inner part n-3 times
Sclipting, (UTF-16) 80 bytes
갰減먩놔 먩놦①復먩놗겮꺕똀 먩놬①復①增疊먩놣겮꺕똀會먩놣겮꺕떠 먩놩⑴復먩놝
Explanation
Input n pushed on stack
갰減 Subtract 3
먩놔 "╔"
먩놦 "╦"
①復 String of above repeated n-3 times
먩놗겮꺕똀 "╗\n╠"
먩놬 "╬"
①復 String of above repeated n-3 times
①增疊 List of above repeated (n-3)+1 times
먩놣겮꺕똀 "╣\n╠"
會 Join the list with separater above
먩놣겮꺕떠 "╣\n╚"
먩놩 "╩"
⑴復 String of above repeated n-3 times (but finally remove n-3 from stack)
먩놝 "╝"
0 comment threads
C (clang), 210 198 183 bytes
i,j,k,l;s(v,w,x,y,z){printf("%s",v);for(;w<x;w++){printf("%s",y);}puts(z);}main(){scanf("%i",&i);l=i-3;s("╔",j,l,"╦","╗");for(j=0;j<i-2;j++){s("╠",k,l,"╬","╣");}s("╚",j=0,l,"╩","╝");}
Still wondering if these characters could even count as a byte, probably two. ¯\_(ツ)_/¯
A special golfing trick I learned. If you don't want to repeat the loops, then make a function. For some reason, C (clang) is okay with such non-returning function that's not main()
. Enough abuse for this.
1 comment thread