- 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
....
cheef 04.06.2010 12:47 # 0
malleus 04.06.2010 13:04 # 0
Dummy00001 05.06.2010 01:01 # +1
guest 07.06.2010 23:30 # +3
Dummy00001 07.06.2010 23:49 # 0
для теста я бы лучше посмотрел как новички работают с сетью или файламы, как они умеют обрабатывать ошибки, как они умеют адаптироватся к чужому стилю программирования.
это нужно в программировании каждый божий день - и создает больше проблем чем неэлегантный алгоритм.
malleus 08.06.2010 12:08 # 0
обычная в общем то задача, где надо чуть чуть пошевелить межушным узлом. нет там никаких сложных алгоритмов, надо просто написать простой и понятный код.
а практические навыки проверяются в другом задании, но там сложно определить, чувак опечатался или склад ума у него такой. Все таки готовую структуру рельсов тяжело испоганить - просто бери готовое и юзай. Опять же, куча готовых решений...
Dummy00001 08.06.2010 12:22 # +1
да и мне уже интересно чья идея это была на Ruby писать. вроде как бы в универах такое еще не проподается. если перевести вышеприведенную программу на Prolog, где рекурсия есть норма жизни, то она будет почти не говно.
malleus 08.06.2010 12:46 # +1
пишется задача в двух вариантах на ruby и на php, иногда только на ruby - если человек не знает php, то учить не заставляем.
А что касается отсутсвия преподавания ruby в универе - и что? мы теперь должны брать людей без опыта, обучать их за свой счет? поэтому и даются простые задания, что бы понять - есть способности к программированию, или сколько не учи, один хрен выйдет быдлокодер с амбициями.
guest 27.08.2013 10:33 # +1
Вот меня тоже мучает вопрос, какое отношение эта говнозадача имеет к реальному программированию. Или у вас фирма спортивным занимается?
kegdan 27.08.2013 10:36 # 0
xXx_totalwar 03.09.2010 20:37 # +1
ололо, таки сумел сделать говнище несмотря на рекурсию =)
wvxvw 27.08.2013 05:08 # 0
Чет длинновато как-то.
bormand 27.08.2013 07:45 # +3
http://ideone.com/ztuitx
3.14159265 27.08.2013 16:59 # 0
bormand 27.08.2013 17:00 # 0
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"), ...]
3.14159265 27.08.2013 17:03 # 0
>\s -> (show $ length s) ++ [head s]
Тут тоже ясно - генерирует эту пару.
Но каким образом оно дуплит где дубликаты и проходит по ним.
group?
bormand 27.08.2013 17:04 # +1
Ну да, это комбо конката и мапа, чтобы их по-отдельности не писать.
> 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'] и наоборот.
3.14159265 27.08.2013 17:11 # 0
Да уж это понятно.
Меня больше в тупик ставило что group написан был в конце, а должен выполнятся в начале.
bormand 27.08.2013 17:12 # +1
Композиция такая композиция ;)
(f . g) x = f (g x)
P.S. Кстати формула, которую я написал, это настоящее определение точки. Можно даже вбить его в интерпретатор и потестить.
roman-kashitsyn 27.08.2013 17:28 # +1
bormand 27.08.2013 17:29 # 0
Кстати, а хаскель умеет в юникодные операторы? В духе а ↣ b.
roman-kashitsyn 27.08.2013 17:32 # +1
Только по ушам за такое бить надо.
3.14159265 27.08.2013 17:34 # 0
bormand 27.08.2013 17:39 # +1
☒ = ☐ . ⨯
3.14159265 27.08.2013 17:39 # +1
✟блядство
bormand 27.08.2013 17:46 # +2
☪✟✟∅⊠
P.S. Не гарантирую, что в винде будут видны все буквы ;)
guest 04.06.2010 13:52 # 0
malleus 04.06.2010 14:29 # −2
Stalker 04.06.2010 15:58 # 0
Stalker 04.06.2010 16:17 # 0
111221
312211
13112221
1113213211
Так штоле?
malleus 04.06.2010 16:21 # 0
guest 04.06.2010 20:36 # −6
Мне кажется что в языке, где уважают haml -- все такие.. нет?
guest 05.06.2010 14:46 # +1
brannt 28.08.2010 23:26 # 0
malleus 03.09.2010 16:06 # 0
структуру для хранения промежуточного результата ищо никто правда не догадался использовать
neudachnik 15.10.2010 21:05 # 0
via http://www.rubyquiz.com/quiz138.html
Ruby - это не "язык", это и есть говно, как и сам Matz.
P.S. обосрите меня пожалуйста..
malleus 18.10.2010 12:19 # −1
guest 27.08.2013 03:52 # 0
guest 27.08.2013 13:04 # 0
задача на пошевелить мозгом.
простое, читабельное, поддерживаемое решение в разумные сроки.
guest 30.08.2013 01:05 # 0
Кстати, написанное на руби собственное решение работает чуточку быстрее)
guest 30.08.2013 01:59 # 0
Чаще всего это задание срабатывало как детектор неопытных разработчиков - каких только косяков не было в этом маленьком кусочке кода.
kegdan 27.08.2013 07:57 # +1
C# (можно сделать кошернее сделав функцию, которая сразу генерит n строк и юзать 2 StringBuilder (невиданная оптимизация, ня!))
kegdan 27.08.2013 08:15 # 0
ибо 4 может получиться только из цепочки X,X,X,X -> предыдущая строка имела вид Х раз Х, затем Х раз Х -> 2*X раз Х -> следующая строка не Х,Х,Х,Х а 2*Х, Х.
Также для любой входной цифры Y> 1 строка всегда будет иметь вид ХХХ1Y
bormand 27.08.2013 08:43 # 0
kegdan 27.08.2013 09:23 # 0
3.14159265 27.08.2013 17:23 # 0
> юзать 2 StringBuilder (невиданная оптимизация, ня!)
Я бы написал стрим/appendable(char), который аккумулирует значения и передает свой вывод по цепочке другому такому же стриму. Остановка по -1.
bormand 27.08.2013 17:27 # 0
Или тут хитрый план - сложить стримы в массив, и потом сделать им всем какой-нибудь toString?
3.14159265 27.08.2013 17:28 # 0
Да. Хотя наверняка есть способы лучше. По сути ведь получается та же рекурсия.
>Или тут хитрый план - сложить стримы в массив, и потом сделать им всем какой-нибудь toString?
Но считать так сразу все - тупо. Надо много памяти.
И тогда рулит итеративный подход .
bormand 27.08.2013 17:36 # 0
Ну она, по идее, уложится в 3*n памяти, т.к. каждому слою надо 1-3 цифры, чтобы понять сколько из них совпало. При том, что строки довольно быстро растут, это будет неплохой экономией. Но вот по процу оно один хер считает все полностью ;(
А вон в задачке с PE надо сказать, сколько 1,2 и 3 при n = 10^12... Там уже явно другой подход нужен.
P.S. На вики пишут, что Конвей когда-то доказал, что через некоторое время последовательность рассыпается на независимые "атомы", которые дальше крутятся не затрагивая друг-друга. Может в эту сторону надо копать?
3.14159265 27.08.2013 17:49 # 0
>уложится в 3*n памяти
Плюс оверхед на объектах и счетчиках.
> которые дальше крутятся не затрагивая друг-друга
Кстати да. Возможно, типичные строки.
Но я заметил другую закономерность:
132113
111312
311311
Начала строк идут с периодом в 3 и повторяются.
Причем общий префикс увеличивается, сначала
1
1
3
Потом
11
13
31
итд
bormand 27.08.2013 17:58 # 0
kegdan 27.08.2013 18:15 # 0
kegdan 27.08.2013 18:11 # 0
kegdan 27.08.2013 17:53 # 0
3.14159265 27.08.2013 18:04 # 0
Правда идея Конвея с переходами из состояния в состояние смотрится еще выгоднее.
bormand 27.08.2013 18:06 # 0
kegdan 27.08.2013 17:50 # 0
>сложить стримы в массив
Можно и так, только пользы от этих строк никакой.) Я просто в цикле из печатаю
kegdan 27.08.2013 17:56 # 0
а можно узнать где об этом почитать?
3.14159265 27.08.2013 18:06 # 0
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Appendable.html
kegdan 27.08.2013 18:13 # 0
roman-kashitsyn 27.08.2013 09:08 # 0
kegdan 27.08.2013 09:24 # 0
Desktop 24.04.2024 17:37 # 0