Todos los desafíos
Fácil 0 resueltos 0% de aceptación

Suscriptores de eventos

Entrega eventos a los suscriptores de cada tema, al estilo observer, y cuenta lo que recibe cada persona.

Lo que aprenderás

  • Asociar cada tema con quienes lo siguen
  • Avisar a todos los suscriptores de un evento
  • Ignorar suscripciones repetidas con un conjunto

Problema

Ver original (inglés)

El patrón observer permite que los objetos se suscriban a un sujeto y reciban un aviso cada vez que ocurre algo. Aquí, las personas se suscriben a temas y cada evento publicado llega a todos los suscriptores de su tema.

Cada suscripción es <person> <topic>. Una suscripción repetida no tiene efecto adicional. Después, cada evento de events es un nombre de tema: cada suscriptor de ese tema recibe una notificación. Los eventos de temas que nadie sigue se descartan.

Implementa event_subscribers(subscriptions, events).

Entrada

subscriptions: Cadenas "<person> <topic>" (los nombres no tienen espacios).

events: Nombres de temas, en orden de publicación.

Salida

Devuelve "<person>:<count>" para cada persona con al menos una suscripción, ordenadas por nombre (orden ordinal de caracteres).

Restricciones

1 ≤ número de suscripciones ≤ 10,000

0 ≤ número de eventos ≤ 100,000

Ejemplos

Ejemplo 1
Entrada:
events = ["news", "sports", "weather"]
subscriptions = ["bob sports", "alice news", "alice sports"]

Salida esperada:
expected = ["alice:2", "bob:1"]
Entrada:
std::vector<std::string> events = {"news", "sports", "weather"};
std::vector<std::string> subscriptions = {"bob sports", "alice news", "alice sports"};

Salida esperada:
std::vector<std::string> expected = {"alice:2", "bob:1"};
Entrada:
string[] events = new string[] {"news", "sports", "weather"};
string[] subscriptions = new string[] {"bob sports", "alice news", "alice sports"};

Salida esperada:
string[] expected = new string[] {"alice:2", "bob:1"};

Explicación

alice sigue news y sports, así que recibe ambos eventos; bob solo recibe sports; nadie sigue weather: ["alice:2", "bob:1"].

Ejemplo 2
Entrada:
events = []
subscriptions = ["zoe tech", "zoe tech"]

Salida esperada:
expected = ["zoe:0"]
Entrada:
std::vector<std::string> events = {};
std::vector<std::string> subscriptions = {"zoe tech", "zoe tech"};

Salida esperada:
std::vector<std::string> expected = {"zoe:0"};
Entrada:
string[] events = new string[] {};
string[] subscriptions = new string[] {"zoe tech", "zoe tech"};

Salida esperada:
string[] expected = new string[] {"zoe:0"};

Explicación

La suscripción repetida cuenta una sola vez y no se publicó ningún evento: ["zoe:0"].

Cómo abordarlo

Inténtalo primero por tu cuenta y luego abre las pistas una a una.

Pista 1

Agrupa a los suscriptores por tema para que cada evento encuentre rápido a su público.

Pista 2

Usa un conjunto por tema para que una suscripción repetida cuente una sola vez.

Pista 3

Todo el que se suscribió aparece en el resultado, aunque tenga cero notificaciones.

Complejidad esperada

tiempo O(suscripciones + eventos × suscriptores por tema), espacio extra O(suscripciones)

Referencias

Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.