Skip to content

Instantly share code, notes, and snippets.

@tompng
Last active December 23, 2020 15:41
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tompng/85d3014b2df7bc50d03cb3f42e0be194 to your computer and use it in GitHub Desktop.
Save tompng/85d3014b2df7bc50d03cb3f42e0be194 to your computer and use it in GitHub Desktop.
type DeleteSpace<T extends string> =
T extends `${infer A} ${infer B}` ? `${DeleteSpace<A>}${DeleteSpace<B>}` :
T extends `${infer A} ${infer B} ${infer C} ${infer D} ${infer E} ${infer F} ${infer G} ${infer H} ${infer I} ${infer J} ${infer K} ${infer L} ${infer M} ${infer N} ${infer O} ${infer P} ${infer Q}`
? `${A}${B}${C}${D}${E}${F}${G}${H}${I}${J}${K}${L}${M}${N}${O}${P}${DeleteSpace<Q>}` :
T extends `${infer A} ${infer B} ${infer C} ${infer D}`
? `${A}${B}${C}${DeleteSpace<D>}` :
T extends `${infer A} ${infer B}` ? `${A}${DeleteSpace<B>}` : T
type DeleteLB<T extends string> = T extends `${infer A}\n${infer B}\n${infer C}\n${infer D}`
? `${A}${B}${C}${DeleteLB<D>}` :
T extends `${infer A}\n${infer B}` ? `${A}${DeleteLB<B>}` : T
type Split<Data extends string> =
Data extends `${infer A}|${infer B}|${infer C}|${infer D}|${infer E}|${infer F}|${infer G}|${infer H}|${infer Rest}` ?
[A,B,C,D,E,F,G,H,...Split<Rest>] :
Data extends `${infer A}|${infer B}|${infer C}|${infer D}|${infer Rest}` ?
[A,B,C,D,...Split<Rest>] :
Data extends `${infer Line}|${infer Rest}` ? [Line, ...Split<Rest>] : Data extends '' ? [] : [Data]
type LB = ' \n'
type Render0_63<D extends string[]> =
`${L<D[0]>}${LB}${L<D[1]>}${LB}${L<D[2]>}${LB}${L<D[3]>}${LB}${L<D[4]>}${LB}${L<D[5]>}${LB}${L<D[6]>}${LB}${L<D[7]>
}${LB}${L<D[8]>}${LB}${L<D[9]>}${LB}${L<D[10]>}${LB}${L<D[11]>}${LB}${L<D[12]>}${LB}${L<D[13]>}${LB}${L<D[14]>}${LB}${L<D[15]>
}${LB}${L<D[16]>}${LB}${L<D[17]>}${LB}${L<D[18]>}${LB}${L<D[19]>}${LB}${L<D[20]>}${LB}${L<D[21]>}${LB}${L<D[22]>}${LB}${L<D[23]>
}${LB}${L<D[24]>}${LB}${L<D[25]>}${LB}${L<D[26]>}${LB}${L<D[27]>}${LB}${L<D[28]>}${LB}${L<D[29]>}${LB}${L<D[30]>}${LB}${L<D[31]>
}${LB}${L<D[32]>}${LB}${L<D[33]>}${LB}${L<D[34]>}${LB}${L<D[35]>}${LB}${L<D[36]>}${LB}${L<D[37]>}${LB}${L<D[38]>}${LB}${L<D[39]>
}${LB}${L<D[40]>}${LB}${L<D[41]>}${LB}${L<D[42]>}${LB}${L<D[43]>}${LB}${L<D[44]>}${LB}${L<D[45]>}${LB}${L<D[46]>}${LB}${L<D[47]>
}${LB}${L<D[48]>}${LB}${L<D[49]>}${LB}${L<D[50]>}${LB}${L<D[51]>}${LB}${L<D[52]>}${LB}${L<D[53]>}${LB}${L<D[54]>}${LB}${L<D[55]>
}${LB}${L<D[56]>}${LB}${L<D[57]>}${LB}${L<D[58]>}${LB}${L<D[59]>}${LB}${L<D[60]>}${LB}${L<D[61]>}${LB}${L<D[62]>}${LB}${L<D[63]>}`
type Render64_127<D extends string[]> =
`${L<D[64]>}${LB}${L<D[65]>}${LB}${L<D[66]>}${LB}${L<D[67]>}${LB}${L<D[68]>}${LB}${L<D[69]>}${LB}${L<D[70]>}${LB}${L<D[71]>
}${LB}${L<D[72]>}${LB}${L<D[73]>}${LB}${L<D[74]>}${LB}${L<D[75]>}${LB}${L<D[76]>}${LB}${L<D[77]>}${LB}${L<D[78]>}${LB}${L<D[79]>
}${LB}${L<D[80]>}${LB}${L<D[81]>}${LB}${L<D[82]>}${LB}${L<D[83]>}${LB}${L<D[84]>}${LB}${L<D[85]>}${LB}${L<D[86]>}${LB}${L<D[87]>
}${LB}${L<D[88]>}${LB}${L<D[89]>}${LB}${L<D[90]>}${LB}${L<D[91]>}${LB}${L<D[92]>}${LB}${L<D[93]>}${LB}${L<D[94]>}${LB}${L<D[95]>
}${LB}${L<D[96]>}${LB}${L<D[97]>}${LB}${L<D[98]>}${LB}${L<D[99]>}${LB}${L<D[100]>}${LB}${L<D[101]>}${LB}${L<D[102]>}${LB}${L<D[103]>
}${LB}${L<D[104]>}${LB}${L<D[105]>}${LB}${L<D[106]>}${LB}${L<D[107]>}${LB}${L<D[108]>}${LB}${L<D[109]>}${LB}${L<D[110]>}${LB}${L<D[111]>
}${LB}${L<D[112]>}${LB}${L<D[113]>}${LB}${L<D[114]>}${LB}${L<D[115]>}${LB}${L<D[116]>}${LB}${L<D[117]>}${LB}${L<D[118]>}${LB}${L<D[119]>
}${LB}${L<D[120]>}${LB}${L<D[121]>}${LB}${L<D[122]>}${LB}${L<D[123]>}${LB}${L<D[124]>}${LB}${L<D[125]>}${LB}${L<D[126]>}${LB}${L<D[127]>}`
type RenderFull<D extends any[]> = `${LB}${Render0_63<D>}${LB}${Render64_127<D>}`
type SChars = {'0':'_','1':'▘','2':'▝','3':'▀','4':'▖','5':'▌','6':'▞','7':'▛','8':'▗','9':'▚','+':'▐','-':'▜','*':'▄','/':'▙','_':'▟','=':'█'}
type MChars = {'!':'_','?':'▘','@':'▝','#':'▀','$':'▖','%':'▌','^':'▞','&':'▛','(':'▗',')':'▚','[':'▐',']':'▜','{':'▄','}':'▙',':':'▟',';':'█'}
type C1 = keyof SChars
type CX = keyof MChars
type L<X extends string> =
X extends `${infer A}${infer B}${infer C}${infer D}${infer E}${infer F}${infer Rest}`
? Rest extends '' ? RenderLineShort<X> :
(F extends CX ? `${L<`${A}${B}${C}${D}${E}`>}${L<`${F}${Rest}`>}` : `${L<`${A}${B}${C}${D}${E}${F}`>}${L<`${Rest}`>}`) :
RenderLineShort<X>
type RenderLineShort<X extends string> =
X extends '' | undefined ? '' :
X extends `${infer G}${infer Rest}` ?
[G, Rest] extends [CX, `${infer N}${infer R}`] ? `${Multi<G, N>}${RenderLineShort<R>}`
: `${Single<G>}${RenderLineShort<Rest>}`
: Single<X>
type Single<C extends string> = C extends C1 ? SChars[C] : never
type Multi<C extends string, N extends string> = C extends CX ? Repeat<MChars[C], N> : never
type Singles<S extends string> = S extends '' ? '' : S extends `${infer A}${infer Rest}` ? `${Single<A>}${Singles<Rest>}` : never
type N32 = 'g'|'h'|'i'|'j'|'k'|'l'|'m'|'n'|'o'|'p'|'q'|'r'|'s'|'t'|'u'|'v'|'w'|'x'|'y'|'z'|'0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'+'|'/'
type N16 = 'Q'|'R'|'S'|'T'|'U'|'V'|'W'|'X'|'Y'|'Z'|'a'|'b'|'c'|'d'|'e'|'f'|'w'|'x'|'y'|'z'|'0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'+'|'/'
type N8 = 'I'|'J'|'K'|'L'|'M'|'N'|'O'|'P'|'Y'|'Z'|'a'|'b'|'c'|'d'|'e'|'f'|'o'|'p'|'q'|'r'|'s'|'t'|'u'|'v'|'4'|'5'|'6'|'7'|'8'|'9'|'+'|'/'
type N4 = 'E'|'F'|'G'|'H'|'M'|'N'|'O'|'P'|'U'|'V'|'W'|'X'|'c'|'d'|'e'|'f'|'k'|'l'|'m'|'n'|'s'|'t'|'u'|'v'|'0'|'1'|'2'|'3'|'8'|'9'|'+'|'/'
type N2 = 'C'|'D'|'G'|'H'|'K'|'L'|'O'|'P'|'S'|'T'|'W'|'X'|'a'|'b'|'e'|'f'|'i'|'j'|'m'|'n'|'q'|'r'|'u'|'v'|'y'|'z'|'2'|'3'|'6'|'7'|'+'|'/'
type N1 = 'B'|'D'|'F'|'H'|'J'|'L'|'N'|'P'|'R'|'T'|'V'|'X'|'Z'|'b'|'d'|'f'|'h'|'j'|'l'|'n'|'p'|'r'|'t'|'v'|'x'|'z'|'1'|'3'|'5'|'7'|'9'|'/'
type C2<C extends string> = `${C}${C}`
type C4<C extends string> = C2<C2<C>>
type C8<C extends string> = C2<C4<C>>
type C16<C extends string> = C2<C8<C>>
type C32<C extends string> = C2<C16<C>>
type Repeat<C extends string, N extends string> =
`${C}${C}${N extends N32 ? C32<C> : ''}${N extends N16 ? C16<C> : ''}${N extends N8 ? C8<C> : ''}${N extends N4 ? C4<C> : ''}${N extends N2 ? C2<C> : ''}${N extends N1 ? C : ''}`
type Format<T extends string> = `${C32<' '>}${T extends `${infer A}${LB}${LB}${string}` ? A : T}`
type Render<T extends string> = Format<RenderFull<Split<DeleteLB<DeleteSpace<T>>>>>
type Christmas = Render<`
!/!9|!/!9|!/!9|!/!9|!/!F84!0|!/!E*=/*!z|!/!D_;C/!y|!/!B_ ;
G* !w|!/*_;K*4!t|!4*;Y/*4!m|!423;X73!n|! 7-; U3!
p|!9-;Q7 !r|!+-;P!s|!+2;P!s|!+8;P!s|!++;D#D-;E!s|!+ ;A7 3
108{D4#B ;A!s |!+3!D ;E /!C3! s|!/! D;F !x|
!/!D;F4! w|!/! C8;G !w| !/! C_; G/! v|! /!B +;J 4!t|!
/!A*;L/! s|!/08 ;N /!r| !/; R/! p|! 98;T /*! n|!78_;W/
4!l|!6*_ ;Z*4!j| !5_;d *!i| !3*;h/!g |!18 _;k *!e|!08
;o4!c|!z *;q/4!a| !y_;t/ !Z|!x+;w4 !X|! x+; x4!W|!y3;x!
W|!229_;h7#H!W|!2 8;k/!e| !1*;n/!c|!08;p/!b|!z_;s/!Z|!y *;v*!X|!x
+;y4! V|!w*;z/*!U|!v+;2*!T|!u_;5!S|!t8;6*!R|!t;8!R| !t;C7#B;q7#H!
R|! u1!D_ ;r/!Z|!z;v/!X|!y_;x4! V|!x_;0!U|!v8 _;2*!S |!R
8{ A4!Y+;4/!R|!O*_;E{C;B{A4!M*;6/4!P|!N_;B73;L/*! K;94!O|!N;K/40*_;E*4!E8;//!N|!J8{A;
E-; L73;C/{A! B_; o #G -; N*! M|! J+;D 7 !C*; L*2
;D/08;n3! J#A ;L5! L| !J+;E /* ;D7 3-;N 50;J7 #B !G 2# B-; J#A !O2#B;
G/!L|!J+;B2-; E3 !C2;M52; G73!R2 3; D73 0*_= !T3-; C7 !L |! J+; B!A+ ;P/
4;E 5!A#B 1!S ;D/{ A! A8*;D5 !m |!J+; B!A+; A7 3; F7 3-; J5!X8;P 5!
m|!J+ ;B!A+; A5! A;C!C2 ;B 7#B+;B5!X +; P5 !m |!J + ;B4 0+;
A5!A;C!D;B5!B+;B5!X+;P5!m|!J+;C/_;A5!A; C!D;B508*_;B5!X+;P5!m|!L2-;D/!A;C!D;H#A!Y+;Q4!
l|!N23;D*;C!A*_;F31!b+;Q5!l|!R3;K731!h23-;K73!n|!T#A-;B7#B!q2#G!q|!W23!/!j|!/!9|!/!9|!/
`>
type NewYear = Render<`
!H+; A7!R{B 4!H ;B5!E|!B 8{B! A+; A/{ E_; A/!G8 ;B! I;B5!E|! B+;O #B! G+;A 5!I;B508 *4
!A|!H ;B1!C {B4 !I;B5!A+ ;A/{ B;G 5!A |!G8 ;B* ;F*4 !H;B1!A2 #F- ;A7#A 1!B |!E*;D#B-;
F4!E+; B!J+ ;A5 !E|!C_;B 3;B! A8; B10 2 ;B/ ! D+; B 08*4!F;B 5!E |!B_; A7! A-; A4*;
A71 !B2 ;B! D2; B8; A7!F ;B5 !E| !B ;B! B+; D7 !D_ ;B !E; D7! F_ ;B! F|! B;B
*0* _;B 71 !B8 *;C1!E-; C!E8 ;C1 !F| !B2 ;F302 ;G3 !G2;B5!B *_ ;C 7 !H |! D2# B!D2
7#C 1 !J# B !D3 -731!I|! G+;A 7!V *!F _/{A !G| !G+; A5!E8*=/ 4 !I; B!F ; B1!G|!B{D _
;A/ {B _=0 23; B/4!G-;A /{D_ ;B{ A!F |!B; I7# B!C3 ;B*!F_;D # A-;F/4!C| ! G+;A5!I2 -3
!E8 ;D5 !B_ ;A5 !A3 ;B*! B|! G+; A/{B ;B/ {A4! G+; B3;B!A_;A7! C2; B 5!A |
!D8 {A;E 7#B-;B /*!D8;B! A-;A /*; A7! E;B5 !A| !B8_ ;E5!G2;B /!C +;A 5!B ;D 7!F
;B5 !A|!A 8;B30 +;A5!A*; A!C+;B!C+;B! B*;B 3!E 8;B7 !B|!A+;A /!A+ ;A5 !A;B 4!A 8;B 7!D
-;F 71!B8* _;C3 !C|!B3;F 5!A3;G7!F2#D 1!A3 ;E7 31!D |!D#A-;A 3!C 2#A=7 #A! R+= #A1 !H|
`>
type SepType = undefined | [string, SepType]
type Parse<T, S extends SepType> =
T extends '' ? ' ':
T extends '#' ? '#' :
S extends undefined ? T extends `${infer B1}${infer B2}${infer B3}${infer B4}` ? [B1, B2, B3, B4] : never :
T extends `${infer B1}${S[0]}${infer B2}${S[0]}${infer B3}${S[0]}${infer B4}` ?
[Parse<B1, S[1]>, Parse<B2, S[1]>, Parse<B3, S[1]>, Parse<B4, S[1]>]
: never
type B0_8 = [0,0,0,0,0,0,0,0]
type B1_8 = [1,1,1,1,1,1,1,1]
type B0_16 = [...B0_8, ...B0_8]
type B1_16 = [...B1_8, ...B1_8]
type B0_32 = [...B0_16, ...B0_16]
type B1_32 = [...B1_16, ...B1_16]
type P16_8 = [...B0_8, ...B1_8]
type P16_4 = [0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1]
type P16_2 = [0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1]
type P16_1 = [0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
type P64_32 = [...B0_32, ...B1_32]
type P64_16 = [...B0_16, ...B1_16, ...B0_16, ...B1_16]
type P64_8 = [...P16_8, ...P16_8, ...P16_8, ...P16_8]
type P64_4 = [...P16_4, ...P16_4, ...P16_4, ...P16_4]
type P64_2 = [...P16_2, ...P16_2, ...P16_2, ...P16_2]
type P64_1 = [...P16_1, ...P16_1, ...P16_1, ...P16_1]
type P128_64 = [...B0_32, ...B0_32, ...B1_32, ...B1_32]
type P128_32 = [...P64_32, ...P64_32]
type P128_16 = [...P64_16, ...P64_16]
type P128_8 = [...P64_8, ...P64_8]
type P128_4 = [...P64_4, ...P64_4]
type P128_2 = [...P64_2, ...P64_2]
type P128_1 = [...P64_1, ...P64_1]
type PatternType = (0 | 1)[]
type BitPatterns = [P128_64, [P128_32, [P128_16, [P128_8, [P128_4, [P128_2, [P128_1, undefined]]]]]]]
type BitPatternType = [PatternType, BitPatternType | undefined]
type JoinElement = string | number
type Join<T extends any[]> = T extends [infer A] ? A : T extends [infer A, ...(infer B)] ? A extends string | number ? `${A}${Join<B>}` : '' : ''
type ShapeType = string | [ShapeType, ShapeType, ShapeType, ShapeType]
type Render<S extends ShapeType> = `
${RenderLine<S, 0>}
${RenderLine<S, 1>}
${RenderLine<S, 2>}
${RenderLine<S, 3>}
${RenderLine<S, 4>}
${RenderLine<S, 5>}
${RenderLine<S, 6>}
${RenderLine<S, 7>}
${RenderLine<S, 8>}
${RenderLine<S, 9>}
${RenderLine<S, 10>}
${RenderLine<S, 11>}
${RenderLine<S, 12>}
${RenderLine<S, 13>}
${RenderLine<S, 14>}
${RenderLine<S, 15>}
${RenderLine<S, 16>}
${RenderLine<S, 17>}
${RenderLine<S, 18>}
${RenderLine<S, 19>}
${RenderLine<S, 20>}
${RenderLine<S, 21>}
${RenderLine<S, 22>}
${RenderLine<S, 23>}
${RenderLine<S, 24>}
${RenderLine<S, 25>}
${RenderLine<S, 26>}
${RenderLine<S, 27>}
${RenderLine<S, 28>}
${RenderLine<S, 29>}
${RenderLine<S, 30>}
${RenderLine<S, 31>}
${RenderLine<S, 32>}
${RenderLine<S, 33>}
${RenderLine<S, 34>}
${RenderLine<S, 35>}
${RenderLine<S, 36>}
${RenderLine<S, 37>}
${RenderLine<S, 38>}
${RenderLine<S, 39>}
${RenderLine<S, 40>}
${RenderLine<S, 41>}
${RenderLine<S, 42>}
${RenderLine<S, 43>}
${RenderLine<S, 44>}
${RenderLine<S, 45>}
${RenderLine<S, 46>}
${RenderLine<S, 47>}
${RenderLine<S, 48>}
${RenderLine<S, 49>}
${RenderLine<S, 50>}
${RenderLine<S, 51>}
${RenderLine<S, 52>}
${RenderLine<S, 53>}
${RenderLine<S, 54>}
${RenderLine<S, 55>}
${RenderLine<S, 56>}
${RenderLine<S, 57>}
${RenderLine<S, 58>}
${RenderLine<S, 59>}
${RenderLine<S, 60>}
${RenderLine<S, 61>}
${RenderLine<S, 62>}
${RenderLine<S, 63>}
${RenderLine<S, 64>}
${RenderLine<S, 65>}
${RenderLine<S, 66>}
${RenderLine<S, 67>}
${RenderLine<S, 68>}
${RenderLine<S, 69>}
${RenderLine<S, 70>}
${RenderLine<S, 71>}
${RenderLine<S, 72>}
${RenderLine<S, 73>}
${RenderLine<S, 74>}
${RenderLine<S, 75>}
${RenderLine<S, 76>}
${RenderLine<S, 77>}
${RenderLine<S, 78>}
${RenderLine<S, 79>}
${RenderLine<S, 80>}
${RenderLine<S, 81>}
${RenderLine<S, 82>}
${RenderLine<S, 83>}
${RenderLine<S, 84>}
${RenderLine<S, 85>}
${RenderLine<S, 86>}
${RenderLine<S, 87>}
${RenderLine<S, 88>}
${RenderLine<S, 89>}
${RenderLine<S, 90>}
${RenderLine<S, 91>}
${RenderLine<S, 92>}
${RenderLine<S, 93>}
${RenderLine<S, 94>}
${RenderLine<S, 95>}
${RenderLine<S, 96>}
${RenderLine<S, 97>}
${RenderLine<S, 98>}
${RenderLine<S, 99>}
${RenderLine<S, 100>}
${RenderLine<S, 101>}
${RenderLine<S, 102>}
${RenderLine<S, 103>}
${RenderLine<S, 104>}
${RenderLine<S, 105>}
${RenderLine<S, 106>}
${RenderLine<S, 107>}
${RenderLine<S, 108>}
${RenderLine<S, 109>}
${RenderLine<S, 110>}
${RenderLine<S, 111>}
${RenderLine<S, 112>}
${RenderLine<S, 113>}
${RenderLine<S, 114>}
${RenderLine<S, 115>}
${RenderLine<S, 116>}
${RenderLine<S, 117>}
${RenderLine<S, 118>}
${RenderLine<S, 119>}
${RenderLine<S, 120>}
${RenderLine<S, 121>}
${RenderLine<S, 122>}
${RenderLine<S, 123>}
${RenderLine<S, 124>}
${RenderLine<S, 125>}
${RenderLine<S, 126>}
${RenderLine<S, 127>}
`
type OFFSET = ' '
type RenderLine<S extends ShapeType, Y extends number> =
`${OFFSET}${RenderCell<S,0,Y>}${RenderCell<S,1,Y>}${RenderCell<S,2,Y>}${RenderCell<S,3,Y>}${RenderCell<S,4,Y>}${RenderCell<S,5,Y>}${RenderCell<S,6,Y>}${RenderCell<S,7,Y>}${RenderCell<S,8,Y>}${RenderCell<S,9,Y>}${RenderCell<S,10,Y>}${RenderCell<S,11,Y>}${RenderCell<S,12,Y>}${RenderCell<S,13,Y>}${RenderCell<S,14,Y>}${RenderCell<S,15,Y>}${RenderCell<S,16,Y>}${RenderCell<S,17,Y>}${RenderCell<S,18,Y>}${RenderCell<S,19,Y>}${RenderCell<S,20,Y>}${RenderCell<S,21,Y>}${RenderCell<S,22,Y>}${RenderCell<S,23,Y>}${RenderCell<S,24,Y>}${RenderCell<S,25,Y>}${RenderCell<S,26,Y>}${RenderCell<S,27,Y>}${RenderCell<S,28,Y>}${RenderCell<S,29,Y>}${RenderCell<S,30,Y>}${RenderCell<S,31,Y>}${RenderCell<S,32,Y>}${RenderCell<S,33,Y>}${RenderCell<S,34,Y>}${RenderCell<S,35,Y>}${RenderCell<S,36,Y>}${RenderCell<S,37,Y>}${RenderCell<S,38,Y>}${RenderCell<S,39,Y>}${RenderCell<S,40,Y>}${RenderCell<S,41,Y>}${RenderCell<S,42,Y>}${RenderCell<S,43,Y>}${RenderCell<S,44,Y>}${RenderCell<S,45,Y>}${RenderCell<S,46,Y>}${RenderCell<S,47,Y>}${RenderCell<S,48,Y>}${RenderCell<S,49,Y>}${RenderCell<S,50,Y>}${RenderCell<S,51,Y>}${RenderCell<S,52,Y>}${RenderCell<S,53,Y>}${RenderCell<S,54,Y>}${RenderCell<S,55,Y>}${RenderCell<S,56,Y>}${RenderCell<S,57,Y>}${RenderCell<S,58,Y>}${RenderCell<S,59,Y>}${RenderCell<S,60,Y>}${RenderCell<S,61,Y>}${RenderCell<S,62,Y>}${RenderCell<S,63,Y>}${RenderCell<S,64,Y>}${RenderCell<S,65,Y>}${RenderCell<S,66,Y>}${RenderCell<S,67,Y>}${RenderCell<S,68,Y>}${RenderCell<S,69,Y>}${RenderCell<S,70,Y>}${RenderCell<S,71,Y>}${RenderCell<S,72,Y>}${RenderCell<S,73,Y>}${RenderCell<S,74,Y>}${RenderCell<S,75,Y>}${RenderCell<S,76,Y>}${RenderCell<S,77,Y>}${RenderCell<S,78,Y>}${RenderCell<S,79,Y>}${RenderCell<S,80,Y>}${RenderCell<S,81,Y>}${RenderCell<S,82,Y>}${RenderCell<S,83,Y>}${RenderCell<S,84,Y>}${RenderCell<S,85,Y>}${RenderCell<S,86,Y>}${RenderCell<S,87,Y>}${RenderCell<S,88,Y>}${RenderCell<S,89,Y>}${RenderCell<S,90,Y>}${RenderCell<S,91,Y>}${RenderCell<S,92,Y>}${RenderCell<S,93,Y>}${RenderCell<S,94,Y>}${RenderCell<S,95,Y>}${RenderCell<S,96,Y>}${RenderCell<S,97,Y>}${RenderCell<S,98,Y>}${RenderCell<S,99,Y>}${RenderCell<S,100,Y>}${RenderCell<S,101,Y>}${RenderCell<S,102,Y>}${RenderCell<S,103,Y>}${RenderCell<S,104,Y>}${RenderCell<S,105,Y>}${RenderCell<S,106,Y>}${RenderCell<S,107,Y>}${RenderCell<S,108,Y>}${RenderCell<S,109,Y>}${RenderCell<S,110,Y>}${RenderCell<S,111,Y>}${RenderCell<S,112,Y>}${RenderCell<S,113,Y>}${RenderCell<S,114,Y>}${RenderCell<S,115,Y>}${RenderCell<S,116,Y>}${RenderCell<S,117,Y>}${RenderCell<S,118,Y>}${RenderCell<S,119,Y>}${RenderCell<S,120,Y>}${RenderCell<S,121,Y>}${RenderCell<S,122,Y>}${RenderCell<S,123,Y>}${RenderCell<S,124,Y>}${RenderCell<S,125,Y>}${RenderCell<S,126,Y>}${RenderCell<S,127,Y>}`
type RenderCell<S extends ShapeType, X extends number,Y extends number> = ReadCell<S, BitPatterns, X, Y>
type ReadCell<S extends ShapeType, P extends BitPatternType, X extends number, Y extends number> =
ReadCell2<[P[0][X], P[0][Y]], P[1], S, X, Y>
type ReadCell2<PXY extends [0 | 1, 0 | 1], SubPattern extends BitPatternType | undefined, S extends ShapeType, X extends number, Y extends number> =
ReadCell3<
PXY extends [0, 0] ? S[0] : PXY extends [0, 1] ? S[2] : PXY extends [1, 0] ? S[1] : PXY extends [1, 1] ? S[3] : 'never',
SubPattern, X, Y
>
type ReadCell3<S extends ShapeType, SubPattern extends BitPatternType | undefined, X extends number, Y extends number> =
S extends ' ' ? '_' : S extends '#' ? '█' :
SubPattern extends undefined ? AAChar<S> : ReadCell<S, SubPattern, X, Y>
type UNICODES = {'0':'_','1':'▗','2':'▝','3':'▐','4':'▖','5':'▄','6':'▞','7':'▟','8':'▘','9':'▚',a:'▀',b:'▜',c:'▌',d:'▙',e:'▛',f:'█'}
type AAChar<S> = S extends keyof UNICODES ? UNICODES[S] : never
type Draw<Data extends string[]> = Render<Parse<Join<Data>, ['(', [')', ['{', ['}', ['[', [']', undefined]]]]]]>>
type D = Draw<[
'{{{}}[[]]]0005[]]00ff]15ff}[[]]55ff]55ff[]]55ff]54ff){}}}[[]0001]0001]1fff[007f]55ff]#]#{}}[[]]00ff]00ff[]]00ff]0055}[[]]0055]0055[]]0055]0055{[]]]0103[[]0f3f]]3fff}1f7f]#]#]#[#[#[#}[0003]#]070f]#[]0001]007f]5fff',
'[3fff]#]#]#}#)}[]]]071f[[]3f3f]]3f2f}}[]0b02]][[{057f]#]#]#[#[#[#}#}#]#]2f02]#[#[]2f02]]0001[#]#]7fff]#}#{}[]]]0001[[]0f3f]]3f3f}}[]3f2f]]0b02[[{0007]1fff]7fff]#[#[#[#}#}#[#[2f02]#]]2b00[#}#)#}#[#[#[#]#]#]fee0}#}',
'#]#]#]fffe[fee0]]8000][#]f8e0]#]c080[]]]0103{#[#]#]ffa8]fa00[ffe8]a000]][]]0017]5fff}#]#]aa00][#]#]0200]aa00[0015]007f]#]#[00ff]00ff]#]#}]011f]0107]#[#[3fff]#]#]#[#}#[#[#]fffa]fef0]8000[fe00]aa00]]{#}#]]#][]0f0f]',
']0f0f[#]00c0]#]c0f0[]0f0f]]0b03}#}#]f4fd]#]#[]]40d0][#[f4ff]]#]c0f0{#[#]#]#]fcfc[#[#]fcfc]#]#}8000]]][[]]0040][}ff3f]#]0f02]#[#[]bf0b]][#]#]2f00]ffbf}d0fd]]#]f4ff[]]00f5]0055[#[#(}}[[55ff]00ff]#]#[0054]]#]f5ff}[[',
']]00f5][{{#}#]f5ff]#]#[00d4]]#]d0ff[#[#}#}#{]]0040][[fdff]00f4]#]#[]]d0fd]0040}}#[#]f5ff]#]#[#[#}00d0]]fdff]40f4[[#[d0fd]]#]d4ff){{}}[[]]0040][}{)#]#]bf00]ffaf[#[0054]]#]f5ff[af00]ffbf]00f4]0200}#[#[#]#]ff2f]#[#}',
'#[#]40f4]#]#[ff02]ffbf]]0200[#]#]ff2f]#}0200]ffbf]40f0]0f03[#[fcff]]#]c0d0[ff3f]#]3f0f]#{#{[0b02]#]]#[[]#]0107]#}#]f0f0]#]f0f0[0f0f]#]0f0f]#[#]f0f0]#]e0c0[0f0f]#]3f3f]#}]0001]007f]5fff[1fff]#]#]#[#]#]#]fffe[#]fee',
'0]fa80]}fffe]0003]f8c0]0f3f[#[0107]#]3f7f]#[#{#)f4ff]00d0]#]fdff[]]00d0][#[#]40f4]#]#}[[]]40f4][}#}#]40f5]#]#[]]d0fd][#[#]d0fd]#]#{}}[[]]d0f4][}{#{#]40f4]#]#[]]40d0][#[fdff]0040]#]f0fd}}#}40d0]]f4fc][[#]]#]c0c0[(',
'}[[[]0003]]0f3f}}[]3f3f]]3f2f[[]0b00]]{]0001]0007]7fff[7fff]#]#]#[7fff]#]#]#[#}#}#[#[#]#]2f02]ffbf[#}#{}[[[]]]0003}}[]0f3f]]3f3f[[]3f0f]]0200{]0b00]]0007[#]#]7fff]#[0007]7fff]7fff]#[#}#}#[#[#]#]ff2f]#[#}#)#}#[#]f',
'0e0]fffe]8000[#]#]#]fffc[f0c0]]]}#}#]f0e0]#]c080[]0103]]0f0f[#]]#][]0f0f]]0f0f{]]]011f[0005]15ff]7fff]#[0007]#]1f7f]#[#}#[#[#]fffe]fff8]a000[ffa0]ff00]]}#[#]#]#]fefc[#[#]fcfc]#]fdff}c000]]][[[{#}#]00c0]#]c0f0[]0b',
'03]][#]fcff]#]#[]]c0f4]}#}#[#]40f4]#]#[#[#{#]#]ffbf]#[#[2f03]#]]bf0b[#}d0f4]]#]d0ff[]]0054][#[#}]]40fd][bf02]#]]0a00[#]f5ff]#]#[00fd]0050]#]#}#]#]bf00]ff2a[#]#]ffaa]ffaa[]]#]55ff[]]57ff]#){]af00]][ffaa]ffbf]][[}#',
']#]][#]fffe]][[}}{{)ffaa]ffaa]][ffaa]ff00]][[}ff00]ff00]][ff00]ff00]][[}}{ff2a]#]]0b00[#]#]ffbf]#[[2f0f]#]0302]#}#}[]ffbf]]3f2f[[]0b03]]}#[#[#]#]ff3f]#[#{{}0b00]ffbf]]0b00[#]#]ff2a]#[[}}(#]d4ff]#]#[00d0]]#]40f4[f',
'f2a]#]]0b00[#]#]ffbf]#}ff3f]#]2f03]#[#[40d0]bf2f]fcff]0b02[#}[0f03]#]]#[[]#]0003]#}#]40c0]#]f0f0[bf3f]#]2f0f]#[#]f0f0]#]f0f0[0f0f]#]0f0f]#{#{]]0057]17ff[0f7f]#]#]#[#[#]#]#]fee0}#]f0c0]fffe]8000[0f1f]#]3f7f]#[f8e0',
']0107]]1fff[#}#]#]fe00]a000[fea0]]0005]17ff[0015]05ff]#]#[#}077f]#]#]#[#[#[#{#)#{#}#]c0c0]#]8000[[fefc]]f0c0][}#[#]fff8]#]e000[#]#]#]fee0[f8c0]]]}{#}#[#]#]#]fff8[#]#]#]ffe0[fff8]8000]8000]}#[#]#]#]fee0[#]#]fffe]f',
'880[fa80]]]}fee0]]][[[{fef0]]8000][[[}}})#}#}#}#[#[#[#]fffa]fe80]8000{#}#[#]fffe]fff8]8000[#]fee0]f880][8000]]]}#]#]#]fea0[fff8]e000]8000][e800]]][}{#]#]#]ffaa[#]#]fe00]a000[[}ffa0]a000]][[[}}{)e000]]][[[}}}{{{'
]>
SEPARATORS = '(){}[]<>'
B64CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
HEXCHARS = '0123456789abcdef'
def shape(x,y)
x*=1.5
y*=1.5
x+=0.2
(20**(x+y-2)+20**(x-y-2)+2.7**(-x-0.5-1.2*(2.5+(1.2-Math.cos(15*y))**0.25)/
(5+(5*y/3+5*x*y/9)**16)/(1+Math.exp(4*x)))-0.67
)*(((y*y+4e-3)**0.5-0.33)**2+((11*x-1)/12)**2-1/7.0
)*((y.abs-4/13.0)**2+(x-1/8.0)**2-0.11
)*((y.abs-2/7.0)**2+(x-1/6.0)**2-0.03)<0
end
size = 128
h = size * 2
w = size * 2
shape = h.times.map do |iy|
w.times.map do |ix|
shape(2.0 * ix / w - 1, 2.0 * iy / h - 1)
# (2*ix-w)**2+(2*iy-h)**2<(w**2+h**2)/8
end
end
def show(shape)
shape.each { |l| puts l.map { _1 ? '#' : ' ' }.join }
end
show(shape)
def encode(shape, i, x, y)
h = shape.size
w = shape[0].size
ws = w >> i
hs = h >> i
sep = SEPARATORS[i]
if ws * hs > 4
a = nil
a = nil unless (x...x+ws).all?{|ix|
(y...y+hs).all?{|iy|
c = shape[iy][ix]
a = c if a.nil?
a == c
}
}
return '#' if a == true
return '' if a == false
sep = nil if (ws / 2) * (hs / 2) == 4
n = 0
seg = [
encode(shape, i + 1, x, y),
encode(shape, i + 1, x + ws / 2, y),
encode(shape, i + 1, x, y + hs / 2),
encode(shape, i + 1, x + ws / 2, y + hs / 2)
]
# return
seg.join(sep)
n = 0
seg.select! do |a|
n *= 3
if a == ''
false
elsif a == '#'
n += 1
false
else
n += 2
true
end
end
seg.size == 4 ? seg.join(sep) : n.divmod(9).map{('A'.ord+_1).chr}.join + seg.join(sep)
else
n = 0
(x...x + ws).each { |ix|
(y...y + hs).each { |iy|
n *= 2
n += 1 if shape[iy][ix]
}
}
HEXCHARS[n]
end
end
encoded = encode shape, 0, 0, 0
puts encoded
puts encoded.size
encoded2 = (shape-[[false]*256]).map{|l|l.map{_1 ? '1':'0'}.join.scan(/0+|1+/).map(&:size).map{|a|a>=32 ? B64CHARS[a/64%32+32]+B64CHARS[a%64] : B64CHARS[a]}.join}.join('|')
puts encoded2
puts encoded2.size
require'chunky_png'
img = ChunkyPNG::Image.from_file 'image2.png'
size = 110
shape = size.times.map do |y|
size.times.map do |x|
ix = x * img.width / size
iy = y * img.width / size * 2
next false if iy >= img.height
color = (img[ix, iy] >> 8) & 0xff
color < 128
end
end
show shape
shape2 = (size/2).times.map{|y|
(size/2).times.map{|x|
[shape[2*y][2*x],
shape[2*y][2*x+1],
shape[2*y+1][2*x],
shape[2*y+1][2*x+1]].map.with_index{_1 ? 1<<_2 : 0}.sum.to_s(16)
}
}
shape2.shift while shape2.first.all?{_1=='0'}
c1 = '0123456789+-*/_='
cx = '!?@#$%^&()[]{}:;'
ns = [*'A'..'Z',*'a'..'z',*'0'..'9','+', '/']
encoded3 = shape2.map{|l|
# binding.irb unless l.all?{_1=='0'}
l.join.scan(/((.)\2{0,64})/).map{|s, c|
n = c.to_i(16)
s.size == 1 ? c1[n] : cx[n] + ns[s.size-2]
}.join
}.join('|')
puts encoded3
puts encoded3.size
us = '_▘▝▀▖▌▞▛▗▚▐▜▄▙▟█'
[c1,cx].map{|c|puts c.chars.zip(us.chars).map{"'#{_1}':'#{_2}'"}.join','}
puts encoded3.split('|').max_by(&:size)
puts
template = <<T
######################################################### #
## #################################### ### ###
######## ########################################## ### #
######## #### ###### ## ##### ##### ### ###
######## ##### #### ### ### ### ### ### ### ### #####
######## ###### ## #### ### ### ### #### ### #########
######## ####### ##### #### ######## #### ### #######
######## ######## ###### ######### #### ### ###########
################# ####### ############################# #########
##### ###### ######## ############################# #############
### ### ##################### ############# ######## ###
## ############################################ ###################################
### ######### ### # ## ## ### ### #### # #### ###
######## ### #### ## ##### ## ### #### ##### ## ## ## ### ### ######
########### ## ######## ###### ## ### #### ##### ## ## ## ### #### ###
### ### ### #### ## ###### ## ##### ##### ## ## ## ### ####### ##
##### ###### ### ###### ## ######### ## ## ## ### # ### ###
##################################### ##############################################
#####################################################################################
T
template = <<T
#### ###### ### ######## #### ### ### ### ##### ### ######## #### ### #### ######## ##
##### ##### ### ######## #### ### ### #### ### #### ######## ### ##### ### ##########
###### #### ### ######## #### ### ### # ### # ### # ######## ### ##### ### ### ####
### ### ### ### ### #### ### ### ## ### ### ## ### ## ### ### ## ### ### ###
### ### ## ### ######## #### ### ### ### ##### ### ######## ## ## # ## ## ### ####
### # ### # ### ######## #### ### ### #### ### #### ######## # ### ### # ######### #
### ## ### ### ######## #### ### ### #### ### #### ######## # ######### # ######## ##
### ### ### ### ### #### ### ### #### ### #### ### ########### ### # ### #
### #### ###### ######## #### ### ### #### ### #### ######## ### ### ### ## ###
### ##### ##### ######## ############ #### ### #### ######## #### ### #### ### ### ###
### ###### #### ######## ############ #### ### #### ######## ### ##### ### ### ### ###
T
encoded3.chars.tap do |cs|
puts template.gsub('#'){cs.shift || ' '}
puts cs.join
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment