Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите решить элементарную таску
Форум «Всё о Паскале» > 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.

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