Спасибо за видео. Заметил, что, вроде, в задаче № 5155 в строке: m.append(c.end() - c.start() + 1) добавлять эту единицу не нужно. C добавлением единицы, если использовать дальше обычное деление, а не целочисленное, получается 1310.5 вместо 1310.0. Но целочисленное деление привело к правильному ответу
Алексей, добрый день! Спасибо за разбор! Так всё просто с этим гробом. С помощью регулярок нашли все строки, которые являются арифметическими выражениями, после чего каждое из них закидываем в функцию eval() и получаем значение выражение.
А разве не легче будет проверять значение арифметического выражения через eval()? Решение этим способом: from re import * s = open('24-299.txt').readline() num = r'(?:[1-9][0-9]*|0)' pattern = rf'{num}(?:[+*]{num})*' m = [len(c) for c in findall(pattern, s) if eval(c) == 0] print(max(m))
Нет. Тест: 12*0+1. У тебя будет ответ 0, а должен быть 4. Дело в том, что мы можем элемент из findall срезать слева и справа, и значение уже получится равным нулю (хотя исходное не равнялось).
Респект бесконечный, кроме Вас такое никто не объяснит толково на большую аудиторию)
я ждал этого разбора! спасибо!
Спасибо за видео. Заметил, что, вроде, в задаче № 5155 в строке: m.append(c.end() - c.start() + 1) добавлять эту единицу не нужно. C добавлением единицы, если использовать дальше обычное деление, а не целочисленное, получается 1310.5 вместо 1310.0. Но целочисленное деление привело к правильному ответу
Алексей, добрый день! Спасибо за разбор!
Так всё просто с этим гробом.
С помощью регулярок нашли все строки, которые являются арифметическими выражениями, после чего каждое из них закидываем в функцию eval() и получаем значение выражение.
не все варианты проверяются, 53+0*0*0*0*0*0 будет неверно, а без 53+ верно
@Вова-ч2м7и почему Вы так решили? Код выдаёт правильный ответ - 53
s = "53+0*0*0*0*0*0"
print(eval(s))
А разве не легче будет проверять значение арифметического выражения через eval()? Решение этим способом:
from re import *
s = open('24-299.txt').readline()
num = r'(?:[1-9][0-9]*|0)'
pattern = rf'{num}(?:[+*]{num})*'
m = [len(c) for c in findall(pattern, s) if eval(c) == 0]
print(max(m))
Нет. Тест: 12*0+1. У тебя будет ответ 0, а должен быть 4.
Дело в том, что мы можем элемент из findall срезать слева и справа, и значение уже получится равным нулю (хотя исходное не равнялось).
@@infkege всё понял, немного ошибся, через eval() надо было иначе решать, но там код длинный
@@infkege почему 4, если ответ 1?))
@@infkege респект! тоже решил через regexp и долго не мог понять, почему ответ в итоге неправильный
А почему во всех заданиях, которые в первой половине видео, нет пересекающихся комбинаций?
Здравствуйте, скажите а это веба достаточно для 24 задачи или будут другие вебы?
На открытом курсе есть еще 3 веба по этой задаче