enunciados + leetcode
Enunciados como los de una entrevista real para resolver por tu cuenta, con el tiempo que te darían, y problemas de LeetCode recomendados para cada tecnología y seniority. Nada se corrige acá: resolvelo en tu editor, en voz alta, y marcá lo que ya practicaste.
Tenés una función callModel(prompt: string): Promise<string> que simula un LLM: devuelve texto que debería ser un JSON con la forma { "sentiment": "positive" | "negative" | "neutral", "confidence": number }, donde confidence va de 0 a 1. A veces el modelo devuelve el JSON envuelto en un bloque de código, con texto antes ("Claro, acá va:") o directamente inválido.
Implementá classifySentiment(text: string): Promise<Result> que arme el prompt, llame al modelo, extraiga el JSON, lo valide contra el schema y, si falla, reintente hasta 3 veces incluyendo en el nuevo prompt el error de validación. Para probarlo, armá un mock de callModel que devuelva en orden: Claro: {sentiment: positive}, {"sentiment": "happy", "confidence": 0.9} y {"sentiment": "positive", "confidence": 0.92}; tu función tiene que terminar devolviendo el tercer resultado.
# requisitos
# si te sobra tiempo, te van a preguntar
Recibís una lista de documentos { id: string, text: string }[] y una función mock embed(text: string): number[] que devuelve un vector de dimensión fija (para el ejercicio podés implementarla como un bag of words sobre un vocabulario chico, así es determinística).
Implementá chunk(text, size, overlap) que parta cada documento en fragmentos de como máximo size palabras con overlap palabras compartidas entre fragmentos consecutivos, y search(query, k) que devuelva los k chunks más similares a la query por similitud coseno, con su docId, el texto y el score. Ejemplo: con size = 4 y overlap = 1, el texto "a b c d e f g" produce ["a b c d", "d e f g"].
# requisitos
overlap < size y manejar textos más cortos que size.# si te sobra tiempo, te van a preguntar
Tenés un log de llamadas a un modelo como un array de { model: string, inputTokens: number, outputTokens: number, userId: string } y una tabla de precios { [model]: { inputPerMillion: number, outputPerMillion: number } } en dólares.
Implementá costReport(calls, prices) que devuelva el costo total, el costo por usuario y el top 3 de usuarios que más gastan. Ejemplo: con un modelo a 3 USD por millón de input y 15 USD por millón de output, una llamada con 2.000 tokens de input y 500 de output cuesta 0.0135 USD.
# requisitos
# si te sobra tiempo, te van a preguntar