Skip to content

Instantly share code, notes, and snippets.

@juvuorin
Last active April 24, 2020 11:03
Show Gist options
  • Save juvuorin/b705bc1e7708fe005375b67e6619e3f1 to your computer and use it in GitHub Desktop.
Save juvuorin/b705bc1e7708fe005375b67e6619e3f1 to your computer and use it in GitHub Desktop.
koiramainenOhjelmointikisa2020
const _ = require("lodash/fp");
const toFunc = _.curry((obj, def, value) =>
obj.hasOwnProperty(value) ? obj[value] : def
);
const subjectToCategory = toFunc({
"Pupun jäljestys": "Metsästys",
"Hirven jäljestys": "Metsästys",
"Linnun noutaminen": "Metsästys",
"Lumen pöllyytys": "Pihatyöt",
"Kukkapenkkien kaivaminen": "Pihatyöt"
}, "Muut");
const groupAndSum = _.pipe(
_.toPairs,
_.map(([subject, grade]) => (
[ subjectToCategory(subject), grade ]
)),
_.groupBy(0),
_.mapValues(_.sumBy(1))
);
console.log(
groupAndSum({
"Pupun jäljestys": 10,
"Hirven jäljestys": 10,
"Linnun noutaminen": 10,
"Lumen pöllyytys": 10,
"Kukkapenkkien kaivaminen": 10,
"Parvekkeen vahtiminen": 10,
"Piilotetun luun löytäminen": 10,
"Oman hännän jahtaaminen": 10,
"Kuun ulvonta": 10
})
);
@juvuorin
Copy link
Author

Tässä on erittäin hyvä ratkaisu ongelmaan. Tehtävässä on ollut kysymys tiedonkäsittelyongelmasta ja tässä on siihen hyvä ratkaisu. Työssä ei ole otettu kantaa tiedon syöttöön (input, read) tai tulostukseen (output, print), vaan on ratkaistu tiedonkäsittelyongelma sellaisenaan. Lodash-kirjaston avulla on kuitenkin päästy varsin luettavaan ratkaisuun, jonka pihvinä on groupAndSum-funktio, joka yhdistää kategorioiden määrittelyn koiran todistukseen.

Ratkaisu edellyttää hyvää JavaScript-ohjelmointitaitoa sekä käsitystä tiedonkäsittelysuunnitelman laatimisesta kuvaamalla ongelman ratkaisu sellaisenaan, mistä esimerkkinä on datan putkitus (pipe) ja käsittelytoimien määrittäminen käsittelysekvenssinä for-looppien tai vastaavien konstruktien sijaan. Tästä ei ole pitkä matka käyttämään puhdasta funktionaalista kieltä, jos intoa on.

Mahtavaa, että kisaan tuli myös lodash-versio!

Tsemppiä ohjelmointihommiin!

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