Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Олив
0 / 0 / 0
Регистрация: 22.10.2015
Сообщений: 20
#1

Задача 4: игры со словами

22.10.2015, 11:48. Просмотров 566. Ответов 17
Метки нет (Все метки)

Всего в серии постов 5 задач, буду благодарна если мне напишут хотя бы одну (нужны все 5) - 11 класс, нужно сдать завтра

4) Захар любит игры со словами. Но играть одному не интересно, поэтому Захар подсадил на эти игры соседа по парте — Славу. Бывает так, что они выполняют контрольную по математике очень быстро и оставшееся время до перемены, ребята посвящают играм со словами. Недавно, Захар придумал очередную игру-шифровалочку. Один игрок берет строки ab и aab. После этого он выписывает много раз первую строк, затем много раз вторую строку, а задача второго игрока — ответить на вопрос: сколько раз была выписана первая строка и сколько — вторая? Казалось бы, чего тут сложного, ан нет. . . В условие игры внесен некоторый элемент неожиданности. Дело в том, что загадывающий игрок может случайно (или специально) совершить ошибки при построении слова, что сильно усложняет процесс разбора загаданной строки. Ребята проиграли в эту игру весь день, причем пока идет урок один шифрует, а на перемене второй игрок пытается расшифровать.
Придя домой Слава попытался написать программу разбора строки, но опыта не хватило. Помогите ему, напишите программу, которая сможет разобрать загаданную строку и дать ответ на задачу.

Формат входных данных
В единственной строке находится загаданная строка s (1 <= |s| <= 105).

Формат выходных данных
Если строку можно разложить на исходные, то нужно вывести два числа — сколько раз была выписана строка ab и сколько — строка aab. Если строку разложить нельзя, то выведите −1.

Буду очееень благодарна решившему)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2015, 11:48
Ответы с готовыми решениями:

Задача с function - число согласных букв в тексте (строки со словами)
Всем привет, форумчане! Очень нужна ваша помощь. Нужно сделать программ с...

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

Удалить пробелы, стоящие между первым и вторым словами, а также между двумя последними словами
Задание: Удалить пробелы, стоящие между первым и вторым словами, а также между...

Удалить пробелы, стоящие между первым вторым словами, а также между двумя последними словами
Удалить пробелы, стоящие между первым вторым словами, а также между двумя...

Задача на создание карточной игры.
Здравствуйте. Собственно, само задание звучит, как &quot;Написать программу, которая...

17
Sergey_B
163 / 163 / 57
Регистрация: 08.01.2013
Сообщений: 335
22.10.2015, 14:31 #2
Четвертая (не написано что нельзя с регулярками )
Python
1
2
3
4
5
6
7
8
9
10
11
    inputStr = 'abbabbababababbabaabababbabaabb' #Исходные данные
    abCount = 0 #Счетчик вхождений подстроки 'ab'
    for token in re.findall("ab", inputStr, re.IGNORECASE): #Ищем в строке последовательность 'ab'
        if token: #Если нашли
            abCount += 1 #Увеличиваем счетчик
    aabCount = 0 #Счетчик вхождений подстроки 'aab'
    for token in re.findall("aab", inputStr, re.IGNORECASE):
        if token: #Если нашли
            aabCount += 1 #Увеличиваем счетчик
    print "ab=", abCount
    print "aab=", aabCount
0
Marinero
Модератор
Эксперт NIX
2049 / 1662 / 567
Регистрация: 02.03.2015
Сообщений: 5,443
22.10.2015, 15:11 #3
Sergey_B, По поводу 4-й — не совсем так. Как я понял, можно разложить это значит в строке только ab и aab. Т.е Ваша строка не раскладывается тк abb… уже не попадаем. Т.е.
Python
2
3
4
5
6
s = inputStr.split('b')
if '' in s:
    print(-1)
else:
    print(s.count('a'), s.count('aa'))
