среда, 7 ноября 2007 г.

Тихо шифером шурша...вычисляем факториал на C#

using System;

 

namespace sillytests

{

    delegate T SelfApplicable<T>(SelfApplicable<T> self);

 

    class Program

    {

        static void Main(string[] args)

        {

            // The Y combinator

            SelfApplicable< Func<Func< Func<int, int>, Func<int, int>>, Func<int, int>>> Y = y => f => x => f(y(y)(f))(x);

            // The fixed point generator

 

            Func< Func< Func<int, int>, Func<int, int> >, Func<int, int>> Fix = Y(Y);

            // The higher order function describing factorial

            Func<Func<int, int>, Func<int, int>> F = fac => x => x == 0 ? 1 : x * fac(x - 1);

 

            // The factorial function itself

            Func<int, int> factorial = Fix(F);

 

            for (int i = 0; i < 12; i++)

            {

                Console.WriteLine(factorial(i));

            }

        }

 

    }

}



Взято тут.

Hellow World с использованием LINQ и Reflection

Забавы...

using System;

using System.Linq;

using System.Reflection;

 

namespace sillytests

{

    class Program

    {

        static void Main(string[] args)

        {

            foreach (var t in from fi in typeof(Reflect).GetFields() where !fi.IsStatic select fi.Name + " ")

                Console.Write(t.ToUpper());

 

        }

 

        class Reflect

        {

            public bool Hello;

            public int World;

            public string from;

            public double LINQ;

            public byte and;

            public float reflection;

            public static double BlaBlaber;

        }

    }

}

Многоядерные процессоры и C#

Пока информации немного.
Параллельный LINQ - Выполнение запросов на многоядерных процессорах

Параллельная производительность - Оптимизация управляемого кода для многоядерных компьютеров

вторник, 6 ноября 2007 г.

Эрик Лептон обьясняет почему вывод типов...

не работает с функциями напрямую.
Вот тут - C# 3.0 Return Type Inference Does Not Work On Member Groups

Обьяснение туманное и запутанное. Интересен тот факт что в первоначальной спецификации на версию 3.0 это было заявлено.
О чем речь собственно...
Пусть есть вот такой код:

public static IEnumerable<R> transformation<C, R>(this IEnumerable<C> collection, Func<C, R> projection)

{

    foreach (C c in collection)

        yield return projection(c);

}

 

public static int to_42(int value)

{

    return 42;

}


Мы хотим применить to_42 к transformation. Тогда если где-то ниже мы напишем:

int[] numbers = new int[] { 1, 2, 3, 4, 5 };

foreach (int i in numbers.transformation(collections.to_42))

{

    Console.WriteLine(i);

}


Мы получим ошибку компиляции. Вот такую:

error CS0411: The type arguments for method 'alogrithm.collections.transformation<C,R>(System.Collections.Generic.IEnumerable<C>, System.Func<C,R>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.



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

Func<int, int> _f = collections.to_42;

foreach (int i in numbers.transformation(_f))

...

foreach (int i in numbers.transformation(new Func<int, int>(collections.to_42)))

...

foreach (int i in numbers.transformation((x) => { return collections.to_42(x); }))

...

foreach (int i in numbers.transformation<int,int>(collections.to_42))

...



Все сводится к тому что мы так или иначе задали тип (в основном возвращаемого значения) явно. Т.е. компилятор самостоятельно понять какой именно тип возвращаемого значения у функции to_42 не может. И Эрик подробно и обстоятельно обьясняет почему это абсолютно правильно.
Скажу честно - я ничего не понял из этих объяснений.
Я вижу какими типами должна быть инстанцииирована ( в терминах шаблонов С++ ) transformation при использовании to_42 в качестве параметра. Думаю любой это видит. Почему этого не должен видеть хотя бы в частном случае компилятор я не понимаю и вряд ли пойму.

Беедненький Микрософт

Сначала Билл Гейтс перестал быть самым богатым человеком. Потом перестал быть даже вторым...опустившись "аж" на третье место.
А теперь неприятности у самого Микрософта. Перестали они быть самой дорогой компанией в мире...И главное кто их подвинул то... Китайцы. Что характерно - нефтяная компания. 1 триллион стоит. PetroChina если интересно...Уоррен Баффетт по слухам в 2003 г. вложил в акции PetroChina $488 млн, в этом году продал их за $3,5 млрд. Умеет же...

суббота, 3 ноября 2007 г.

Computer Language Benchmarks Game

Computer Language Benchmarks Game

Сравнение решения различных задач на разных языках программирования.
Также в принципе примеры задач при изучении другого языка программирования.
Старичок-плюсовичок порадовал. Руби улыбнул.

пятница, 2 ноября 2007 г.

Расшифрована следующая часть генома...

Кошки. Что дает полная расшифровка генома? Наверняка о геномах, генах и их расшифровке все слышали, а вот что это и зачем...
Итак. Хочу все знать. Википедия и немного гугля. Понятия.

Геном.

Наверху всей смысловой цепочки находится понятие геном.В нем сосредотчена наследственной информации. Т.е. совокупность всего где сосредоточена генетическая информация называется геномом.

Геном->хромосомы.

Дальше идут хромосомы. Чаще всего генетическая информация передается пачками хромосом.

Геном->хромосомы->ДНК.

Хромосомы в свою очередь помимо всего прочего содержат молекулы ДНК. У хромосом бывают разные стадии их существования. В одних стадиях все молекулы ДНК "соединены" в "макромолекулу", в других разделены. Как-то.

Порядки цифр: Исследователи из 10 стран, работающие над проектом IRGSP (International Rice Genome Sequencing Project), впервые расшифровали геном риса: идентифицировали 37 тысяч 544 гена и установили положение каждого из них на 12 хромосомах.

Ну это у риса. С человеком посложнее. Хотя пишут что тоже 30 000 генов у человека. У червя какого-то 19 тысяч. Кому верить...

Геном->хромосомы->ДНК->ген (генетический код).

Генетический код он же Ген — это определенные сочетания нуклеотидов и последовательность их расположения в молекуле ДНК. Т.е. "ген" состоит из последовательно(?) идущих друг за другом "нуклеодидов". В ДНК используется четыре нуклеотида — аденин (А), гуанин (G), цитозин (С), тимин (T).

Геном->хромосомы->ДНК->ген->"участки"(не нашел отдельного названия)

ДНК разбит на участки, разделяемые "стопами" (а иногда "стартами").
Каждый участок - тоже набор нуклеотидов плюс "стоп". Стоп - определенная последовательность из нуклеотидов.

Участки кодируют молекулы белка. Т.е. из одного участка получается один строго определенный белок. Соответствия один к одному нет, т.е. существуют различные участки которые кодируют один и тот же белок.

Белок состоит из аминокислот. Которых двадцать штук. Значит нам нужно минимум три нуклеотида чтобы закодировать все двадцать аминокислот ( 4*4*4 ). Порция из трех нуклеотидов называется "кодон". Или триплет.

Геном->хромосомы->ДНК->ген->"участки"->кодоны->нуклеотиды.

Вариантов получается 64 штуки. 3 из этих вариантов приходятся на "стоп".
Итого 61 вариант на 20 аминокислот...

Избыточность. И вообще если бы нуклеотидов было пять достаточно было бы "порции" из двух чтобы закодировать аминокислоту. И еще на стоп осталось бы...


Дальше.

Белки производятся в строго отведенном для этого месте. И ДНК туда не попадают. Поэтому информацию о том что именно производить нужно донести до этого места. Этим занимаются мРНК (иРНК). То бишь одна молекула мРНК это копия одного участка ДНК. Копию естественно нужно сначала создать. А потом оттащить к "фабрике". Этим занимаются молекулы называемые...да без разницы как они называются.

Генетический мусор.

Не все "участки" одинаково полезны. Ровно как и не все гены. Есть определенные участки которые не формируют никакие белки. Это и есть генетический мусор. ДНК в основном состоит из такого вот мусора. У человека к примеру этого мусора 97%. Он не совсем бесполезен, точнее очень даже полезен. Полезен поскольку различные участки "мусора" можно сравнивать между собой, и это порою проще чем сравнивать "смысловые" участки. В результате таких вот сравнений человек и обезьяна не могу дать потомства. Далее - неугодные генетические изменения воздействуют на ДНК случайно и велика вероятность того что эти изменения попадут в генетический мусор. Туда им и дорога.

Различия в генах

Во первых у разных существ разное количество генов. Цифры - десятки тысяч. Во вторых большенство этих генов мусор. В третьих - в тех что не мусор ( смысловые гены, из которых потом белки собирают) очень мало отличий. По непроверенным мной данным от мыши мы отличаемся на 300 генов. Информации это не несет поскольку непонятно сколько реально информации в этих 300 генах. Не нашел.

У человека 23 хромосомы. Сколько в этих хромосомах генов и сколько в генах участков - не нашел.
Косвенно - предполагалось, что их(генов?участков? наверно все же генов) 80 тыс. и что они содержат примерно 3 млрд. нуклеотидов).

К началу 2001 года в геноме человека со стопроцентной достоверностью идентифицировано 30-40 тыс. генов - это от одной из команд занимавшейся расшифровкой человеческого генома.

Доктор Вильям Хезелтайн (руководитель фирмы "Хьюмэн Геном Сайенс") настаивает, что в их банке содержится приватизированная информация на 120 тыс. генов.

Фирма "Инсайт" имеет каталог 140 тыс. идентифицированных генов человека и также настаивает на этом количестве общего числа генов человека.


Выводы.
Каталоги генов худо бедно получены. Их расположения на хромосомах вроде тоже. Какие гены за что отвечают - очень частично. Что с этим всем делать - пока непонятно. Если я правильно понял ученые методом пусть и научного но тыка как-то научились оперировать некоторыми порциями геномов у некоторых видов. Отсюда - "генетически измененные огурцы" и прочее.

Вот пока и все что я знаю о ДНК на текущий момент...

А также то что конгрессом США был недавно принят закон, пресекающий саму возможность дискриминации человека по генетическим признакам.

Далее посмотреть - как из "участков" строятся белки, зачем, как из белков строятся образования большего порядка и т.д.

И эти люди пишут на С++....

Как им это удается?
Предыстория - опять забыл как использовать "high-resolution performance counter" (писал на С++)- т.е. более точный таймер. По ключевым словам permormance timer сделал поиск в гугле, первая ссылка на пример на C#, зашел, посмотрел что функции называются QueryPerformanceCounter и QueryPerformanceFrequency...
И тут глянул комментарии...
Dear Sir,
Iam a new progrmmer and I need this code to measure time for some process with high precision, and iam using Visual C++ 6,
and when i copy this code and paste it in the Visual C++ and compile the code it gives errors which iam pasting now:
Can you please tell me which mistake am i making
thanks

ompiling...
Text1.c
D:\USER\Perkash\Text1.c(1) : error C2061: syntax error : identifier 'System'
D:\USER\Perkash\Text1.c(1) : error C2059: syntax error : ';'
....
Text1.exe - 15 error(s), 0 warning(s)


Он конечно сам написал что он "new progrmmer"...но ожидать что код написанный на одном языке свободно откомпилируется на другом это немного перебор.

четверг, 1 ноября 2007 г.

Project Euler - этюды для программистов для взрослых.

Project Euler - сайт с различными задачами различной сложности, в основном конечно требующими знаний математики и физики. Но и для профанов можно найти что-то интересное.

Подпоследовательность...суперпоследовательнось..перебор...вообщем

Взято с RSDN, что в свою очередь взято из статьи в журнале MonadReader выпуск#1
Суперпоследовательность s последовательности p — такая последовательность, множество подпоследовательностей которой содержит, среди прочего, все перестановки последовательности p.
Пример:

p = 1 2 3
s = 1 2 3 1 2 3 1
# # #
# # #
# # #
# # #
# # #
# # #



Чтобы далее не заморачиваться с наборами неуникальных элементов, будем полагать, что p(n) = [1..n], т.е. алфавит из n букв.

Напишите:
1) Предикат, проверяющий, является ли данная строка s суперпоследовательностью для алфавита p(n). Наивная реализация занимает O(n! * length(s)), это неприемлемо долго.
2) Генератор кратчайшей суперпоследовательности для p(n)
3) Формулы для оценки нижней и верхней границ её длины. Понятно, что грубые оценки — это n и n^2-n+1. Можно ли их сузить?
4) Формулы для оценки количества кратчайших суперпоследовательностей.

Для любителей самообразования:
— напишите это на Хаскелле и на J
— — наиболее читаемо
— — наиболее компактно
— — наиболее быстродействующе