Oberon space

General Category => Общий раздел => Тема начата: kemiisto от Сентябрь 26, 2011, 01:06:48 pm

Название: Решаем задачки. :)
Отправлено: kemiisto от Сентябрь 26, 2011, 01:06:48 pm
Я читаю эту (http://oberoncore.ru/library/sovremennoe_programmirovanie_s_nulya) книгу. И решаю задачки в ББ!!!111 ;D Решения можно увидеть тут (https://github.com/kemiisto/ModernProgrammingFromTheGroundUp). valexey там же выкладывает "толстые" решения на С. :D Кому интересно, может присоединиться.
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 26, 2011, 01:22:04 pm
обновление тут (в архиве): http://oberspace.dyndns.org/index.php/topic,142.msg2268.html#msg2268

module Ex_1 where

main = do
    n <- readLn :: IO Integer
    let xs = [ show i ++ " и " ++ show (n `div` i)
             | i <- takeWhile (\k -> k*k <= n) [2..]
             , n `mod` i == 0
             ]
    mapM_ putStrLn xs

module Ex_2 where

main = do
    n <- readLn :: IO Integer
    putStrLn $ if perfect n then "Да" else "Нет"
  where
    perfect x = x == sum [d | d <- [1..x `div` 2], x `mod` d == 0 ]

module Ex_3 where

main = do
    str <- getLine
    print $ sum $ filter (>0) $ map (read :: String -> Integer) $ words str

module Ex_4 where

main = do
    str <- getLine
    print $ sum $ filter even $ map (read :: String -> Integer) $ words str

module Ex_5 where

import Data.List

main = do
    str <- getLine
    let [x, y, z] = sort $ take 3 $ map (read :: String -> Integer) $ words str
    putStrLn $ if x*x + y*y == z*z then "Да" else "Нет"
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 26, 2011, 03:35:37 pm
module Ex_2 where

main = do
    n <- readLn :: IO Integer
    putStrLn $ if perfect n then "Да" else "Нет"
  where
    perfect x = x == sum [d | d <- [1..x `div` 2], x `mod` d == 0 ]
Не компилируется (другие аналогично). Имеем следующее:
$ ghc Ex_2.hs
ld: warning: could not create compact unwind for .LFB3: non-standard register 5 being saved in prolog
Undefined symbols for architecture i386:
  "___stginit_ZCMain", referenced from:
      _main in libHSrtsmain.a(Main.o)
  "_ZCMain_main_closure", referenced from:
      _main in libHSrtsmain.a(Main.o)
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 26, 2011, 03:53:27 pm
Не компилируется (другие аналогично). Имеем следующее:
$ ghc Ex_2.hs
ld: warning: could not create compact unwind for .LFB3: non-standard register 5 being saved in prolog
Undefined symbols for architecture i386:
  "___stginit_ZCMain", referenced from:
      _main in libHSrtsmain.a(Main.o)
  "_ZCMain_main_closure", referenced from:
      _main in libHSrtsmain.a(Main.o)
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

Я-то проверял в интерпретаторе, а при компиляции надо имена модулей Ex_1 и тд переименовать на Main )))
module Main where

main = do
    n <- readLn :: IO Integer
    putStrLn $ if perfect n then "Да" else "Нет"
  where
    perfect x = x == sum [d | d <- [1..x `div` 2], x `mod` d == 0]
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 26, 2011, 05:10:00 pm
Выложил в архиве каталог с исходниками решений на хаскеле с батниками для их компиляции
GHC 7.0.3

Там во второй задачке (про совершенные числа) тестовое входное значение: 137438691328 (седьмое совершенное число).
На моём компе (P-DualCore 2.6) вычисляется за 0.1 сек.
Интересно бы сравнить время с сишным и паскалевским решениями... 8)
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 26, 2011, 06:43:01 pm
Там во второй задачке (про совершенные числа) тестовое входное значение: 137438691328 (седьмое совершенное число).
На моём компе (P-DualCore 2.6) вычисляется за 0.1 сек.
Интересно бы сравнить время с сишным и паскалевским решениями... 8)

Вот сравнение с С++ решением:
Хаскель:
$ time echo 137438691328 | ./ex_2.exe
Да

real    0m0.142s
user    0m0.144s
sys     0m0.004s

С++:
$ time echo 137438691328 | ./a.out
Yes

real    0m0.090s
user    0m0.092s
sys     0m0.000s

Хаскель примерно в полтора раза медленнее.
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 26, 2011, 07:21:14 pm
Хаскель примерно в полтора раза медленнее.
Ну а какая-нить там Ада или Компонентный Паскаль -- в два раза медленнее. И чо? )))
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 26, 2011, 07:22:46 pm
Хаскель примерно в полтора раза медленнее.
Ну а какая-нить там Ада или Компонентный Паскаль -- в два раза медленнее. И чо? )))
Это бездоказательное утверждение.
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 26, 2011, 07:27:37 pm
Кстати, я ошибся. Хаскель не в полтора раза медленнее, а более чем в два. Это хорошо видно на больших числах:
$ time echo 1374386913280000 | ./a.out
No

real    0m6.055s
user    0m6.024s
sys     0m0.032s

$ time echo 1374386913280000 | ./ex_2.exe
Нет

real    0m13.053s
user    0m13.009s
sys     0m0.024s
Результат стабильный.
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 26, 2011, 09:40:39 pm
более оптимизированное решение второй задачки:
module Main where

main :: IO ()
main = do
    n <- readLn :: IO Integer
    putStrLn $ if perfect n then "Да" else "Нет"
  where
    perfect x = x == sum (1 : [ i + d
                              | i <- takeWhile (<= x') [2..]
                              , let (d, m) = x `divMod` i
                              , m == 0
                              ])
      where
        x' = truncate $ sqrt $ fromInteger x

выполняется у меня примерно в полтора раза быстрее предыдущего. Теперь должно не сильно уступать сишному ))
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 26, 2011, 09:48:20 pm
$ time echo 1374386913280000 | ./ex_2.exe
Нет

real    0m11.238s
user    0m11.197s
sys     0m0.032s

Быстрее, но не существенно.
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 26, 2011, 11:15:16 pm
ладно, вот три окончательных варианта второй задачи:

main :: IO ()
main = do
    n <- readLn :: IO Integer
    putStrLn $ if perfect n then "Да" else "Нет"
  where
    perfect x = x == sum (1 : [ i + d
                              | i <- [2..x']
                              , let (d, m) = x `divMod` i
                              , m == 0
                              ])
      where
        x' = truncate $ sqrt $ fromInteger x

import Control.Parallel

main :: IO ()
main = do
    n <- readLn :: IO Integer
    putStrLn $ if perfect n then "Да" else "Нет"
  where
    perfect x = sum2 `par` sum3 `pseq` x == 1 + sum2 + sum3
      where
        sum2 = bs 2
        sum3 = bs 3
        bs b = sum  [ i + d
                    | i <- [b, b + 2 .. sqx]
                    , let (d, m) = x `divMod` i
                    , m == 0
                    ]
        sqx   = truncate $ sqrt $ fromInteger x

import Control.Concurrent

main :: IO ()
main = do
    n <- readLn :: IO Integer
    p <- perfect n
    putStrLn $ if p then "Да" else "Нет"
  where
    perfect x = do
        sum2c <- newChan
        sum3c <- newChan
        forkOS $ calcSum 2 sum2c
        forkOS $ calcSum 3 sum3c
        sum2 <- readChan sum2c
        sum3 <- readChan sum3c
        return $ x == 1 + sum2 + sum3
      where
        calcSum b c = do
            writeChan c $! sum  [ i + d
                                | i <- [b, b + 2 .. sqx]
                                , let (d, m) = x `divMod` i
                                , m == 0
                                ]
        sqx   = truncate $ sqrt $ fromInteger x

Время выполнения на числе 1374386913280000, соответственно:
6.2 сек
5.2 сек
4.8 сек
К сожалению, время уменьшилось не в два раза на моём двухядернике ((

UPD. Поправил первое решение
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 27, 2011, 10:21:59 am
проверил на процессоре P-DualCore 1.6 сишный вариант с int64 на tinycc 0.9.23 и три варианта на хаскеле (тоже с Int64)

сишный вариант 5.1 сек
хаскельные: 7.2, 4.1 (par) и 3.9 (forkOS) сек

Ура!!! хаскель рулит! обогнал сишника )))

ЗЫ. TinyCC -- неоптимизирующий, почти однопроходный компилятор, который по качеству генерации маш. кода примерно соответствует BBCP (когда-то я их сравнивал на микротестах -- всяких там сортировках и тд) и сильно (как минимум в 2 раза) уступает в этом плане GCC
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 27, 2011, 10:22:54 am
К сожалению, время уменьшилось не в два раза на моём двухядернике ((
А ты как запускал?
У меня получилось 6 секунд, то есть раза в два быстрее прежних решений (по тактам сответственно так же).
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 27, 2011, 10:25:46 am
проверил на процессоре P-DualCore 1.6 сишный вариант с int64 на tinycc 0.9.23 и три варианта на хаскеле (тоже с Int64)

сишный вариант 5.1 сек
хаскельные: 7.2, 4.1 (par) и 3.9 (forkOS) сек

Ура!!! хаскель рулит! обогнал сишника )))

ЗЫ. TinyCC -- неоптимизирующий, почти однопроходный компилятор, который по качеству генерации маш. кода примерно соответствует BBCP (когда-то я их сравнивал на микротестах -- всяких там сортировках и тд) и сильно (как минимум в 2 раза) уступает в этом плане GCC
Ну, вообще то и в этом тесте сишный вариант быстрее хаскельного. Правда менее чем в два раза :-) Мы ведь будем считать по числу тактов процессора и энергопотреблению процессора, правда ведь? :-) Тем более что TiniCC да, оптимизирует никак.
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 27, 2011, 10:48:53 am
К сожалению, время уменьшилось не в два раза на моём двухядернике ((
А ты как запускал?
У меня получилось 6 секунд, то есть раза в два быстрее прежних решений (по тактам сответственно так же).
Это сильно зависит от того, какие ещё проги в фоне работают. У меня  дома видимо тестам как раз они и мешали -- всякие оперы, чаты и прочая...
Возможно и от процессора тоже зависит...
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 27, 2011, 10:52:16 am
Потестировал на i5.  4 ядра.

Имеем:
$ time echo 1374386913280000 | ./Main -N
Нет
Time = 0:0:4.124

real 0m4.132s
user 0m4.100s
sys 0m0.030s

$ time echo 1374386913280000 | ./MainPar -N
Нет
Time = 0:0:4.189

real 0m4.196s
user 0m4.164s
sys 0m0.029s


$ time echo 1374386913280000 | ./MainConc -N
Нет
Time = 0:0:5.284

real 0m5.292s
user 0m4.877s
sys 0m0.128s

$ time echo 1374386913280000 | ./a.out
No

real 0m0.792s
user 0m0.788s
sys 0m0.005s

Теперь отгадайте, который из них написан на Си? :-)
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 27, 2011, 11:00:56 am
Потестировал на i5.  4 ядра.

Теперь отгадайте, который из них написан на Си? :-)

нипанятно. хаскельные варианты (которые c par и forkOS) запускались с ключами +RTS -N -RTS или без них?
кто-му же эти варианты расчитаны на два ядра, для 4-х их надо немного переделать )

а сишный вариант без изменений или заточен на многопоточность?
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 27, 2011, 11:18:53 am
нипанятно. хаскельные варианты (которые c par и forkOS) запускались с ключами +RTS -N -RTS или без них?
кто-му же эти варианты расчитаны на два ядра, для 4-х их надо немного переделать )
В логах же видно с какими аргументами запускались программы.

а сишный вариант без изменений или заточен на многопоточность?
Си полностью однопоточный. Просто теперь он работает с 64битными целыми.

#include <stdlib.h>
#include <stdio.h>

typedef int64_t nat;

int main()
{
    nat n;
    scanf("%llu", &n);
    nat d,res=n-1;
    for (d=2; d<n && d<=n/d; d++)
        if (!(n%d)) res-=d+n/d;
    printf(!res ? "Yes\n" : "No\n");
    return 0;
}
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 27, 2011, 11:23:40 am
Гм. Значит просто -N не достаточно? Почему же у меня дома работало. Вот свежие результаты:
$ time echo 1374386913280000 | ./Main +RTS -N -RTS
Нет
Time = 0:0:4.966

real 0m4.980s
user 0m5.803s
sys 0m0.329s

$ time echo 1374386913280000 | ./MainPar +RTS -N -RTS
Нет
Time = 0:0:3.611

real 0m3.619s
user 0m7.365s
sys 0m0.213s

$ time echo 1374386913280000 | ./MainConc +RTS -N -RTS
Нет
Time = 0:0:3.764

real 0m3.773s
user 0m7.767s
sys 0m0.243s

Кстати, сложность задачи от значения аргумента зависит не линейно. Соответственно у Си-решения такое же время исполнения как у хаскель-решения получается если увеличить аргумент не в 10 а в 100 раз.
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 27, 2011, 02:02:42 pm
Кстати, сложность задачи от значения аргумента зависит не линейно. Соответственно у Си-решения такое же время исполнения как у хаскель-решения получается если увеличить аргумент не в 10 а в 100 раз.

не понял. в обоих решениях O(n^0.5)...
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 27, 2011, 02:07:29 pm
Кстати, сложность задачи от значения аргумента зависит не линейно. Соответственно у Си-решения такое же время исполнения как у хаскель-решения получается если увеличить аргумент не в 10 а в 100 раз.

не понял. в обоих решениях O(n^0.5)...
Это и есть не линейная зависимость :-)
Название: Re: Решаем задачки. :)
Отправлено: kemiisto от Сентябрь 28, 2011, 11:12:06 am
Фаллометрию тут устроили! :D
Название: Re: Решаем задачки. :)
Отправлено: Peter Almazov от Сентябрь 28, 2011, 02:05:59 pm
Задачи дурацкие, непонятно какие умения они должны развивать. Уровень решения на КП - ниже плинтуса.
Правда, книгу я не читал. ("Сам я Пастернака не читал, но, как честный советский человек, "... и.т.п.)

Про Хаскель: сам до сих пор не могу переделать свое мышление в функциональное, но, чем дальше, тем больше убеждаюсь, что программы на нем синтезируются (т.е. пишутся) с помощью вдохновения, озарения, догадки и т.п. Нет рабочего инструмента, который бы позволял профессионалу в любом состоянии гарантированно выдавать результат. Который не сильно отличался бы у разных людей.
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 28, 2011, 02:34:56 pm
2Geniepro:

Так какой вариант решения второй задачи закинуть в репозиторий? Решение должно быть с одной стороны эффективным, а с другой - легко понимабельным (все же для новичков это делается) и требующим минимума плясок с бубном при компиляции и запуске. То есть оно не должно требовать скриптов компиляции, компилироваться должно как-то так: "ghc MyCoolSolution.hs".

Как ответишь - закину всю пачку решений хаскелевских.

PS. Решения на других языках приветствуются.
PPS. 2kemiisto: новые задачки из книжки также приветствуются :-)
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 28, 2011, 02:53:00 pm
Задачи дурацкие, непонятно какие умения они должны развивать. Уровень решения на КП - ниже плинтуса.
  Базовой алгоритмизации для новичков.
Цитировать
Правда, книгу я не читал. ("Сам я Пастернака не читал, но, как честный советский человек, "... и.т.п.)
Оно и видно, даже название книги не  удосужились прочитать. Да я бы не сказал что  "честный советский человек", скорее "недалекий"
Цитировать
Про Хаскель: сам до сих пор не могу переделать свое мышление в функциональное, но, чем дальше, тем больше убеждаюсь, что программы на нем синтезируются (т.е. пишутся) с помощью вдохновения, озарения, догадки и т.п. Нет рабочего инструмента, который бы позволял профессионалу в любом состоянии гарантированно выдавать результат. Который не сильно отличался бы у разных людей.
При отсутствии реальной потребности в таких решениях, может помочь лишь природная любознательность(в редких случаях тщеславие). Увы с годами последняя увядает (сужу по себе).
Название: Re: Решаем задачки. :)
Отправлено: Peter Almazov от Сентябрь 28, 2011, 02:57:24 pm
Оно и видно, даже название книги не  удосужились прочитать.
Откуда это следует?
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 28, 2011, 03:00:01 pm
Оно и видно, даже название книги не  удосужились прочитать.
Откуда это следует?
Из первого вашего высказывания.
Название: Re: Решаем задачки. :)
Отправлено: Peter Almazov от Сентябрь 28, 2011, 03:16:05 pm
Оно и видно, даже название книги не  удосужились прочитать.
Откуда это следует?
Из первого вашего высказывания.
Т.к. название я прочитал, то по факту вывод неверный. Клеветы, в общем  :)
Про Хаскель: сам до сих пор не могу переделать свое мышление в функциональное, но, чем дальше, тем больше убеждаюсь, что программы на нем синтезируются (т.е. пишутся) с помощью вдохновения, озарения, догадки и т.п. Нет рабочего инструмента, который бы позволял профессионалу в любом состоянии гарантированно выдавать результат. Который не сильно отличался бы у разных людей.
При отсутствии реальной потребности в таких решениях, может помочь лишь природная любознательность(в редких случаях тщеславие). Увы с годами последняя увядает (сужу по себе).
Реальные потребности, а также мои или ваши любознательность и тщеславие здесь не при чем. Я говорю о том, что из-за отсутствия инструмента решения разных людей могут сильно различаться очень сильно. Вот в этой шутке http://www.willamette.edu/~fruehr/haskell/evolution.html очень много "не шутки".
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 28, 2011, 03:26:52 pm
Цитировать
Т.к. название я прочитал, то по факту вывод неверный. Клеветы, в общем  :)
Вы меня поняли - значит небезнадежны  ;)
Цитировать
Реальные потребности, а также мои или ваши любознательность и тщеславие здесь не при чем. Я говорю о том, что из-за отсутствия инструмента решения разных людей могут сильно различаться очень сильно. Вот в этой шутке http://www.willamette.edu/~fruehr/haskell/evolution.html очень много "не шутки".
Не понимаю - о каких различия в решениях вы говорите, и причем здесь они (различия)? Я лично говорю про то, что "нафига мне изучать новый яп, если мне текущих знаний и навыков хватает на то чтобы справиться с любой интересной(в широком смысле)  проблемой"
Да это прямой оффтоп... предлагаю завершить ЭТУ дискуссию в ЭТОЙ ветке.
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 28, 2011, 09:02:15 pm
2Geniepro:

Так какой вариант решения второй задачи закинуть в репозиторий? Решение должно быть с одной стороны эффективным, а с другой - легко понимабельным (все же для новичков это делается) и требующим минимума плясок с бубном при компиляции и запуске. То есть оно не должно требовать скриптов компиляции, компилироваться должно как-то так: "ghc MyCoolSolution.hs".

Как ответишь - закину всю пачку решений хаскелевских.
main = do
    n <- readLn
    let is_perfect = n == sum ( 1 : [ d + d'
                                    | d <- [2..truncate $ sqrt $ fromIntegral n]
                                    , let (d', m) = n `divMod` d
                                    , m == 0
                                    ] )
    putStrLn $ if is_perfect then "Да" else "Нет"
Это решение чётко описывает решение задачи -- пересчитать все делители числа кроме него самого. В отличие от этого решение на сях -- эзотерично и нипанятно, а потому засчитано быть не может и должно быть дисквалифицировано!!!
Решение на КП -- намана, практически аналогично хаскельному...
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 28, 2011, 09:44:36 pm
Про Хаскель: сам до сих пор не могу переделать свое мышление в функциональное, но, чем дальше, тем больше убеждаюсь, что программы на нем синтезируются (т.е. пишутся) с помощью вдохновения, озарения, догадки и т.п. Нет рабочего инструмента, который бы позволял профессионалу в любом состоянии гарантированно выдавать результат. Который не сильно отличался бы у разных людей.
Тысячу и одно решение любой задачи можно придумать на любом языке, было бы желание и немного фантазии.
Даже питон не в силах этому помешать...  ;D
Название: Re: Решаем задачки. :)
Отправлено: valexey от Сентябрь 28, 2011, 11:50:04 pm
Решение на КП -- намана, практически аналогично хаскельному...
Кстати, действительно решение на КП будет практически аналогично хаскельному... по производительности :-)

