- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
def get_next_line(max_level, current_level, current_line_items)
next_line_items = []
result_string = ''
if current_level == 1
next_line_items.push(1)
result_string = "1\n"
else
current_line_number = false
current_line_number_count = 0
current_index = 0
current_line_items.each do |line_number|
if current_index == 0
current_line_number = line_number
current_line_number_count = 1
else
if line_number == current_line_number
current_line_number_count = current_line_number_count + 1
else
next_line_items.push(current_line_number_count)
next_line_items.push(current_line_number)
current_line_number_count = 1
current_line_number = line_number
end
end
if current_index >= current_line_items.length - 1
next_line_items.push(current_line_number_count)
next_line_items.push(current_line_number)
end
current_index = current_index + 1
end
result_string = next_line_items.join(' ') + "\n"
end
if current_level < max_level
result_string = result_string + get_next_line(max_level, current_level + 1, next_line_items).to_s
end
# return result
result_string
end
puts 'Input max level:'
level = gets
puts ''
puts get_next_line(level.to_i, 1, [])
реальное тестовое задание кандитата.
задача - вывести несколько членов последовательности
1
11
21
1211
....
для теста я бы лучше посмотрел как новички работают с сетью или файламы, как они умеют обрабатывать ошибки, как они умеют адаптироватся к чужому стилю программирования.
это нужно в программировании каждый божий день - и создает больше проблем чем неэлегантный алгоритм.
обычная в общем то задача, где надо чуть чуть пошевелить межушным узлом. нет там никаких сложных алгоритмов, надо просто написать простой и понятный код.
а практические навыки проверяются в другом задании, но там сложно определить, чувак опечатался или склад ума у него такой. Все таки готовую структуру рельсов тяжело испоганить - просто бери готовое и юзай. Опять же, куча готовых решений...
да и мне уже интересно чья идея это была на 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