Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
быдлокодите на пхп? считаете алгоритмы изжившей практикой? написать абы как, лишь бы работало? написано раз - не читается никогда? выпей йаду. такие "программисты" не нужны.
я больше про то что на практике, алгоритмы бывают нужны крайне редко и в 90% случаев вычитываются из книжек.
для теста я бы лучше посмотрел как новички работают с сетью или файламы, как они умеют обрабатывать ошибки, как они умеют адаптироватся к чужому стилю программирования.
это нужно в программировании каждый божий день - и создает больше проблем чем неэлегантный алгоритм.
а в данном случае что? на входе одна строка, на выходе - другая. Или на входе массив - на выходе массив.
обычная в общем то задача, где надо чуть чуть пошевелить межушным узлом. нет там никаких сложных алгоритмов, надо просто написать простой и понятный код.
а практические навыки проверяются в другом задании, но там сложно определить, чувак опечатался или склад ума у него такой. Все таки готовую структуру рельсов тяжело испоганить - просто бери готовое и юзай. Опять же, куча готовых решений...
зависит от постановки задачи. если вы ему дали "продолжи последовательность" то это уже говно. кто-то догадается что имеется в виду. кто-то не догадается. (я как правило приду через пять минут с парой десятков вариантов трактовки последовательности.) реальной зависимости это догадливость к навыкам программирования не имеет.
да и мне уже интересно чья идея это была на Ruby писать. вроде как бы в универах такое еще не проподается. если перевести вышеприведенную программу на Prolog, где рекурсия есть норма жизни, то она будет почти не говно.
задача - написать программу выводящую заданную последовательность. как она формируется обычно говорим, если сам не догадался.
пишется задача в двух вариантах на ruby и на php, иногда только на ruby - если человек не знает php, то учить не заставляем.
А что касается отсутсвия преподавания ruby в универе - и что? мы теперь должны брать людей без опыта, обучать их за свой счет? поэтому и даются простые задания, что бы понять - есть способности к программированию, или сколько не учи, один хрен выйдет быдлокодер с амбициями.
>что бы понять - есть способности к программированию
Вот меня тоже мучает вопрос, какое отношение эта говнозадача имеет к реальному программированию. Или у вас фирма спортивным занимается?
> где рекурсия есть норма жизни, то она будет почти не говно.
ололо, таки сумел сделать говнище несмотря на рекурсию =)
detect :: (Eq a) => [a] -> Int
detect [] = 0
detect (h:t) = detect' t 1
where
detect' [] r = r
detect' (u:k) r | u == h = detect' k (r+1)
| otherwise = r
dropFront :: (Eq a) => [a] -> [a]
dropFront [] = []
dropFront (h:t) = dropWhile (== h) t
newList :: [Int] -> [Int]
newList old = newList' old []
where
newList' [] acc = acc
newList' lst acc = newList' (dropFront lst) (acc ++ [detect lst] ++ [head lst])
createSeq n | n <= 1 = [1]
| otherwise = create' n [1]
where
create' 0 p = p
create' r p = create' (r-1) (newList p)
main = do
s <- getContents
let t = (read $ head $ lines s) :: Int
mapM_ (print . createSeq) (take t [1..])
Конечно умеет. GHC вроде несколько встроенных преобразований для всяких стрелочек имеет. Бёрд целую книжку написал, используя уникодные символы для почти всех операций.
Только по ушам за такое бить надо.
ну вот примерно с такими или подобными тестовыми заданиями и приходится иметь дело.
структуру для хранения промежуточного результата ищо никто правда не догадался использовать
Это не работа, а тестовое задание. Тут нужно показать, как ты можешь думать, а регексы - это просто знание регексов. Всё равно, что вместо написания тестовой программы найти гем.
Кстати, написанное на руби собственное решение работает чуточку быстрее)
Это в теории, на практике же, решений на регекспе было меньшинство. и большинство этих решений - копипаста из интернетов без малейших изменений. тоже показатель, как человек может думать)
Чаще всего это задание срабатывало как детектор неопытных разработчиков - каких только косяков не было в этом маленьком кусочке кода.
Also в последовательности никогда не будет чисел больше 3
ибо 4 может получиться только из цепочки X,X,X,X -> предыдущая строка имела вид Х раз Х, затем Х раз Х -> 2*X раз Х -> следующая строка не Х,Х,Х,Х а 2*Х, Х.
Также для любой входной цифры Y> 1 строка всегда будет иметь вид ХХХ1Y
> юзать 2 StringBuilder (невиданная оптимизация, ня!)
Я бы написал стрим/appendable(char), который аккумулирует значения и передает свой вывод по цепочке другому такому же стриму. Остановка по -1.
> чтобы искать n'ю строку, если 1..n-1 не нужны
Да. Хотя наверняка есть способы лучше. По сути ведь получается та же рекурсия.
>Или тут хитрый план - сложить стримы в массив, и потом сделать им всем какой-нибудь toString?
Но считать так сразу все - тупо. Надо много памяти.
И тогда рулит итеративный подход .
> По сути ведь получается та же рекурсия.
Ну она, по идее, уложится в 3*n памяти, т.к. каждому слою надо 1-3 цифры, чтобы понять сколько из них совпало. При том, что строки довольно быстро растут, это будет неплохой экономией. Но вот по процу оно один хер считает все полностью ;(
А вон в задачке с PE надо сказать, сколько 1,2 и 3 при n = 10^12... Там уже явно другой подход нужен.
P.S. На вики пишут, что Конвей когда-то доказал, что через некоторое время последовательность рассыпается на независимые "атомы", которые дальше крутятся не затрагивая друг-друга. Может в эту сторону надо копать?
>это будет неплохой экономией
>уложится в 3*n памяти
Плюс оверхед на объектах и счетчиках.
> которые дальше крутятся не затрагивая друг-друга
Кстати да. Возможно, типичные строки.
Но я заметил другую закономерность:
132113
111312
311311
Начала строк идут с периодом в 3 и повторяются.
Причем общий префикс увеличивается, сначала
1
1
3
Потом
11
13
31
итд
Сохранять префикс для последующего использования. Их всего три штуки. Достаточно понять сколько отрезать.
Правда идея Конвея с переходами из состояния в состояние смотрится еще выгоднее.
Но что-то меня пугает фраза 92 of these elements dominate the evolution, in that they either soon make up the whole string, or if not then as the string lengthens to infinity, they make up "almost all" (a measure theory term) of the string.
для теста я бы лучше посмотрел как новички работают с сетью или файламы, как они умеют обрабатывать ошибки, как они умеют адаптироватся к чужому стилю программирования.
это нужно в программировании каждый божий день - и создает больше проблем чем неэлегантный алгоритм.
обычная в общем то задача, где надо чуть чуть пошевелить межушным узлом. нет там никаких сложных алгоритмов, надо просто написать простой и понятный код.
а практические навыки проверяются в другом задании, но там сложно определить, чувак опечатался или склад ума у него такой. Все таки готовую структуру рельсов тяжело испоганить - просто бери готовое и юзай. Опять же, куча готовых решений...
да и мне уже интересно чья идея это была на Ruby писать. вроде как бы в универах такое еще не проподается. если перевести вышеприведенную программу на Prolog, где рекурсия есть норма жизни, то она будет почти не говно.
пишется задача в двух вариантах на ruby и на php, иногда только на ruby - если человек не знает php, то учить не заставляем.
А что касается отсутсвия преподавания ruby в универе - и что? мы теперь должны брать людей без опыта, обучать их за свой счет? поэтому и даются простые задания, что бы понять - есть способности к программированию, или сколько не учи, один хрен выйдет быдлокодер с амбициями.
Вот меня тоже мучает вопрос, какое отношение эта говнозадача имеет к реальному программированию. Или у вас фирма спортивным занимается?
ололо, таки сумел сделать говнище несмотря на рекурсию =)
Чет длинновато как-то.
http://ideone.com/ztuitx
group "112322" = ["11", "2", "3", "22"]
show $ length [1,1] = "2"
[head "11"] = "1"
concatMap f = concat . map f
iterate step "1" = ["1", step "1", step (step "1"), ...]
>\s -> (show $ length s) ++ [head s]
Тут тоже ясно - генерирует эту пару.
Но каким образом оно дуплит где дубликаты и проходит по ним.
group?
Ну да, это комбо конката и мапа, чтобы их по-отдельности не писать.
> group?
Ага. group собирает подряд идущие одинаковые элементы в группы.
grpoup [1,2,2,3,3,1,1,1] = [[1], [2,2], [3,3], [1,1,1]]
P.S. Не забываем, что в хаскеле String = [Char], и поэтому "111" = ['1', '1', '1'] и наоборот.
Да уж это понятно.
Меня больше в тупик ставило что group написан был в конце, а должен выполнятся в начале.
Композиция такая композиция 😉
(f . g) x = f (g x)
P.S. Кстати формула, которую я написал, это настоящее определение точки. Можно даже вбить его в интерпретатор и потестить.
Кстати, а хаскель умеет в юникодные операторы? В духе а ↣ b.
Только по ушам за такое бить надо.
☒ = ☐ . ⨯
✟блядство
☪✟✟∅⊠
P.S. Не гарантирую, что в винде будут видны все буквы 😉
111221
312211
13112221
1113213211
Так штоле?
Мне кажется что в языке, где уважают haml -- все такие.. нет?
структуру для хранения промежуточного результата ищо никто правда не догадался использовать
via http://www.rubyquiz.com/quiz138.html
Ruby - это не "язык", это и есть говно, как и сам Matz.
P.S. обосрите меня пожалуйста..
задача на пошевелить мозгом.
простое, читабельное, поддерживаемое решение в разумные сроки.
Кстати, написанное на руби собственное решение работает чуточку быстрее)
Чаще всего это задание срабатывало как детектор неопытных разработчиков - каких только косяков не было в этом маленьком кусочке кода.
C# (можно сделать кошернее сделав функцию, которая сразу генерит n строк и юзать 2 StringBuilder (невиданная оптимизация, ня!))
ибо 4 может получиться только из цепочки X,X,X,X -> предыдущая строка имела вид Х раз Х, затем Х раз Х -> 2*X раз Х -> следующая строка не Х,Х,Х,Х а 2*Х, Х.
Также для любой входной цифры Y> 1 строка всегда будет иметь вид ХХХ1Y
> юзать 2 StringBuilder (невиданная оптимизация, ня!)
Я бы написал стрим/appendable(char), который аккумулирует значения и передает свой вывод по цепочке другому такому же стриму. Остановка по -1.
Или тут хитрый план - сложить стримы в массив, и потом сделать им всем какой-нибудь toString?
Да. Хотя наверняка есть способы лучше. По сути ведь получается та же рекурсия.
>Или тут хитрый план - сложить стримы в массив, и потом сделать им всем какой-нибудь toString?
Но считать так сразу все - тупо. Надо много памяти.
И тогда рулит итеративный подход .
Ну она, по идее, уложится в 3*n памяти, т.к. каждому слою надо 1-3 цифры, чтобы понять сколько из них совпало. При том, что строки довольно быстро растут, это будет неплохой экономией. Но вот по процу оно один хер считает все полностью ;(
А вон в задачке с PE надо сказать, сколько 1,2 и 3 при n = 10^12... Там уже явно другой подход нужен.
P.S. На вики пишут, что Конвей когда-то доказал, что через некоторое время последовательность рассыпается на независимые "атомы", которые дальше крутятся не затрагивая друг-друга. Может в эту сторону надо копать?
>уложится в 3*n памяти
Плюс оверхед на объектах и счетчиках.
> которые дальше крутятся не затрагивая друг-друга
Кстати да. Возможно, типичные строки.
Но я заметил другую закономерность:
132113
111312
311311
Начала строк идут с периодом в 3 и повторяются.
Причем общий префикс увеличивается, сначала
1
1
3
Потом
11
13
31
итд
Правда идея Конвея с переходами из состояния в состояние смотрится еще выгоднее.
>сложить стримы в массив
Можно и так, только пользы от этих строк никакой.) Я просто в цикле из печатаю
а можно узнать где об этом почитать?
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Appendable.html