Только что принял участие в сабже. Результаты будут завтра. Задачки несложные. Кто хочет — можно присоединяться, потому что регистрация открыта будет ещё почти сутки.
UPD: Прошёл квал, решив все задачки. Первый раунд — на следующих выходных.
Товарищ
Антон подсказал остроумное решение первой задачи (Alien Language). Вкратце напомню её суть.
Дан набор слов языка и несколько шаблонов вида типа такого: abc(xy)d(gf). Буквы в скобках означают, что на месте этих скобок может быть любая из этих букв. То есть, шаблону выше удовлетворяют следующие слова: abcxdg, abcydg, abcxdf и abcydf. Необходимо найти для каждого из заданных шаблонов, сколько слов из словаря им соответствуют.
Задача при заданных там ограничениях решается в лоб. Самый крутой способ (который я узнал от Антона) — это преобразовать шаблон в регексп, заменив круглые скобки на квадратные :) Тогда задача решается буквально в пару строчек на руби путем проверки каждого слова словаря на соотвествие этому регекспу. Любуйтесь короче:
l, d, n = gets.split(' ').map { |w| w.to_i }
dictionary = Array.new(d) { |i| gets.chomp }
1.upto(n) do |test_no|
pattern = gets.chomp.gsub('(', '[').gsub(')', ']')
regex = Regexp.new(pattern)
count = dictionary.select { |word| regex =~ word }.size
puts "Case ##{test_no}: #{count}"
end