Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2015, 18:50   #1
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
Радость Ребус (TurboPascal, FreePascal)

Всем привет!

Я решал задачу, и потом когда решил отправил её на тестирование у меня не прошёл 2 тест (тесты нельзя просматривать) Я пол часа мучился с кодом, так и не нашёл ошибки Вот условие и код, пожалуйста помогите!


Задача H. Ребус
Имя входного файла: rebus.in
Имя выходного файла: rebus.out
Ограничение по времени: 2 секунды
Ограничение по памяти: 256 мегабайт

На прошлом уроке английского Пете задали домашнее задание. Оно заключалось в разгадывании
ребусов. Каждый ребус — это последовательность картинок. С двух сторон от каждой картинки
могут располагаться апострофы. Каждая картинка обозначает некоторое слово. Предположим, что
перед некоторой картинкой нарисовано i апострофов, а после нее j апострофов. Это значит, что у
слова, которое сопоставляется картинке, необходимо убрать i букв с начала и j с конца, а оставшуюся
его часть записать вместо картинки и апострофов. Так необходимо сделать с каждой картинкой и
окружающими ее апострофами. После этого нужно «склеить» получившиеся кусочки в одно слово.
Оно и будет разгадкой ребуса.

У Пети нет проблем с тем, чтобы сопоставить каждой картинке слово. Но ему очень лень
заниматься отбрасыванием лишних букв и склеиванием слов. Поэтому он попросил вас помочь ему.
Дана строка, которая состоит из маленьких латинских букв, апострофов (символов с кодом 39), а
также пробелов, которые разделяют слова. Апостроф относиться к некоторому слову, если между
ними нет пробела. Если апостроф стоит слева от слова, то у него необходимо убрать одну букву с
начала, если справа — с конца. Потом необходимо склеить все слова в одно.
Например, пусть дана строчка «team ’ ’ ’ ’ school ’ ’ olympiad’ ’ ’». В первом слове ничего изменять
не надо, так как к нему не относится ни один апостроф. Во втором необходимо убрать первые
четыре буквы и получить «ol», из третьего слова получится «ymp». После скеливания трех кусочков
получим строку «teamolymp».

Формат входного файла
В первой строке входного файла дан ребус, длиной не более 100 символов, который необходимо
решить. Гарантируется, что в строчке присутствуют только апострофы (код символа — 39), пробелы
и маленькие латинские буквы, а также, что ребус корректен — нет слова, у которого нобходимо
удалить букв больше, чем его длина.

Формат выходного файла
Выведите одно слово — ответ на ребус.
Примеры

rebus.in
team ’ ’ ’ ’ school ’ ’ olympiad’ ’ ’

rebus.out
teamolymp


Вот мой код:

var
s,rebus: string;
st: array [1..100] of string;
i,l,k,k1,j,a,u,u1,y: longint;
begin
assign(input,'rebus.in');
reset(input);
assign(output,'rebus.out');
rewrite(output);

readln(s);
s:=' '+s+' ';

for i:=2 to length(s)-1 do { Ищем все слова в строке s}
if s[i] <> ' ' then
begin
if s[i-1] = ' ' then l:=i;
if s[i+1] = ' ' then
begin
inc(a);
st[a]:=copy(s,l,i-l+1); {Все найденные слова помещаем в массив}
end;
end;

