КИТА unofficial
Ноябрь 22, 2024, 05:22:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: [1]   Вниз
  Печать  
Автор Тема: Искусство программирования (задача 7)  (Прочитано 6671 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Alder
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« : Сентябрь 24, 2008, 06:04:06 »

Разомнем немного мозги Улыбка

Дана таблица вида:
Код:
    | a | b | c |
  1 |   |   |   |
  2 |   |   |   |
  . |   |   |   |
  . |   |   |   |
  n |   |   |   |

В ячейках произвольно расставлены галочки, минимум одна галочка в строке, например
Код:
    | a | b | c |
  1 |   | v |   |
  2 | v |   | v |
  3 |   |   | v |
  4 | v |   |   |
  5 | v |   |   |


Нужно вычислить все варианты различных комбинаций галочек от первой до последней строки(a, b и c). То есть для примера выше ответ такой:
Два варианта.
Вариант 1: bacaa
Вариант 2: bccaa

Побеждает минимальная по объему программа. Языки реализации - любые (у меня есть ответ на Ruby, он меня поразил своей краткостью)
« Последнее редактирование: Сентябрь 24, 2008, 06:38:43 от Alder » Записан

"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #1 : Сентябрь 25, 2008, 06:42:40 »

Код: (C# 3.0)
   static class Program
    {
        static IEnumerable<string> Combinations(this IEnumerable<string> table)
        {
            foreach (var result in
                from line in table.Count() > 1 ? table.Take(table.Count() - 1).Combinations() : new string[] { string.Empty }
                from character in table.Count() > 0 ? table.Last() : string.Empty
                select line + character)
                yield return result;
        }

        static void Main(string[] args)
        {
            foreach (string s in new string[] { "B", "AC", "C", "A", "A" }.Combinations())
                Console.WriteLine(s);
        }
    }
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
Alder
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #2 : Сентябрь 26, 2008, 12:48:02 »

А кроме Сочина больше никому не интересно?
Записан

"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6134


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #3 : Сентябрь 26, 2008, 08:00:48 »

А кроме Сочина больше никому не интересно?
Я не совсем врублюсь в условие, а так бы поучаствовал.
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #4 : Октябрь 15, 2008, 04:00:59 »

Код: ("F#")
#light
printf "%A" (["B"; "AС"; "С"; "A"; "A"]
|> Seq.fold (fun result current -> [for c in current do for s in result -> s + (string)c]) [""])

Цитировать
["BAСAA"; "BССAA"]

Алдер, давай свой вариант. =)
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
Alder
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #5 : Октябрь 15, 2008, 04:07:40 »

Код: ("Ruby")
# Produces list of permutations of elements according to a set of rules.
#
# Rules determine which elements are acceptable in each position of a single
# permutation. First rule determines which elements are acceptable in the first
# position of a permutation, second rule -- to a second position, and so on.

def permutations(rules)
  rules.inject([[]]) { |solution, rule| apply_rule(solution, rule) }
end

# extends each element of solution with each element of a rule
def apply_rule(solution, rule)
  rule.inject([]) do |acc, possible_value|
    acc.concat(append(possible_value, solution))
  end
end
# returns an array produced by prepending a +value+ to each element of
# +permutations+.
def append(value, permutations)
  permutations.map { |p| p.dup.push(value) }
end

RULES = [[   :x,   2],
   [   :x,    ],
   [1,   :x,  2],
   [   :x,    ]];

puts permutations(RULES).map {|p| p.inspect}.join("\n")

Думаю, что код Сочина на F# будет самым коротким Улыбка
Записан

"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
Storm
Верховный
Администратор
Аспирант
*****

Карма: +29/-0
Offline Offline

Пол: Мужской
Сообщений: 484



« Ответ #6 : Октябрь 21, 2008, 12:25:15 »

F# не знаю, ничего не скажу, но, ИМХО, подобного плана задачи следует решать с применением лишь условного ветвления и цикла с заданным количеством итераций, как учил Дейкстра, иначе это все будет сведено к мерянью языками программирования.

можно написать модуль для Perl с реализацией поставленной задачи и программа будет  сведена к вызову функции с возвратом ссылки на список.

да и задачу уточнить не помешает, потому что не въехал какие варианты на выходе должны быть.
Записан

Только две вещи бесконечны: вселенная и тупость, и я еще не уверен по поводу вселенной. (Альберт Эйнштейн)
----------------------------------------------------
"There are two major products that came out of Berkeley: LSD and UNIX. We don't believe this to be a coincidence." (с) Jeremy S. Anderson

Проходит ирландец мимо паба....
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #7 : Октябрь 21, 2008, 01:43:53 »

F# не знаю, ничего не скажу, но, ИМХО, подобного плана задачи следует решать с применением лишь условного ветвления и цикла с заданным количеством итераций, как учил Дейкстра, иначе это все будет сведено к мерянью языками программирования.
Мир не замкнут на одних лишь императивных языках. Так что если и мерянье, то скорее парадигмами. =)
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.072 секунд. Запросов: 30.