Skip to content

Instantly share code, notes, and snippets.

@obazoud
Last active December 11, 2015 23:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save obazoud/4676259 to your computer and use it in GitHub Desktop.
Save obazoud/4676259 to your computer and use it in GitHub Desktop.
object Money {
// Equation: x = 1*foo + 7*bar + 11*qix + 21*bar
val FOO = 1; val BAR = 7; val QIX = 11; val BAZ = 21;
def change(cents: Int): List[Map[String, Int]] = {
lazy val tuple = for (
foo <- 0 to cents; bar <- 0 to (cents - FOO * foo) / BAR;
qix <- 0 to (cents - FOO * foo - BAR * bar) / QIX;
baz <- 0 to (cents - FOO * foo - BAR * bar - QIX * qix) / BAZ
) yield (foo, bar, qix, baz)
Stream(tuple: _*)
.filter {
case (foo, bar, qix, baz) => FOO * foo + BAR * bar + QIX * qix + BAZ * baz == cents
}
.map {
case (foo, bar, qix, baz) => Map("foo" -> foo, "bar" -> bar, "qix" -> qix, "baz" -> baz)
}
.map(x => x.filter(y => y._2 > 0))
.toList
}
}

L’échoppe de monade sur Scalaskel.

Sur la planète Scalaskel, une planète en marge de la galaxie, aux confins de l'univers, la monnaie se compte en cents, comme chez nous. 100 cents font un groDessimal. Le groDessimal est la monnaie standard utilisable partout sur toutes les planètes de l’univers connu. C'est un peu compliqué à manipuler, mais si on ne s'en sert pas y'a toujours des erreurs d'arrondis incroyables quand on les soustrais ou on les divise, c’est idiot, mais c’est comme ça. Sur Scalaskel, on utilise rarement des groDessimaux, on utilise des pièces plus petites : Le Foo vaut 1 cent, le Bar vaut 7 cents, le Qix vaut 11 cents et le Baz vaut 21 cents.

Vous tenez une échoppe de monade et autres variables méta-syntaxique sur Scalaskel. Pour faire face à l’afflux de touristes étrangers avec les poches remplies de groDessimaux vous avez besoin d’écrire un programme qui pour toute somme de 1 à 100 cents, vous donnera toutes les décompositions possibles en pièces de Foo, Bar, Qix ou Baz.

Par exemple, 1 cent ne peut se décomposer qu’en une seule pièce Foo. Par contre 7 cents peuvent se décomposer soit en 7 pièces Foo, soit en 1 pièce Bar.

Serveur Web :

Votre serveur doit répondre aux requetes http GET de la forme http://serveur/scalaskel/change/X, X étant une valeur en cents de 1 à 100 cents.

La réponse attendue est un json de la forme :

[{“foo”: w, “bar”: x, “qix”: y, “baz”: z}, …]

Exemples Pour http://serveur/scalaskel/change/1 il faut répondre :

[ {“foo”: 1} ]

Pour http://serveur/scalaskel/change/7 il faut répondre :

[ {“foo”: 7}, {“bar”: 1} ]

L’ordre des valeurs dans le tableau json, ainsi que le formatage n’a pas d’importance à partir du moment ou c’est du json valide, il s’entends.

Bon courage !

change=8: foo:8, foo:1 bar:1 change=10: foo 10, foo:3 bar:1 change=11: foo 11, foo:4 bar:1, qix:1 change=15: foo 15, foo:1 bar:2, foo:8 bar:1, foo:4 qix:1 change=30: foo:30, foo:2 bar:4, foo:5 bar:2 qix:1, foo:19 qix:1

change=66: foo:66, foo:3 bar:9, qix:6, qix:1 baz:5

baz:1 bar:1 foo:2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment