Три кадра решений Project Euler, написанных на языке программирования D
Содержание
- Введение
- Получение даже
- В расцвете сил
- Жить по-крупному
- Последние мысли
- Сноски
Введение
Project Euler¹ — это веб-сайт, предлагающий математические головоломки, которые обычно решаются с помощью компьютерного программирования. У них более миллиона зарегистрированных пользователей, которые в совокупности представили более двенадцати миллионов правильных решений своих головоломок². Если посмотреть на GitHub, можно обнаружить 40 846 репозиториев, относящихся к «проекту Эйлера»³, и кажется, что очень немногие из них, если вообще есть, имеют решения, реализованные на языке программирования D.⁴
Некоторое время назад я решил выучить язык D, и, поскольку решений Project Euler, написанных на языке D, не так много, я решил воспользоваться этой возможностью и опубликовать решения, написанные на этом языке. В этой статье я расскажу о трех загадках, которые показались мне интересными, и о своих решениях для них.
Квитирование: четная последовательность Фибоначчи
«Каждый новый член в последовательности Фибоначчи генерируется путем добавления двух предыдущих членов. Начиная с 1 и 2, первые 10 членов будут:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …
Рассмотрев члены последовательности Фибоначчи, значения которых не превышают четырех миллионов, найдите сумму членов с четными значениями». (Проект Эйлер)
Таким образом, эта головоломка состоит в том, чтобы ввести читателя, который раньше не программировал на D, в «канавку» программирования на D, познакомив его с тем, как D использует элементарные понятия программирования, такие как условная логика и циклы.
Я решил эту проблему, определив статический массив⁵ “fibonacci”
для обработки суммирования двух предыдущих чисел и динамический массив⁶ “even_fibonacci”
для хранения четных чисел Фибоначчи. Я реализовал простой цикл do…while
, похожий на тот, что используется в C++ или Java, с условием запуска базовой логики до тех пор, пока сумма ранее вычисленных чисел Фибоначчи не станет больше или равна 3 999 999.
«Основная логика» включает добавление того, что находится в массиве Фибоначчи, проверку на четность (это можно выяснить, вычислив число n по формуле: n mod 2
и проверив, не равно ли оно нулю), добавление его к список (язык D добавляет объекты в списки, такие как list ~= object
) и обновление двух чисел в массиве fibonacci
самым верхним числом и вновь вычисленным числом.
Это было довольно легко, на мой взгляд.
В расцвете сил: 10001-й расцвет
«Перечислив первые шесть простых чисел: 2, 3, 5, 7, 11 и 13, мы увидим, что 6-е простое число равно 13.
Что такое 10 001-е простое число?» (Проект Эйлер)
Поэтому я хотел продемонстрировать это, потому что мне нужно было перенести код с хорошего веб-сайта, посвященного компьютерным наукам, под названием GeeksForGeeks⁷, на котором была статья, посвященная решету Эратосфена, реализованному на Python⁸.
В моем случае Решето Эратосфена включает в себя создание массива из bool
типов данных, заполненных true
значениями, итерацию по списку, увеличивающуюся на текущую позицию в массиве, и маркировку составных индексов как false
.
Это видео от Khan Academy и Art of the Problem описывает решето намного лучше, чем я когда-либо мог:
Это было немного сложно, но я смог портировать скрипт Python во что-то, что язык D может понять и выполнить:
Жизнь на широкую ногу: самый большой продукт в серии
«Четыре соседние цифры тысячезначного числа, имеющие наибольшее произведение, равны 9 × 9 × 8 × 9 = 5832.
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843 [... чик ...]
05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450
Найдите тринадцать соседних цифр в 1000-значном числе, которые имеют наибольшее произведение. Какова ценность этого продукта?» (Проект Эйлер)
Так что этот был интересен. Решить это было не так сложно, но довольно утомительно. Под этим я подразумеваю, что решение не было интеллектуально сложным, скорее в нем была ошибка, настолько тривиальная, что мне пришлось спросить StackOverflow, что не так с моим кодом.
Оказалось, что головоломка «[l]самый большой продукт в серии» дала число, которое было слишком большим для типа данных int
(в шестнадцатеричном формате: 0x57994b000
), как указал кто-то из StackOverflow.⁹ Поэтому я решил пойти с тип long
, поскольку он имеет размер 64 бита:
Последние мысли
Опять же, это всего лишь описание некоторых математических вещей, которые можно делать с языком D. Попробуйте принять вызов, который может предложить Project Euler, и посмотрите, чему вы можете научиться.
Вот что у меня есть на данный момент с точки зрения решений:
Благодарности
Я хотел бы поблагодарить прекрасных людей на GeeksForGeeks и StackOverflow за публикацию статей и наличие сообщества полезных и умных инженеров-программистов, которые прямо или косвенно помогают мне в моей работе.
Сноски
- https://projecteuler.net/
- По состоянию на 4 июля 2021 г.: https://projecteuler.net/statistics.
- По состоянию на 4 июля 2021 г.: https://archive.today/aWySX.
- https://dlang.org/
- https://tour.dlang.org/tour/en/basics/arrays
- Там же.
- https://www.geeksforgeeks.org/
- Программа Python для решета Эратосфена. КомпьютерщикиДляГиков. Получено 4 июля 2021 г.: https://www.geeksforgeeks.org/python-program-for-sieve-of-eratosthenes/
- Ветка StackOverflow: https://stackoverflow.com/questions/68245264/inconsintent-behaviour-with-computation-of-greatest-product-given-n-adjacent-d