Cheryl's birthday: Difference between revisions

Content deleted Content added
Realize in F#
Hout (talk | contribs)
→‎{{header|JavaScript}}: 2nd and 3rd filters generalised
Line 196: Line 196:


// (A's month contains only one remaining day)
// (A's month contains only one remaining day)
// (A: "Then I also know")
// (3 :: A "Then I also know")
monthsWithSingleDays(true)(
uniquePairing(true)(fst)(


// among the days with unique months,
// among the days with unique months,


// (B's day is paired with only one remaining month)
// (B's day is paired with only one remaining month)
// (B: "I know now")
// (2 :: B "I know now")
daysWithUniqueMonths(true)(
uniquePairing(true)(snd)(


// excluding months with unique days,
// excluding months with unique days,


// (A's month is not among those with unique days)
// (A's month is not among those with unique days)
// (A: "I know that Bernard does not know")
// (1 :: A "I know that Bernard does not know")
monthsWithUniqueDays(false)(
monthsWithUniqueDays(false)(


// from the given month-day pairs:
// from the given month-day pairs:


// (Cheryl's list)
// (0 :: Cheryl's list)
map(x => tupleFromList(words(strip(x))),
map(x => tupleFromList(words(strip(x))),
splitOn(/,\s+/,
splitOn(/,\s+/,
Line 226: Line 226:
))
))
);
);



// monthsWithUniqueDays :: Bool -> [(Month, Day)] -> [(Month, Day)]
// monthsWithUniqueDays :: Bool -> [(Month, Day)] -> [(Month, Day)]
const monthsWithUniqueDays = blnInclude => xs => {
const monthsWithUniqueDays = blnInclude => xs =>
const
bindPairs(xs,
dctDays = dictFromPairs(snd)(fst)(xs),
md => {
dctMonths = dictFromPairs(fst)(snd)(xs),
const
days = filter(
m = fst(md),
k => 1 === length(dctDays[k]),
d = snd(md),
Object.keys(dctDays)
days = filter(
),
k => 1 === length(d[k]),
months = filter(
Object.keys(d)
k => (blnInclude ? id : not)(
),
0 < length(intersect(dctMonths[k], days))
months = filter(
),
k => (blnInclude ? id : not)(
Object.keys(dctMonths)
0 < length(intersect(m[k], days))
);
),
Object.keys(m)
return filter(tpl => elem(fst(tpl), months), xs);
};
);
return filter(tpl => elem(fst(tpl), months), xs);
}
);


// daysWithUniqueMonths :: Bool -> [(Month, Day)] -> [(Month, Day)]
// uniquePairing :: Bool -> ((a, a) -> a) ->
// -> [(Month, Day)] -> [(Month, Day)]
const daysWithUniqueMonths = blnInclude => xs => {
const uniquePairing = blnInc => f => xs =>
const
dctDays = dictFromPairs(snd)(fst)(xs),
bindPairs(xs,
dctMonths = dictFromPairs(fst)(snd)(xs),
md => {
days = filter(
const
k => (blnInclude ? id : not)(
dct = f(md),
1 === length(dctDays[k])
matches = filter(
),
k => (blnInc ? id : not)(
Object.keys(dctDays)
1 === length(dct[k])
);
),
Object.keys(dct)
return filter(tpl => elem(snd(tpl), days), xs);
};
);
return filter(tpl => elem(f(tpl), matches), xs);
}
);


// monthsWithSingleDays :: Bool -> [(Month, Day)] -> [(Month, Day)]
// bindPairs :: [(Month, Day)] -> (Dict, Dict) -> [(Month, Day)]
const monthsWithSingleDays = blnInclude => xs => {
const bindPairs = (xs, f) => f(
const
Tuple(
dctMonths = dictFromPairs(fst)(snd)(xs),
dictFromPairs(fst)(snd)(xs),
months = filter(
dictFromPairs(snd)(fst)(xs)
)
k => (blnInclude ? id : not)(
);
1 == length(dctMonths[k])
),
Object.keys(dctMonths)
);
return filter(tpl => elem(fst(tpl), months), xs);
};


// dictFromPairs :: ((a, a) -> a) -> ((a, a) -> a) -> [(a, a)] -> Dict
// dictFromPairs :: ((a, a) -> a) -> ((a, a) -> a) -> [(a, a)] -> Dict