Программирование — это инструмент, который можно использовать для решения широкого круга задач. Обычно мы пишем решения для наших клиентов, иногда делаем приложения для себя. Программы вовсе не обязательно должны быть продуктами, они могут действовать как маленькие кусочки для достижения более крупной цели.

Это было еще в мае 2009 года, когда Нико пришел с простым вопросом. Сколько треугольников вы можете найти на этом рисунке?

Очевидно, что 1–3–10, 1–2–7 — треугольники. Наверняка 7–9–2 изобразить легко. 2–4–6 немного маловато, но определенно нужно считать и так далее. Каждый из этих треугольников имеет другое зеркальное отображение. Через некоторое время вы понимаете, что есть еще 1–2–6, 2–6–7 и – о боже!– 1–2–9. Скорее всего, вы собьетесь со счета, сколько существует треугольников, если только вы серьезно не организованы.

Поскольку нам нравится развлекаться с аркадами, напитками или любыми другими проблемами, возникающими в нашей повседневной жизни в Манасе, мы решили решить эту проблему, используя наши любимые инструменты.

В мае 2009 года некоторые из нас были на пороге выпуска, работая ассистентами преподавателей в колледже; школа была еще одним повседневным занятием.

Большинство из нас программисты, и поэтому мы программируем. Но у каждого программиста разные предпочтения, опыт, области знаний, и это простое упражнение было прекрасным проявлением всего этого богатства.

В течение дня была отправлена ​​куча писем с предложенными ответами. Заявления были сделаны вокруг 53, 54, 47, 63, 65. 47 был самым популярным ответом на сегодняшний день, но, согласно некоторым источникам, неправильным.

Разница между числами зависит от того, считаются ли три выровненные точки треугольником. И если 2–6–8 равно 2–8–10… тут точно не главное.

В результате у нас появилось множество реализаций с совершенно разным «математическим» фоном для решения этой загадки.

В хронологическом порядке у нас были следующие решения

  • Сантьяго Палладино с 62 строками Python насчитал 3-сегментные циклы в графе. Да, ему нравится Python и теория графов (и численные методы).
  • Адриан Ромеро с 35 строками Python сосредоточился больше на линиях, чем на точках. Он подсчитал пересечения между парами прямых, которые соответствуют треугольнику.
  • Хуан Вайнерман с 41 строкой C# и интенсивным использованием LINQ применил подход реляционной алгебры (или SQL-иш, если алгебра не ваша чашка чая), чтобы получить векторное произведение и отфильтровать, получив тот же ответ, что и предыдущие.
  • Брайан Дж. Кардифф (это я!) написал постыдные и глупые 30 строк Пролога (могло быть 20). Тот же ответ! Это был алгоритм Generate & Test, который искал три не выровненные точки, которые были выровнены попарно.

В течение дня были итерации (в конце концов, мы agile-разработчики) для исправления, обсуждения и выявления различных мнений о том, что является треугольником, а что нет. Мы смягчили критерии треугольника, так как мы не достигли ожидаемого ответа, и мы хотели знать, почему.

Адаптация программного обеспечения является большой проблемой. Если внутреннее функционирование алгоритма не очевидно при чтении кода, изменить его довольно сложно. Ничто из вышеперечисленного не было слишком длинным или слишком загадочным, особенно для самого автора. Но, может быть, из-за моей предвзятости Пролог был здесь явным победителем. Проверьте код!

Но вы знаете, что? Решения на этом не остановились.

  • Ари Боренцвейг кодирует много, серьезно. Тогда Кристал даже не был сном и написал 334 строки на Java. Он даже создал класс График, класс Тесты и Счетчик треугольников. Это путь Java. Идея, лежащая в основе этого, была похожа на идею Адриана, сосредоточенная на линиях.
  • Jonathan Kicillof (наш графический дизайнер!) представил свой. Хотя он знал ActionScript, и сегодня я поражен плагинами Javascript, которые он может реализовать, он представил PDF. Да, хорошо организованный PDF-файл, который помог нам прямо указать на хорошие, плохие и уродливые треугольники.
  • Ари Боренцвейг, тот парень, который до сих пор много пишет, представил в общей сложности 676 строк Java. На этот раз с UI для рисования и решения любой задачи на основе треугольника.

Учитывая, что ввод фиксирован, самой короткой программой будет echo 47, но это лишило бы ее всего удовольствия.

И приятно использовать свои навыки и компьютер, чтобы решить проблему для себя, самостоятельно. Я с радостью вспоминаю, когда уже получал массу удовольствия и проблем с программированием только с черепахой.