Задачка. ломаю голову уже второй день.

Billy_Wonka

Новичок
Пользователь
Авг 12, 2020
1
1
3
Товарищи столкнулся с таким тестовым заданием.
На вход подается 2 строки. Нужно определить, можно ли превратить первую строку во вторую, заменяя одни буквы на другие, с учетом следующих правил:

  • - участвуют только буквы русского алфавита а-я;
  • - все буквы в нижнем регистре;
  • - за один шаг можно преобразовать все вхождения одной буквы в другую.

Входные данные
Входная информация поступает из стандартного ввода в виде одной строки. В этой строке содержатся две подстроки, разделенные пробелом. Ваше решение должно учитывать вариант, когда на вход поданы строки разной длины. Некорректные данные на вход не поступают, дополнительные проверки не требуются.


Выходные данные
В качестве ответа в стандартный вывод программа должна выводить True (если превратить можно) или False (если превратить нельзя).


Пример 1
Входные данные: привет прикол
Выходные данные: True
Преобразования (выводить не нужно): в ⇒ к (прикет) е ⇒ о (прикот) т ⇒ л (прикол)


Пример 2
Входные данные: ааббдд ддббаа
Выходные данные: True
Преобразования (выводить не нужно): д ⇒ я (ааббяя) а ⇒ д (ддббяя) я ⇒ а (ддббаа)


Пример 3
Входные данные: абаб ааах
Выходные данные: False
Преобразовать нельзя, так как 'б' не сможет оказаться одновременно 'а' и 'х'.