for i:=1 to a do {начинаем разгадывать ребус, берём первое слово}
begin
u:=0;
u1:=0;
k:=0;
k1:=0;
for j:=1 to length(st[i]) do
if st[i][j] = #39 then inc(k) {считаем сколько в начале ' и как только следующий символ не ' , то начинаем цепочку действий}
else
begin
for y:=length(st[i]) downto
length(st[i]) div 2 do
if st[i][y] = #39 then inc(k1); {1. Считаем сколько кавычек в конце слова}
u1:=k1*2; {2. Даём переменной u1 количество ' в конце слова умноженных на 2 (так как столько же букв нужно будет убрать)}

u:=k*2+1; {3. Даём переменной u количество ' в начале слова умноженных на 2 и +1}
for u:=u to length(st[i])-u1 do {4. И от u до длинны слова минус u1 даём переменной ребус по символу из слова}
rebus:=rebus+st[i][u];
break; {потом переходим к новому слову}
end;
end;
writeln(rebus); {И так получается строка из символов некоторых слов, которая являеться разгадкой ребуса}
end.





Задачу решил, большое спасибо Smogg за помощь!

Последний раз редактировалось VladKB1; 08.03.2015 в 14:21.
VladKB1 вне форума Ответить с цитированием
Старый 07.03.2015, 19:26   #2
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
Радость Номер страницы (TurboPascal, FreePascal)

Всем заранее спасибо!
VladKB1 вне форума Ответить с цитированием
Старый 07.03.2015, 21:04   #3
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Код:
s,rebus: string;
 st: array [1..100] of string;
 i,l,k,k1,j,a,u,u1,y: longint;
Так некрасиво!
Код:
a1,a2: string;
a3: array [1..100] of string;
a4,a5,a6,a7,a8,a9,a10,a11,a12: longint;
Надо так! Я щитаю
Smogg вне форума Ответить с цитированием
Старый 07.03.2015, 22:16   #4
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
Код:
s,rebus: string;
 st: array [1..100] of string;
 i,l,k,k1,j,a,u,u1,y: longint;
Так некрасиво!
Код:
a1,a2: string;
a3: array [1..100] of string;
a4,a5,a6,a7,a8,a9,a10,a11,a12: longint;
Надо так! Я щитаю
Как кому удобнее )) мне удобно с разными переменными
VladKB1 вне форума Ответить с цитированием
Старый 07.03.2015, 23:23   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

При чем здесь разные? Тебе как бы намекают, что множество имен переменных, имена которых не несут ни какого смысла затрудняют чтение и отладку программы. Даже маленькой. А отладка проги в 1000 строк с такими именами переменных равносильна подвигу
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.03.2015, 00:06   #6
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
При чем здесь разные? Тебе как бы намекают, что множество имен переменных, имена которых не несут ни какого смысла затрудняют чтение и отладку программы. Даже маленькой. А отладка проги в 1000 строк с такими именами переменных равносильна подвигу
Все так))

3 переменных еще туда-сюда понять про что они, но десяток - перебор

Последний раз редактировалось Smogg; 08.03.2015 в 00:31.
Smogg вне форума Ответить с цитированием
Старый 08.03.2015, 01:42   #7
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Вроде помог разобраться, если нет извините (исправил самое первое сообщение)
VladKB1 вне форума Ответить с цитированием
Старый 08.03.2015, 14:05   #8
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от VladKB1 Посмотреть сообщение
Вроде помог разобраться, если нет извините (исправил самое первое сообщение)
Молодец! Совершенно другое дело!
Комменты, конечно же, лучше, чем осмысленные имена, но обычно их очень лень писать и полагаешься на "самодокументированность кода". Да вот досада, у каждого свое представление о "самодокументированности кода".


Уже корректирабельно:
Код:
for i:=1 to a do {начинаем разгадывать ребус, берём первое слово}
begin
	u:=0;
	u1:=0;
	k:=0;
	k1:=0;
	for j:=1 to length(st[i]) do
		if st[i][j] = #39 then inc(k) {считаем сколько в начале ' и как только следующий символ 