Компилятор ББ ведь практически не умеет оптимизировать. ghc же умеет, но достижению настоящей производительности ему уже мешает дикий семантический разрыв между языком и машиной. Так что примерно то на то и должно выйти.
Название: Re: Решаем задачки. :)
Отправлено: Peter Almazov от Сентябрь 29, 2011, 06:03:06 am
Тысячу и одно решение любой задачи можно придумать на любом языке, было бы желание и немного фантазии.
Ну, не скажите, Хаскель здесь рекордсмен. На том же КП трудно представить себе десятки вариантов вычисления факториала. Даже если удасться это сделать, то в этом не будет ни капли юмора. Один бред. В отличие от Хаскеля.
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 29, 2011, 09:41:45 am
На том же КП трудно представить себе десятки вариантов вычисления факториала. Даже если удасться это сделать, то в этом не будет ни капли юмора. Один бред. В отличие от Хаскеля.

Так и на Хаскелле это тоже бред.
Например, сделать интерпретатор микроязычка, и на этом язычке реализовать факториал -- неужели на КП такое невозможно? Возможно, конечно же.
Почему же на КП такое не делают? Да просто потому, что слишком низкоуровневый язык, неудобен для реализации всяких трансляторов. Что ж поделать?
А было бы сильное желание -- сделать было бы можно...

Реально же факториал на хаскелле вычисляется проще пареной репы:
factorial x = product [1..x]
и по другому никто в реальном продакшене не сделает, ибо зачем делать сложнее? Хаскеллеры же не враги себе...
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 29, 2011, 11:19:10 am


и по другому никто в реальном продакшене не сделает, ибо зачем делать сложнее? Хаскеллеры же не враги себе...
А что есть значимый "Хаскельдакшен" - сегмент рынка на котором за софтину созданную на Хаскеле народ готов платить реальное бабло?
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 29, 2011, 11:42:24 am
и по другому никто в реальном продакшене не сделает, ибо зачем делать сложнее? Хаскеллеры же не враги себе...
А что есть значимый "Хаскельдакшен" - сегмент рынка на котором за софтину созданную на Хаскеле народ готов платить реальное бабло?

ну, говорят, что есть. хотя с триллионым рынком софта на коболе хаскеллу, конечно же, не сравниться...
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 29, 2011, 11:46:31 am
и по другому никто в реальном продакшене не сделает, ибо зачем делать сложнее? Хаскеллеры же не враги себе...
А что есть значимый "Хаскельдакшен" - сегмент рынка на котором за софтину созданную на Хаскеле народ готов платить реальное бабло?

ну, говорят, что есть. хотя с триллионым рынком софта на коболе хаскеллу, конечно же, не сравниться...
И это говорит активист хаскелизма на враждебных виртуазных нивах.... смело, однако ;)
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 29, 2011, 11:49:41 am
Ну ладно по делу - шестую задачу  я бы автору(решения) не зачел . Какого фига он исключил возможность равенства значения в L одному из введенных ранее значений (a,b,c,d)
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 29, 2011, 11:56:17 am
сегмент рынка на котором за софтину созданную на Хаскеле народ готов платить реальное бабло?

Вообще, по-идее, обычно народ платит за программы не потому что те были написаны на каком-то языке, а за то, что эти программы решают какие-то важные для народа хозяйственные задачи...
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 29, 2011, 11:58:20 am
сегмент рынка на котором за софтину созданную на Хаскеле народ готов платить реальное бабло?

Вообще, по-идее, обычно народ платит за программы не потому что те были написаны на каком-то языке, а за то, что эти программы решают какие-то важные для народа хозяйственные задачи...
не возражаю , и что  ;)
Название: Re: Решаем задачки. :)
Отправлено: kemiisto от Сентябрь 29, 2011, 12:44:43 pm
Ну ладно по делу - шестую задачу  я бы автору(решения) не зачел . Какого фига он исключил возможность равенства значения в L одному из введенных ранее значений (a,b,c,d)
Потому что, в этом случае придётся специфицировать поведение алгоритма в этой ситуации. В формулировки задачи на это нет никаких намёков. Ивапще, низачли бы они. Я сам себе такую задачу дал. 8)  Давайте Вашу, там будете Вы зачитывать. ;)
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 29, 2011, 03:00:02 pm
Потому что, в этом случае придётся специфицировать поведение алгоритма в этой ситуации. В формулировки задачи на это нет никаких намёков. Ивапще, низачли бы они. Я сам себе такую задачу дал. 8)  Давайте Вашу, там будете Вы зачитывать. ;)
А ну поняяяятно, нефиг в чужуй нужник лезть... и то естно - обгадититься низачо сподобно.   ;D . А свою  вам пожалуй не дам - слишком долго объяснять надо что сделать... и судя по всему не факт, что до вас дойдет  ;) А если  про обучающие задачки вы говорите - то это бессмысленно (судя по вашему решению , и отношению к критике) , пустая трата времени , однако.
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 29, 2011, 03:44:02 pm
сегмент рынка на котором за софтину созданную на Хаскеле народ готов платить реальное бабло?