Понял что если длинна первой строки не равна длине второй то уже получаем False.
Понял что нужно создать цикл и что проверяем в цикле( условно (x) )от i до длины первого слова (ищем, есть ли еще first_letter в a ИЛИ second_letter в b

Пока дошел только к этому и то коряво...
def chek_string( a , b ):
if len(a) != len(b):
return False
while i<=len(a)
first_letter = a
second_letter = b
 
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Понял что если длинна первой строки не равна длине второй то уже получаем False.
Это не верно.

Вот пример:
Python:
def chek_string(a, b):
    # если вторая строка короче первой, то преобразовать не получится
    if len(b) < len(a):
        return False
    # словарь соответствия букв в первой и второй строках
    d = {}
    for i, item in enumerate(a):
        # если буква не в словаре
        if item not in d:
            # добавляем (буква: буква из второго слова)
            d[item] = b[i]
        # если уже есть
        else:
            # проверяем чтобы не отличались значения
            if d[item] != b[i]:
                # если отличаются - то преобразовать не получится
                return False
    return True


print(chek_string('привет', 'прикол'))
print(chek_string('ааббдд', 'ддббаааа'))
print(chek_string('абаб', 'ааах'))
print(chek_string('абаб', 'аа'))
 
Последнее редактирование:
  • Мне нравится
Реакции: Messyar и Student

Messyar

Новичок
Пользователь
Авг 13, 2020
10
1
3
Вот такой код не проходит почему-то. Хотя тесты все проходит. В каком-то из случаев не правильный ответ

Python:
def word_transform_2(word_to_transform, word_origin):

    if word_to_transform == word_origin:

        return 1

    if len(word_to_transform) >= 33:

        list_of_letters = list('абвгдеёжзийклмнопрстуфхцчшщъыьэюя')

        for symbol in word_to_transform:

            if symbol in list_of_letters:

                list_of_letters.remove(symbol)

        if len(list_of_letters) == 0:

            return 0

    if len(word_origin) != len(word_to_transform):

        return 0

    dict_to_check = {}

    for i, item in enumerate(word_to_transform):

        if item not in dict_to_check:      
            dict_to_check[item] = word_origin

        else:
            if dict_to_check[item] != word_origin:

                return 0

    return 1

word_to_transform, word_origin = input().split()

print(word_transform_2(word_to_transform, word_origin))
 
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Выше же уже написал решение, нужно только input разделить и в функцию подставить:
Python:
def chek_string(a, b):
    # если вторая строка короче первой, то преобразовать не получится
    if len(b) < len(a):
        return False
    # словарь соответствия букв в первой и второй строках
    d = {}
    for i, item in enumerate(a):
        # если буква не в словаре
        if item not in d:
            # добавляем (буква: буква из второго слова)
            d[item] = b[i]
        # если уже есть
        else:
            # проверяем чтобы не отличались значения
            if d[item] != b[i]:
                # если отличаются - то преобразовать не получится
                return False
    return True

word1, word2 = input().split()

print(chek_string(word1, word2))
Ваш вариант не проходит тесты из-за дополнительных проверок (if len(word_origin) != len(word_to_transform):), которые дают неверный ответ когда строки разной длины.
 
  • Мне нравится
Реакции: Messyar

Messyar

Новичок
Пользователь
Авг 13, 2020
10
1
3
Ваше решение я тоже пробовал, но по условиям задачи насколько я понимаю слова должны быть все таки равны по длине. Иначе как преобразовать заменой только букв в одинаковые слова? При разной длине придется буквы добавлять к слову.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Ваше решение я тоже пробовал, но по условиям задачи насколько я понимаю слова должны быть все таки равны по длине. Иначе как преобразовать заменой только букв в одинаковые слова? При разной длине придется буквы добавлять к слову.
Вот в условиях про длину:
Ваше решение должно учитывать вариант, когда на вход поданы строки разной длины
В моем варианте если вторая строка короче первой, то преобразовать не удастся. Если равна или длиннее, то может получиться.
 

Messyar

Новичок
Пользователь
Авг 13, 2020
10
1
3
Вот в условиях про длину:

В моем варианте если вторая строка короче первой, то преобразовать не удастся. Если равна или длиннее, то может получиться.

Спасибо за ответ! Но я просто скопировал Ваше решение для пробы с поправкой, конечно, input добавил и оно тоже не прошло. Поэтому и утверждаю, что скорее всего решение не проходит не по этой причине. Еще:

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

Все таки из условий мне кажется удалять буквы из слова нельзя. И решение все равно не проходит.
 

kozminykh

Новичок
Пользователь
Авг 14, 2020
1
0
1
Вот в условиях про длину:

В моем варианте если вторая строка короче первой, то преобразовать не удастся. Если равна или длиннее, то может получиться.

Добрый день. Объясните, пожалуйста, логику. Я, как и автор вопроса, понял условие так, что если длины строк отличаются, то первую во вторую преобразовать нельзя. Ведь в условии сказано «заменяя одни буквы на другие», а не заменяя отсутствие букв буквами или буквы отсутствием букв. Возможно, это я что-то неправильно понимаю, поэтому и прошу объяснить ход вашей мысли.
 

alext

Популярный
Пользователь
Май 10, 2020
288
66
28
Python:
def can_transform(first, second):
    if len(first) != len(second): return False
    pairs = {}
    for x, y in zip(first, second):
        if x in pairs and pairs[x] != y:
            return False
        else:
            pairs[x] = y
    return True

if __name__ == '__main__':
    assert can_transform('привет', 'прикол')
    assert can_transform('ааббдд', 'ддббаа')
    assert not can_transform('абаб', 'ааах')
    assert not can_transform('а', 'бв')
 
Последнее редактирование:
  • Мне нравится
Реакции: Messyar

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Добрый день. Объясните, пожалуйста, логику. Я, как и автор вопроса, понял условие так, что если длины строк отличаются, то первую во вторую преобразовать нельзя. Ведь в условии сказано «заменяя одни буквы на другие», а не заменяя отсутствие букв буквами или буквы отсутствием букв. Возможно, это я что-то неправильно понимаю, поэтому и прошу объяснить ход вашей мысли.
Вы правы. Перечитал условие.
можно ли превратить первую строку во вторую
В моем примере превратить полностью не получится, а только в пределах длины исходной строки. В итоге если длина строк не равна нужно вернуть False, то есть полное преобразование не возможно.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот еще вариант с проверкой на возможность преобразования в обе стороны:
Python:
def check_string(a, b):
    # если строки не равны - то преобразовать не получится
    if len(b) != len(a):
        return False
    # проверка в обе стороны
    return check(a, b) and check(b, a)


def check(a, b):
    d = {}
    for i, item in enumerate(a):
        if item not in d:
            d[item] = b[i]
        else:
            if d[item] != b[i]:
                return False
    return True


word1, word2 = input().split()
print(check_string(word1, word2))
 
  • Мне нравится
Реакции: Messyar

Messyar

Новичок
Пользователь
Авг 13, 2020
10
1
3
Вот это проходит решение, надо еще вторе слово проверять на присутствие всех букв алфавита.

Python:
def word_transform_2(word_to_transform, word_origin):
    
    word_to_transform = word_to_transform.lower()
    word_origin = word_origin.lower()
    
    if word_to_transform == word_origin:
        return 1
    
    if len(word_origin) != len(word_to_transform):
        return 0
    
    if len(word_origin) >= 33:
        list_of_letters = list('абвгдеёжзийклмнопрстуфхцчшщъыьэюя')
        for symbol in word_origin:
            if symbol in list_of_letters:
                list_of_letters.remove(symbol)
        if len(list_of_letters) == 0:
            return 0
    
    dict_to_check = {}
    for i, item in enumerate(word_to_transform):
        
        if item not in dict_to_check:
            
            dict_to_check[item] = word_origin[i]
        
        else:
            
            if dict_to_check[item] != word_origin[i]:
                
                return 0
    return 1

word_to_transform, word_origin = input().split()
print(word_transform_2(word_to_transform, word_origin))
 

Messyar

Новичок
Пользователь
Авг 13, 2020
10
1
3
Следующая задачка в этом отборе) Написал код, но не проходит. Если кто-то сможет подсказать что я не учел, буду благодарен)

