Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разложение числа на слагаемые, помогите разобраться 
:(
    Опции темы
PavAks
  Дата 23.1.2008, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.1.2008

Репутация: нет
Всего: нет



Всем привет! Помогите, плз, с идеей. Я для изучения ruby накачал в нете разных заданий, и пытаюсь их выполнить. Изучаю его недолго smile . Поэтому извинете за глупый вопрос, но я с ним уже неделю бьюсь smile . Вот текст задачи: 

Написать метод partitions_p(n), которые получают целое положительное число n и возвращают все разложения числа n на сумму натуральных слагаемых (т.е. возвращают массивы слагаемых). В разложениях слагаемые идут по убыванию. 
Пример: [[5], [4, 1], [3, 2], [3, 1, 1], [2, 2, 1], [2, 1, 1, 1], [1, 1, 1, 1, 1]]



з.ы. подскажите, пожалуйста, с какого боку к этому подходить. Или, может, есть какая функция, которая делает такое разложение? Или делать все циклами?
PM MAIL   Вверх
setq
Дата 23.1.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 707
Регистрация: 28.9.2003

Репутация: нет
Всего: 26




Если такая функция уже есть, то задача становится немного бессмысленной. Циклы - хорошая идея, почему нет?)
PM MAIL   Вверх
PavAks
Дата 23.1.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.1.2008

Репутация: нет
Всего: нет



Просто я не могу себе представить как это делать циклами  smile 

PM MAIL   Вверх
PavAks
  Дата 3.2.2008, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.1.2008

Репутация: нет
Всего: нет



Что-то начало получаться, хотя не все разложения выдает smile 

[[5], [4, 1], [3, 2, 1], [3, 2], [3, 1, 1, 1], [2, 2, 1], [2, 1, 1, 1], [1, 1, 1, 1, 1]]
-----------------------------------------------------------------------
[[10], [9, 1], [8, 2], [7, 3], [6, 4], [5, 5], [5, 4, 1], [5, 3, 2], [5, 2, 2, 1], [5, 1, 1, 1, 1, 1], [4, 4, 2], [4, 4, 1, 1], [4, 3, 3], [4, 2, 2, 2], [4, 1, 1, 1, 1, 1, 1], [3, 3, 3, 1], [3, 3, 2, 2], [3, 2, 2, 2, 1], [3, 1, 1, 1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [2, 2, 2, 2, 1, 1], [2, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]

Код

number = gets.chomp.to_i
i = number
j = 0
count = 0
arr1 = []
arr2 = []
arr3 = []
while i != number/2
i -= 1
j += 1
arr2.push(i, j)
arr2 = arr2.sort{|x, y| y<=>x}
arr1.push(arr2)
tmp = arr2[0]
arr2 = Array.new
while count != number/2
count += 1
tmp1 = tmp % count
tmp2 = tmp/count
tmp2.times do arr3.push(count) end
arr3.push(j)
if tmp1 != 0
arr3.push(tmp1)
end
arr3 = arr3.sort{|x, y| y<=>x }
arr1.push(arr3)
arr3 = Array.new
end

count = 0
end

p arr1.sort{|x, y| y<=>x }.uniq


На числах больше 10 не очень хорошо работает  :(

Это сообщение отредактировал(а) PavAks - 3.2.2008, 01:46
PM MAIL   Вверх
fixxer
Дата 5.2.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: нет
Всего: 27



как то сложно у Вас получилось. У меня так

Код

def items(b)
    result = [[b]]
    (1..(b - 1)).each do |i|
        items(b - i).each do |j| 
            result.push(([i] + j).sort) 
        end
    end
    return result.sort
end

p items(5).uniq.reverse


Изучаю ruby совсем недавно. Уверен, что можно сделать еще короче.

Это сообщение отредактировал(а) fixxer - 5.2.2008, 23:16


--------------------
user posted image
PM MAIL ICQ   Вверх
fixxer
Дата 6.2.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: нет
Всего: 27



удалось сократить до

Код

def items(b)
  return (1..(b - 1)).inject([[b]]) {|s, i| s + items(b - i).collect{|j| ([i] + j).sort}}.sort
end

p items(5).uniq.reverse


ЗЫ. Админы, а когда будет подсветка для ruby?


--------------------
user posted image
PM MAIL ICQ   Вверх
PavAks
  Дата 9.2.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.1.2008

Репутация: нет
Всего: нет



ну ты даешь... класс...  smile 
PM MAIL   Вверх
source777
Дата 9.2.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Эх, решение уже найдено, но у меня есть небольшое исправление, чтобы результат выводился именно в том виде как в написано в задании:
Код

def items(b)
  return (1..b/2).inject([[b]]) {|s, i| s + items(b - i).collect{|j| ([i] + j).sort.reverse}}.uniq.sort.reverse
end

p items(5) # => [[5], [4, 1], [3, 2], [3, 1, 1], [2, 2, 1], [2, 1, 1, 1], [1, 1, 1, 1, 1]]
 smile 

Это сообщение отредактировал(а) source777 - 9.2.2008, 17:25


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Google
  Дата 22.4.2019, 03:19 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby: Общие вопросы"
source777
  • С чего начать? начинаем
  • Ссылки на полезные ресурсы смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.