Last active
December 23, 2020 15:41
-
-
Save tompng/85d3014b2df7bc50d03cb3f42e0be194 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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| | |
`> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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]]][[[}}}{{{' | |
]> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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