You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
2.1 KiB
149 lines
2.1 KiB
import type { Equal, Expect } from '@type-challenges/utils'
|
|
|
|
type cases = [
|
|
Expect<Equal<FizzBuzz<1>, ['1']>>,
|
|
Expect<Equal<FizzBuzz<5>, ['1', '2', 'Fizz', '4', 'Buzz']>>,
|
|
Expect<Equal<FizzBuzz<20>, [
|
|
'1',
|
|
'2',
|
|
'Fizz',
|
|
'4',
|
|
'Buzz',
|
|
'Fizz',
|
|
'7',
|
|
'8',
|
|
'Fizz',
|
|
'Buzz',
|
|
'11',
|
|
'Fizz',
|
|
'13',
|
|
'14',
|
|
'FizzBuzz',
|
|
'16',
|
|
'17',
|
|
'Fizz',
|
|
'19',
|
|
'Buzz',
|
|
]>>,
|
|
Expect<Equal<FizzBuzz<100>, [
|
|
'1',
|
|
'2',
|
|
'Fizz',
|
|
'4',
|
|
'Buzz',
|
|
'Fizz',
|
|
'7',
|
|
'8',
|
|
'Fizz',
|
|
'Buzz',
|
|
'11',
|
|
'Fizz',
|
|
'13',
|
|
'14',
|
|
'FizzBuzz',
|
|
'16',
|
|
'17',
|
|
'Fizz',
|
|
'19',
|
|
'Buzz',
|
|
'Fizz',
|
|
'22',
|
|
'23',
|
|
'Fizz',
|
|
'Buzz',
|
|
'26',
|
|
'Fizz',
|
|
'28',
|
|
'29',
|
|
'FizzBuzz',
|
|
'31',
|
|
'32',
|
|
'Fizz',
|
|
'34',
|
|
'Buzz',
|
|
'Fizz',
|
|
'37',
|
|
'38',
|
|
'Fizz',
|
|
'Buzz',
|
|
'41',
|
|
'Fizz',
|
|
'43',
|
|
'44',
|
|
'FizzBuzz',
|
|
'46',
|
|
'47',
|
|
'Fizz',
|
|
'49',
|
|
'Buzz',
|
|
'Fizz',
|
|
'52',
|
|
'53',
|
|
'Fizz',
|
|
'Buzz',
|
|
'56',
|
|
'Fizz',
|
|
'58',
|
|
'59',
|
|
'FizzBuzz',
|
|
'61',
|
|
'62',
|
|
'Fizz',
|
|
'64',
|
|
'Buzz',
|
|
'Fizz',
|
|
'67',
|
|
'68',
|
|
'Fizz',
|
|
'Buzz',
|
|
'71',
|
|
'Fizz',
|
|
'73',
|
|
'74',
|
|
'FizzBuzz',
|
|
'76',
|
|
'77',
|
|
'Fizz',
|
|
'79',
|
|
'Buzz',
|
|
'Fizz',
|
|
'82',
|
|
'83',
|
|
'Fizz',
|
|
'Buzz',
|
|
'86',
|
|
'Fizz',
|
|
'88',
|
|
'89',
|
|
'FizzBuzz',
|
|
'91',
|
|
'92',
|
|
'Fizz',
|
|
'94',
|
|
'Buzz',
|
|
'Fizz',
|
|
'97',
|
|
'98',
|
|
'Fizz',
|
|
'Buzz',
|
|
]>>,
|
|
]
|
|
|
|
type FizzBuzz<
|
|
N extends number,
|
|
Res extends string[] = [],
|
|
Acc extends 1[] = [1],
|
|
Acc3 extends 1[] = [1],
|
|
Acc5 extends 1[] = [1],
|
|
> =
|
|
Res['length'] extends N
|
|
? Res
|
|
: Acc3['length'] extends 3
|
|
? Acc5['length'] extends 5
|
|
? FizzBuzz<N, [...Res, 'FizzBuzz'], [...Acc, 1], [1], [1]>
|
|
: FizzBuzz<N, [...Res, 'Fizz'], [...Acc, 1], [1], [...Acc5, 1]>
|
|
: Acc5['length'] extends 5
|
|
? FizzBuzz<N, [...Res, 'Buzz'], [...Acc, 1], [...Acc3, 1], [1]>
|
|
: FizzBuzz<N, [...Res, `${Acc['length']}`], [...Acc, 1], [...Acc3, 1], [...Acc5, 1]>
|
|
|
|
; |