Exercices

Sommaire

ASCII Art
Afficher des mots en ASCII Art
Small Language Model
Expérimenter la fonctionnalité du next token d'un LLM
cats-effect
Isoler les effets avec cats-effect
Machine à changer la monnaie
Calculer les billets à distribuer

ASCII Art

Objectif

Dans les gares et aéroports, on croise souvent ce type d’écran :

Vous êtes-vous demandé comment il serait possible de simuler cet affichage dans un bon vieux terminal ? Nous, oui : avec l’art ASCII !

Règles

L’art ASCII permet de représenter des formes en utilisant des caractères. Dans notre cas, ces formes sont précisément des mots. Par exemple, le mot MANHATTAN pourra être affiché ainsi en art ASCII :

# #  #  ### # #  #  ### ###  #  ###
### # # # # # # # #  #   #  # # # #
### ### # # ### ###  #   #  ### # #
# # # # # # # # # #  #   #  # # # #
# # # # # # # # # #  #   #  # # # #

Votre mission : écrire un programme capable d’afficher une ligne de texte en art ASCII dans un style qui vous est fourni en entrée.

Entrées du jeu

Entrée

Ligne 1 : la largeur L d’une lettre représentée en art ASCII. Toutes les lettres font la même largeur.

Ligne 2 : la hauteur H d’une lettre représentée en art ASCII. Toutes les lettres font la même hauteur.

Ligne 3 : La ligne de texte T, composée de N caractères ASCII

Lignes suivantes : La chaîne de caractères N représentée en art ASCII.

Sortie

Le texte T en art ASCII.

Les caractères de a à z seront affichés en art ASCII par leur équivalent en majuscule.

Les caractères qui ne sont pas dans les intervalles [a-z] ou [A-Z], seront affichés par le point d’interrogation en art ASCII.

Contraintes

Exemple 1

Entrée

4
5
E
 #  ##   ## ##  ### ###  ## # # ###  ## # # #   # # ###  #  ##   #  ##   ## ### # # # # # # # # # # ### ###
# # # # #   # # #   #   #   # #  #    # # # #   ### # # # # # # # # # # #    #  # # # # # # # # # #   #   #
### ##  #   # # ##  ##  # # ###  #    # ##  #   ### # # # # ##  # # ##   #   #  # # # # ###  #   #   #   ##
# # # # #   # # #   #   # # # #  #  # # # # #   # # # # # # #    ## # #   #  #  # # # # ### # #  #  #
# # ##   ## ##  ### #    ## # # ###  #  # # ### # # # #  #  #     # # # ##   #  ###  #  # # # #  #  ###  #

Sortie

###
#
##
#
###

Exemple 2

Entrée

4
5
MANHATTAN
 #  ##   ## ##  ### ###  ## # # ###  ## # # #   # # ###  #  ##   #  ##   ## ### # # # # # # # # # # ### ###
# # # # #   # # #   #   #   # #  #    # # # #   ### # # # # # # # # # # #    #  # # # # # # # # # #   #   #
### ##  #   # # ##  ##  # # ###  #    # ##  #   ### # # # # ##  # # ##   #   #  # # # # ###  #   #   #   ##
# # # # #   # # #   #   # # # #  #  # # # # #   # # # # # # #    ## # #   #  #  # # # # ### # #  #  #
# # ##   ## ##  ### #    ## # # ###  #  # # ### # # # #  #  #     # # # ##   #  ###  #  # # # #  #  ###  #

Sortie

# #  #  ### # #  #  ### ###  #  ###
### # # # # # # # #  #   #  # # # #
### ### # # ### ###  #   #  ### # #
# # # # # # # # # #  #   #  # # # #
# # # # # # # # # #  #   #  # # # #

Small Language Model

Des trigrammes peuvent-être utilisés pour transformer un texte en une nouvelle version surréelle. Mais quelles sont les heuristiques à appliquer pour obtenir un résultat convenable ?

L'analyse par trigrammes est assez simple. S'intéresser à chaque groupe de trois mots adjacents dans un document. Utiliser les deux premiers mots de ce groupe comme la clé, et se rappeler que le troisième mot suit cette clé. Une fois terminée, on connait donc la liste de tous les mots qui font suite à toutes les séquences de deux mots dans un document. Par exemple, si on prend cette entrée :

