| Bytes | Lang | Time | Link |
|---|---|---|---|
| 216 | Python 3.8 prerelease | 250426T121145Z | squarero |
| 263 | AWK | 250429T145531Z | xrs |
| 2878 | Google Sheets | 250428T193147Z | doubleun |
| 2628 | JavaScript Node.js | 250429T124858Z | doubleun |
| 276 | Ruby p | 250426T045856Z | Value In |
| 068 | 05AB1E | 250428T073716Z | Kevin Cr |
| nan | Uiua | 250427T133159Z | Joao-3 |
| 070 | Charcoal | 250426T132812Z | Neil |
| nan | Jelly | 250426T182946Z | Jonathan |
| 213 | JavaScript Node.js | 250426T123236Z | l4m2 |
Python 3.8 (pre-release), 200 199 or 217 216 bytes
-1 byte from both: use '%d'%x instead of str(x) to save a byte of whitespace (source).
199 bytes if a map object of lines is sufficient:
lambda x:map(''.join,[*zip(*[((t:=''.join(map(lambda x:chr(x-1and x+9470or 32),b'ywxvxxx&yy&wxvvxw&&w'))[int(c)*6:])[:6:3],t[1:6:3],t[2:6:3])for c in'%d'%x])])
216 bytes if multiline output is required (as per challenge):
lambda x:print(*map(''.join,[*zip(*[((t:=''.join(map(lambda x:chr(x-1and x+9470or 32),b'ywxvxxx&yy&wxvvxw&&w'))[int(c)*6:])[:6:3],t[1:6:3],t[2:6:3])for c in'%d'%x])]),sep='\n')
AWK, 155 chars, 263 bytes
{for(;i++<NF;p=p substr("└┘╶┴└╴╶┘ ╵╶┘└┘ ╵└┘ ╵",x,2)){s=s substr("┌┐ ┐╶┐╶┐╷╷┌╴┌╴╶┐┌┐┌┐",(x=$i*2+1),2);t=t substr("││ │┌┘╶┤└┤└┐├┐ │├┤└┤",x,2)}}$0=s"\n"t"\n"p
Google Sheets, 179 chars, 287 UTF-8 bytes
=reduce(,{1,2,3},lambda(r,j,r&reduce(,sequence(len(A1)),lambda(s,i,s&mid(index({"┌┐ ┐╶┐╶┐╷╷┌╴┌╴╶┐┌┐┌┐","││ │┌┘╶┤└┤└┐├┐ │├┤└┤","└┘╶┴└╴╶┘ ╵╶┘└┘ ╵└┘ ╵"},j),2*mid(A1,i,1)+1,2)))&"
"))
Put the digits in cell A1 and the formula in B1.

Ungolfed:
=let(
a, { "┌┐ ┐╶┐╶┐╷╷┌╴┌╴╶┐┌┐┌┐";
"││ │┌┘╶┤└┤└┐├┐ │├┤└┤";
"└┘╶┴└╴╶┘ ╵╶┘└┘ ╵└┘ ╵"
},
reduce("", sequence(3), lambda(r, j,
r &
reduce("", sequence(len(A1)), lambda(s, i, let(
f, lambda(t, mid(t, 2 * mid(A1, i, 1) + 1, 2)),
s & f(index(a, j))
))) &
char(10)
))
)
JavaScript (Node.js), 154 chars, 262 UTF-8 bytes
$=>[0,1,2].reduce((r,j)=>r+[...$].reduce((s,c)=>s+(a=["┌┐ ┐╶┐╶┐╷╷┌╴┌╴╶┐┌┐┌┐","││ │┌┘╶┤└┤└┐├┐ │├┤└┤","└┘╶┴└╴╶┘ ╵╶┘└┘ ╵└┘ ╵"])[j][2*c]+a[j][2*c+1],'\n'),'')
Port of my Google Sheets answer.
Ruby -p, 278 276 bytes
s=$/
gsub(/./){$><<%w'┌┐ \ ┐ ╶┐ ╶┐ ╷╷ ┌╴ ┌╴ ╶┐ ┌┐ ┌┐'[i=$&.to_i]
s+=%w'││ \ │ ┌┘ ╶┤ └┤ └┐ ├┐ \ │ ├┤ └┤ ││'[i]
%w'└┘ ╶┴ └╴ ╶┘ \ ╵ ╶┘ └┘ \ ╵ └┘ \ ╵ └┘'[i]}
puts s
Explanation
#! ruby -p # Take input, run code, then output
s=$/ # Initialize middle row to newline
gsub(/./){ # Replace each character of input...
i=$&.to_i # Get int value of character
$><<%w'...'[ ] # Print top row symbol immediately
s+=%w'...'[i] # Add symbols to middle row
%w'...'[i]} # ... with the corresponding symbols
puts s # Print middle row
# (Bottom row printed automatically)
05AB1E, 68 bytes (without bonus)
•ʒÚĆu¬&“
∞M>ζ¿?>∞‹6×d7Δ¦+Ï+5••´A¼P¬`ĀpòÅ·¶²ˆ³Çûô~j•4°вçÅвJ2ô3ôISèøJ»
05AB1E, score: 69 (92 bytes - 25% bonus)
•ʒÚĆu¬&“
∞M>ζ¿?>∞‹6×d7Δ¦+Ï+5••„`~f₂λ£Îy≠¦т3“ ¢`Ûλö+·âŠ)u$₃₃vƒH†á-āò!θ™•4°в2äIèçÅвJ2ô3ôISèøJ»
Explanation:
•ʒÚĆu¬&“
∞M>ζ¿?>∞‹6×d7Δ¦+Ï+5•
# Push compressed integer 23726136957641056461562494931500353271689051299106857692814144430
# Without bonus:
•´A¼P¬`ĀpòÅ·¶²ˆ³Çûô~j•
# Push compressed integer 948895909496949200329484950894749588958995919500
4° # Push 10000 (10 to the power 4)
в # Convert the large integer to a base-10000 list:
# [9488,9590,9496,9492,32,9484,9508,9474,9588,9589,9591,9500]
# With bonus:
•„`~f₂λ£Îy≠¦т3“ ¢`Ûλö+·âŠ)u$₃₃vƒH†á-āò!θ™•
# Push compressed integer 948895909496949200329484950894749588958995919500949195949499949500329487951594759473959395959507
4°в # Convert it to a base-10000 list:
# [9488,9590,9496,9492,32,9484,9508,9474,9588,9589,9591,9500,9491,9594,9499,9495,32,9487,9515,9475,9473,9593,9595,9507]
2ä # Split it into two equal-sized parts
Iè # Get the 0-based first input'th part
ç # Convert the integers to characters with those codepoints
Åв # Convert the first integer to this base-"┐╶┘└ ┌┤│╴╵╷├" list,
# aka convert it to a base-length list and index into the string
J # Join the list of characters together to a string
2ô # Split it into substrings of size 2
3ô # Then split that into sublists of size 3
I # Push the second input-integer
S # Convert it to a list of digits
è # Index each into this list
ø # Zip/transpose; swapping rows/columns
J # Join each inner list together to strings
» # Join all strings with newline delimiter
# (after which the result is output implicitly)
See this 05AB1E tip of mine (sections How to compress large integers? and How to compress integer lists?) to understand why •ʒÚĆu¬&“\n∞M>ζ¿?>∞‹6×d7Δ¦+Ï+5• is 23726136957641056461562494931500353271689051299106857692814144430; •´A¼P¬`ĀpòÅ·¶²ˆ³Çûô~j• is 948895909496949200329484950894749588958995919500; •´A¼P¬`ĀpòÅ·¶²ˆ³Çûô~j•4°в is [9488,9590,9496,9492,32,9484,9508,9474,9588,9589,9591,9500]; •„`~f₂λ£Îy≠¦т3“ ¢`Ûλö+·âŠ)u$₃₃vƒH†á-āò!θ™• is 948895909496949200329484950894749588958995919500949195949499949500329487951594759473959395959507; and •„`~f₂λ£Îy≠¦т3“ ¢`Ûλö+·âŠ)u$₃₃vƒH†á-āò!θ™•4°в is [9488,9590,9496,9492,32,9484,9508,9474,9588,9589,9591,9500,9491,9594,9499,9495,32,9487,9515,9475,9473,9593,9595,9507].
Uiua, 167 163 bytes + Bonus => Score = 125.25 122.25
The bytes here are counted with the SBCS bytes metric that appears upon hovering on a function in the pad.
≡&p/≡⊂⊏:∧(⍜⊙↻⊂@ )12_25+9472⊂@\0"$uvwt#+yz{x"+×13:°⋯↯∞_3_2_4⋯₈-@\0⊏:↯∞_3"2T¬9R´9yYªt²4Y²6T92vT2tY"≡⋕°⋕
Apparently, Uiua is good at compressing strings:
"$uvwt#+yz{x": Every character here is added to 9472, which ends up in the Box Drawing Unicode block. After decompression and inserting spaces, it ends up becoming"─│┌┐└┘├┤╵╶╷╴ ━┃┏┓┗┛┣┫╹╺╻╸ "."2T¬9R´9yYªt²4Y²6T92vT2tY": Every digit is represented by 3 characters, whose nibbles (hex digits) index into the box drawing string. This gets decompressed into a 10⨯3⨯2 array of indices.
Charcoal, 80 70 bytes
E⪪“Z↶∕≧kK»B'´⎚.›{.⊟Iζ7M⊙ω$➙|ⅈ”χ⭆θ⍘℅§ιIλ⭆I⪪”)¶∧q¦Fω↔hςZUV⁵⁹C.4|μ|y§”⁴℅ν
Try it online! Link is to verbose version of code. Explanation: Uses a look-up table where each row of each digit is encoded by an ASCII character whose ordinal is converted to base 12 using a custom string of box-drawing characters as digits, chosen so that all of the required characters are printable ASCII.
“...” Compressed look-up table
⪪ Split into substrings by length
χ Predefined variable `10`
E Map over substrings
θ First input
⭆ Map over digits and join
ι Current substring
§ Indexed by
λ Current digit
I Cast to integer
℅ Take the ordinal
⍘ Convert using custom base digits
”...” Compressed list of character codes
⪪ Split into substrings by length
⁴ Literal integer `4`
I Cast to integer
⭆ Map over values and join
ν Current value
℅ Character with that ordinal
Implicitly print
Previous 80-byte solution:
↑⪪⭆⭆S§⪪”&&LvYζ=⟦Þ´⪫⊞X⁹Kv№DSσ,,⁰∕C!E↘β”⁶Iι§ │┌┐└┘├┤╴╵╶╷⌕βι³
Try it online! Link is to verbose version of code. Explanation: Represents each digit by six letters encoding box-drawing characters, but output left-to-right so that the first letter encodes the bottom left, the third encodes the top left and the sixth encodes the top right box-drawing character of the digit.
S Input as a string
⭆ Map over digits and join
”...” Compressed look-up table of lowercase letters
⪪ Split into substrings by length
⁶ Literal integer `6`
§ Indexed by
ι Current digit
I Cast to integer
⭆ Map over lowercase letters
... Box-drawing characters
§ Indexed by
⌕ Index of
ι Current letter
β In lowercase letters
⪪ Split into substrings by length
³ Literal integer `3`
↑ Output rotated 90° anticlockwise
This is 58 characters but each box-drawing character takes 3 bytes to represent for a total of 22 extra bytes. Note that due to a bug in TIO's deverbosifier, it unnecessarily inserts three extra bytes into the code (ATO's deverbosifier does not have that bug).
Jelly, 70 bytes with bonus -> Score = 53.5
DịⱮ“€00ȷYY0TTT“Ð\;wlHÐSw'“æq8æ8tætæt‘ṃYð“µƤƈRṛ’D×+“ḂJȦỴdT`\ẒlX‘+⁽!ⱮỌ⁶;
A full program that accepts two arguments - the non-negative integer and a zero or one indicating boldness - and prints to stdout.
How?
DịⱮ“...‘ṃYð“...’D×+“...‘+⁽!ⱮỌ⁶; - Main Link: N; isBold
“...’D - digits of 41447333473
× - multiply each by {isBold}
+“...‘ - vectorised add to [191,74,190,188,100,84,96,92,189,108,88]
+⁽!Ɱ - add 9400 to each
Ọ - from ordinals
⁶; - prefix with a space
-> Chars = " ╷│╶╴├┌┘└╵┤┐"
ð - using {Chars} as right argument...
D - digits of {N}
ịⱮ“...‘ - 1-index into each of:
[[12, 48, 48, 26, 89, 89, 48, 84, 84, 84],
[15, 92, 59,119,108, 72, 15, 83,119, 39],
[22,113, 56, 22, 56,116, 22,116, 22,116]]
ṃ - base decompress using {Chars} as the digits [1,...,11,0]
Y - join with newline character
- implicit, smashing print
Jelly, 60 bytes -> Score = 60
“ḂJȦỴdT`\ẒlX‘⁽!Ɱ+Ọ⁶;ɓDịⱮ“€00ȷYY0TTT“Ð\;wlHÐSw'“æq8æ8tætæt‘ṃY
A full program that accepts a non-negative integer argument and prints to stdout.
How?
“...‘⁽!Ɱ+Ọ⁶;ɓDịⱮ“...‘ṃY - Main Link: N
“...‘ - list of code-page indices
-> [191,74,190,188,100,84,96,92,189,108,88]
⁽!Ɱ+ - 9400 plus {that}
-> [9591,9474,9590,9588,9500,9484,9496,9492,9589,9508,9488]
Ọ - from ordinals
-> "╷│╶╴├┌┘└╵┤┐"
⁶; - prefix {that} with a space character
ɓ - start a new dyadic chain - f(N, Chars)
D - digits of {N}
“...‘ - list of lists of code page indices
-> [[12, 48, 48, 26, 89, 89, 48, 84, 84, 84],
[15, 92, 59,119,108, 72, 15, 83,119, 39],
[22,113, 56, 22, 56,116, 22,116, 22,116]]
ịⱮ - {Digits of N} 1-index into each of {those}
ṃ - base decompress using {Chars} as the digits [1,...,11,0]
Y - join with newline characters
- implicit, smashing print
JavaScript (Node.js), 213 bytes, bonus
s=>t=>(A=t?'╺┗┏┣ ╹╻┃╸┛┓┫':'╶└┌├ ╵╷│╴┘┐┤',g=x=>s.replace(/./g,c=>A[x[c]]+A[+x[1+c]+4]))('24006220226266244666')+`
${g('74201134313357766377')}
`+g('14104014105145155155')
JavaScript (Node.js), 171 bytes
s=>(A='╶└┌├ ╵╷│╴┘┐┤',g=x=>s.replace(/./g,c=>A[x[c]]+A[+x[1+c]+4]))('24006220226266244666')+`
${g('74201134313357766377')}
`+g('14104014105145155155')