p = problem $ do x <- newVar y <- newVar x >| 0 x <| 10 y >| 0 y <| 10 (x*x + y*y) >| 9 minimize $ x*x - 2*x*y + 4*x + y*y - 4*y + 4 + 7 *Main > last $ take 1000 $ optimize p (7.000000322085075,array (1,2) [(1,0.8733208989876261),(2,2.872753373591708)]) ня?
Ленивые вычисления + Y-комбинатор с мемоизацией = динамическое программирование (не совсем =) y lim f = let a = listArray lim $ map g (range lim) g = f (a!) in (a!) fib = y (1, 100) $ \f n -> if (n<=2) then 1 else (f (n-1)) + (f (n-2))
acm.timus.ru дизайн такой же, как и 10 лет назад, когда я последний раз решал оттуда задачи.
Вдвойне приятно, что решения можно отправлять на хаскеле!
Приятно видеть, что у Вдвойне приятно, что решения можно отправлять на хаскеле!
kawais.mooo.com
В качестве параметров берет диаметры двух труб, угол между трубами, толщину стенок одной из труб и имя постскрипт файла, куда и выводится результат.
pixmapNew :: DrawableClass d => Maybe d -> SomeCrap -> IO PIxmap
При попытке скомпилить код со строчкой
pm <- pixmapNew Nothing someCrap
вываливается ошибка, ведь компилятор не может вывести тип d.
Приходится писать так:
pm <- pixmapNew (Nothing :: Maybe Drawable) crap
хотя и Maybe Drawable тут не несет никакого смысла.
Это я что-то не понимаю, или это неудачная реализация биндингов в gtk2hs?
Или почему не работает
let a = [| 1 |]
print $(a)
но работает
print $([| 1 |])
Пусть есть две функции State: moveUp :: State (Integer, Integer) () moveUp = modify (\(x, y) -> (x, y+1)) и callStupid :: State String () callStupid = modify (++ " sucks") Как теперь реализовать функцию moveUpAndCallStupid :: State FunkyType () чтобы руками не разворачивать монады State и не собирать новые? data FunkyData = Funky { name :: String, coordinates :: (Integer, Integer) }
instance (Num a, Num b) => Num (a->b) where (+) f1 f2 = \x -> f1 x + f2 x (-) f1 f2 = \x -> f1 x - f2 x (*) f1 f2 = \x -> f1 x * f2 x abs f = \x -> abs $ f x signum f = \x -> signum $ f x fromInteger a = \x -> fromIntegral a
Первым же делом, два постулата.
Во-первых, две ноты, отличающихся по частоте в два раза — одна и та же нота.
Этому можно найти много объяснений, но оставлю в форме постулата.
Во-вторых, две ноты, отличающиеся по частоте в полтора раза, приятны как созвучие.
Такой интервал, кстати, называется квинта.
Так вот, начнем с какой-либо ноты. Возьмем струну длиной один метр и подвесим груз 1 кг.
Каждый раз будем увеличивать частоту в полтора раза, увеличивая груз в полтора раза.
Но если вес груза будет превышать 2кг, поделим его пополам.
Prelude> let cut x = if x>=2 then x/2 else x
Prelude> let f x = cut (1.5*x)
Проделаем такую операцию над первой нотой 12 раз и получим каких-то 13 звуков:
Prelude> let notes = take 13 $ iterate f 1
Prelude> notes
[1.0, 1.5, 1.125, 1.6875, 1.265625, 1.8984375, 1.423828125, 1.06787109375, 1.601806640625, 1.20135498046875, 1.802032470703125, 1.3515243530273438, 1.0136432647705078]
Все частоты ощутимо отличаются друг от друга, кроме первой и тринадцатой (1 и 1.0136).
Если продолжать увеличивать частоту в полтора раза и делить на два при необходимости,
то ноты будут повторяться с достаточно большой точностью.
Теперь если принять первую ноту с грузом 1 за до, то вот это и есть двенадцать нот(до, до#, ре, ре#, ...) в порядке возростания частоты:
Prelude Data.List> sort $ take 12 notes
[1.0, 1.06787109375, 1.125, 1.20135498046875, 1.265625, 1.3515243530273438, 1.423828125, 1.5, 1.601806640625, 1.6875, 1.802032470703125, 1.8984375]
Кстати, если взять первые 7 нот последовательности notes, то получится тональность соль мажор:
Prelude Data.List> let names = ["do", "do#", "re", "re#", "mi", "fa", "fa#", "sol", "sol#", "la", "la#", "si"]
Prelude Data.List> filter ((flip elem (take 7 notes)).fst) (zip (sort $ take 12 notes) names)
[(1.0,"do"), (1.125,"re"), (1.265625,"mi"), (1.423828125,"fa#"), (1.5,"sol"), (1.6875,"la"), (1.8984375,"si")]
#2400076
sprunge.us
Костыль, который берет выделенный текст, набранный в неправильной раскладке, переводит в правильную и пихает результат в копи-паста буфер.
ЗЫ требует gtk, да
Продолжая sprunge.us
Костыль, который берет выделенный текст, набранный в неправильной раскладке, переводит в правильную и пихает результат в копи-паста буфер.
ЗЫ требует gtk, да
datarecoverylabs.com
Прокручиваем ниже и читаем про сабж :3
Прокручиваем ниже и читаем про сабж :3