je pense donc je suis donc je pense donc je décide

On peut générer :

"je pense" => ["donc", "donc"]
"pense donc" => ["je", "je"]
"donc je"  => ["suis", "pense", "décide"]
"je suis"  => ["donc"]
"suis donc"  => ["je"]

Cela veut dire que les mots je pense sont tous les deux suivis par le mot donc, que les mots donc je sont suivis une fois par suis, une fois par pense et une fois par décide, etc.

Pour générer un nouveau texte à partir de cette analyse, choisir un couple de mots arbitraire comme point de départ. L'utiliser pour trouver aléatoirement un nouveau mot à ce texte. Cela donne maintenant un nouveau couple de mots à la fin du text. L'utiliser pour trouver potentiellement un nouveau mot basé sur ces derniers. L'ajouter au texte et continuer. Dans l'exemple précédent, nous pouvons commencer par je suis. La seule possibilité qui nous est offerte est le mot donc, donc nous obtenons :

je suis donc

Les deux derniers mots sont suis donc donc le prochain mot est je.

je suis donc je

En recherchant donc je, on se retrouve alors avec un choix à faire. Choisissons par exemple pense.

je suis donc je pense

En suivant la même logique, on peut donc arriver à une suite de mots du type :

je suis donc je pense donc je décide

À ce state, on doit s'arrêter puisqu'aucune séquence ne débute par je décide.

Si le texte en entrée est très court, l'algorithme n'est pas très intéressant. Nourrissez-le avec un livre, en revanche, en lui fournissnat ainsi beaucoup plus d'options, et vous pourriez obtenir un résultat plus surprenant.

Pour ce kata, essayer d'implémenter un algorithme de trigrammes qui génère une centainte de mots de texte en utilisant un fichier d'entrée de la taille d'un livre comme entrée. Le projet Gutenberg est une bonne source de livres en ligne.

Objectifs

Les katas ont pour eux de vous permettre d'essayer quelque chose de nombreuses fois. Dans celui-ci, ce qu'on peut expérimenter n'est pas seulement du code, mais également les heuristiques qui traitent le texte. Comment gère-t-on la ponctuation, les paragraphes ? Avons-nous besoin d'implémenter du retour arrière si nous nous apercevons que nous tombons dans une voie sans issue ?

Source

Isoler les effets avec cats-effect

Cats-effect est une librairie qui permet d'écrire du code qui décrit les futurs effets qui seront exécutés une fois pour toute.

Voici un schéma et des données Cassandra :

CREATE KEYSPACE IF NOT EXISTS cats_effect WITH REPLICATION = { 'class': 'SimpleStrategy', 'replication_factor': 1 };

CREATE TABLE IF NOT EXISTS cats_effect.cats(id TIMEUUID PRIMARY KEY, name TEXT);

INSERT INTO cats_effect.cats(id, name) VALUES (9761fc50-af5d-11e7-8484-23ac7386a7b4, 'grosminet') IF NOT EXISTS;
INSERT INTO cats_effect.cats(id, name) VALUES (a83d1e20-b376-11e7-8d2c-c17e24c486da, 'catwoman') IF NOT EXISTS;
INSERT INTO cats_effect.cats(id, name) VALUES (017cd6d0-b807-11e7-82b1-6db11998e458, 'felix') IF NOT EXISTS;

Écrire un programme qui liste les chats, inverse leur nom (grosminet devient tenimsorg) et ré-insère les noms inversés en base, le tout au moyen de Cats-effect.

Machine à changer la monnaie

Étant donné une spécification de devise et un montant, vous devez indiquer le nombre de billets et de pièces nécessaires.

La spécification de devise est une chaîne qui décrit les pièces et les billets de banque par ordre croissant. Exemple pour les euros :

1 2 5 10 20 50 100 200 500

La sortie est une chaîne avec le nombre de billets de banque ou de pièces plus « x » plus le billet de banque ou la pièce par ordre décroissant. Exemple pour 285€ :

1x200 1x50 1x20 1x10 1x5