IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Помогите решить элементарную таску, Тест светодиодов
xxx000
сообщение 2.06.2010 20:53
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


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

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


пожалуйста помогите!!!

Сообщение отредактировано: Lapp - 3.06.2010 5:03
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
TarasBer
сообщение 3.06.2010 10:55
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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

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

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 4.06.2010 6:39
Сообщение #3


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(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.

На примере все отрабатывает четко )).
Прошу прощения, я тут немного отступил от правил оформления..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.07.2025 11:22
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"