Форум программистов, компьютерный форум, киберфорум
Наши страницы
PascalABC.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Eugene_41
0 / 0 / 0
Регистрация: 06.09.2019
Сообщений: 8
1

Ошибка в решении задачи "Занимательная физика"

08.09.2019, 06:42. Просмотров 1798. Ответов 16
Метки нет (Все метки)

я тут наговнокодил. и в 2 случаях выдает "Wrong Answer" в чем ошибка?
код не меняйте

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
var
  st : string;
  c : char;
  i , q : byte;
begin
   Assign (input , 'input.txt');
   Assign (output , 'output.txt');
   ReSet (input);
   ReWrite (output);
   ReadLn (st);
   Readln (c);
   q := length (st);
     for i:=2 to q-1 do
     if (st[i-1] = 'a') and (st[i] = 'b') and (st[i+1] = 'c') and (c = 'a') then
      begin
       Insert(c, st , i+1);
       write(st);
       exit
      end;
      
   for i:=2 to q-1 do
     if (st[i-1] = 'a') and (st[i] = 'b') and (st[i+1] = 'c') then
      begin
       Insert(c, st , i);
       write(st);
       exit
      end;
     
      
   for i:=2 to q do
     if (st[i-1] = 'b') and (st[i] = 'c') then
       begin
       Insert(c, st , 2);
       write(st);
       exit
       end
      else
        begin
        Insert(c, st , 1);
        write(st);
        exit
        end;
      
end.
Текст задачи
Задача F. Занимательная физика
Автор: И. Блинов, И. Збань, А. Жихарева
Входной файл: input.txt
Выходной файл: output.txt
Максимальный балл: 100
Ограничение времени: 2 сек
Ограничение памяти: 512 Мб

Условие

Физик Антон построил цепочку S из частиц. Частицы обозначаются маленькими латинскими буквами от a до z. Если в цепочке встречается последовательность подряд идущих символов abc, то происходит взрыв. Причем взрывов случится ровно столько, сколько раз в цепочке встречается эта последовательность. Например, в цепочке aaabcabcсс произойдёт два взрыва.

У Антона осталась последняя частица C, которую ему необходимо добавить. Поскольку он может поместить оставшуюся частицу в любое место цепочки, он хочет сделать это так, чтобы после добавления этой частицы количество взрывов стало минимально возможным.

В первом примере в исходной цепочке происходит один взрыв caabcc, Антон может поставить частицу v после буквы a, в подстроке abc и получим цепочку caavbcc, в которой взрывов нет. Также возможным ответом является строка caabvcc.
Формат входного файла

Первая строка содержит строку S, вторая единственный символ C.
Формат выходного файла

Выходной файл должен содержать единственную строку — новую цепочку.
Ограничения

Количество букв в цепочке от 1 до 100. Все символы во входном файле это строчные буквы латинского алфавита.

Входной файл (input.txt) Выходной файл (output.txt)
1
caabcc
v
caavbcc
2
ab
a
aab
0
Миниатюры
Ошибка в решении задачи "Занимательная физика"  
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2019, 06:42
Ответы с готовыми решениями:

В чем ошибка? Когда печатаю "а" или "б" все работает, а когда "А" или "Б" то он не меняет "А" на "Б"
{Программа заменяет буквы "а" на буквы "б" в введенном тексте} var stroka : string; i :...

Решение заданий типа "Array","Matrix","String","File","Text"""
большая просьба помочь решить где-то около 35-40 (из 100) задач (мне не понятных) типа массив и...

Написать программу проверки правильности написания сочетаний "жи", "ши", "ча", "ща", "чу", "щу". Исправить ошибки
дан текст.написать программу проверки правильности написания сочетаний "жи", "ши", "ча", "ща",...

Требуется помощь в решении задачки - "Шифратор"
Люди добрые помогите разобраться с задачкой Условие: Переписать слова во входном тексте наоборот....

Шахматы: охарактеризовать положение белых с помощью слов: "мат", "шах", "пат", "обыкновенная позиция"
у белых на доске остался только король , у черных - король, слон, конь. охарактеризовать положение...

16
Sun Serega
674 / 452 / 225
Регистрация: 07.04.2017
Сообщений: 1,951
08.09.2019, 10:29 2
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
begin
  Reset(input, 'input.txt');
  Rewrite(output, 'output.txt');
  
  var s := ReadlnString;
  var ch := ReadChar;
  
  var ind := s.IndexOf('abc');
  if ind=-1 then
  begin
    var before := ch='c';
    if before then write(ch);
    write(s);
    if not before then write(ch);
  end else
    write(s.Insert(ind+1,ch));
  
end.
1
Eugene_41
0 / 0 / 0
Регистрация: 06.09.2019
Сообщений: 8
08.09.2019, 11:36  [ТС] 3
ошибки
0
Миниатюры
Ошибка в решении задачи "Занимательная физика"  
Sun Serega
674 / 452 / 225
Регистрация: 07.04.2017
Сообщений: 1,951
08.09.2019, 13:03 4
Я протестировал свой код на всём что смог придумать. Узнавайте какие именно тесты (с какими входными данными) падают, без этого ничего не выйдет.
1
08.09.2019, 13:03
ФедосеевПавел
Модератор
4594 / 2587 / 1036
Регистрация: 01.02.2015
Сообщений: 8,472
Записей в блоге: 1
08.09.2019, 13:24 5
Лучший ответ Сообщение было отмечено Eugene_41 как решение

Решение

Теряюсь с синтаксисом PABC.NET, поэтому решения приводить не буду, да и олимпиада - дело индивидуальное.

1. Пусть вводятся строка s и символ ch.
2. N:=pos('abc', s) - позиция начала первой подстроки 'abc'
3.1. Для N>0 (найдена подстрока): Если ch='a', то вставить символ в строку после символа 'b', иначе после символа 'a'
3.2. Для N=0 (не найдена подстрока): Если ch='a', то добавить символ в конец строки, иначе - в начало строки.

Добавлено через 4 минуты
Sun Serega, мне кажется, что у вас в программе для строки 'abc' и символа 'a' вставка произойдёт после первого символа 'a' и получится результат 'aabc'.
2
Eugene_41
0 / 0 / 0
Регистрация: 06.09.2019
Сообщений: 8
08.09.2019, 13:43  [ТС] 6
всем спасибо, заработало. оставлю код с решением
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var 
  s : string;
  ch : char;
  n : integer;
begin
  Reset(input, 'input.txt');
  Rewrite(output, 'output.txt');
  ReadLn (s);
  ReadLn (ch);
  n := pos ('abc' , s);
  
  if n > 0 then
    if ch = 'a' then
     Insert(ch, s , n+2)
    else
     Insert(ch, s , n+1); 
   
   
   if n = 0 then
    if ch = 'a' then
     Insert(ch, s , n+2)
    else
     Insert(ch, s , n+1);
    
   write (s);
end.
0
ФедосеевПавел
Модератор
4594 / 2587 / 1036
Регистрация: 01.02.2015
Сообщений: 8,472
Записей в блоге: 1
08.09.2019, 13:48 7
Лучший ответ Сообщение было отмечено Eugene_41 как решение

Решение

Я бы записал
Pascal
1
2
3
4
5
6
7
8
9
10
  if n > 0 then
    if ch = 'a' then
     Insert(ch, s , n+2)
    else
     Insert(ch, s , n+1); 
   else
    if ch = 'a' then
     s:=s+ch
    else
     s:=ch+s;
При отсутствии подстроки вы не туда вставляете. Нужно или в начало дописывать или в конец.
1
Eugene_41
0 / 0 / 0
Регистрация: 06.09.2019
Сообщений: 8
08.09.2019, 13:55  [ТС] 8
этот код все тесты прошел ¯\_(ツ)_/¯
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var 
  s : string;
  ch : char;
  n : integer;
begin
  Reset(input, 'input.txt');
  Rewrite(output, 'output.txt');
  ReadLn (s);
  ReadLn (ch);
  n := pos ('abc' , s);
  
  if n > 0 then
    if ch = 'a' then
     Insert(ch, s , n+2)
    else
     Insert(ch, s , n+1); 
   
   
   if n = 0 then
    if ch = 'a' then
     Insert(ch, s , n+2)
    else
     Insert(ch, s , n+1);
    
   write (s);
end.
0
ФедосеевПавел
Модератор
4594 / 2587 / 1036
Регистрация: 01.02.2015
Сообщений: 8,472
Записей в блоге: 1
08.09.2019, 13:59 9
Это случайность. На таком
bbbc
a

получили бы ошибку.
1
Eugene_41
0 / 0 / 0
Регистрация: 06.09.2019
Сообщений: 8
08.09.2019, 14:03  [ТС] 10
получается babbc (проверил)
0
ФедосеевПавел
Модератор
4594 / 2587 / 1036
Регистрация: 01.02.2015
Сообщений: 8,472
Записей в блоге: 1
08.09.2019, 14:08 11
Значит для
bbc
a
1
Eugene_41
0 / 0 / 0
Регистрация: 06.09.2019
Сообщений: 8
08.09.2019, 14:15  [ТС] 12
действительно, исправляю код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var 
  s : string;
  ch : char;
  n : integer;
begin
  Reset(input, 'input.txt');
  Rewrite(output, 'output.txt');
  ReadLn (s);
  ReadLn (ch);
  n := pos ('abc' , s);
  
  if n > 0 then
    if ch = 'a' then
     Insert(ch, s , n+2)
    else
     Insert(ch, s , n+1); 
   
   
   if n = 0 then
    if ch = 'a' then
     s := s + ch
    else
     s := ch + s;
    
   write (s);
