Наши любимые Лев Николаевич и Анна Аркадьевна вновь пустились в приключения! На этот раз некто взял случайный фрагмент из 75 подряд идущих строк файла, и попытался их перекодировать. Но не точно из кодировки utf-8, а из случайной (набор разрешённых кодировок см. ниже). Кодировка, в которую происходило перекодирование, тоже была выбрана случайно из того же набора. Операция прошла успешно! Возможно, не один раз, а два или даже три (но не больше). Получилась редкостная бНОПНЯ. Вывести первую строку исходного фрагмента, в предположении, что обратная перекодировка также возможна.
- Набор допустимых кодировок:
- cp1026 cp1140 cp1256 cp273 cp437 cp500 cp775 cp850 cp852 cp855 cp857 cp860 cp861 cp862 cp863 cp865 cp866 gb18030 hp_roman8 iso8859_10 iso8859_11 iso8859_13 iso8859_14 iso8859_15 iso8859_16 iso8859_2 iso8859_4 iso8859_5 iso8859_9 koi8_r mac_cyrillic mac_greek mac_latin2 mac_roman utf_8
- Ввод делать со стандартного ввода (не из файла)
Дополнение. Пока во временнЫе рамки укладывается только решение, в котором на любом этапе перекодировки участвуют только такие пары, которые одновременно пригодны и для исходного файла, т. е. для первого этапа. Поскольку совершенно не факт, что на втором этапе не появятся новые варианты, в этом году будем решать задачу с этим дополнительным допущением.
…содержимое файла…
- Файл с примером получен двумя операциями перекодирования:
- cp775 → gb18030, cp1026 → iso8859_9
- Например, в Linux это аналогично вот такой конструкции:
$ cat fragment | iconv -f cp775 -t gb18030 | iconv -f cp1026 -t iso8859-9 > bnopnya
Чтобы проверить: iconv -t cp1026 -f iso8859-9 bnopnya | iconv -t cp775 -f gb18030
Подсказка: число в 75 строк взято не случайно! В этой задаче сначала нужно поисследовать сам текст романа (я для этого написал маленькую программку (спойлер):
)
она. - Не говорите, пожалуйста, со мной про оперу, вы ничего не понимаете в
Ещё один вариант редкостной бНОПНи, на этот раз 3 перекодировки
внаймы, а самому хозяйничать, держать скотину, навозить поля, сажать леса.
('iso8859_5', 'utf_8') ('koi8_r', 'gb18030') ('iso8859_10', 'gb18030')
- На моём компьютере решение заняло 5 секунд (но бывает и до 10; на EJudge, соответственно, примерно до 20)
Окончательный спойлер:
Я решал задачу так (это далеко не самый оптимальный алгоритм):
Написал отдельную программку, которая нашла подстроку-инвариант текста с русскими буквами, встречающийся в любых 75 подряд идущих строках (довольно предсказуемо, кстати)
Теперь о решении: