Programming Praxis – McNugget Numbers

In today’s Programming Praxis exercise, our goal is to determine all the numbers that are not McNugget numbers, i.e. numbers that cannot be created by summing multiples of 6, 9 and 20. Let’s get started, shall we?

A quick import:

import Data.List

The code is pretty straightforward: just take all the numbers up to 180 that cannot be created by a linear combination of 6, 9 and 20.

notMcNuggets :: [Integer]
notMcNuggets = [1..180] \\
    [a+b+c | a <- [0,6..180], b <- [0,9..180-a], c <- [0,20..180-a-b]]

To test whether everything works correctly:

main :: IO ()
main = print notMcNuggets

Yup. Nice and simple.

About these ads

Tags: , , , , , , ,

One Response to “Programming Praxis – McNugget Numbers”

  1. gcbenison Says:

    Here is an alternate implementation where [6,9,20] can be replaced with any list of integers:

    isSumOf::[Integer]->Integer->Bool
    isSumOf (x:[]) y = (mod y x) == 0
    isSumOf (x:xs) y = (any $ isSumOf xs) [y,y-x..0]

    mcNugget = isSumOf [6,9,20]

    *Main Data.List> filter (not . mcNugget) [1..10000]
    [1,2,3,4,5,7,8,10,11,13,14,16,17,19,22,23,25,28,31,34,37,43]

    *Main Data.List> isSumOf [3852,1171,3257] 91873
    False
    *Main Data.List> isSumOf [3852,1171,3257] 91874
    True

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


Follow

Get every new post delivered to your Inbox.

Join 35 other followers

%d bloggers like this: