Impossible cube maybe
Jelly, 187 166 bytes
ḣ9;⁾| ṁ5¤oµ€“µ½¿‘¦
“ _/ |/|”;€⁶;”_ṁ"“¡ẇḞ6’D¤ṃ@“Ė⁸ġṾṗ¢œƝṇRK⁹ṄẸŒÐ¤ɓḂı)ḥṆqƓị¹÷ḄƝṁPʠVW1JĊTc;[¤ÆWŒṠṬ#ʋÆ6ẉ⁷ZḷƊḤƑẹẠGḊ|qi×Ƭ®ÐėƁ1(⁸ṪU¹Bgoƭ<Gḋ×c:ȦṚƇĊ¬e*⁽%ḷİ°U’Fs27ǹ⁸?x€15¦€19Y
A full program.
Try it online!
How?
103 bytes are a 101 digit base 250 number, which is a base-8 compression of a possible cube, with trailing spaces added to equalise the row-lengths, without new lines, and without 18 characters from the middle of each row, like this, but without newlines:
_________________
/ _____________ /|
/ / ___________/ / |
/ / /| | / / |
/ / / | | / / |
/ / /| | | / / /| |
/ / / | | | / / / | |
/ / / | | | / / /| | |
/ /_/___|_|_|__/ / / | | |
/________________/ / | | |
| ______________ | | | | |
| | | | | |_| | |__| | |
| | | | |___| | |____| |
| | | / / ___| | |_ / /
| | | / / / | | |/ / /
| | | / / / | | | / /
| | |/ / / | | |/ /
| | | / / | | /
| | |/_/_______| | /
| |____________| | /
|________________|/
The 8 base-8 digits represent the strings of characters:
1 2 3 4 5 6 7 0
" ", "_", "/", " ", "|", "/ / /", "| | |", "_____"
So the compression is then like the below where 1
s, 6
s, 7
s and 0
s are to be replaced by the strings shown above:
111000__111/ 00___ /|11 / / 00_/ / |116| |11 / / |1 6 | |11/ /1|1 671 6| |16 71 6 | | 6 7167 6___|_|_|__6 7/000_/ / 7| 00____ | | 771 7_7__771 | |___7____| |71/ / ___7_ / / 7 6176 7 61 7 / /1761 7/ /1 7 / /11| |1/1 7/_/0__| | /11| |00__| | /11 |000_|/11
The program reverses the process and changes the characters that need changing if the cube should be an impossible one:
“ _/ |/|”;€⁶;”_ṁ"“¡ẇḞ6’D¤ṃ@“ ... ’Fs27ǹ⁸?x€15¦€19Y Main link: V
...splitting this up...
...Main link part 1:
“ _/ |/|”;€⁶;”_ṁ"“¡ẇḞ6’D¤ - make the list of strings of characters
“ _/ |/|” - list of characters = " _/ |/|"
⁶ - literal space character
;€ - concatenate €ach -> [" ","_ ","/ "," ","| ","/ ","| "]
”_ - literal = '_'
; - concatenate -> [" ","_ ","/ "," ","| ","/ ","| ", '_']
¤ - nilad followed by link(s) as a nilad:
“¡ẇḞ6’ - base 250 literal = 31111555
D - convert to decimal list -> [3,1,1,1,1,5,5,5]
" - zip with:
ṁ - mould like
- -> [" ","_","/"," ","|","/ / /","| | |","_____"]
...Main link, part 2:
...ṃ@“ ... ’Fs27 - make the rows of a possible cube without the middle repetitions:
... - part 1, above
“ ... ’ - the 101 digit base 250 number
ṃ@ - base decompression with swapped @rguments
F - flatten (because the digit values we are using are actually lists)
s27 - split into chunks of length 27 (into the rows)
...Main link part 3:
...ǹ⁸?x€15¦€19Y - make "impossible" if need be, add the row middles and output
... - part 2, above
? - if:
⁸ - chain's left argument = V
Ç - ...then: call last link (1) as a monad
- (make it an impossible cube - see link 1, below)
¹ - ...else: identity (do nothing)
€ - for €ach
¦ - apply sparsely:
15 - ...to index: 15
x€ 19 - ...this: repeat €ach nineteen times
Y - join with newlines
- implicit print
ḣ9;⁾| ṁ5¤oµ€“µ½¿‘¦ Link 1, replace characters to make impossible: rows
¦ apply sparsely:
“µ½¿‘ ...to indexes: code-page indexes = [9,10,11]
...this:
µ€ for €ach:
ḣ9 head to index 9
¤ nilad followed by link(s) as a nilad:
⁾| list of characters = ['|',' ']
ṁ5 mould like 5 = ['|',' ','|',' ','|']
; concatenate
o logical or (vectorises) with the row
(which has the effect of appending the rest of the row)
JavaScript (ES6), 352 344 333 bytes
Saved 2 bytes thanks to @YairRand
x=>[...'mnopqrstuvwxyz01~'].reduce((p,c)=>(l=p.split(c)).join(l.pop()),`1yup
1z uux z|
1/z uu_/z |
yqswtqvy|
yys wtyvq|
qs0t sw
ys 0ts w
snt/v0
v_/x${x?0:'|_|_|'}m/v 0
/~_${b=x?0:'o_'}p/zn
| ~${b}m wnrynuo_0__0ryywp0owryv p0_ vr st0/vrst 0vr/vtn/zrvtqwyzr/_/pow z
wuu__wz
|um|/~xo1yyq0w |z /q o__w| |szp~t111svzr
0qy pu~ox_ny0muxx`)
Demo
let f =
x=>[...'mnopqrstuvwxyz01~'].reduce((p,c)=>(l=p.split(c)).join(l.pop()),`1yup
1z uux z|
1/z uu_/z |
yqswtqvy|
yys wtyvq|
qs0t sw
ys 0ts w
snt/v0
v_/x${x?0:'|_|_|'}m/v 0
/~_${b=x?0:'o_'}p/zn
| ~${b}m wnrynuo_0__0ryywp0owryv p0_ vr st0/vrst 0vr/vtn/zrvtqwyzr/_/pow z
wuu__wz
|um|/~xo1yyq0w |z /q o__w| |szp~t111svzr
0qy pu~ox_ny0muxx`)
flag = true
setInterval(_ => o.innerHTML = f(flag = !flag), 750)
<pre id=o></pre>
SOGL V0.12, 145 bytes
─3n{_⁰
ā"¹K╚=+ƨψ≡tšÆA%εW#žt─M^_ξ0“6²⁰ _*ž}"⁵æκLνbΡ°■=μθΝv╝xxΛTγ►℮ΞyF“'№⁰┐∙ž}"⁸Βλμž╚⅔\Ρ═⁴-θ=╚_>◄4℮`ε║t“'¦⁰ā;∫0 /ž}╬5}'Æ6«@┐2Ο3∙:Aža.?X"≥YΤ%‘5n}L9ž
Try it Here!
This program stores the line data as 3 separate base 36-46 numbers and decodes each and ž
s the values in the main array.
Because of the abusive way of how I draw the diagonal lines, the output has 27 lines of lines with spaces (which is allowed by the OP)
input:
0 - impossible
1 - possible
Explanation:
The first line is basically a substitute ⁰ with ─3n{_
ā push an empty array (the canvas for the whole cube)
"...“ pushes 29714643711764388252557994982458231735529743027583646902
6²─ base-36 decodes it
3n{ } for each group of 3 numbers do (where the numbers are X, Y, length)
_ put all the contents on the stack (in the order X, Y, length)
_* get POP amount of underscores
ž in the canvas at the positions x;y (the position of the 1st char, 1-indexed) put the underscores
"...“ pushes 19564601770087915522037775830252836261712294966673526596188
'№─ base-46 decodes it
3n{ } for each group of 3 numbers do
_ put all the contents on the stack
┐∙ get an array of "|"s with the length of POP
ž in the canvas at the position x;y (position of the top char, 1-indexed) put the vertical bar
"...“ pushes 124633728256573776407884156928319785312464662536125755768
'¦─ base-40 decodes it
3n{ } for each group of 3 numbers do
_ put all the contents on the stack
ā; one below the stack put an empty array (canvas for the diagonal line)
∫ } for range(length) do
0 TMP
/ push "/"
ž at the position (iter; 0), 1-indexed put a "/". This extends the array one line upward and causes the extra spaces.
╬5 in the canvas at the position x;y(1-indexed, the top position) put the diagonal line canvas without overriding with spaces
'Æ push 36
6« push 12
@┐2Ο push two spaces, encased in vertical bars - "| | |"
3∙ get an array of 3 of those
:A save on variable A
ž in the canvas, at the positions 36; 12 put the array
a push the variable A
.? } if the input is non-0, then
X remove the variable A off of the stack
"≥YΤ%‘ push "|_|_|__________"
5n chop that into an array of strings of length 5
L9ž at positions 10;9 insert the top of stack (either the ["| | |","| | |","| | |"] or ["|_|_|","_____","","_____"]) in the canvas