Ограничение времени, с2
Ограничение памяти, МБ96
Общее число попыток отправки15
Петя решил узнать, когда программисту выгоднее всего искать работу на hh.ru. Конечно, когда больше всего открыто вакансий.
Он выгрузил в текстовый файл время открытия и закрытия всех подходящих вакансий за 2019 год.
Теперь нужно определить период времени, когда открытых вакансий было больше всего.
Считаем, что:
  • - начальное и конечное время всегда присутствуют;
  • - начальное время всегда меньше или равно конечному;
  • - начальное и конечное время включены в интервал.
Входные данные
Входная информация поступает из стандартного ввода, в первой строке приходит 1 число - количество вакансий. Каждая из следующих строк содержит информацию о вакансии в виде двух чисел – начальное и конечное время, они разделены пробелом. Время задается в секундах (https://ru.wikipedia.org/wiki/Unix-время). Некорректные данные на вход не поступают, дополнительные проверки не требуются.
Выходные данные
В качестве ответа в стандартный вывод через пробел нужно вывести два числа: количество найденных интервалов и сумму длительности интервалов в секундах (начальная и конечная секунды должны быть включены в интервал).
Пример 1
Входные данные:
1
1595862781 1595862785
Выходные данные: 1 5
Пример 2
Входные данные:
2
1595862781 1595862783
1595862782 1595862784

Выходные данные: 1 2
Пример 3
Входные данные:
2
1595862781 1595862782
1595862783 1595862784

Выходные данные: 2 4

Вот мой код:

Python:
def refactor_intervals_2(intervals):
    new_intervals = []
    used_intervals = []
    step_count = 0
    intervals.sort()
    
    # выбираем 2 интервала для сравнения
    for i, interval_check in enumerate(intervals):
        step_count += 1
        new_interval_start, new_interval_end = interval_check[0], interval_check[1]
        
        if interval_check in used_intervals:
            continue
        
        end_of_interval_next = len(intervals) + 1
        interval_next = intervals[i+1:end_of_interval_next]
        
        for j, interval_next_check in enumerate(interval_next):
            
            if new_interval_end >= interval_next_check[0]:
                new_interval_start = interval_next_check[0]
                used_intervals.append(interval_next_check)
                if interval_next_check[1] <= new_interval_end:
                    new_interval_end = interval_next_check[1]
                    used_intervals.append(interval_next_check)
        new_interval = [new_interval_start, new_interval_end]
        if new_interval and new_interval not in new_intervals:
            new_intervals.append([new_interval_start, new_interval_end])
        
        
        
    return new_intervals

#input_intervals = int(input())
intervals = []
while input_intervals > 0:
    input_intervals -= 1
    interval_start, interval_end = input().split()
    interval_start = int(interval_start)
    interval_end = int(interval_end)
    intervals.append([interval_start, interval_end])
    
intervals = [[1595862771, 1595862779],
             [1595862772, 1595862774],
             [1595862773, 1595862775],
             [1595862773, 1595862774],
             [1595862772, 1595862773],
             [1595862782, 1595862784],
             [1595862781, 1595862783],
             [1595862793, 1595862794],
             [1595862791, 1595862792],
             [1595862761, 1595862799],
             [1595862777, 1595862778]]
    
list_result = refactor_intervals_2(intervals)
intevals_count = len(list_result)

sum_time_of_intervals = 0
for item in list_result:
    sum_time_of_intervals = sum_time_of_intervals + (item[1] - item[0] + 1)
    print(item, sum_time_of_intervals)

print(intevals_count, sum_time_of_intervals)
 

Sonik3000

Новичок
Пользователь
Авг 30, 2020
1
0
1
if len(word_origin) >= 33:
list_of_letters = list('абвгдеёжзийклмнопрстуфхцчшщъыьэюя')
for symbol in word_origin:
if symbol in list_of_letters:
list_of_letters.remove(symbol)
if len(list_of_letters) == 0:
return 0

Добрый день.
Вопрос. А зачем проверять на количество символов =>33? Что это дает?
По 0 понятно.
 

Messyar

Новичок
Пользователь
Авг 13, 2020
10
1
3
Добрый день. Чтобы лишний раз этот цикл не гонять, а только когда есть вероятность, что это необходимо делать.
 

Kostya

Новичок
Пользователь
Сен 12, 2020
1
0
1
Добрый день. Чтобы лишний раз этот цикл не гонять, а только когда есть вероятность, что это необходимо делать.
Здравствуйте.
А зачем проверять второе слово на наличие всех букв?
 

Alex_kh

Новичок
Пользователь
Сен 19, 2020
1
0
1
Привет!
А как Вы справились с первой задачей?
Что-то ума не приложу - все работает, на разных тестах пробовал, но система не пропускает дальше и отвечает "неправильный ответ" или "ошибка во время выполнения (если допускать к анализу строки разной длины)"

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

  • - участвуют только буквы русского алфавита а-я;
  • - все буквы в нижнем регистре;
  • - за один шаг можно преобразовать все вхождения одной буквы в другую.

Входные данные
Входная информация поступает из стандартного ввода в виде одной строки. В этой строке содержатся две подстроки, разделенные пробелом. Ваше решение должно учитывать вариант, когда на вход поданы строки разной длины. Некорректные данные на вход не поступают, дополнительные проверки не требуются.


Выходные данные
В качестве ответа в стандартный вывод программа должна выводить True (если превратить можно) или False (если превратить нельзя).


Пример 1
Входные данные: привет прикол
Выходные данные: True
Преобразования (выводить не нужно): в ⇒ к (прикет) е ⇒ о (прикот) т ⇒ л (прикол)


Пример 2
Входные данные: ааббдд ддббаа
Выходные данные: True
Преобразования (выводить не нужно): д ⇒ я (ааббяя) а ⇒ д (ддббяя) я ⇒ а (ддббаа)


Пример 3
Входные данные: абаб ааах
Выходные данные: False
Преобразовать нельзя, так как 'б' не сможет оказаться одновременно 'а' и 'х'.

Понял что если длинна первой строки не равна длине второй то уже получаем False.
Понял что нужно создать цикл и что проверяем в цикле( условно (x) )от i до длины первого слова (ищем, есть ли еще first_letter в a ИЛИ second_letter в b

Пока дошел только к этому и то коряво...
def chek_string( a , b ):
if len(a) != len(b):
return False
while i<=len(a)
first_letter = a
second_letter = b
"
 

Messyar

Новичок
Пользователь
Авг 13, 2020
10
1
3
Здравствуйте.
А зачем проверять второе слово на наличие всех букв?

Потому что по условию можно использовать толко 33 буквы и если они все использованы, то преобразовать слово одно в другое не получится, так как заменять можно тоже только на эти 33 буквы. И в итоге при первом же проходе появятся как минимум две одинаковые буквы.
 

shshn

Новичок
Пользователь
Окт 9, 2020
3
0
1
Привет, тоже решаю эти задачки, тесты прохожу, проверки на русский язык, длину и регистр, а сама задачка не принимается, подскажите, что может быть не так?
Причём заметил, что тесты обращают внимание на принт, а не на ретурн, я что-то не так оформляю?


Python:
def check(input):
    input = input.split()
    #проверка на регистр
    #print(list(''.join(input)))
    for i in list(''.join(input)):
        if i != i.lower():
            print(0)
            return 0
    #input = input.lower()
    #input = input.split()

    #проверка на русский язык
    alphavit = [chr(i) for i in range(1072, 1104)]
    for i in list(''.join(input)):
        if i not in alphavit:
            print(0)
            return 0

    #проверка на одинаковую длину
    first, second = list(input[0]), list(input[1])
    if len(first) != len(second):
        print(0)
        return 0

    #создание словаря и изменение первой подстроки
    d = {}
    for i, item in enumerate(first):
        if item not in d:
            d[item] = second[i]
        if item in d:
            first[i] = d[item]

    if first == second:
        print(1)
        return 1
    print(0)
    return 0

input = check(input())
 

Messyar

Новичок
Пользователь
Авг 13, 2020
10
1
3
Привет, тоже решаю эти задачки, тесты прохожу, проверки на русский язык, длину и регистр, а сама задачка не принимается, подскажите, что может быть не так?
Причём заметил, что тесты обращают внимание на принт, а не на ретурн, я что-то не так оформляю?


Python:
def check(input):
    input = input.split()
    #проверка на регистр
    #print(list(''.join(input)))
    for i in list(''.join(input)):
        if i != i.lower():
            print(0)
            return 0
    #input = input.lower()
    #input = input.split()

    #проверка на русский язык
    alphavit = [chr(i) for i in range(1072, 1104)]
    for i in list(''.join(input)):
        if i not in alphavit:
            print(0)
            return 0

    #проверка на одинаковую длину
    first, second = list(input[0]), list(input[1])
    if len(first) != len(second):
        print(0)
        return 0

    #создание словаря и изменение первой подстроки
    d = {}
    for i, item in enumerate(first):
        if item not in d:
            d[item] = second[i]
        if item in d:
            first[i] = d[item]

    if first == second:
        print(1)
        return 1
    print(0)
    return 0

input = check(input())

Так тесты на русский язык не надо делать, по условию задачи некорректный ввод не может быть, и как я понял на регистр тоже не надо. А вот именно использованы ли все маленькие буквы алфавита во втором слове - надо.
Именно принт и должен выводить результат, там же написано надо в консоль вывести, а ретурн в консоль ничего не выводит же.
 

shshn

Новичок
Пользователь
Окт 9, 2020
3
0
1
Так тесты на русский язык не надо делать, по условию задачи некорректный ввод не может быть, и как я понял на регистр тоже не надо. А вот именно использованы ли все маленькие буквы алфавита во втором слове - надо.
Именно принт и должен выводить результат, там же написано надо в консоль вывести, а ретурн в консоль ничего не выводит же.


Да, с принтом и ретурном разобрался, перенеся принт на вызов функции.
А вот по поводу маленьких букв не понял, у меня есть проверка, что если в исходной строке есть заглавная буква, то возвращается ноль, это ведь она и есть.
А проверки на русский и длину предлагаешь убрать?
 

Форум IT Специалистов