II Командный чемпионат Санкт-Петербурга по программированию

Санкт-Петербург, 1994 год

Задачи

Задача A. Качество программы

Имя входного файла: a.in
Имя выходного файла: a.out
Ограничение времени: 30 секунд

Чтобы автоматизировать проверку качества программного продукта, были выработаны критерии, по которым определяются плохие и хорошие черты программы. Некоторые критерии касались общего стиля программирования. В данной задаче требуется найти значения для простейших из этих критериев.

Напишите программу, которая вводит из файла исходный текст программы на языке Pascal и определяет:

Следующая информация поможет вам вспомнить структуру программы на языке Pascal. Текст программы записывается в свободном формате. Строки могут быть произвольной длины. Текст комментария начинается с символа { и заканчивается символом }. Строковая константа начинается и заканчивается символом апострофа '. Строковая константа не может располагаться на нескольких строках. Два апострофа подряд '' внутри строковой константы обозначают один символ апострофа и не являются концом или началом строковой константы. Однако при подсчете '' считаются как два символа. Фигурные скобки { и } внутри строковой константы не являются ограничителями комментария, так же, как и апострофы внутри комментария не являются ограничителями строковой константы.

Файл исходных данных содержит правильную (не содержащую синтаксических ошибок) программу на языке Pascal. Файл не содержит символов табуляции. Строки могут быть сколь угодно длинными. Символы перевода строки при подсчете не учитываются. Длина файла исходных данных не превосходит 64-х Кбайт.

Пример

a.ina.out
program TEST;
    { раздел описания переменных:
    }
var i: integer;
    s: string;
begin
   s := 'Печатаем число '; {это комментарий}
   for i := 1 to 5 do
      writeln (s, i);
   s := '{эта строка не является комментарием}';
end.  {конец программы TEST}
Количество строк в программе = 11
Общее число символов в программе = 247
Количество пустых строк в программе = 0
Количество комментариев в программе = 3
Общее число символов в комментариях = 73
Количество операторов GOTO = 0

Задача B. 1994**N

Имя входного файла: b.in
Имя выходного файла: b.out
Ограничение времени: 60 секунд

Для заданного N (1 ≤ N ≤ 1994) вычислить значение выражения

1994**N

Файл исходных данных содержит одно или несколько чисел, разделенных пробелами и (или) символами перевода строки. Для каждого такого числа вывести в выходной файл с новой строки значение указанного выражения.

Пример

b.inb.out
2 10
3976036
993691419595690831723569386546176

Задача C. Анализ зависимости данных

Имя входного файла: c.in
Имя выходного файла: c.out
Ограничение времени: 30 секунд

Для определения того, могут ли итерации цикла выполняться параллельно (на векторном компьютере) используется анализ зависимости данных. Ваша задача провести анализ зависимости данных для оператора цикла с оператором присваивания одномерному массиву.

Во входном файле содержится набор циклов. Каждый цикл содержит один оператор присваивания, который включает элементы одномерного массива A c линейными индексами и счетчик цикла I. Для каждого цикла требуется определить какому из следующих условий он удовлетворяет:

Оператор присваивания записывается в виде

A [expr] := expr2

где в качестве индексов массива A могут быть следующие выражения:

n  I  I-m  I+m  n*I  n*I+m  n*I-m

Здесь m и n - целые числа в диапазоне -32768..+32767. Выражение в правой части присваивания является арифметическим выражением, записанным по правилам языка Pascal. Выражение не содержит строковых констант и комментариев. Все вырезки из массива A удовлетворяют описанным выше требованиям.

Оператор цикла задается в виде LOOP mm,nn,pp. Цикл задает выполнение оператора присваивания для каждого I от mm до nn с шагом pp. Если pp не задано, то шаг считается равным 1. Границы и шаг цикла являются целыми числами в диапазоне -32768..+32767. Шаг цикла pp≠0.

Оператор может быть выполнен параллельно, если после присваивания элементу массива A (левая часть присваивания), его значение не используется в правой части оператора. Анализ зависимости не выполняется, если цикл работает один или два раза.

Исходные данные