end.
0
Sun Serega
674 / 452 / 225
Регистрация: 07.04.2017
Сообщений: 1,951
08.09.2019, 14:37 13
Pos(s, ...) работает как s.IndexOf(...)+1, только медленнее. И так же с Insert-ами.

Если в моём случае исправить вариант с символом "a":
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
begin
  Reset(input, 'input.txt');
  Rewrite(output, 'output.txt');
  
  var s := ReadlnString;
  var ch := ReadChar;
  
  var ind := s.IndexOf('abc');
  if ind=-1 then
  begin
    var before := ch='c';
    if before then write(ch);
    write(s);
    if not before then write(ch);
  end else
  if ch='a' then
    write(s.Insert(ind+2,ch)) else
    write(s.Insert(ind+1,ch));
  
end.
2
ФедосеевПавел
Модератор
4594 / 2587 / 1036
Регистрация: 01.02.2015
Сообщений: 8,472
Записей в блоге: 1
08.09.2019, 15:57 14

Не по теме:

Sun Serega, pos применил потому, что совсем не знаю .NET, а хотел показать идею.



Добавлено через 7 минут
А почему pos медленнее, чем IndexOf? Это же обычный поиск подстроки в строке. Или для IndexOf применяется не сравнение, а какой-нибудь ускоренный алгоритм, подобный алгоритму Рабина-Карпа?
0
Sun Serega
674 / 452 / 225
Регистрация: 07.04.2017
Сообщений: 1,951
08.09.2019, 17:27 15
Реализация Pos, которую можно увидеть зажав Ctrl и тыкнув на Pos в программе:
Pascal
1
2
3
4
5
6
function Pos(subs, s: string; from: integer): integer;
begin
  if (subs = nil) or (subs.Length = 0) or (from > s.Length) then
    Result := 0
  else Result := s.IndexOf(subs, from - 1, System.StringComparison.Ordinal) + 1;
end;
То есть куча проверок (кроме всего прочего противоречащих правилам современного программирования) + сам .IndexOf . Вообще StringComparison.Ordinal в теории может ускорить сравнение строк, содержащих странные знаки. Но 1. в нашем случае в строках только англ. буквы и 2. StringComparison.Ordinal можно использовать и в своём коде.
3
ФедосеевПавел
Модератор
4594 / 2587 / 1036
Регистрация: 01.02.2015
Сообщений: 8,472
Записей в блоге: 1
08.09.2019, 17:49 16
Спасибо за разъяснения по pos.

Если результат IndexOf определён в документации и равен (-1) при всех дополнительно проверяемых условиях, то, действительно, можно было бы обойтись только Result:=s.IndexOf.... Допускаю, что раньше поиск осуществлялся другим способом, не вызовом IndexOf, и теперь остались рудименты. А вот если IndexOf в проверяемых случаях возвращает нечто другое, то деваться некуда - нужно проверять.

А тут
Цитата Сообщение от Sun Serega Посмотреть сообщение
противоречащих правилам современного программирования
кажется, несколько максималистское утверждение, вы несколько сгустили краски. Впрочем, спорить не собираюсь, т.к. абсолютно не разбираюсь в теме.
2
Sun Serega
674 / 452 / 225
Регистрация: 07.04.2017
Сообщений: 1,951
08.09.2019, 18:24 17
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Допускаю, что раньше поиск осуществлялся другим способом, не вызовом IndexOf, и теперь остались рудименты
Да, раньше, только не в PascalABC.Net . В данный язык Pos добавили для совместимости с дохлыми паскалями (ибо в большинстве книг и школ учат именно старым паскалям).

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
кажется, несколько максималистское утверждение
Скорее эстетической. Но при этом и не только моё.

.IndexOf даст ошибку если пытаться искать строку вне границ исходной строки или если subs=nil, а Pos тупо проигнорит. Такая гадость обычно усложняет дебаг в больших и сложных кодах.

Если надо, к примеру, игнорить выход индекса за границы, а subs=nil вообще что то неожиданное - надо поставить условие для индекса прямо перед вызовом .IndexOf в своей программе. Таким образом если subs будет таки nil - программист узнает об этом сразу, а не когда упадёт какая то другая часть кода.
1
08.09.2019, 18:24
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2019, 18:24

После каждого символа "О" вставлять пробел и подсчитывать количество букв "А" стоящих между буквами "К" и "Л"
После каждого символа "О" вставлять пробел и подсчитывать количество букв "А" стоящих между буквами...

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

В заданной последовательности литер, состоящей из букв латинского алфавита и оканчивающейся точкой, определите общее число вхождений букв "a","e", "c", "h".
Немогу написать программу. В заданной последовательности литер, состоящей из букв латинского...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.