Subtract

Challenge

Implement the type Subtraction that is - in Javascript by using BuildTuple.

If the minuend is less than the subtrahend, it should be never.

It’s a simple version.

For example

Subtract<2, 1>; // expect to be 1
Subtract<1, 2>; // expect to be never

Solution

In Vergleich zu den anderen extremen Herausforderugen ist diese doch eher einfacher. Eine erste Loesung ist es, einfach die Differenz zwischen den beiden Zahlen zu errechnen, da dies ja auch das Ergebnis darstellt. Die Idee ist es, zwei Arrays miteinander zu vergleichen, wobei bei zweiten Array der Rest infert wird, und es sich damit auch um die Differenz handelt. Dies wird durch folgendes Beispiel ersichtlich:

/*
Füllt ein Array mit Einsen, bis die Länge des Arrays der angegebenen Zahl entspricht
Input: 5
Output: [1,1,1,1,1]
*/
type FillArray<T extends number, Acc extends 1[] = []> = Acc["length"] extends T
  ? Acc
  : FillArray<T, [...Acc, 1]>;

// Beispiel fuer 5, 2
// FillArray<5> => [1,1,1,1,1]
// FillArray<2> => [1,1]
// von TypeScript inferter Rest => [1,1,1]  => stellt gleichzeitig auch die Differenz dar
type Subtract<M extends number, S extends number> = FillArray<M> extends [
  ...FillArray<S>,
  ...infer Rest
]
  ? Rest["length"]
  : never;

https://github.com/type-challenges/type-challenges/issues/16386

References