0
Олив
0 / 0 / 0
Регистрация: 22.10.2015
Сообщений: 20
22.10.2015, 15:16  [ТС] #4
Sergey_B, 4 ошибку выдает
0
Sergey_B
163 / 163 / 57
Регистрация: 08.01.2013
Сообщений: 335
22.10.2015, 16:01 #5
Marinero, я такую строку привел в пример исходя из этого условия:
В условие игры внесен некоторый элемент неожидан-
ности. Дело в том, что загадывающий игрок может случайно (или специально) совершить ошибки
при построении слова, что сильно усложняет процесс разбора загаданной строки.
Хотя может вы правы. Топикстартер не спешит вносить поправки и пояснения, поэтому не будем гадать))

И немного поправлю код, оставив свои условия:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import re 
 
def main():
 
    inputStr = 'aababbbababaabababaabbbabababab' #Исходные данные
    
        abCount = 0 #Счетчик вхождений подстроки 'ab'
        for token in re.findall("ab", inputStr, re.IGNORECASE): #Ищем в строке последовательность 'ab'
            if token: #Если нашли
                    abCount += 1 #Увеличиваем счетчик
    aabCount = 0 #Счетчик вхождений подстроки 'aab'
        for token in re.findall("aab", inputStr, re.IGNORECASE):
            if token: #Если нашли
                    aabCount += 1 #Увеличиваем счетчик
 
    if abCount == 0 and aabCount == 0:
        print "-1"
    else:
        print "ab=", abCount
            print "aab=", aabCount
 
 
main()
Добавлено через 40 минут
Олив, ошибку выдает, потому что вы не импортировали библиотеку, посмотрите более поздний вариант кода)
0
Esecman
38 / 26 / 12
Регистрация: 31.12.2013
Сообщений: 329
22.10.2015, 16:12 #6
Sergey_B,
C++
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
#include <iostream>
#include <string>
using namespace std;
int main(){
    string str, k, j;
    cin >> str;
 
    int c1 = 0;
    int c2 = 0;
       
    for(int i = 0; i < str.size(); i++){
        if(str[i] == *"a" || str[i] == *"b")
           continue;
        if(str[i] != *"a" || str[i] != *"b")
           str.erase(i--, 1);
    }
    
    if(str.size() < 5 || (str[0] + str[1]) != 195 || (str[str.size() - 1] + str[str.size() - 2] + str[str.size() - 3]) != 292){
       cout << -1 << endl;
       return 0;
    }
    for(int i = 0; i < str.size(); i++){
        k = str.substr(i, 2);
        j = str.substr(i, 3);
        
        if(k == "ab"){
           str.erase(i, 1);
           c1++;
           i--;
        }
        if(j == "aab"){
           str.erase(i, 2);
           c2++;
           i--;
        }
    }
    if(c1 == 0 || c2 == 0) cout << -1 << endl;
    else cout << c1 << " " << c2 << endl;
       
    system("pause");
    return 0;
}
Вообще, в тесте abaab ответ 1 1, нежели 2 и 1 как у Вас.
Выше привел свое решение, но оно почему-то в некоторых местах не проходит. Ошибку не могу понять.
0
Sergey_B
163 / 163 / 57
Регистрация: 08.01.2013
Сообщений: 335
22.10.2015, 17:01 #7
Как вариант, найдем все последовательности "aab" и заменим их, чтобы не мешали:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def main():
 
         inputStr = 'aababbbababaabababaabbbabababab' #Исходные данные
               
     aabCount = 0 #Счетчик вхождений подстроки 'aab'
         temp = re.subn('aab', '***', inputStr) #Найдем и заменим все вхождения 'aab'
         if temp: #Если нашли
                aabCount = temp[1]
     inputStr = temp[0] #Обновленная строка
     print inputStr
     abCount = 0 #Счетчик вхождений подстроки 'ab'
         for token in re.findall("ab", inputStr, re.IGNORECASE): #Ищем в строке последовательность 'ab'
                if token: #Если нашли
                    abCount += 1 #Увеличиваем счетчик
     if abCount == 0 and aabCount == 0:
            print "-1"
     else:
            print "ab=", abCount
            print "aab=", aabCount
 
 
