- 1
- 2
- 3
- 4
- 5
- 6
- 7
// Возвращает квадрат натурального числа
// 4^2 = 1 + 3 + 5 + 7
int sqr(int n) {
int result = 0;
for(int i = 1, a = 1; i <= n; i++, a = a + 2) result += a;
return result;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+68
// Возвращает квадрат натурального числа
// 4^2 = 1 + 3 + 5 + 7
int sqr(int n) {
int result = 0;
for(int i = 1, a = 1; i <= n; i++, a = a + 2) result += a;
return result;
}
Нестандартные решения - залог успешности проекта.
Какие простые множители? Можно поподробнее?
То есть возвести множетель в кважрат?
Но ведь тогда задача сводится к предыдущей. Не понимаю.
Ведь оп считает вторую степень числа через суммирование.
1. Получаем сверхэкспонентное время.
2. Используем символьную арифметику для нахождения квадрата (мы же копируем выражение, а не значение).
Во. С такой точки зрения принимается.
Хотя сложность можно нарастить многими способами.
Думаю сложнее чем рекурсивное сложение инкрементами, рекурсивное умножение рекурсивными сложениями инкрементами, и рекурсивное возведение в степень рекурсивными умножениями рекурсивными сложениями инкрементами, итд до стрелочной нотации, придумать трудно.
И. Важно сделать это парой функций, то есть обобщить для любой вложенности.
Функция hyper(), которая при n=0 - инкремент, при n=1 - сложение, при n=2 - умножение, при n=3 - степень и т.п.? Забыл, как она правильно называется ;(
H(0,3,9) // инкремент 9
H(1,3,5) // 3+5
H(2,3,5) // 3*5
H(3,3,5) // 3**5
Блин. Так это практически она и есть, я там ниже в спойлере еще вчера её упоминал.
Только у Аккермана для джвух, а у меня для трёх:
>H(op-1,a,H(op,a,b-1))
Сравните, http://upload.wikimedia.org/math/f/8/2/f826ff51d40963b01fd8fee2dbe8ff0a.png
Проблема в том что стек быстро заканчивается.
Сделать генератор кода, который будет вычислять гиперфункцию произвольных двух чисел и записывать ответ в переданный массив.
*Задача повышенной сложности (в O-нотации).Полагаю такой способ будет еще более ресурсоёмким.
Кстати, а почему до сих пор нет AES на брейнфаке?
Если про пару десятков принципов ООП сложной жабы надо прочитать 0..2 книжки, а про философию простого хаскеля - 5..20 книжек, то про простейший брейнфак нужно читать 20..100 книг, чтобы писать одни и те же программы.
После #14528 можно ожидать и AES на брейнфаке.
по специальности "математик, системный программист" машину Тьюринга изучают чуть ли не первой
Требуется: придумать непротиворечивое определение Hyper(f, x, n) на случай нецелых значений n и, пользуясь только интерпретатором Brainfuck, найти символьное выражение Hyper(f, x, √2̅) для основных тригонометрических функций.
Блин, пример не в ту ветку попал:
http://govnokod.ru/17276#comment258717
Главное — то чтоб эта функция наиболее неоптимально реализована: через понижение порядка самой себя.
1) возведению простого числа в энную степень
2) перемножению пачки взаимнопростых чисел
Нет ничего хуже чем нестабильный по сложности алгоритм. В оп коде сложность предсказуема.
А вдруг злоумышленник будет присылать для возведения в степень специально подобранные простые числа.
Что тогда? Ведь sqr тогда сведется к тривиальному возведению в квадрат.
В этом случае будут простаивать проплаченные наперёд вычислительные мощности и теряться деньги.
Чтобы не понести убыток, я рекомендую добавить элегантное решение добавить if и проверить n на простоту.
if (isPrime(n)) использовать формулу n*n-1=(n-1)*(n+1)
n-1 и n+1 — гарантированно составные числа (при n>4)
и уже их разбить на множители и перемножать.
Таким образом вы защититесь от prime-атак и минимизируете убытки.
Или по-русски это не простые множители (prime factors)?
>Квадрат любого числа в таком случае будет просто повторение этого произведения еще раз: 36^2 = (2 * 2 * 3 * 3) * (2 * 2 * 3 * 3) = 1296.
Ну это всё копетанство.
Меня насторожило:
> а потом каждый из них удвоить.
Удвоить, по-русски, это обычно умножить на джва.
var calc=function(op, count){../*говняно-рекурсивная реализация через понижение count, when count=0 понижение порядка op*/...};
Где op - операция.
op = 1 - сложение с count
op = 2 - умножение на count
op = 3 - возведение в степень count
var sqr=calc(3,2);
f(5)=25;
Блджад что-то похожее на Аккермана получается. Переизобрёл велосипед.
http://ideone.com/tMEsSq
В этой строчке есть C++.
Во всяком случае Visual Studio 2013 не ругается на это.
Наоборот же.
Это первая версия студии, которая худо-бедно поддерживает C99.
Ёпты, ну погуглите
http://blogs.msdn.com/b/vcblog/archive/2013/07/19/c99-library-support-in-visual-studio-2013.aspx
>там что - правда массивы переменной длины запилили?
Конкретно эту фичу нет. Но хотя бы в хедеры внесли функции, и то радует.
http://msdn.microsoft.com/en-us/library/vstudio/zb1574zs(v=vs.120).aspx
>To summarize, we added declarations and implementations for missing functions in the following headers
чисто заголовки добавленные, а про функции языка ничего.
Насколько я знаю массивов переменной длины в VS нет, потому что в С++ они не нужны, а для VS важнее поддержка С++.
И в комментах к статье это вроде подтверждают. Так что нет, VS не поддерживает С99.
>Так что нет, VS не поддерживает С99.
Я сказал "худо-бедно". Если так разобраться gcc тоже не все фичи C99 поддерживает.
А я сказал "не поддерживает".
Поэтому использовать его для проверки совместимости со стандартом нет смысла.
В gcc может тоже не все поддерживается, но у VS вообще своя, особая атмосфера.
https://ru.wikipedia.org/wiki/C99
Ну мы что тут, практики что ли собрались?
sql(-2) = 0
отправить на доработку
short чисто для ускорения - сервак не даёт проге достаточно времени, чтобы просчитать int (http://codepad.org/M9WfLzE8).