Created
May 9, 2022 23:32
-
-
Save Grubba27/f676d4fc24b227ddea5715a16b97f106 to your computer and use it in GitHub Desktop.
Fibonacci formula and Fatorial one made simple with TS types :D
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 Reverse<A> = | |
`${A}` extends `${infer AH}${infer AT}` | |
? `${Reverse<AT>}${AH}` : A | |
type Digs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
type DigsNext<I = Digs, R = {}> = | |
I extends [infer Head, infer Next, ...infer Tail] | |
? DigsNext<[Next, ...Tail], R & Record<Head, Next>> | |
: { [K in keyof R]: R[K] } | |
type DigsPrev = { [K in keyof DigsNext as DigsNext[K]]: K } | |
type ToNumber< | |
S extends string, | |
L extends number[] = []> | |
= `${L['length']}` extends S | |
? L['length'] | |
: ToNumber<S, [...L, 0]> | |
type GreaterThan< | |
T extends number, | |
U extends number, | |
C extends unknown[] = [] | |
> = | |
T extends U | |
? false | |
: C['length'] extends T | |
? false | |
: C['length'] extends U | |
? true | |
: GreaterThan<T, U, [...C, 1]>; | |
type AddOne<A> = | |
A extends `${infer AH}${infer AT}` | |
? AH extends '9' ? `0${AddOne<AT>}` : `${DigsNext[AH]}${AT}` | |
: `1` | |
type SubOne<A> = | |
A extends `${infer AH}${infer AT}` | |
? AH extends '0' ? `9${SubOne<AT>}` : `${DigsPrev[AH]}${AT}` | |
: never | |
type Sub< | |
A extends string, | |
B extends string, | |
R extends string = "0" | |
> = | |
B extends R | |
? A | |
: Sub<SubOne<A>, B, AddOne<R>>; | |
type Add<A, B> = | |
A extends `${infer AH}${infer AT}` ? | |
B extends `${infer BH}${infer BT}` | |
? BH extends '0' ? `${AH}${Add<AT, BT>}` : Add<AddOne<A>, SubOne<B>> | |
: A : B | |
type Mul<A, B, R = '0'> = | |
A extends '0' ? R : | |
B extends '0' ? R : | |
A extends `${infer AH}${infer AT}` | |
? AH extends '0' ? Mul<AT, `0${B}`, R> : Mul<SubOne<A>, B, Add<R, B>> | |
: R | |
type Multiply<A extends string | number | bigint, B extends string | number | bigint> = | |
Reverse<Mul<Reverse<A>, Reverse<B>>> | |
type Fatorial | |
<Num extends string, Acc extends string = '1'> = | |
Num extends '1' | |
? Acc | |
: Fatorial<SubOne<Num>, Multiply<Num, Acc>> | |
const f4: Fatorial<'4'> // 24 | |
const f5: Fatorial<'5'> // 120 | |
const f6: Fatorial<'6'> // 720 | |
type Fibonacci | |
<Num extends string> = | |
GreaterThan<2, ToNumber<Num>> extends false | |
? Add<Fibonacci<SubOne<Num>>, Fibonacci<Sub<Num, '2'>>> | |
: Num | |
const fib2: Fibonacci<'2'> // 1 | |
const fib3: Fibonacci<'3'> // 2 | |
const fib5: Fibonacci<'5'> // 5 | |
const fib6: Fibonacci<'6'> // 8 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
wow...