Различия между версиями 7 и 11 (по 4 версиям)
Версия 7 от 2020-11-28 21:32:44
Размер: 5055
Редактор: FrBrGeorge
Комментарий:
Версия 11 от 2020-11-30 19:14:08
Размер: 5232
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 9: Строка 9:
   * Цифры и символы из набора `()[]+-*/%;.,>=<"`    * Цифры и символы из набора `()[]+-*/%;.,>=<"!:`
Строка 18: Строка 18:
  * Подсказка: на входе ''процедура на языке Рапира'', и только она. Не забудьте о возможных переводах строки в конце неё (то ли они есть, то ли нет).   * Подсказка: На входе ''процедура на языке Рапира'', и только она. Мы ничего не знаем о тексте ''внутри'' процедуры. Не забудьте о возможных переводах строки и пробелах вокруг неё (то ли они есть, то ли нет).
Строка 21: Строка 21:
  * Спойлер. Я решал задачу так: /* Составил таблицу всех допустимых (не вызывающих исключение и однозначных) на данном алфавите перекодировок длины не больше 4. Для удобства в начало алфавита поместил букву "П" (от слова "ПРОЦ", с которого начинается процедура). В действительности таблица была сначала для длины 1, и проверял я по ней, потом на её основе — длины 2 и т. д. Проверял так: если перекодированные алфавит в таблице начинается на тот же байт, что и закодированная процедура, надо попытаться перекодировать её обратно по соответствующей цепочке перекодировок. Если получилось, да ещё результат состоит из больших букв, начинается на "ПРОЦ ", а заканчивается на "КНЦ;", шанс, что мы ошиблись, нулевой. Данный пример может получаться путём разных перекодировок; вот соответствующее значение из таблицы моего решения: `('CP1251', 'CP866') ('koi8-r', 'utf8')`. */   * Спойлер. Я решал задачу так:
  {{{#!wiki comment
   
* Составил таблицу всех допустимых (не вызывающих исключение и однозначных) на данном алфавите перекодировок длины не больше 4.
    *
Для удобства в начало алфавита поместил букву "П" (от слова "ПРОЦ", с которого начинается процедура).
    *
В действительности таблица была сначала для длины 1, и проверял я по ней, потом на её основе — длины 2 и т. д.
   *
Проверял так:
    * если перекодированный
алфавит в таблице начинается на тот же байт, что и закодированная процедура, надо попытаться перекодировать её обратно по соответствующей цепочке перекодировок.
    *
Если получилось, да ещё результат состоит из ншего алфавита, начинается на "ПРОЦ ", а заканчивается на "КНЦ;", шанс, что мы ошиблись, нулевой.
 
Данный пример может получаться путём разных перекодировок; вот соответствующее значение из таблицы моего решения: `('CP1251', 'CP866') ('koi8-r', 'utf8')`.
  }}}

Текст процедуры на языке Рапира в кодировке koi8-r был несколько (не более четырёх раз) раз перекодирован, причём перекодировщику сообщали совершенно произвольную исходную и целевую кодировку (например, из CP866 в latin1). Восстановить предполагаемый текст процедуры.

  • В первой строке ввода — возможные кодировки, не более 8 (через пробел)
  • Во второй строке ввода — последовательность шестнадцатеричных цифр — это байты закодированной процедуры
  • На выходе — исходный текст процедуры.
  • Для упрощения будет считать, что в программе на языке Рапира могут присутствовать только
    • Заглавные русские и латинские буквы (строчных нет)

    • Цифры и символы из набора ()[]+-*/%;.,>=<"!:

    • Пробелы, табуляции и переводы строки
  • Известно, что неоднозначная перекодировка (в которой более одного входного символа соответствует одному выходному) не производилась

utf8 koi8-r CP1251 CP866 ISO8859-1 ISO8859-5 mac-arabic cp1140
d0aed091e2959ed19120d0a6d094e29591d091d09428293b0a20202020d093d098d093e2959ee295933a2022d099e29593d091e29591d093d0a6d094d093d095e295992c20e2959ce29598d09121223b0ae2959ae2959dd1913b0a
  • Подсказка: На входе процедура на языке Рапира, и только она. Мы ничего не знаем о тексте внутри процедуры. Не забудьте о возможных переводах строки и пробелах вокруг неё (то ли они есть, то ли нет).

  • Подсказка 2 (мелкая): у типа bytes есть удобный метод…

  • Подсказка 3 (от К. О.): текст процедуры выводится в кодировке utf-8, а не в КОИ8-Р (спасибо, Кэп!)
  • Спойлер. Я решал задачу так:
  • В этом примере требуется две перекодировки

ПРОЦ СТАРТ();
    ВЫВОД: "ЗДРАВСТВУЙ, МИР!";
КНЦ;

А в этом примере — четыре (результат тот же):

utf8 koi8-r CP1251 CP866 ISO8859-1 ISO8859-5 mac-arabic cp1140
6641665066316635c28066476644663366506644c288c289c29bc28ec280c280c280c28066c2b966c2ad66c2b966316657c29ac280c28266c3b466576650663366c2b96647664466c2b9664566c29fc28cc28066c39c66c3996650c281c282c29bc28e6639665c6635c29bc28e

И сверх программы (кто дождётся результата? у меня 5 секунд) — пять перекодировок (результат тот же)

utf8 koi8-r CP1251 CP866 ISO8859-1 ISO8859-5 mac-arabic cp1140
27665c27a6a268f6a22f68f727cf275fa2686a27a6275f685a68b2683968d568f768f768f768f7272527c92725a268f6a2c2689f68f7683727caa2c227a6a2686a272527cf275f2725273e2768de68d268f7a2d1a2687927a668536837683968d5a2c7a2c5a22f683968d5


CategoryHomework

LecturesCMC/PythonIntro2020/Homework_TotalBnopnya (последним исправлял пользователь FrBrGeorge 2020-11-30 19:14:08)