Alder
|
|
« : Сентябрь 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
Пол:
Сообщений: 1518
|
|
« Ответ #1 : Сентябрь 25, 2008, 06:42:40 » |
|
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
|
|
« Ответ #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
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #3 : Сентябрь 26, 2008, 08:00:48 » |
|
А кроме Сочина больше никому не интересно? Я не совсем врублюсь в условие, а так бы поучаствовал.
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #4 : Октябрь 15, 2008, 04:00:59 » |
|
#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
|
|
« Ответ #5 : Октябрь 15, 2008, 04:07:40 » |
|
# 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
Пол:
Сообщений: 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
Пол:
Сообщений: 1518
|
|
« Ответ #7 : Октябрь 21, 2008, 01:43:53 » |
|
F# не знаю, ничего не скажу, но, ИМХО, подобного плана задачи следует решать с применением лишь условного ветвления и цикла с заданным количеством итераций, как учил Дейкстра, иначе это все будет сведено к мерянью языками программирования.
Мир не замкнут на одних лишь императивных языках. Так что если и мерянье, то скорее парадигмами. =)
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
|