Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите решить элементарную таску
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
xxx000
Вот препод задал таску:
я думал её решил, а оказалось, что если светодиод уже работал, а потом перегорел, то вывеси неверно, и вот этот случай я не рассматривал, и не знаю как.

1995 East-Central Regionals ACM International Collegiate Programming Contest Sponsored by Microsoft

Много электронных устройств имеют цифровые индикаторы, которые используют наборы светодиодов. Элемент обычного цифрового дисплея использует семь прямоугольных светодиодов с сегментами, расположенными следующим образом: Цифры отображаются с помощью включения различных комбинаций из семи сегментов в соответствии со следующей таблицей: Свечение сегментов в цифрах (Y - да, N - нет)

a b c d e f g
0
Y Y Y Y Y Y N
1
N Y Y N N N N
2
Y Y N Y Y N Y
3
Y Y Y Y N N Y
4
N Y Y N N Y Y
5
Y N Y Y N Y Y
6
Y N Y Y Y Y Y
7
Y Y Y N N N N
8
Y Y Y Y Y Y Y
9
Y Y Y Y N Y Y

Например, цифра три будет отображена как совокупность сегментов {a,b,c,d,g}. Задача ниже абстрагирована из подобной задачи, встреченной в отделе проверки качества входящих частей на фабрике по производству микроволновых печей. Приходящие семисегментные светодиодные индикаторы проверяются на их корректное функционирование с помощью автоматического оборудования, работающего под программным управлением. Замечание: решение задачи ниже ни достаточно, ни необходимо для тестирования в реальных условиях.

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

Формат ввода: ввод состоит из серий наборов данных, имеющих следующий формат. Первая строка - натуральное одиночное число больше 0 и меньше 11. Число упорядочено по левому краю строки ввода. Следующие N строк - в каждой строке есть последовательность из семи состояний. Символы Y/N показывают состояние свечения сегментов индикатора. Последовательные строки предположительно представляют последовательность обратного отсчёта. Первый из семи символов - это свечение сегмента "a". Конец данных отмечается нулевым набором данных с нулём на первой строке. Нет информации о том, где последовательность обратного отсчёта начинается для данного набора данных. Нет информации, которая переносится с одного набора в другой, каждый набор данных представляет отдельный светодиодный индикатор.

Формат вывода: для каждой предположительной последовательности обратного отсчёта во входном файле вы должны ответить MATCH или MISMATCH в зависимости от того, может ли эта последовательность быть верной последовательностью обратного отсчёта где-нибудь внутри последовательности {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, если неизвестное количество неисправных элементов присутствует в начале теста и, возможно, сгорит во время тестирования.

ledtest.in
1
YYYYYYY
2
NNNNNNN
NNNNNNN
2
YYYYYYY
YYYYYYY
3
YNYYYYY
YNYYNYY
NYYNNYY
3
YNYYYYN
YNYYNYN
NYYNNYN
3
YNYYYYN
YNYYNYN
NYYNYYN
4
YYYYYYY
NYYNNNN
NNYYYYN
NNNYNNN
3
NNNNNNN
YNNNNNN
NNNNYNN

ledtest.out
MATCH MATCH MISMATCH MATCH MATCH MISMATCH MATCH MATCH


пожалуйста помогите!!!
Unconnected
Два раза прочитал эту элементарную таску, и по-моему всё сводится к тому, чтобы узнать, может ли совокупность включенных секторов индикатора при небольшом дополнении образовывать цифру (цифры, кусочек обратного отсчёта). Правда ведь?)
Lapp
Я взял на себя смелость отредактировать условие, чтобы сделать его читабельнее. Я только вставил разрывы строк; все огрехи машинного перевода остаются на совести лентяя xxx000.
Lapp
Цитата(Unconnected @ 3.06.2010 0:22) *
всё сводится к тому, чтобы узнать, может ли совокупность включенных секторов индикатора при небольшом дополнении образовывать цифру (цифры, кусочек обратного отсчёта). Правда ведь?)
Плюс, образуют ли эти цифры фрагмент последовательности обратного отсчета. Причем, в пределах одного теста плохие сегменты должны оставаться плохими, рабочие сегменты могут портиться в процессе теста.
TarasBer
> рабочие сегменты могут портиться в процессе теста.

Нет, наоборот. Так чуть легче.

> Ни один из сегментов не сгорит во включенном состоянии, и ни один из вышедших из строя сегментов не будет восстановлен.
TarasBer
Всё, я запутался.

> и некоторые из элементов могут выйти из строя во время теста. Ни один из сегментов не сгорит во включенном состоянии

Ничего не понимаю.
xxx000
Цитата(TarasBer @ 3.06.2010 10:55) *

Всё, я запутался.

> и некоторые из элементов могут выйти из строя во время теста. Ни один из сегментов не сгорит во включенном состоянии

Ничего не понимаю.


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

Я не могу сделать,если предположим, диод был сгоревшим, и я предположил это и сделал его работающим, а потом диод в этой же последовательности заработал, то это неверно!
Lapp
Цитата(TarasBer @ 3.06.2010 11:55) *
> и некоторые из элементов могут выйти из строя во время теста.
> Ни один из сегментов не сгорит во включенном состоянии

Ничего не понимаю.
Согласен с Тарасом, эта фраза действительно превносит некий элемент бардака - возникает вопрос: а гаснут ли сегменты между тестами? smile.gif
Но если встать на позиции здравого смысла и отнести все сомнения на счет не вполне адекватного перевода (или еще чего-то), то все становится более-менее ясно, и решение этой "элементарной таски" сразу вырисовывается в голове - где-то примерно так:
const
l= 7;
g= 9;
m= 10;
d: array [0..g] of set of 1..l = (
[1,2,3,4,5,6 ],
[ 2,3 ],
[1,2, 4,5, 7],
[1,2,3,4, 7],
[ 2,3, 6,7],
[1, 3,4, 6,7],
[1, 3,4,5,6,7],
[1,2,3 ],
[1,2,3,4,5,6,7],
[1,2,3,4, 6,7]
);

var
r: array [1..m] of set of 1..l; // readings
p: array [1..m] of set of 0..g; // possible digits
b: set of byte; // bad
f: text;
i,j,k,n: integer;
s: string;
y: boolean; // yes

begin
Assign(f,'ledtest.in');
ReSet(f);
while not EoF(f) do begin
readLn(f,n);
for i:=1 to n do begin
ReadLn(f,s);
r[i]:=[];
for j:=1 to l do if UpCase(s[j])='Y' then Include(r[i],j);
end;
for i:=1 to n do begin
b:= [1..l]-r[i];
for j:= i+1 to n do b:= b-r[j];
p[i]:=[];
for j:=0 to g do if (d[j]-r[i]<=b) and (r[i]-d[j]=[]) then Include(p[i],j)
end;
j:=n-1;
repeat
y:=true;
for k:=0 to n-1 do y:=y and (j-k in p[k+1]);
Inc(j)
until y or (j>g);
Write(y,' ')
end;
Close(f);
ReadLn
end.

На примере все отрабатывает четко )).
Прошу прощения, я тут немного отступил от правил оформления..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.