main()
Результат:
ab= 9
aab= 3
0
Олив
0 / 0 / 0
Регистрация: 22.10.2015
Сообщений: 20
22.10.2015, 17:03  [ТС] #8
Sergey_B, можешь еще на с++ написать?
0
Marinero
Модератор
Эксперт NIX
2049 / 1662 / 567
Регистрация: 02.03.2015
Сообщений: 5,443
22.10.2015, 17:08 #9
Ну и наворотили…
Python
1
2
3
4
5
6
inputStr = 'aababbbababaabababaabbbabababab' #Исходные данные
s = inputStr.split('b')
try:
    print(s.count('a'), s.count('aa'))
except:
    print(-1)
0
Londonstari
1 / 1 / 2
Регистрация: 16.08.2013
Сообщений: 44
22.10.2015, 17:50 #10
не всё так просто ,отрицательные значения не получаются
abaabab -1
abab -1
aabaab -1
когда строчку разделить нельзя

Добавлено через 18 минут
вот костыль
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
inputStr =str(input())
s = inputStr.split('b')
try:
   a=s.count('a')
   b=s.count('aa')
 
except:
    print()
if b == 0 or a ==0 :
    print(-1)
else:
    print(a)
    print(b)
0
Marinero
Модератор
Эксперт NIX
2049 / 1662 / 567
Регистрация: 02.03.2015
Сообщений: 5,443
22.10.2015, 18:34 #11
Londonstari, Почему строчку разделить нельзя? abaabab —> ab aab ab?
0
Londonstari
1 / 1 / 2
Регистрация: 16.08.2013
Сообщений: 44
22.10.2015, 18:54 #12
Marinero, не получается отделить вообще ничего ,странно except: ,как-то работает
0
Sergey_B
163 / 163 / 57
Регистрация: 08.01.2013
Сообщений: 335
23.10.2015, 08:16 #13
Олив, нет компилятора на работе)

Добавлено через 8 минут
Marinero, а если взять такую строку: "aaaabab" - так как по условию возможно, что загадывающий игрок может случайно (или специально) совершить ошибки, ваш код не найдет последовательность "aab", т.к. после сплита строка примет вид: "aaaa a ", и соответственно посчитает только одну букву а.
0
Marinero
Модератор
Эксперт NIX
2049 / 1662 / 567
Регистрация: 02.03.2015
Сообщений: 5,443
23.10.2015, 12:14 #14
Sergey_B, Тут неверно сформированое условие — пока не скажут, что считать ошибкой, а что считать невозможностью расшифровки, то угадывать можно до бесконечности. В Вашем примере aaaab считать как ab или как aab?
1
Sergey_B
163 / 163 / 57
Регистрация: 08.01.2013
Сообщений: 335
23.10.2015, 13:34 #15
Marinero, согласен, но ваш вариант вообще никакую последовательность не посчитает, а так да, нужно ставить дополнительное условие, какую последовательность выбирать в варианте со строкой где перед "b" стоит подряд куча "a"
0
Marinero
Модератор
Эксперт NIX
2049 / 1662 / 567
Регистрация: 02.03.2015
Сообщений: 5,443
23.10.2015, 15:16 #16
Цитата Сообщение от Sergey_B Посмотреть сообщение
ваш вариант вообще никакую последовательность не посчитает
А может это так и надо?
Тем более мы и не должны тут окончательно готовый код постить. Идея понятна? Пусть ТС доработает под свои условия.
0
Sergey_B
163 / 163 / 57
Регистрация: 08.01.2013
Сообщений: 335
23.10.2015, 18:13 #17
Marinero, полностью согласен А то им на питоне написали, да еще и кучу вариантов на выбор, а теперь кому на C++ подавай, кому на паскале, совсем обленились)))
0
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,213
Завершенные тесты: 3
23.10.2015, 22:16 #18
Цитата Сообщение от Олив Посмотреть сообщение
После этого он выписывает много раз первую строк, затем много раз вторую строку
Сначала все "ab", потом все "aab".
0
23.10.2015, 22:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2015, 22:16

Задача про Олимпийские Игры
Есть такая задача: Разработать программу, которая подводит итоги Олимпийских...

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

Дана строка текста, между словами текста минимум один пробел.Написать программу, которая между словами текста ставит по три точки!!
Дана строка текста, между словами текста минимум один пробел.Написать...


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

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

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