Форум программистов, компьютерный форум, киберфорум
Наши страницы

Python

Войти
Регистрация
Восстановить пароль
 
 
Олив
0 / 0 / 0
Регистрация: 22.10.2015
Сообщений: 20
#1

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

22.10.2015, 11:48. Просмотров 543. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Задача 4: игры со словами (Python):

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

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

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

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

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

Задача на создание карточной игры. - C++
Здравствуйте. Собственно, само задание звучит, как &quot;Написать программу, которая на основе классов реализует карточную игру Блэк-Джек.&quot;. ...

17
Sergey_B
163 / 163 / 14
Регистрация: 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
1956 / 1626 / 496
Регистрация: 02.03.2015
Сообщений: 5,309
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 / 14
Регистрация: 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 / 6
Регистрация: 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 / 14
Регистрация: 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
1956 / 1626 / 496
Регистрация: 02.03.2015
Сообщений: 5,309
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 / 0
Регистрация: 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
1956 / 1626 / 496
Регистрация: 02.03.2015
Сообщений: 5,309
22.10.2015, 18:34 #11
Londonstari, Почему строчку разделить нельзя? abaabab —> ab aab ab?
0
Londonstari
1 / 1 / 0
Регистрация: 16.08.2013
Сообщений: 44
22.10.2015, 18:54 #12
Marinero, не получается отделить вообще ничего ,странно except: ,как-то работает
0
Sergey_B
163 / 163 / 14
Регистрация: 08.01.2013
Сообщений: 335
23.10.2015, 08:16 #13
Олив, нет компилятора на работе)

Добавлено через 8 минут
Marinero, а если взять такую строку: "aaaabab" - так как по условию возможно, что загадывающий игрок может случайно (или специально) совершить ошибки, ваш код не найдет последовательность "aab", т.к. после сплита строка примет вид: "aaaa a ", и соответственно посчитает только одну букву а.
0
Marinero
Модератор
Эксперт NIX
1956 / 1626 / 496
Регистрация: 02.03.2015
Сообщений: 5,309
23.10.2015, 12:14 #14
Sergey_B, Тут неверно сформированое условие — пока не скажут, что считать ошибкой, а что считать невозможностью расшифровки, то угадывать можно до бесконечности. В Вашем примере aaaab считать как ab или как aab?
1
Sergey_B
163 / 163 / 14
Регистрация: 08.01.2013
Сообщений: 335
23.10.2015, 13:34 #15
Marinero, согласен, но ваш вариант вообще никакую последовательность не посчитает, а так да, нужно ставить дополнительное условие, какую последовательность выбирать в варианте со строкой где перед "b" стоит подряд куча "a"
0
23.10.2015, 13:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2015, 13:34
Привет! Вот еще темы с ответами:

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

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

Сборка ПК "для себя" - игры, игры, игры! Киев, бюджет 8300 грн с монитором. - Игровой компьютер
Всем доброго времени суток. 1. Бюджет примерно 8300 грн (с монитором) 2. Украина, г. Киев, намерен покупать на http://rozetka.com.ua/...

Задача про вектор для игры "Быки и коровы" - C++
Задача из книги Страуструпа, вот условие : программа должна хранить вектор из четырех различных чисел в диапазоне от 0 до 9 (т.е.,...


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

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

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