Вообще, по-идее, обычно народ платит за программы не потому что те были написаны на каком-то языке, а за то, что эти программы решают какие-то важные для народа хозяйственные задачи...
не возражаю , и что  ;)
а то, что подобный софт на хаскелле делается, продаётся, возможно даже покупается кем-то.
но в основном всё-таки на хаскелле решают внутрифирменные задачи, так что там зарплату платят хаскеллерам и всё на этом ((
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 29, 2011, 03:48:52 pm
а то, что подобный софт на хаскелле делается, продаётся, возможно даже покупается кем-то.
но в основном всё-таки на хаскелле решают внутрифирменные задачи, так что там зарплату платят хаскеллерам и всё на этом ((
Тогда , с моей точки зрения, это не продакшен (потому, что завязан на конкретную фирму). МММ. Понятие экзотика подходит?
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Сентябрь 29, 2011, 06:02:36 pm
Понятие экзотика подходит?
хоть горшком назовите, только в печь не кладите...  ;D
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 30, 2011, 05:57:29 am
Понятие экзотика подходит?
хоть горшком назовите, только в печь не кладите...  ;D
Может вас еще  в "терновый куст" кинуть  ;D ? - обойдетесь, ибо возможно привыкание....
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 30, 2011, 04:43:59 pm
Решение проблемы 8( что об арифметической прогрессии)- та же порнография...
Название: Re: Решаем задачки. :)
Отправлено: kemiisto от Сентябрь 30, 2011, 06:31:50 pm
Решение проблемы 8( что об арифметической прогрессии)- та же порнография...
Если уж критикуете, так конструктивнее. Что неправильно? И мне Ваши задачи "до лампочки". Я про них не спрашивал. Куда мне... ;D
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 30, 2011, 06:38:56 pm
Решение проблемы 8( что об арифметической прогрессии)- та же порнография...
Если уж критикуете, так конструктивнее. Что неправильно? И мне Ваши задачи "до лампочки". Я про них не спрашивал. Куда мне... ;D

1.ТАЖЕ ПОРНОГРАФИЯ =НЕ ЯВЛЯЕТСЯ РЕШЕНИЕМ ИСХОДНОЙ ЗАДАЧИ (ГНУСНЫЙ НАМЕК -  являются ли числа 4,8 ,16  членами арифметической прогрессии).
2. Это хорошо
3. Действительно, вы даже понять что нужно сделать в задачке для начинающих неспособны...Только кривляться да воздух сотрясать в чате...
Название: Re: Решаем задачки. :)
Отправлено: kemiisto от Сентябрь 30, 2011, 06:57:09 pm
А что Вы грубите? Я же написал:
Цитировать
Строго говоря, любые три целых числа являются членами арифметической прогрессии (с разностью 1). Имеет смысл, например, проверять, являются ли 3 числа идущими друг за другом членами арифметической прогрессии. 
Исходная задача сформулирована неодназаначно. Я, например, вот такую решил, как описал.
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 30, 2011, 07:33:50 pm
А что Вы грубите? Я же написал:
Цитировать
Строго говоря, любые три целых числа являются членами арифметической прогрессии (с разностью 1). Имеет смысл, например, проверять, являются ли 3 числа идущими друг за другом членами арифметической прогрессии. 
Исходная задача сформулирована неодназаначно. Я, например, вот такую решил, как описал.
1. Я не грублю - я возвращаю  вам ваше кривлянье с усилением (и успешно).
2. Это тривиальный случай -не интересный.
3. Это другая задача(подмножество исходной).
4. Если решаете ДРУГУЮ задачу - будьте добры  отразите этот факт в комментариях в шапке программы (лично я сомневаюсь что это правда, слишком похож этот случай на предыдущий, впрочем, дело ваше).
Задача сформулирована однозначно(минус тривиальный случай) - достаточно реформулировать ее в эквивалентном виде "проверить являются ли 3 целых числа членами арифметической прогрессии с шагом D>1". Но для этого нужно было потратить некоторое время на работу с ее условием= что вы не сделали как в первом, так и во втором случае...
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 30, 2011, 07:46:28 pm
А у меня, между делом, возникла просьба к "ремонтных дел мастеру" - Петру Алмазову. Что вы имели ввиду под "Уровень решения на КП - ниже плинтуса." - и если можно, с обоснованием.
Название: Re: Решаем задачки. :)
Отправлено: kemiisto от Сентябрь 30, 2011, 08:17:20 pm
1. Я не грублю - я возвращаю  вам ваше кривлянье с усилением (и успешно).
Какое кривляние? :o

2. Это тривиальный случай -не интересный.
3. Это другая задача(подмножество исходной).
4. Если решаете ДРУГУЮ задачу - будьте добры  отразите этот факт в комментариях в шапке программы (лично я сомневаюсь что это правда, слишком похож этот случай на предыдущий, впрочем, дело ваше).
Задача сформулирована однозначно(минус тривиальный случай) - достаточно реформулировать ее в эквивалентном виде "проверить являются ли 3 целых числа членами арифметической прогрессии с шагом D>1". Но для этого нужно было потратить некоторое время на работу с ее условием= что вы не сделали как в первом, так и во втором случае...
Я процитировал README.md из репозитория. Можете проверить - время коммита у решения и у описания задачи одно и тоже. Хоть в этом не сомневайтесь. Я согласен, что случай тривиальный. Сейчас обновлю формулировку и попробую решить. ;D

P.S. Я выложил ссылку. Если Вас что-то не устроило, так и скажите. Я же не просто так сюда написал. А тут сразу началось. Одному - ниже плинтуса, другому - порнография... :(
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Сентябрь 30, 2011, 09:05:48 pm
1. Я не грублю - я возвращаю  вам ваше кривлянье с усилением (и успешно).
Какое кривляние? :o
Я процитировал README.md из репозитория. Можете проверить - время коммита у решения и у описания задачи одно и тоже. Хоть в этом не сомневайтесь. Я согласен, что случай тривиальный. Сейчас обновлю формулировку и попробую решить. ;D

P.S. Я выложил ссылку. Если Вас что-то не устроило, так и скажите. Я же не просто так сюда написал. А тут сразу началось. Одному - ниже плинтуса, другому - порнография... :(
1. "Ивапще, низачли бы они. Я сам себе такую задачу дал.   Давайте Вашу, там будете Вы зачитывать."....."Я же не просто так сюда написал. А тут сразу началось. Одному - ниже плинтуса, другому - порнография... :(" взятые в контексте темы - кривлянье. Ответ с усилением в том же духе выглядит, естественно, как вызов (с различными оттенками грубости).
2. Время коммита из репозитория здесь не причем. Я вас не обвиняю, ошибаются все - просто спросите у своих собеседников по "мове"  (сиплюиста и хаскиллера  ;) ) решили бы они ПРАВИЛЬНО эту задачку. Собственно, то что вы сделали уже заслуживает уважения - по этому я и сделал сообщение об ошибке.
3. Не факт что это даст какой-то результат... Ответьте лучше на вопросы  - чего вы хотели достичь а) читая эту книгу. б ) решая эти задачи
Название: Re: Решаем задачки. :)
Отправлено: kemiisto от Сентябрь 30, 2011, 09:20:59 pm
Я хочу научиться программировать. :)

По поводу задачи. Тут думать надо. А у меня живот болит. :( А выпил НО-ШПУ и пошёл спать. Завтра посмотрю... Сначала хотел посчитать модуль разности между a, b и b, c. Больший модуль проверить на делимость на меньший. Но нет. Точно не будет работать, например, на 4, 8, 14, то есть, когда шаг прогрессии меньше минимально разности между элементами проверяемой последовательности...
Название: Re: Решаем задачки. :)
Отправлено: Peter Almazov от Октябрь 01, 2011, 02:29:43 am
А у меня, между делом, возникла просьба к "ремонтных дел мастеру" - Петру Алмазову. Что вы имели ввиду под "Уровень решения на КП - ниже плинтуса." - и если можно, с обоснованием.
Сейчас уезжаю, отвечу не раньше завтрашнего вечера.
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 02, 2011, 08:08:40 am
Прочитал оглавление книги, кусок из первой главы(пробник с одного из издательских сайтов), попробовал восстановить логику обучения... Возникло 2 вопроса к вам kemiisto
1. 8 задача дается после того, как вводится неформальное определение циклического оператора или нет?
2. Не смог понять, что имел ввиду автор под словами СОВРЕМЕННОЕ ПРОГРАММИРОВАНИЕ-можете привести свои соображения на этот счет(с оценкой, как пользователя  честно заплатившего за книгу- насколько в этом контексте удачно изложение), может это просто маркетинговый ход?.
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Октябрь 02, 2011, 04:40:43 pm
Тестовые примеры в задаче 6 противоречат условию самой задачи.
Поэтому я беру такие тесты:
Main> :main
1 2 3 4 5
0 -- не найдено

Main> :main
1 2 3 4 0
0 -- не найдено

Main> :main
1 2 3 4 2
2

Main> :main
1 3 5 6 5
3
Само решение:
module Ex_6 where

main :: IO ()
main = do
    str <- getLine
    let xs :: [Integer]
        xs = map read $ words str
        ys = init xs
        l  = last xs
    print $ find l ys
  where
    find x xs = find' xs 1
      where
        find' []     _              = 0
        find' (y:ys) n  | y == x    = n
                        | otherwise = find' ys (n+1)


А вот решение задачи 8. Зачем кому-то здесь могут понадобиться циклы -- ума не приложу: ))
module Ex_8 where

main :: IO ()
main = do
    str <- getLine
    let x:y:z:_ = map read $ words str
        (av, m) = (x + y + z) `divMod` 3
        f       = m == 0 && (x == av || y == av || z == av)
    putStrLn $ if f then "Да" else "Нет"
Три числа являются рядом лежащими членами арифметической прогрессии, если их сумма кратна трём, а одно из них (среднее) равно трети от их суммы (среднее арифметическое трёх чисел):
y = x + d
z = x + d + d
(x + y + z) = x + (x + d) + (x + d + d) = 3*(x + d) = 3*y
(x + y + z) = 3*y кратно трём
(x + y + z)/3 = y

это я что бы самому не забыть )))
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 02, 2011, 05:13:43 pm

А вот решение задачи 8. Зачем кому-то здесь могут понадобиться циклы -- ума не приложу: ))
module Ex_8 where

main :: IO ()
main = do
    str <- getLine
    let x:y:z:_ = map read $ words str
        (av, m) = (x + y + z) `divMod` 3
        f       = m == 0 && (x == av || y == av || z == av)
    putStrLn $ if f then "Да" else "Нет"
Мне (dizer'у) - и скорее всего начинающему программисту (который хочет решить эту задачку) - но, я так понял, не вам  ;)

Цитировать
Три числа являются рядом лежащими членами арифметической прогрессии, если их сумма кратна трём, а одно из них (среднее) равно трети от их суммы (среднее арифметическое трёх чисел):
y = x + d
z = x + d + d
(x + y + z) = x + (x + d) + (x + d + d) = 3*(x + d) = 3*y
(x + y + z) = 3*y кратно трём
(x + y + z)/3 = y

это я что бы самому не забыть )))
Да, не вам - теперь, я надеюсь, это видят - все.   :( .  Вот, кстати, Kemiisto, ответ от любителя хаскеля- и очень наглядный урок: "не понимаешь что нужно делать - нефиг писать программу, ибо  тут не поможет даже Хаскель"... И еще поздравляю - вы, в отличии от Geniepro поняли в чем прикол с пол-тычка.
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Октябрь 03, 2011, 05:32:49 am
"не понимаешь что нужно делать - нефиг писать программу, ибо  тут не поможет даже Хаскель"... И еще поздравляю - вы, в отличии от Geniepro поняли в чем прикол с пол-тычка.
Я чуйствую, что Вы мне как-то тонко нахамили, но не могу понять, как именно ((
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 03, 2011, 05:57:54 am
"не понимаешь что нужно делать - нефиг писать программу, ибо  тут не поможет даже Хаскель"... И еще поздравляю - вы, в отличии от Geniepro поняли в чем прикол с пол-тычка.
Я чуйствую, что Вы мне как-то тонко нахамили, но не могу понять, как именно ((

1. Нет(по сути дела - тот же ответ, с усилением).Констатация фактов .
2. Посмотрите ВНИМАТЕЛЬНО сообщения начиная с 49 номера(этой ветки).
Название: Re: Решаем задачки. :)
Отправлено: Peter Almazov от Октябрь 03, 2011, 07:01:04 am
А у меня, между делом, возникла просьба к "ремонтных дел мастеру" - Петру Алмазову. Что вы имели ввиду под "Уровень решения на КП - ниже плинтуса." - и если можно, с обоснованием.
Ну чего там обосновывать. Задачи решены по принципу "что вижу, о том и пою". Я думал kemiisto немерянно крут, судя по количеству мата от него на jabber-конференции. Если бы я знал, что, как программист, он начинающий, то не стал бы комментировать.
Разбирать решения этих задач у меня нет ни малейшего желания.
Название: Re: Решаем задачки. :)
Отправлено: Peter Almazov от Октябрь 03, 2011, 07:03:06 am
"не понимаешь что нужно делать - нефиг писать программу, ибо  тут не поможет даже Хаскель"... И еще поздравляю - вы, в отличии от Geniepro поняли в чем прикол с пол-тычка.
Я чуйствую, что Вы мне как-то тонко нахамили, но не могу понять, как именно ((
Тоже не понял сути претензий к Geniepro . Он дал нормальное решение дурацкой задачи.
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 03, 2011, 07:56:02 am
Мат не является показателем "крутости"...А желание , если оно есть, быть лучше чем сейчас -похвально(ИМХО -при любом раскладе).
Тоже не понял сути претензий к Geniepro . Он дал нормальное решение дурацкой задачи.
В условиях (оригинальных), ничего  не говорилось о проверке на что 3 числа являются ПОСЛЕДОВАТЕЛЬНО идущими членами арифметической прогрессии (т.е. Kemiisto и Geniepro приводили решения для частного случая, и непонятно с какой стати...). И если задача не решена - то пофигу крутой ты программист, материшься в чате или делаешь double Q перед "авторитетами..."  или нет -результат один. Но еще раз замечу в отличие от "крутых" он суть проблемы уловил сразу.
Кстати,  вывод Geniepro хорош, но тождество (a+b-2с)(c+b-2a)(c+a-2b)=0 (сие есть элементарное следствие основного признака арифм. прогрессии) лучше.
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 03, 2011, 08:20:39 am
Разбирать решения этих задач у меня нет ни малейшего желания.
А я и не прошу этого делать - мне интересно где находится "позиция плинтуса" и что это такое в программах на 10 строк.
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Октябрь 03, 2011, 09:52:33 am
В условиях (оригинальных), ничего  не говорилось о проверке на что 3 числа являются ПОСЛЕДОВАТЕЛЬНО идущими членами арифметической прогрессии (т.е. Kemiisto и Geniepro приводили решения для частного случая, и непонятно с какой стати...).
Я не знаю, какой была формулировка задачи в оригинале у Потопахина, я решал в той формулировке, которая была у Кемиисто на гитхабе.
Но вообще, когда речь идёт о членах арифметической прогрессии, то мне лично кажется вполне разумным предположить, что они идут ррядом друг с другом, раз не указано обратное...
Может быть там, в учебнике Потопахина и было указано это обратное -- я этого указания не видел...
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 03, 2011, 10:02:48 am
В условиях (оригинальных), ничего  не говорилось о проверке на что 3 числа являются ПОСЛЕДОВАТЕЛЬНО идущими членами арифметической прогрессии (т.е. Kemiisto и Geniepro приводили решения для частного случая, и непонятно с какой стати...).
Я не знаю, какой была формулировка задачи в оригинале у Потопахина, я решал в той формулировке, которая была у Кемиисто на гитхабе.
Но вообще, когда речь идёт о членах арифметической прогрессии, то мне лично кажется вполне разумным предположить, что они идут ррядом друг с другом, раз не указано обратное...
Может быть там, в
 учебнике Потопахина и было указано это обратное -- я этого указания не видел...
1. Да ну   ;)
2. С чего бы это?
3. Kemiisto, в отличие от вас, проблему признал-  Неужели так тщеславие душит  ;)
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Октябрь 03, 2011, 10:16:06 am
2. С чего бы это?
3. Kemiisto, в отличие от вас, проблему признал-  Неужели так тщеславие душит  ;)
2. А как иначе? о_О
3. Какую проблему? О_О
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 03, 2011, 10:22:43 am
2. С чего бы это?
3. Kemiisto, в отличие от вас, проблему признал-  Неужели так тщеславие душит  ;)
2. А как иначе? о_О
3. Какую проблему? О_О
1. Например, как приведено в сообщение 51 - если вас интересует школьная формулировка, если вас интересует формулировка в терминах арифметических вычетов - обратитесь к соответствующему разделу теории чисел... шучу, хватит википедии... :D
2. Что задаче не решена в поставленной формулировке.  :)
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Октябрь 03, 2011, 10:53:10 am
1. Например, как приведено в сообщение 51 - если вас интересует школьная формулировка, если вас интересует формулировка в терминах арифметических вычетов - обратитесь к соответствующему разделу теории чисел... шучу, хватит википедии... :D
2. Что задаче не решена в поставленной формулировке.  :)
Не, так мы будем думать и гадать сто лет.
Кемиисто, просканируй кусок книги де эта задача формулируется -- как там у Потопахина на самом деле?
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Октябрь 03, 2011, 10:56:14 am
Как вариант, кто-нить из вас может зайти на форум к оборонкоровам и уточнить там у Потопахина (vvp) что же он, чёрт возьми, имел в виду в своей восьмой задачке для начинающих программахеров?
Мой аккаунт там заблокирован, так что я спросить там этого не могу (да и не хочу, если честно).
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 03, 2011, 10:57:22 am
Не, так мы будем думать и гадать сто лет.
Кемиисто, просканируй кусок книги де эта задача формулируется -- как там у Потопахина на самом деле?
А зачем гадать, может просто подумать...
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Октябрь 03, 2011, 11:01:37 am
А зачем гадать, может просто подумать...

Много думать вредно -- череп может начать жать )))
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 03, 2011, 11:08:08 am
А зачем гадать, может просто подумать...

Много думать вредно -- череп может начать жать )))
Ну да, с другой стороны, если этого не делать а просто мм пукать в холостую  - можно  обосраться .  :)
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Октябрь 03, 2011, 11:11:07 am
Ну да, с другой стороны, если этого не делать а просто мм пукать в холостую  - можно  обосраться .  :)
Вы лучше приведите решения этих задачек на каком-нить интересном языке.
На APL там, или на форте, или какой там у Вас любимый на этой неделе? ;D
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 03, 2011, 11:20:39 am
Вы лучше приведите решения этих задачек на каком-нить интересном языке.
На APL там, или на форте, или какой там у Вас любимый на этой неделе? ;D
Я вас разочарую - у меня на этой неделе и (пока не сделаю) wingui для gulp'a так что - попсовое делфи, и только делфи... ибо незачем умножать проблемы без необходимости.  :) И потом, я же на "крутость" в вашем понимании не претендую  :D  ибо не хочу отбирать хлеб ваш (или потому что - не крут  :D, хотя бы в сравнении с Петром  Алмазовым ибо затрудняюсь увидеть элементы интерьера квартиры в решениях Kemiisto, правда  я не все их смотрел). А вот разговор о задачках для начинающих в контексте обучения мне интересен.
Название: Re: Решаем задачки. :)
Отправлено: valexey от Октябрь 03, 2011, 12:47:37 pm
Формулировки задач действительно весьма не четкие.

Я не знаю хорошо это, или плохо. С одной стороны оно заставляет думать о задаче постановки задачи. Что ценно, и что многими игнорируется. С другой, по таким формулировкам начинающему может быть сложно писать решение (тем более что у начинающего и так проблем достаточно - его пугает язык, и программирование вообще, ибо непривычно. А тут нужно фокусировать внимание еще на одной сущности).
Название: Re: Решаем задачки. :)
Отправлено: Geniepro от Октябрь 10, 2011, 04:10:12 pm
И снова задача 8 ))

Даны x, y, z -- произвольные члены арифметической прогрессии, упорядоченные по возрастанию (шаг прогрессии считаем положительным).

Надо определить максимально возможный шаг этой прогрессии.

Учитывая, что:

http://ru.wikipedia.org/wiki/Арифметическая_прогрессия

Любой член прогрессии может быть вычислен по формуле общего члена:
    an = a1 + (n - 1) * d для всех n >= 1

вычисляем d:

x = a1
y = a1 + k*d
z = a1 + m*d

k = (y - x)/d
m = (z - x)/d

Как видно, d является общим делителем разностей (y - x) и (z - x).
По условиям задачи требуется найти наибольшее значение d, это значит, что нужно найти наибольший общий делитель (y - x) и (z - x).

module Ex_8b where

import Data.List

main = do
    str <- getLine
    let x:y:z:_ = sort $ map read $ words str
    if x == z then
        putStrLn "Прогрессия вырожденная, шаг = 0"
    else if x == y || y == z then
        putStrLn "Прогрессия отсутствует"
    else
        let d = gcd (y - x) (z - x) in
        putStrLn $ "Прогрессия с шагом = " ++ show d
Название: Re: Решаем задачки. :)
Отправлено: kemiisto от Октябрь 16, 2011, 08:21:34 pm
Ну ладно по делу - шестую задачу  я бы автору(решения) не зачел . Какого фига он исключил возможность равенства значения в L одному из введенных ранее значений (a,b,c,d)
А где я исключил такую возможность? ???
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 16, 2011, 08:32:33 pm
Ну ладно по делу - шестую задачу  я бы автору(решения) не зачел . Какого фига он исключил возможность равенства значения в L одному из введенных ранее значений (a,b,c,d)
А где я исключил такую возможность? ???
Пусть на входе последовательность 1 2 3 4 1 - что выдаст ваша программа?
Название: Re: Решаем задачки. :)
Отправлено: kemiisto от Октябрь 16, 2011, 08:42:44 pm
Пусть на входе последовательность 1 2 3 4 1 - что выдаст ваша программа?
1 выдаст. Нумерация с нуля. То есть 1 встанет между 1 и 2.

P.S. Надо, кстати, сделать, чтоб нумерация в выдаче с 1 начиналась. Человеку - человеческое! :)
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 16, 2011, 09:06:52 pm
Пусть на входе последовательность 1 2 3 4 1 - что выдаст ваша программа?
1 выдаст. Нумерация с нуля. То есть 1 встанет между 1 и 2.

P.S. Надо, кстати, сделать, чтоб нумерация в выдаче с 1 начиналась. Человеку - человеческое! :)

1. А почему не 0?
2. А вот этот момент оговаривался 'бесчеловечным' автором в условии этой задачи.   
Название: Re: Решаем задачки. :)
Отправлено: kemiisto от Октябрь 16, 2011, 09:29:02 pm
1. А почему не 0?
2. А вот этот момент оговаривался 'бесчеловечным' автором в условии этой задачи.
1. Ну я про это и писал. Поведение в этом случае не описано. Так что почему бы и не 1.
2. Да? Разве что "положение"... Но ведь положение тоже по-разному можно описать. Можно индексом (номером) при какой-то принятой нумерации, а можно указать его позицию с начала (первый, второй, ...).
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 16, 2011, 09:37:44 pm
1. А почему не 0?
2. А вот этот момент оговаривался 'бесчеловечным' автором в условии этой задачи.
1. Ну я про это и писал. Поведение в этом случае не описано. Так что почему бы и не 1.
2. Да? Разве что "положение"... Но ведь положение тоже по-разному можно описать. Можно индексом (номером) при какой-то принятой нумерации, а можно указать его позицию с начала (первый, второй, ...).
1. Я вам говорю про другое -если задача нечетко описана Вы ДОЛЖНЫ  наложить дополнительные условия в явном виде - их отсутствие (не ваш выбор) я считаю ошибкой.  В этой задаче этот вопрос не существенен (я говорю про решение) , но в 8 задаче -  подобный подход привел к ошибке. (ваше первое решение задачи 8 при определенных обстоятельствах я  бы не счел ошибочным).
2.Он ( В. Потопахин) специально оговорил этот момент, не вижу смысла обсуждать его (момент,  да и автора то же) здесь
Название: Re: Решаем задачки. :)
Отправлено: kemiisto от Октябрь 16, 2011, 09:45:59 pm
1. Я вам говорю про другое -если задача нечетко описана Вы ДОЛЖНЫ  наложить дополнительные условия в явном виде - их отсутствие я считаю ошибкой.  В этой задаче этот вопрос не существенен (я говорю про решение) , но в 8 задаче -  подобный подход привел к ошибке. (ваше первое решение задачи 8 при определенных обстоятельствах я  бы не счел ошибочным).
2.Он ( В. Потопахин) специально оговорил этот момент, не вижу смысла обсуждать его (момент,  да и автора то же) здесь
1. Ну сейчас добавим.
2. Не знаю. Единственный момент - с.8. Но там так "обговорено", что лучше бы уж промолчать. :D
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 16, 2011, 09:49:03 pm
1. Я вам говорю про другое -если задача нечетко описана Вы ДОЛЖНЫ  наложить дополнительные условия в явном виде - их отсутствие я считаю ошибкой.  В этой задаче этот вопрос не существенен (я говорю про решение) , но в 8 задаче -  подобный подход привел к ошибке. (ваше первое решение задачи 8 при определенных обстоятельствах я  бы не счел ошибочным).
2.Он ( В. Потопахин) специально оговорил этот момент, не вижу смысла обсуждать его (момент,  да и автора то же) здесь
1. Ну сейчас добавим.
2. Не знаю. Единственный момент - с.8. Но там так "обговорено", что лучше бы уж промолчать. :D
Не понял, а " Нумерация элементов списка начинается с 0." разве не  слова В. Потопахина?
Название: Re: Решаем задачки. :)
Отправлено: kemiisto от Октябрь 16, 2011, 09:59:16 pm
DIzer, нет, его там только Задание. Всё, начиная с входных данных - мои дописки.

P.S. Надо исправить в описании, что нумерация с 1.
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Октябрь 16, 2011, 10:37:03 pm
DIzer, нет, его там только Задание. Всё, начиная с входных данных - мои дописки.

P.S. Надо исправить в описании, что нумерация с 1.

1. Жаль, а я уж было порадовался за  автора.  :(
2. На мой взгляд, лучше не искажать  авторские условия - а, скажем,  делать это в  комментариях   перед текстом модуля (в файле программы).
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Февраль 24, 2012, 06:01:01 pm
Цитировать
Задание
 Дано 3 целых числа. Проверить являются ли они членами геометрической прогрессии.

Входные данные
 Три целых числа.

Выходные данные
 Являются ли три числа членами геометрической прогресии.

Пояснение
 Здесь решить задачу в общем виде труднее, чем предыдущую. Рассмотрим один из простейших вариантов - проверить, являются ли числа подрядыдущими членами геометрической прогрессии. Будем считать, что числа положительны и упорядочены по возрастанию
  :) Ну прям аспирант,делающий доклад на заседании кафедры....   Если уж решаете упрощенный вариант задачи - так и говорите решаем задачу в предположении, что числа являются последовательными (подрядыдущими ) членами прогрессии, положительны и упорядочены по возрастанию - а то ведь я неумный преподаватель могу подумать , что речь идет "одном из простейших" вариантов решения ПОСТАВЛЕННОЙ задачи.
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Март 26, 2012, 12:36:33 pm
Забавная штука... смотрю на решения задач...и не улавливаю в  чем  заключается "Современность" метода обучения программированию    по  В Потапахину.... Kemiisto  можете просветить? , как "адепт" методики...  или это все рекламная болтовня?
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Март 26, 2012, 12:41:59 pm
Разумеется, можно взять книгу и провести сравнение лично... но всегда интересно посмотреть именно на "рабочий" результат именно с точки зрения пользователя , которому она нужна (по крайней мере настолько,  что он заплатил за книгу свои кровные без принуждения....
Название: Re: Решаем задачки. :)
Отправлено: kemiisto от Март 26, 2012, 01:11:40 pm
Забавная штука... смотрю на решения задач...и не улавливаю в  чем  заключается "Современность" метода обучения программированию    по  В Потапахину.... Kemiisto  можете просветить? , как "адепт" методики...  или это все рекламная болтовня?
Я тоже пока не улавливаю. :D Надо хоть пол книги прочитать. А со временем совсем туго. :(

Однако там ведь обучение современному программированию, а не современное обучение программированию. Так что... Ибо скучный текст на современный метод обучения, мягко скажем, не тянет. ;) Может потом пойдёт повеселее...
Название: Re: Решаем задачки. :)
Отправлено: DIzer от Март 26, 2012, 01:35:19 pm

Я тоже пока не улавливаю. :D Надо хоть пол книги прочитать. А со временем совсем туго. :(

Однако там ведь обучение современному программированию, а не современное обучение программированию. Так что... Ибо скучный текст на современный метод обучения, мягко скажем, не тянет. ;) Может потом пойдёт повеселее...
Ну даете  :) , в лучших традициях любителей семантики  :D надо у эксперта (то есть AlexUs'a) спросить в  чем  семантическая разница...Но ответ понятен - подождем развития "темы" в задачах. Для меня этот вопрос злободневный - студенты регулярно спрашивают про дополнительную литературу...