не ' , то начинаем цепочку действий}
		else
		begin
			for y:=length(st[i]) downto	1 do 
   { непонятно, зачем здесь считалось только до половины строки}
				if st[i][y] = #39 then inc(k1) else break; 
{а если теоретически строка может прогнаться до начала, 
то ставим брейк, если кавычки кончились и начались буквы}
{1. Считаем сколько кавычек в конце слова} 
			u1:=k1*2; 
{2. Даём переменной u1 количество ' в конце слова умноженных на 2 (так как столько же букв нужно будет убрать)}
			u:=k*2+1; 
{3. Даём переменной u количество ' в начале слова умноженных на 2 и +1}
			for u:=u to length(st[i])-u1 do 
{4. И от u до длинны слова минус u1 даём переменной ребус по символу из слова}
				rebus:=rebus+st[i][u];
		break; {потом переходим к новому слову}
		end;
end;

Последний раз редактировалось Smogg; 08.03.2015 в 14:07.
Smogg вне форума Ответить с цитированием
Старый 08.03.2015, 14:18   #9
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
Молодец! Совершенно другое дело!
Комменты, конечно же, лучше, чем осмысленные имена, но обычно их очень лень писать и полагаешься на "самодокументированность кода". Да вот досада, у каждого свое представление о "самодокументированности кода".


Уже корректирабельно:
Код:
for i:=1 to a do {начинаем разгадывать ребус, берём первое слово}
begin
	u:=0;
	u1:=0;
	k:=0;
	k1:=0;
	for j:=1 to length(st[i]) do
		if st[i][j] = #39 then inc(k) {считаем сколько в начале ' и как только следующий символ 
не ' , то начинаем цепочку действий}
		else
		begin
			for y:=length(st[i]) downto	1 do 
   { непонятно, зачем здесь считалось только до половины строки}
				if st[i][y] = #39 then inc(k1) else break; 
{а если теоретически строка может прогнаться до начала, 
то ставим брейк, если кавычки кончились и начались буквы}
{1. Считаем сколько кавычек в конце слова} 
			u1:=k1*2; 
{2. Даём переменной u1 количество ' в конце слова умноженных на 2 (так как столько же букв нужно будет убрать)}
			u:=k*2+1; 
{3. Даём переменной u количество ' в начале слова умноженных на 2 и +1}
			for u:=u to length(st[i])-u1 do 
{4. И от u до длинны слова минус u1 даём переменной ребус по символу из слова}
				rebus:=rebus+st[i][u];
		break; {потом переходим к новому слову}
		end;
end;
ОГРОМНОЕ СПАСИБО!!! Задача прошла все тесты!!! Исправил как вы написали, всё получилось!!!

Код:
var
 s,rebus: ansistring;
 st: array [1..100] of ansistring;
 i,l,k,k1,j,a,u,u1,y: longint;
begin
 assign(input,'rebus.in');
 reset(input);
 assign(output,'rebus.out');
 rewrite(output);

 readln(s);
 s:=' '+s+' ';

 for i:=2 to length(s)-1 do
 if s[i] <> ' ' then
 begin
  if s[i-1] = ' ' then l:=i;
  if s[i+1] = ' ' then
  begin
   inc(a);
   st[a]:=copy(s,l,i-l+1);
  end;
 end;

 for i:=1 to a do
 begin
  u:=0;
  u1:=0;
  k:=0;
  k1:=0;
  for j:=1 to length(st[i]) do
  if st[i][j] = #39 then inc(k)
  else
  begin
   for y:=length(st[i]) downto 1 do
   if st[i][y] = #39 then inc(k1) else break;
   u1:=k1*2;

   u:=k*2+1;
   for u:=u to length(st[i])-u1 do
   rebus:=rebus+st[i][u];
   break;
  end;
 end;
 writeln(rebus);
end.
VladKB1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ребус на Делфи Jane_Air Помощь студентам 4 11.01.2014 18:40
Ребус Delphi2010 Василий01 Помощь студентам 3 24.12.2012 16:08
Ребус! prelest' Паскаль, Turbo Pascal, PascalABC.NET 1 30.05.2011 22:59
Ребус Junger Помощь студентам 5 30.05.2011 10:29
Ребус solnze.90 Паскаль, Turbo Pascal, PascalABC.NET 10 11.01.2011 23:23