Oberon space
General Category => Общий раздел => Тема начата: kemiisto от Сентябрь 26, 2011, 01:06:48 pm
-
Я читаю эту (http://oberoncore.ru/library/sovremennoe_programmirovanie_s_nulya) книгу. И решаю задачки в ББ!!!111 ;D Решения можно увидеть тут (https://github.com/kemiisto/ModernProgrammingFromTheGroundUp). valexey там же выкладывает "толстые" решения на С. :D Кому интересно, может присоединиться.
-
обновление тут (в архиве): 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 "Нет"
-
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
-
Не компилируется (другие аналогично). Имеем следующее:
$ 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]
-
Выложил в архиве каталог с исходниками решений на хаскеле с батниками для их компиляции
GHC 7.0.3
Там во второй задачке (про совершенные числа) тестовое входное значение: 137438691328 (седьмое совершенное число).
На моём компе (P-DualCore 2.6) вычисляется за 0.1 сек.
Интересно бы сравнить время с сишным и паскалевским решениями... 8)
-
Там во второй задачке (про совершенные числа) тестовое входное значение: 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
Хаскель примерно в полтора раза медленнее.
-
Хаскель примерно в полтора раза медленнее.
Ну а какая-нить там Ада или Компонентный Паскаль -- в два раза медленнее. И чо? )))
-
Хаскель примерно в полтора раза медленнее.
Ну а какая-нить там Ада или Компонентный Паскаль -- в два раза медленнее. И чо? )))
Это бездоказательное утверждение.
-
Кстати, я ошибся. Хаскель не в полтора раза медленнее, а более чем в два. Это хорошо видно на больших числах:
$ 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
Результат стабильный.
-
более оптимизированное решение второй задачки:
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
выполняется у меня примерно в полтора раза быстрее предыдущего. Теперь должно не сильно уступать сишному ))
-
$ time echo 1374386913280000 | ./ex_2.exe
Нет
real 0m11.238s
user 0m11.197s
sys 0m0.032s
Быстрее, но не существенно.
-
ладно, вот три окончательных варианта второй задачи:
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. Поправил первое решение
-
проверил на процессоре P-DualCore 1.6 сишный вариант с int64 на tinycc 0.9.23 и три варианта на хаскеле (тоже с Int64)
сишный вариант 5.1 сек
хаскельные: 7.2, 4.1 (par) и 3.9 (forkOS) сек
Ура!!! хаскель рулит! обогнал сишника )))
ЗЫ. TinyCC -- неоптимизирующий, почти однопроходный компилятор, который по качеству генерации маш. кода примерно соответствует BBCP (когда-то я их сравнивал на микротестах -- всяких там сортировках и тд) и сильно (как минимум в 2 раза) уступает в этом плане GCC
-
К сожалению, время уменьшилось не в два раза на моём двухядернике ((
А ты как запускал?
У меня получилось 6 секунд, то есть раза в два быстрее прежних решений (по тактам сответственно так же).
-
проверил на процессоре 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 да, оптимизирует никак.
-
К сожалению, время уменьшилось не в два раза на моём двухядернике ((
А ты как запускал?
У меня получилось 6 секунд, то есть раза в два быстрее прежних решений (по тактам сответственно так же).
Это сильно зависит от того, какие ещё проги в фоне работают. У меня дома видимо тестам как раз они и мешали -- всякие оперы, чаты и прочая...
Возможно и от процессора тоже зависит...
-
Потестировал на 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
Теперь отгадайте, который из них написан на Си? :-)
-
Потестировал на i5. 4 ядра.
Теперь отгадайте, который из них написан на Си? :-)
нипанятно. хаскельные варианты (которые c par и forkOS) запускались с ключами +RTS -N -RTS или без них?
кто-му же эти варианты расчитаны на два ядра, для 4-х их надо немного переделать )
а сишный вариант без изменений или заточен на многопоточность?
-
нипанятно. хаскельные варианты (которые 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;
}
-
Гм. Значит просто -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 раз.
-
Кстати, сложность задачи от значения аргумента зависит не линейно. Соответственно у Си-решения такое же время исполнения как у хаскель-решения получается если увеличить аргумент не в 10 а в 100 раз.
не понял. в обоих решениях O(n^0.5)...
-
Кстати, сложность задачи от значения аргумента зависит не линейно. Соответственно у Си-решения такое же время исполнения как у хаскель-решения получается если увеличить аргумент не в 10 а в 100 раз.
не понял. в обоих решениях O(n^0.5)...
Это и есть не линейная зависимость :-)
-
Фаллометрию тут устроили! :D
-
Задачи дурацкие, непонятно какие умения они должны развивать. Уровень решения на КП - ниже плинтуса.
Правда, книгу я не читал. ("Сам я Пастернака не читал, но, как честный советский человек, "... и.т.п.)
Про Хаскель: сам до сих пор не могу переделать свое мышление в функциональное, но, чем дальше, тем больше убеждаюсь, что программы на нем синтезируются (т.е. пишутся) с помощью вдохновения, озарения, догадки и т.п. Нет рабочего инструмента, который бы позволял профессионалу в любом состоянии гарантированно выдавать результат. Который не сильно отличался бы у разных людей.
-
2Geniepro:
Так какой вариант решения второй задачи закинуть в репозиторий? Решение должно быть с одной стороны эффективным, а с другой - легко понимабельным (все же для новичков это делается) и требующим минимума плясок с бубном при компиляции и запуске. То есть оно не должно требовать скриптов компиляции, компилироваться должно как-то так: "ghc MyCoolSolution.hs".
Как ответишь - закину всю пачку решений хаскелевских.
PS. Решения на других языках приветствуются.
PPS. 2kemiisto: новые задачки из книжки также приветствуются :-)
-
Задачи дурацкие, непонятно какие умения они должны развивать. Уровень решения на КП - ниже плинтуса.
Базовой алгоритмизации для новичков.
Правда, книгу я не читал. ("Сам я Пастернака не читал, но, как честный советский человек, "... и.т.п.)
Оно и видно, даже название книги не удосужились прочитать. Да я бы не сказал что "честный советский человек", скорее "недалекий"
Про Хаскель: сам до сих пор не могу переделать свое мышление в функциональное, но, чем дальше, тем больше убеждаюсь, что программы на нем синтезируются (т.е. пишутся) с помощью вдохновения, озарения, догадки и т.п. Нет рабочего инструмента, который бы позволял профессионалу в любом состоянии гарантированно выдавать результат. Который не сильно отличался бы у разных людей.
При отсутствии реальной потребности в таких решениях, может помочь лишь природная любознательность(в редких случаях тщеславие). Увы с годами последняя увядает (сужу по себе).
-
Оно и видно, даже название книги не удосужились прочитать.
Откуда это следует?
-
Оно и видно, даже название книги не удосужились прочитать.
Откуда это следует?
Из первого вашего высказывания.
-
Оно и видно, даже название книги не удосужились прочитать.
Откуда это следует?
Из первого вашего высказывания.
Т.к. название я прочитал, то по факту вывод неверный. Клеветы, в общем :)
Про Хаскель: сам до сих пор не могу переделать свое мышление в функциональное, но, чем дальше, тем больше убеждаюсь, что программы на нем синтезируются (т.е. пишутся) с помощью вдохновения, озарения, догадки и т.п. Нет рабочего инструмента, который бы позволял профессионалу в любом состоянии гарантированно выдавать результат. Который не сильно отличался бы у разных людей.
При отсутствии реальной потребности в таких решениях, может помочь лишь природная любознательность(в редких случаях тщеславие). Увы с годами последняя увядает (сужу по себе).
Реальные потребности, а также мои или ваши любознательность и тщеславие здесь не при чем. Я говорю о том, что из-за отсутствия инструмента решения разных людей могут сильно различаться очень сильно. Вот в этой шутке http://www.willamette.edu/~fruehr/haskell/evolution.html очень много "не шутки".
-
Т.к. название я прочитал, то по факту вывод неверный. Клеветы, в общем :)
Вы меня поняли - значит небезнадежны ;)
Реальные потребности, а также мои или ваши любознательность и тщеславие здесь не при чем. Я говорю о том, что из-за отсутствия инструмента решения разных людей могут сильно различаться очень сильно. Вот в этой шутке http://www.willamette.edu/~fruehr/haskell/evolution.html очень много "не шутки".
Не понимаю - о каких различия в решениях вы говорите, и причем здесь они (различия)? Я лично говорю про то, что "нафига мне изучать новый яп, если мне текущих знаний и навыков хватает на то чтобы справиться с любой интересной(в широком смысле) проблемой"
Да это прямой оффтоп... предлагаю завершить ЭТУ дискуссию в ЭТОЙ ветке.
-
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 "Нет"
Это решение чётко описывает решение задачи -- пересчитать все делители числа кроме него самого. В отличие от этого решение на сях -- эзотерично и нипанятно, а потому засчитано быть не может и должно быть дисквалифицировано!!!
Решение на КП -- намана, практически аналогично хаскельному...
-
Про Хаскель: сам до сих пор не могу переделать свое мышление в функциональное, но, чем дальше, тем больше убеждаюсь, что программы на нем синтезируются (т.е. пишутся) с помощью вдохновения, озарения, догадки и т.п. Нет рабочего инструмента, который бы позволял профессионалу в любом состоянии гарантированно выдавать результат. Который не сильно отличался бы у разных людей.
Тысячу и одно решение любой задачи можно придумать на любом языке, было бы желание и немного фантазии.
Даже питон не в силах этому помешать... ;D
-
Решение на КП -- намана, практически аналогично хаскельному...
Кстати, действительно решение на КП будет практически аналогично хаскельному... по производительности :-)
Компилятор ББ ведь практически не умеет оптимизировать. ghc же умеет, но достижению настоящей производительности ему уже мешает дикий семантический разрыв между языком и машиной. Так что примерно то на то и должно выйти.
-
Тысячу и одно решение любой задачи можно придумать на любом языке, было бы желание и немного фантазии.
Ну, не скажите, Хаскель здесь рекордсмен. На том же КП трудно представить себе десятки вариантов вычисления факториала. Даже если удасться это сделать, то в этом не будет ни капли юмора. Один бред. В отличие от Хаскеля.
-
На том же КП трудно представить себе десятки вариантов вычисления факториала. Даже если удасться это сделать, то в этом не будет ни капли юмора. Один бред. В отличие от Хаскеля.
Так и на Хаскелле это тоже бред.
Например, сделать интерпретатор микроязычка, и на этом язычке реализовать факториал -- неужели на КП такое невозможно? Возможно, конечно же.
Почему же на КП такое не делают? Да просто потому, что слишком низкоуровневый язык, неудобен для реализации всяких трансляторов. Что ж поделать?
А было бы сильное желание -- сделать было бы можно...
Реально же факториал на хаскелле вычисляется проще пареной репы:
factorial x = product [1..x]
и по другому никто в реальном продакшене не сделает, ибо зачем делать сложнее? Хаскеллеры же не враги себе...
-
и по другому никто в реальном продакшене не сделает, ибо зачем делать сложнее? Хаскеллеры же не враги себе...
А что есть значимый "Хаскельдакшен" - сегмент рынка на котором за софтину созданную на Хаскеле народ готов платить реальное бабло?
-
и по другому никто в реальном продакшене не сделает, ибо зачем делать сложнее? Хаскеллеры же не враги себе...
А что есть значимый "Хаскельдакшен" - сегмент рынка на котором за софтину созданную на Хаскеле народ готов платить реальное бабло?
ну, говорят, что есть. хотя с триллионым рынком софта на коболе хаскеллу, конечно же, не сравниться...
-
и по другому никто в реальном продакшене не сделает, ибо зачем делать сложнее? Хаскеллеры же не враги себе...
А что есть значимый "Хаскельдакшен" - сегмент рынка на котором за софтину созданную на Хаскеле народ готов платить реальное бабло?
ну, говорят, что есть. хотя с триллионым рынком софта на коболе хаскеллу, конечно же, не сравниться...
И это говорит активист хаскелизма на враждебных виртуазных нивах.... смело, однако ;)
-
Ну ладно по делу - шестую задачу я бы автору(решения) не зачел . Какого фига он исключил возможность равенства значения в L одному из введенных ранее значений (a,b,c,d)
-
сегмент рынка на котором за софтину созданную на Хаскеле народ готов платить реальное бабло?
Вообще, по-идее, обычно народ платит за программы не потому что те были написаны на каком-то языке, а за то, что эти программы решают какие-то важные для народа хозяйственные задачи...
-
сегмент рынка на котором за софтину созданную на Хаскеле народ готов платить реальное бабло?
Вообще, по-идее, обычно народ платит за программы не потому что те были написаны на каком-то языке, а за то, что эти программы решают какие-то важные для народа хозяйственные задачи...
не возражаю , и что ;)
-
Ну ладно по делу - шестую задачу я бы автору(решения) не зачел . Какого фига он исключил возможность равенства значения в L одному из введенных ранее значений (a,b,c,d)
Потому что, в этом случае придётся специфицировать поведение алгоритма в этой ситуации. В формулировки задачи на это нет никаких намёков. Ивапще, низачли бы они. Я сам себе такую задачу дал. 8) Давайте Вашу, там будете Вы зачитывать. ;)
-
Потому что, в этом случае придётся специфицировать поведение алгоритма в этой ситуации. В формулировки задачи на это нет никаких намёков. Ивапще, низачли бы они. Я сам себе такую задачу дал. 8) Давайте Вашу, там будете Вы зачитывать. ;)
А ну поняяяятно, нефиг в чужуй нужник лезть... и то естно - обгадититься низачо сподобно. ;D . А свою вам пожалуй не дам - слишком долго объяснять надо что сделать... и судя по всему не факт, что до вас дойдет ;) А если про обучающие задачки вы говорите - то это бессмысленно (судя по вашему решению , и отношению к критике) , пустая трата времени , однако.
-
сегмент рынка на котором за софтину созданную на Хаскеле народ готов платить реальное бабло?
Вообще, по-идее, обычно народ платит за программы не потому что те были написаны на каком-то языке, а за то, что эти программы решают какие-то важные для народа хозяйственные задачи...
не возражаю , и что ;)
а то, что подобный софт на хаскелле делается, продаётся, возможно даже покупается кем-то.
но в основном всё-таки на хаскелле решают внутрифирменные задачи, так что там зарплату платят хаскеллерам и всё на этом ((
-
а то, что подобный софт на хаскелле делается, продаётся, возможно даже покупается кем-то.
но в основном всё-таки на хаскелле решают внутрифирменные задачи, так что там зарплату платят хаскеллерам и всё на этом ((
Тогда , с моей точки зрения, это не продакшен (потому, что завязан на конкретную фирму). МММ. Понятие экзотика подходит?
-
Понятие экзотика подходит?
хоть горшком назовите, только в печь не кладите... ;D
-
Понятие экзотика подходит?
хоть горшком назовите, только в печь не кладите... ;D
Может вас еще в "терновый куст" кинуть ;D ? - обойдетесь, ибо возможно привыкание....
-
Решение проблемы 8( что об арифметической прогрессии)- та же порнография...
-
Решение проблемы 8( что об арифметической прогрессии)- та же порнография...
Если уж критикуете, так конструктивнее. Что неправильно? И мне Ваши задачи "до лампочки". Я про них не спрашивал. Куда мне... ;D
-
Решение проблемы 8( что об арифметической прогрессии)- та же порнография...
Если уж критикуете, так конструктивнее. Что неправильно? И мне Ваши задачи "до лампочки". Я про них не спрашивал. Куда мне... ;D
1.ТАЖЕ ПОРНОГРАФИЯ =НЕ ЯВЛЯЕТСЯ РЕШЕНИЕМ ИСХОДНОЙ ЗАДАЧИ (ГНУСНЫЙ НАМЕК - являются ли числа 4,8 ,16 членами арифметической прогрессии).
2. Это хорошо
3. Действительно, вы даже понять что нужно сделать в задачке для начинающих неспособны...Только кривляться да воздух сотрясать в чате...
-
А что Вы грубите? Я же написал:
Строго говоря, любые три целых числа являются членами арифметической прогрессии (с разностью 1). Имеет смысл, например, проверять, являются ли 3 числа идущими друг за другом членами арифметической прогрессии.
Исходная задача сформулирована неодназаначно. Я, например, вот такую решил, как описал.
-
А что Вы грубите? Я же написал:
Строго говоря, любые три целых числа являются членами арифметической прогрессии (с разностью 1). Имеет смысл, например, проверять, являются ли 3 числа идущими друг за другом членами арифметической прогрессии.
Исходная задача сформулирована неодназаначно. Я, например, вот такую решил, как описал.
1. Я не грублю - я возвращаю вам ваше кривлянье с усилением (и успешно).
2. Это тривиальный случай -не интересный.
3. Это другая задача(подмножество исходной).
4. Если решаете ДРУГУЮ задачу - будьте добры отразите этот факт в комментариях в шапке программы (лично я сомневаюсь что это правда, слишком похож этот случай на предыдущий, впрочем, дело ваше).
Задача сформулирована однозначно(минус тривиальный случай) - достаточно реформулировать ее в эквивалентном виде "проверить являются ли 3 целых числа членами арифметической прогрессии с шагом D>1". Но для этого нужно было потратить некоторое время на работу с ее условием= что вы не сделали как в первом, так и во втором случае...
-
А у меня, между делом, возникла просьба к "ремонтных дел мастеру" - Петру Алмазову. Что вы имели ввиду под "Уровень решения на КП - ниже плинтуса." - и если можно, с обоснованием.
-
1. Я не грублю - я возвращаю вам ваше кривлянье с усилением (и успешно).
Какое кривляние? :o
2. Это тривиальный случай -не интересный.
3. Это другая задача(подмножество исходной).
4. Если решаете ДРУГУЮ задачу - будьте добры отразите этот факт в комментариях в шапке программы (лично я сомневаюсь что это правда, слишком похож этот случай на предыдущий, впрочем, дело ваше).
Задача сформулирована однозначно(минус тривиальный случай) - достаточно реформулировать ее в эквивалентном виде "проверить являются ли 3 целых числа членами арифметической прогрессии с шагом D>1". Но для этого нужно было потратить некоторое время на работу с ее условием= что вы не сделали как в первом, так и во втором случае...
Я процитировал README.md из репозитория. Можете проверить - время коммита у решения и у описания задачи одно и тоже. Хоть в этом не сомневайтесь. Я согласен, что случай тривиальный. Сейчас обновлю формулировку и попробую решить. ;D
P.S. Я выложил ссылку. Если Вас что-то не устроило, так и скажите. Я же не просто так сюда написал. А тут сразу началось. Одному - ниже плинтуса, другому - порнография... :(
-
1. Я не грублю - я возвращаю вам ваше кривлянье с усилением (и успешно).
Какое кривляние? :o
Я процитировал README.md из репозитория. Можете проверить - время коммита у решения и у описания задачи одно и тоже. Хоть в этом не сомневайтесь. Я согласен, что случай тривиальный. Сейчас обновлю формулировку и попробую решить. ;D
P.S. Я выложил ссылку. Если Вас что-то не устроило, так и скажите. Я же не просто так сюда написал. А тут сразу началось. Одному - ниже плинтуса, другому - порнография... :(
1. "Ивапще, низачли бы они. Я сам себе такую задачу дал. Давайте Вашу, там будете Вы зачитывать."....."Я же не просто так сюда написал. А тут сразу началось. Одному - ниже плинтуса, другому - порнография... :(" взятые в контексте темы - кривлянье. Ответ с усилением в том же духе выглядит, естественно, как вызов (с различными оттенками грубости).
2. Время коммита из репозитория здесь не причем. Я вас не обвиняю, ошибаются все - просто спросите у своих собеседников по "мове" (сиплюиста и хаскиллера ;) ) решили бы они ПРАВИЛЬНО эту задачку. Собственно, то что вы сделали уже заслуживает уважения - по этому я и сделал сообщение об ошибке.
3. Не факт что это даст какой-то результат... Ответьте лучше на вопросы - чего вы хотели достичь а) читая эту книгу. б ) решая эти задачи
-
Я хочу научиться программировать. :)
По поводу задачи. Тут думать надо. А у меня живот болит. :( А выпил НО-ШПУ и пошёл спать. Завтра посмотрю... Сначала хотел посчитать модуль разности между a, b и b, c. Больший модуль проверить на делимость на меньший. Но нет. Точно не будет работать, например, на 4, 8, 14, то есть, когда шаг прогрессии меньше минимально разности между элементами проверяемой последовательности...
-
А у меня, между делом, возникла просьба к "ремонтных дел мастеру" - Петру Алмазову. Что вы имели ввиду под "Уровень решения на КП - ниже плинтуса." - и если можно, с обоснованием.
Сейчас уезжаю, отвечу не раньше завтрашнего вечера.
-
Прочитал оглавление книги, кусок из первой главы(пробник с одного из издательских сайтов), попробовал восстановить логику обучения... Возникло 2 вопроса к вам kemiisto
1. 8 задача дается после того, как вводится неформальное определение циклического оператора или нет?
2. Не смог понять, что имел ввиду автор под словами СОВРЕМЕННОЕ ПРОГРАММИРОВАНИЕ-можете привести свои соображения на этот счет(с оценкой, как пользователя честно заплатившего за книгу- насколько в этом контексте удачно изложение), может это просто маркетинговый ход?.
-
Тестовые примеры в задаче 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
это я что бы самому не забыть )))
-
А вот решение задачи 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 поняли в чем прикол с пол-тычка.
-
"не понимаешь что нужно делать - нефиг писать программу, ибо тут не поможет даже Хаскель"... И еще поздравляю - вы, в отличии от Geniepro поняли в чем прикол с пол-тычка.
Я чуйствую, что Вы мне как-то тонко нахамили, но не могу понять, как именно ((
-
"не понимаешь что нужно делать - нефиг писать программу, ибо тут не поможет даже Хаскель"... И еще поздравляю - вы, в отличии от Geniepro поняли в чем прикол с пол-тычка.
Я чуйствую, что Вы мне как-то тонко нахамили, но не могу понять, как именно ((
1. Нет(по сути дела - тот же ответ, с усилением).Констатация фактов .
2. Посмотрите ВНИМАТЕЛЬНО сообщения начиная с 49 номера(этой ветки).
-
А у меня, между делом, возникла просьба к "ремонтных дел мастеру" - Петру Алмазову. Что вы имели ввиду под "Уровень решения на КП - ниже плинтуса." - и если можно, с обоснованием.
Ну чего там обосновывать. Задачи решены по принципу "что вижу, о том и пою". Я думал kemiisto немерянно крут, судя по количеству мата от него на jabber-конференции. Если бы я знал, что, как программист, он начинающий, то не стал бы комментировать.
Разбирать решения этих задач у меня нет ни малейшего желания.
-
"не понимаешь что нужно делать - нефиг писать программу, ибо тут не поможет даже Хаскель"... И еще поздравляю - вы, в отличии от Geniepro поняли в чем прикол с пол-тычка.
Я чуйствую, что Вы мне как-то тонко нахамили, но не могу понять, как именно ((
Тоже не понял сути претензий к Geniepro . Он дал нормальное решение дурацкой задачи.
-
Мат не является показателем "крутости"...А желание , если оно есть, быть лучше чем сейчас -похвально(ИМХО -при любом раскладе).
Тоже не понял сути претензий к Geniepro . Он дал нормальное решение дурацкой задачи.
В условиях (оригинальных), ничего не говорилось о проверке на что 3 числа являются ПОСЛЕДОВАТЕЛЬНО идущими членами арифметической прогрессии (т.е. Kemiisto и Geniepro приводили решения для частного случая, и непонятно с какой стати...). И если задача не решена - то пофигу крутой ты программист, материшься в чате или делаешь double Q перед "авторитетами..." или нет -результат один. Но еще раз замечу в отличие от "крутых" он суть проблемы уловил сразу.
Кстати, вывод Geniepro хорош, но тождество (a+b-2с)(c+b-2a)(c+a-2b)=0 (сие есть элементарное следствие основного признака арифм. прогрессии) лучше.
-
Разбирать решения этих задач у меня нет ни малейшего желания.
А я и не прошу этого делать - мне интересно где находится "позиция плинтуса" и что это такое в программах на 10 строк.
-
В условиях (оригинальных), ничего не говорилось о проверке на что 3 числа являются ПОСЛЕДОВАТЕЛЬНО идущими членами арифметической прогрессии (т.е. Kemiisto и Geniepro приводили решения для частного случая, и непонятно с какой стати...).
Я не знаю, какой была формулировка задачи в оригинале у Потопахина, я решал в той формулировке, которая была у Кемиисто на гитхабе.
Но вообще, когда речь идёт о членах арифметической прогрессии, то мне лично кажется вполне разумным предположить, что они идут ррядом друг с другом, раз не указано обратное...
Может быть там, в учебнике Потопахина и было указано это обратное -- я этого указания не видел...
-
В условиях (оригинальных), ничего не говорилось о проверке на что 3 числа являются ПОСЛЕДОВАТЕЛЬНО идущими членами арифметической прогрессии (т.е. Kemiisto и Geniepro приводили решения для частного случая, и непонятно с какой стати...).
Я не знаю, какой была формулировка задачи в оригинале у Потопахина, я решал в той формулировке, которая была у Кемиисто на гитхабе.
Но вообще, когда речь идёт о членах арифметической прогрессии, то мне лично кажется вполне разумным предположить, что они идут ррядом друг с другом, раз не указано обратное...
Может быть там, в
учебнике Потопахина и было указано это обратное -- я этого указания не видел...
1. Да ну ;)
2. С чего бы это?
3. Kemiisto, в отличие от вас, проблему признал- Неужели так тщеславие душит ;)
-
2. С чего бы это?
3. Kemiisto, в отличие от вас, проблему признал- Неужели так тщеславие душит ;)
2. А как иначе? о_О
3. Какую проблему? О_О
-
2. С чего бы это?
3. Kemiisto, в отличие от вас, проблему признал- Неужели так тщеславие душит ;)
2. А как иначе? о_О
3. Какую проблему? О_О
1. Например, как приведено в сообщение 51 - если вас интересует школьная формулировка, если вас интересует формулировка в терминах арифметических вычетов - обратитесь к соответствующему разделу теории чисел... шучу, хватит википедии... :D
2. Что задаче не решена в поставленной формулировке. :)
-
1. Например, как приведено в сообщение 51 - если вас интересует школьная формулировка, если вас интересует формулировка в терминах арифметических вычетов - обратитесь к соответствующему разделу теории чисел... шучу, хватит википедии... :D
2. Что задаче не решена в поставленной формулировке. :)
Не, так мы будем думать и гадать сто лет.
Кемиисто, просканируй кусок книги де эта задача формулируется -- как там у Потопахина на самом деле?
-
Как вариант, кто-нить из вас может зайти на форум к оборонкоровам и уточнить там у Потопахина (vvp) что же он, чёрт возьми, имел в виду в своей восьмой задачке для начинающих программахеров?
Мой аккаунт там заблокирован, так что я спросить там этого не могу (да и не хочу, если честно).
-
Не, так мы будем думать и гадать сто лет.
Кемиисто, просканируй кусок книги де эта задача формулируется -- как там у Потопахина на самом деле?
А зачем гадать, может просто подумать...
-
А зачем гадать, может просто подумать...
Много думать вредно -- череп может начать жать )))
-
А зачем гадать, может просто подумать...
Много думать вредно -- череп может начать жать )))
Ну да, с другой стороны, если этого не делать а просто мм пукать в холостую - можно обосраться . :)
-
Ну да, с другой стороны, если этого не делать а просто мм пукать в холостую - можно обосраться . :)
Вы лучше приведите решения этих задачек на каком-нить интересном языке.
На APL там, или на форте, или какой там у Вас любимый на этой неделе? ;D
-
Вы лучше приведите решения этих задачек на каком-нить интересном языке.
На APL там, или на форте, или какой там у Вас любимый на этой неделе? ;D
Я вас разочарую - у меня на этой неделе и (пока не сделаю) wingui для gulp'a так что - попсовое делфи, и только делфи... ибо незачем умножать проблемы без необходимости. :) И потом, я же на "крутость" в вашем понимании не претендую :D ибо не хочу отбирать хлеб ваш (или потому что - не крут :D, хотя бы в сравнении с Петром Алмазовым ибо затрудняюсь увидеть элементы интерьера квартиры в решениях Kemiisto, правда я не все их смотрел). А вот разговор о задачках для начинающих в контексте обучения мне интересен.
-
Формулировки задач действительно весьма не четкие.
Я не знаю хорошо это, или плохо. С одной стороны оно заставляет думать о задаче постановки задачи. Что ценно, и что многими игнорируется. С другой, по таким формулировкам начинающему может быть сложно писать решение (тем более что у начинающего и так проблем достаточно - его пугает язык, и программирование вообще, ибо непривычно. А тут нужно фокусировать внимание еще на одной сущности).
-
И снова задача 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
-
Ну ладно по делу - шестую задачу я бы автору(решения) не зачел . Какого фига он исключил возможность равенства значения в L одному из введенных ранее значений (a,b,c,d)
А где я исключил такую возможность? ???
-
Ну ладно по делу - шестую задачу я бы автору(решения) не зачел . Какого фига он исключил возможность равенства значения в L одному из введенных ранее значений (a,b,c,d)
А где я исключил такую возможность? ???
Пусть на входе последовательность 1 2 3 4 1 - что выдаст ваша программа?
-
Пусть на входе последовательность 1 2 3 4 1 - что выдаст ваша программа?
1 выдаст. Нумерация с нуля. То есть 1 встанет между 1 и 2.
P.S. Надо, кстати, сделать, чтоб нумерация в выдаче с 1 начиналась. Человеку - человеческое! :)
-
Пусть на входе последовательность 1 2 3 4 1 - что выдаст ваша программа?
1 выдаст. Нумерация с нуля. То есть 1 встанет между 1 и 2.
P.S. Надо, кстати, сделать, чтоб нумерация в выдаче с 1 начиналась. Человеку - человеческое! :)
1. А почему не 0?
2. А вот этот момент оговаривался 'бесчеловечным' автором в условии этой задачи.
-
1. А почему не 0?
2. А вот этот момент оговаривался 'бесчеловечным' автором в условии этой задачи.
1. Ну я про это и писал. Поведение в этом случае не описано. Так что почему бы и не 1.
2. Да? Разве что "положение"... Но ведь положение тоже по-разному можно описать. Можно индексом (номером) при какой-то принятой нумерации, а можно указать его позицию с начала (первый, второй, ...).
-
1. А почему не 0?
2. А вот этот момент оговаривался 'бесчеловечным' автором в условии этой задачи.
1. Ну я про это и писал. Поведение в этом случае не описано. Так что почему бы и не 1.
2. Да? Разве что "положение"... Но ведь положение тоже по-разному можно описать. Можно индексом (номером) при какой-то принятой нумерации, а можно указать его позицию с начала (первый, второй, ...).
1. Я вам говорю про другое -если задача нечетко описана Вы ДОЛЖНЫ наложить дополнительные условия в явном виде - их отсутствие (не ваш выбор) я считаю ошибкой. В этой задаче этот вопрос не существенен (я говорю про решение) , но в 8 задаче - подобный подход привел к ошибке. (ваше первое решение задачи 8 при определенных обстоятельствах я бы не счел ошибочным).
2.Он ( В. Потопахин) специально оговорил этот момент, не вижу смысла обсуждать его (момент, да и автора то же) здесь
-
1. Я вам говорю про другое -если задача нечетко описана Вы ДОЛЖНЫ наложить дополнительные условия в явном виде - их отсутствие я считаю ошибкой. В этой задаче этот вопрос не существенен (я говорю про решение) , но в 8 задаче - подобный подход привел к ошибке. (ваше первое решение задачи 8 при определенных обстоятельствах я бы не счел ошибочным).
2.Он ( В. Потопахин) специально оговорил этот момент, не вижу смысла обсуждать его (момент, да и автора то же) здесь
1. Ну сейчас добавим.
2. Не знаю. Единственный момент - с.8. Но там так "обговорено", что лучше бы уж промолчать. :D
-
1. Я вам говорю про другое -если задача нечетко описана Вы ДОЛЖНЫ наложить дополнительные условия в явном виде - их отсутствие я считаю ошибкой. В этой задаче этот вопрос не существенен (я говорю про решение) , но в 8 задаче - подобный подход привел к ошибке. (ваше первое решение задачи 8 при определенных обстоятельствах я бы не счел ошибочным).
2.Он ( В. Потопахин) специально оговорил этот момент, не вижу смысла обсуждать его (момент, да и автора то же) здесь
1. Ну сейчас добавим.
2. Не знаю. Единственный момент - с.8. Но там так "обговорено", что лучше бы уж промолчать. :D
Не понял, а " Нумерация элементов списка начинается с 0." разве не слова В. Потопахина?
-
DIzer, нет, его там только Задание. Всё, начиная с входных данных - мои дописки.
P.S. Надо исправить в описании, что нумерация с 1.
-
DIzer, нет, его там только Задание. Всё, начиная с входных данных - мои дописки.
P.S. Надо исправить в описании, что нумерация с 1.
1. Жаль, а я уж было порадовался за автора. :(
2. На мой взгляд, лучше не искажать авторские условия - а, скажем, делать это в комментариях перед текстом модуля (в файле программы).
-
Задание
Дано 3 целых числа. Проверить являются ли они членами геометрической прогрессии.
Входные данные
Три целых числа.
Выходные данные
Являются ли три числа членами геометрической прогресии.
Пояснение
Здесь решить задачу в общем виде труднее, чем предыдущую. Рассмотрим один из простейших вариантов - проверить, являются ли числа подрядыдущими членами геометрической прогрессии. Будем считать, что числа положительны и упорядочены по возрастанию
:) Ну прям аспирант,делающий доклад на заседании кафедры.... Если уж решаете упрощенный вариант задачи - так и говорите решаем задачу в предположении, что числа являются последовательными (подрядыдущими ) членами прогрессии, положительны и упорядочены по возрастанию - а то ведь я неумный преподаватель могу подумать , что речь идет "одном из простейших" вариантов решения ПОСТАВЛЕННОЙ задачи.
-
Забавная штука... смотрю на решения задач...и не улавливаю в чем заключается "Современность" метода обучения программированию по В Потапахину.... Kemiisto можете просветить? , как "адепт" методики... или это все рекламная болтовня?
-
Разумеется, можно взять книгу и провести сравнение лично... но всегда интересно посмотреть именно на "рабочий" результат именно с точки зрения пользователя , которому она нужна (по крайней мере настолько, что он заплатил за книгу свои кровные без принуждения....
-
Забавная штука... смотрю на решения задач...и не улавливаю в чем заключается "Современность" метода обучения программированию по В Потапахину.... Kemiisto можете просветить? , как "адепт" методики... или это все рекламная болтовня?
Я тоже пока не улавливаю. :D Надо хоть пол книги прочитать. А со временем совсем туго. :(
Однако там ведь обучение современному программированию, а не современное обучение программированию. Так что... Ибо скучный текст на современный метод обучения, мягко скажем, не тянет. ;) Может потом пойдёт повеселее...
-
Я тоже пока не улавливаю. :D Надо хоть пол книги прочитать. А со временем совсем туго. :(
Однако там ведь обучение современному программированию, а не современное обучение программированию. Так что... Ибо скучный текст на современный метод обучения, мягко скажем, не тянет. ;) Может потом пойдёт повеселее...
Ну даете :) , в лучших традициях любителей семантики :D надо у эксперта (то есть AlexUs'a) спросить в чем семантическая разница...Но ответ понятен - подождем развития "темы" в задачах. Для меня этот вопрос злободневный - студенты регулярно спрашивают про дополнительную литературу...