Кто-то может злоупотребить LINQ и решить эту денежную загадку?

Когда новый язык в состоянии быть столь выразительным, как C++. Из-за конфликта интересов между возможностями и низкого уровня высокого уровня это жестко для достижения. Который является, почему мы имеем язык и обрабатываем совместимость во-первых.

, Кроме того, C это, вероятно, более жестко, чтобы сделать с C, потому что так минимизировано и мощен. C побеждает на низкоуровневой арене из-за этого. И C создает хорошую поддержку для C++ и цели C.

Короче говоря Вы будете все еще видеть C и C++ в течение долгого времени.

10
задан rekire 3 May 2012 в 06:14
поделиться

1 ответ

Непроверено, но:

        int minQuarters = 1, minDimes = 1,
            minNickels = 1, minPennies = 1,
            maxQuarters = 19, maxDimes = 19,
            maxNickels = 19, maxPennies = 19,
            coinCount = 19, total = 156;
        var qry = from q in Enumerable.Range(minQuarters, maxQuarters)
                  from d in Enumerable.Range(minDimes, maxDimes)
                  from n in Enumerable.Range(minNickels, maxNickels)
                  from p in Enumerable.Range(minPennies, maxPennies)
                  where q + d + n + p == coinCount
                  where q * 25 + d * 10 + n * 5 + p == total
                  select new {q,d,n,p};
        foreach (var row in qry)
        {
            Console.WriteLine("{0} quarter(s), {1} dime(s), {2} nickel(s) and {3} pennies",
                row.q, row.d, row.n, row.p);
        }

На самом деле, для розничных целей - возможно, лучше спросить «Какое наименьшее количество монет я могу выдать»? Замените на:

...
from p in Enumerable.Range(minPennies, maxPennies)
where q + d + n + p <= coinCount
where q * 25 + d * 10 + n * 5 + p == total
orderby q + d + n + p
...

и используйте либо First () , либо Take (...) ;-p

Вероятно, вы также можете уменьшить количество проверенных наблюдений, вычитая ( например) q в тесте maxDimes (и так далее ...) - что-то вроде (упрощенно):

        int minCount = 1,
            coinCount = 19, total = 156;
        var qry = from q in Enumerable.Range(minCount, coinCount - (3 * minCount))
                  where q * 25 <= total
                  from d in Enumerable.Range(minCount, coinCount - (q + (2 * minCount)))
                  where q * 25 + d * 10 <= total
                  from n in Enumerable.Range(minCount, coinCount - (q + d + minCount))
                  where q * 25 + d * 10 + n * 5 <= total
                  from p in Enumerable.Range(minCount, coinCount - (q + d + n))
                  where q + d + n + p == coinCount
                  where q * 25 + d * 10 + n * 5 + p == total
                  select new { q, d, n, p };
21
ответ дан 3 December 2019 в 18:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: