Автор Тема: Задачка архитекторная.  (Прочитано 64954 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #45 : Март 26, 2011, 11:21:26 pm »
Угу. Интересны также коэффициенты сжатия:

Цитировать
Oberon-2  10362   2565    4.0397660819
Haskell 1 4821    1591    3.0301697046
Haskell 2 7795    2189    3.5609867519

Отсюда делаем вывод, что программа на хаскеле ближе к белому шуму, ну или к содержимому /dev/random, нежели код на Обероне :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #46 : Март 26, 2011, 11:23:22 pm »
В лексемах слабо. Решил сравнить в размере конкретно кода, сжатого zip-ом.
Все комментарии и пустые строки выкинул, естественно. Выравнивание кода сохранил.
Оберон-2 вариант:     zip: 2565 байт, распакованный вид: 10362 байт
Haskell, 1-й вариант: zip: 1591 байт, распакованный вид:  4821 байт
Haskell, 2-й вариант: zip: 2189 байт, распакованный вид:  7795 байт

Уточнение (три коммента пропустил):
Оберон-2 вариант:     zip: 2544 байт, распакованный вид: 10311 байт
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #47 : Март 26, 2011, 11:59:49 pm »
Самое ТруЪ-решение Задачи-К -- это решение на языке К от самого Трурля:
O:"+-*/"; o:(+;-;*;_%)
split:{(&x _in\\: y)_ x}
mkr:{:[(x<W)&(y<H);"ref[",($y),";",($x),"]";`badref]}
mkv:{x}
mka:{:[x _sm "[a-z][0-9]"; mkr[(_ic*x)-97; (_ic x[1])-49]
       x _sm "[A-Z][0-9]"; mkr[(_ic*x)-65; (_ic x[1])-49]
       x _sm "[0-9]*"; mkv[x]; `err]}
mkf:{t:split["+",1_ x;O]; `form, +{(o[O?*x]; mka[1_ x])}'t}
parse: {:[x~"";`; *x _sm "[0-9]*"; 0$x;(*x)="'"; 1_ x; (*x)="="; mkf[x]; `err]}
read:{in: {1_'split["\\t",x;,"\\t"]}'0: x; wh:0$*in; W::wh[0]; H::wh[1]; S::parse''1 _ in}
show:{x 0:{x,"\\n",y}/{x,"\\t",y}/'$S}
ref:{if[~4:S[x;y]; force[x;y]]; S[x;y]}
force:{t:S[x;y]; if[`eval~*t; S[x;y]:`cycle]; if[`form~*t; S[x;y;0]:`eval; S[x;y]:eval[t]]}
apply:{y[x;z]}
eval:{a: .:'x[2];:[&/1={4:x}'a; apply/[0;x[1];a]; `err]}

read[`in];(!W)force'\\:!H;show[`out]

Метрика: 16 locs, 47 симв/стр, в сжатом виде 570 байта, в распакованном 782 байт, коэф. сжатия 1.372
« Последнее редактирование: Март 27, 2011, 12:07:59 am от Geniepro »
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

AlexIljin

  • Newbie
  • *
  • Сообщений: 25
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #48 : Март 27, 2011, 12:54:23 pm »
Самое ТруЪ-решение Задачи-К -- это решение на языке К от самого Трурля:
А что, он - первоначальный автор задания?
Ещё вопрос, в каких отношениях находятся языки K и Q?

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #49 : Март 27, 2011, 01:16:14 pm »
Самое ТруЪ-решение Задачи-К -- это решение на языке К от самого Трурля:
А что, он - первоначальный автор задания?
Автор задания -- Влад Балин aka Gaperton, который сделал своё решение на Эрланге, обосновав это тем, что все другие языки он давно забыл, а Эрланг настолько прост, что забыть его невозможно.

А ТруЪ-решение -- ну ведь логично, что задача К должна быть решена на языке К. :о)

Ещё вопрос, в каких отношениях находятся языки K и Q?
http://en.wikipedia.org/wiki/Q_(programming_language_from_Kx_Systems)

Как я понял, Q -- более читабельная обёртка над K, используемая для запросов к базе данных KDB...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #50 : Март 27, 2011, 01:26:57 pm »
Ещё вопрос, в каких отношениях находятся языки K и Q?
http://en.wikipedia.org/wiki/Q_(programming_language_from_Kx_Systems)

Как я понял, Q -- более читабельная обёртка над K, используемая для запросов к базе данных KDB...

Хотя есть ещё вот такой язык Q -- это совсем уже другое, больше на Хаскелл смахивающее...
http://q-lang.sourceforge.net/
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

белый шум

  • Newbie
  • *
  • Сообщений: 33
    • Просмотр профиля
    • альма-матер oberoncore.ru
Re:Задачка архитекторная.
« Ответ #51 : Март 27, 2011, 01:57:43 pm »
Добавлены и поправлены комментарии, плюс исправлена константа MaxHeight в процедуре LoadTable.
оно даже в ББ откомпилялось
Величайшей ошибкой было бы думать.

AlexIljin

  • Newbie
  • *
  • Сообщений: 25
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #52 : Март 27, 2011, 07:14:12 pm »
Как я понял, Q -- более читабельная обёртка над K, используемая для запросов к базе данных KDB...
Моя первая программа на языке q: преобразует положительное целое число в последовательность символов (запись числа).
q)x:18873; L:"012345679"; res:""; while[x>0; res:res,L[x mod 10]; x:x div 10]; reverse res
"18873"
Не знаю, как векторизовать без while : (
Подскажите, как улучшить решение!

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #53 : Март 27, 2011, 07:21:55 pm »
Как я понял, Q -- более читабельная обёртка над K, используемая для запросов к базе данных KDB...
Моя первая программа на языке q: преобразует положительное целое число в последовательность символов (запись числа).
q)x:18873; L:"012345679"; res:""; while[x>0; res:res,L[x mod 10]; x:x div 10]; reverse res
"18873"
Не знаю, как векторизовать без while : (
Подскажите, как улучшить решение!
Я не знаток этих брейнфаков, так что я пас... ;D
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

AlexIljin

  • Newbie
  • *
  • Сообщений: 25
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #54 : Март 27, 2011, 07:32:46 pm »
Я не знаток этих брейнфаков, так что я пас... ;D
А можно аналог на Хаскеле?

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #55 : Март 27, 2011, 07:57:54 pm »
Простейший вариант:
int'to'str :: Integer -> String
int'to'str n = show n
Но это не по-джедайски. Так что вот:
import Char

int'to'str :: Integer -> String
int'to'str 0 = ""
int'to'str n = int'to'str (n `div` 10) ++ [chr $ fromIntegral (n `mod` 10 + fromIntegral(ord '0'))]
Более эффективный на огромных числах вариант:
import Char

int'to'str :: Integer -> String
int'to'str n = i2s n ""
  where
    i2s 0 ss = ss
    i2s n ss = i2s (n `div` 10) ((chr $ fromIntegral (n `mod` 10 + fromIntegral(ord '0'))):ss)
« Последнее редактирование: Март 27, 2011, 08:06:58 pm от Geniepro »
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

AlexIljin

  • Newbie
  • *
  • Сообщений: 25
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #56 : Март 27, 2011, 08:03:40 pm »
Простейший вариант:
int'to'str :: Int -> String
int'to'str n = show n
Но это не по-джедайски.
Да, там тоже есть, я только что дочитал:q)string 18873
"18873"
Так что вот:
import Char

int'to'str :: Int -> String
int'to'str 0 = ""
int'to'str n = int'to'str (n `div` 10) ++ [chr (n `mod` 10 + ord '0')]
Ага, рекурсия. Точно, что это я сразу не подумал?
Спасибо.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #57 : Март 27, 2011, 08:09:16 pm »
Ага, рекурсия. Точно, что это я сразу не подумал?
Спасибо.
Императивное мышление вынуждает думать циклами, а не рекурсиями ))

to iterate is human, to recure divine...
 ;D
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Илья Ермаков

  • Full Member
  • ***
  • Сообщений: 177
    • Просмотр профиля
    • OberonCore
Re:Задачка архитекторная.
« Ответ #58 : Март 27, 2011, 08:46:40 pm »
Практически готовое решение по этой задаче задепонировано Алексею. Опубликую, только когда напишу полную пояснительную статью. Через день-два, думаю.

Объём - 9 модулей, 713 строк (будет под 800, надо думать).

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Задачка архитекторная.
« Ответ #59 : Март 27, 2011, 08:58:59 pm »
Объём - 9 модулей, 713 строк (будет под 800, надо думать).
Чувствуется, что подход очень серьёзный  ;D
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…