Вы должны написать программу, реализующую функцию digitsum(int i)
. Программа должна изменить свой собственный код (для языков, где это невозможно с помощью рефлексии , пожалуйста, будьте изобретательны), чтобы достичь цели.
Вы начинаете с
function digitsum(int i){
return i;
}
и реализовать эволюционный алгоритм, который будет модифицировать вышеупомянутую функцию, пока он не вернет действительные цифры при вызове функции.
Поскольку это конкурс популярности, у вас очень много свободных рук, пожалуйста, будьте креативны!
Методические рекомендации:
- Начните с определенной функции (перевод на ваш язык, конечно).
- Распечатайте хотя бы самую подходящую функцию каждого поколения.
- Распечатайте ваш рабочий раствор, проверенный на 0 <i <10000.
- Будь креативным!
Не делайте:
- Подсказка вашей программы к решению, пожалуйста, используйте все варианты языка!
- Кидай ошибки в консоль.
- Используйте любой внешний вход. Вы можете писать и сохранять в файлы, созданные вашей программой. Без интернета.
Действительное решение с наибольшим количеством голосов выигрывает!
popularity-contest
reggaemuffin
источник
источник
no libraries
разрешено в виду не Libc?no libraries
как это было бы для сложной ИМО, так что избиратели могут решить, если есть много библиотек, используемых!Ответы:
C #
Почти полностью случайное и необработанное решение для сборки. Что касается C # и практически любой другой платформы, это настолько низкий уровень, насколько это возможно. К счастью, C # позволяет вам определять методы во время выполнения в IL (IL - это промежуточный язык, байт-код .NET, похожий на ассемблер). Единственным ограничением этого кода является то, что я выбрал несколько кодов операций (из сотен) с произвольным распределением, которые были бы необходимы для идеального решения. Если мы разрешим все коды операций, шансы работающей программы невелики, так что это необходимо (как вы можете себе представить, есть много разных способов, которые могут привести к сбою инструкций случайной сборки, но, к счастью, они не разрушают всю программу в .NET). Помимо диапазона возможных кодов операций, это абсолютно случайные коды операций IL без намека на подсказки.
Извините, у меня пока нет результатов, потому что даже тестирование на 1..99 (вместо 1..9999) довольно медленное, и я слишком устал. Вернемся к вам завтра.
РЕДАКТИРОВАТЬ: Я закончил программу и много ее подправил. Теперь, если вы нажмете CTRL-C, он завершит текущий запуск и выведет результаты в виде файлов. В настоящее время единственные жизнеспособные решения, которые он производит, - это программы, которые всегда возвращают постоянное число. Я начинаю думать, что шансы на более продвинутую рабочую программу астрономически невелики. Во всяком случае, я буду продолжать работать некоторое время.
РЕДАКТИРОВАТЬ: Я продолжаю дорабатывать алгоритм, это идеальная игрушка для гика, как я. Однажды я видел сгенерированную программу, которая фактически выполняла некоторую случайную математику и не всегда возвращала постоянное число. Было бы здорово запустить его на нескольких миллионах процессоров одновременно :). Будет продолжать это.
РЕДАКТИРОВАТЬ: Вот результат какой-то совершенно случайной математики. Он прыгает вокруг и остается на 17 для остальных индексов. Это не станет сознательным в ближайшее время.
РЕДАКТИРОВАТЬ: это становится все сложнее. Конечно, как и следовало ожидать, он не похож на правильный алгоритм цифровой обработки, но он старается изо всех сил. Смотри, компьютерная программа сборки!
источник
C #
Возможно, это не совсем то, что вы предполагали, но это лучшее, что я мог сделать прямо сейчас. (По крайней мере, с C # и CodeDom).
Итак, как это работает:
((i & v1) >> v2)
. Этими терминами будут гены, которые будут мутировать в процессе бега.Код:
Протестировано на OSX с компилятором Mono C # версии 3.2.6.0.
На каждой итерации выводится значение пригодности текущего расчета. В конце он напечатает лучшее решение вместе со своей пригодностью. Цикл будет работать до тех пор, пока один из результатов не будет иметь значение пригодности 0.
Вот как это начинается:
И через некоторое время (занимает около 30 минут), вот как все это заканчивается (показывая последнюю и почти последнюю итерацию):
Ноты:
a >> b
использоватьa / 2^b
return i;
требует задачи.i & a >> a
а неi & a >> b
, так как в последнем случае эволюция была просто слишком медленной, чтобы быть практической.return (i&a>>b)+(i&c>>d)+...
, поскольку любой другой вид (например, попытка сгенерировать «правильный» код с помощью циклов, присваиваний, проверок условий и т. Д.) Просто сходится слишком медленно. Также таким образом очень легко определить гены (каждый из терминов), и очень легко их мутировать.0..10000
(если вы проверите найденное решение, вы увидите, что оно не будет работать для чисел больше 16384)источник
Javascript
Ну, у меня возникла проблема точности с плавающей запятой в моем ответе - которую, вероятно, можно решить с помощью библиотеки BigDecimal - когда входные числа больше чем
55
.Да, это далеко не
10000
так, поэтому я не ожидаю победы, но все же интересный метод, основанный на этой теме .Он вычисляет [полиномиальную интерполяцию] ( http://en.wikipedia.org/wiki/Polynomial_interpolation ) на основе набора точек, поэтому он использует только умножение, деление и сложение, без операций по модулю или побитовые операции.
Функция выхода:
Эта полиномиальная функция (упрощенная до степени 25 и без округления) построена, посмотрите на значения для целых чисел (читаемые для [6; 19]):
Тесты:
источник