Файл исходных данных содержит одну или более строк, каждая из которых содержит цикл с оператором присваивания в виде:

LOOP mm,nn,pp: A [expr] := expr2

или

LOOP mm,nn: A [expr] := expr2

Длина строки файла исходных данных не превосходит 80 символов.

Вывод программы

Для каждого исходного оператора цикла вывести в выходной файл 2 строки: сам оператор и результат анализа зависимости данных:

        
Не выполнится ни разу
Выполнится один раз
Выполнится два раза
Параллельное исполнение
Требует последовательного исполнения

Пример

c.in
LOOP 1,32767: A [I] := A [I]+1
LOOP 1,7: A [-2*I+50] := A [I-1]+A [I+40]
LOOP 2,800,2: A [I] := -2.03E-17*A [2*I-1]+A [I]
LOOP 7,1,-1: A [I] := A [I+6]*3
LOOP 2,-90,30: A [I] := 2
LOOP 2,3: A [I] := A [I]*4.0
c.out
LOOP 1,32767: A [I] := A [I]+1
Параллельное исполнение
LOOP 1,7: A [-2*I+50] := A [I-1]+A [I+40]
Требует последовательного исполнения
LOOP 2,800,2: A [I] := -2.03E-17*A [2*I-1]+A [I]
Параллельное исполнение
LOOP 7,1,-1: A [I] := A [I+6]*3
Требует последовательного исполнения
LOOP 2,-90,30: A [I] := 2
Не выполнится ни разу
LOOP 2,3: A [I] := A [I]*4.0
Выполнится два раза

Задача D. Ленточный клеточный автомат

Имя входного файла: d.in
Имя выходного файла: d.out
Ограничение времени: 30 секунд

Ленточный клеточный автомат - это абстрактная вычислительная машина, на вход которой подается склеенная в кольцо лента с символами. Эта лента является также единственным запоминающим устройством автомата. Автомат работает пошагово согласно таблице переходов. Таблица переходов определяет мгновенное изменение содержимого ленты за один шаг автомата. Элемент таблицы переходов задает новое значение ячейки в зависимости от ее содержимого и содержимого двух соседних ячеек.

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

Файл исходных данных содержит один или несколько наборов исходных данных, разделенных пустой строкой.

В первой строке набора исходных данных содержится начальное состояние ленты (исходные данные автомата). Допустимыми символами на ленте являются большие и малые латинские буквы, цифры и символ подчеркивания. Длина ленты не превосходит 20-ти символов и не меньше 3-х символов.

Во второй строке набора исходных данных содержится число шагов автомата N. N - целое число от 0 до 100.

В следующих строках набора исходных данных содержится описание таблицы переходов. Описание состоит из правил, которые записываются на отдельных строках в виде:

iAj -> B

Такое правило определяет, что если ячейка содержит символ A, соседняя ячейка слева содержит символ i, соседняя ячейка справа содержит символ j, то на следующем шаге значением ячейки будет символ B.

У первой ячейки соседом слева является последняя ячейка, а у последней ячейки соседом справа является первая. Если для ячейки и ее соседей нет подходящего правила, то ее содержимое на данном шаге не изменяется.

Для каждого набора исходных данных вывести в выходной файл с новой строки содержимое ленты автомата через заданное число шагов.

Все исходные данные корректны и их проверка не требуется. Длина файла исходных данных не превосходит 64-х Кбайт.

Пример

d.ind.out
100010011
2
101 -> 1
001 -> 1
010 -> 0
110 ->> 0

ABC
6
ADC -> Q
001001110
ABC

Задача E. Произведение цифр

Имя входного файла: e.in
Имя выходного файла: e.out
Ограничение времени: 30 секунд

Задано целое число N (1 ≤ N ≤ 1000000). Требуется найти наименьшее натуральное число с произведением цифр N.

Исходный файл содержит одно или несколько чисел, разделенных пробелами и (или) символами перевода строки. Для каждого такого числа вывести в выходной файл с новой строки искомое минимальное число. Если такого числа не существует, вывести 0.

Пример

d.ind.out
10
13
25
0