C-printf Parser
Challenge
There is a function in C language: printf. This function allows us to print something with formatting. Like this:
printf("The result is %d.", 42);
This challenge requires you to parse the input string and extract the format placeholders like %d and %f. For example, if the input string is "The result is %d.", the parsed result is a tuple ['dec'].
Here is the mapping:
type ControlsMap = {
c: "char";
s: "string";
d: "dec";
o: "oct";
h: "hex";
f: "float";
p: "pointer";
};
Solution
Der finale Typ erhält zwei Parameter:
- Den String, der auf die Zeichen geprüft werden soll.
- Einen Akkumulator, der die bereits gefundenen Werte zwischenspeichert
Nun laufen wir einfach über den String, und suchen nach der Kombination aus (Zeichenkette)(Prozentzeichen mit einem Zeichen dahinter)(Restliche Zeichenkette).
Zum Beispiel bei Hello %s: score is %d. => ('Hello ')('s')(': score is %d.'). Somit erhalten wir immer das Zeichen nach einem %-Zeichen, und können dies nun
über eine ControlsMap umwandeln, indem wir das Vorkommen des gefundenen Zeichens mit den Attributen der Map abgleichen. Falls wir was finden, speichern wir es im Akkumulator und arbeiten uns rekursiv durch den String.
type ParsePrintFormat<
S extends string,
Acc extends string[] = []
> = S extends `${infer H}%${infer Op extends string}${infer R}`
? Op extends keyof ControlsMap
? ParsePrintFormat<R, [...Acc, ControlsMap[Op]]>
: ParsePrintFormat<R, Acc>
: Acc;
// Objekt, dass ein Zeichen auf eine Zeichenkette ummappt.
type ControlsMap = {
c: "char";
s: "string";
d: "dec";
o: "oct";
h: "hex";
f: "float";
p: "pointer";
};