m700
если словарь лишних символов не пуст, то пропускаем
Igor
Так мы двигаем всегда, я не понял что значит если лишние есть то двигать
lvt
лишние буквы(?)
Igor
Аа ты хочешь два указателя бегать
Igor
Я бы шел одной длинной наверное, но можно и так
m700
слева вычеркивает справа заполняет, притом если он не из анограмы, приходит то двигаем дальше окно
m700
только когда символы теже что в словаре сопоставляем ко-во
Igor
только когда символы теже что в словаре сопоставляем ко-во
смотри твое ускорение про не из анаграммы оно не ассимптотическое. т.е теоретически все символы в анаграмме и не в анаграмме могут быть одинаковые вопрос только в кол-ве. Обычно такие улучшения не особо влияют на худший случай. А оптимизируют в первую очередь худшие случаи
Igor
Т.е да такую проверку делать можно. Но обычно это усложняет код а понимания задачи не прибавляет.
Igor
ок, понял
Но идея правильная я бы пробовал писать ;)
m700
Но идея правильная я бы пробовал писать ;)
не, код писать это синьорам) а мы джуны таким задачам не нужны)))
Andrii
Ну по технике join можно нафик выкинуть, а сравнивать списки
Igor
А вот как они считают непонятно. Нам выборка, на которой тестится, неизвестна. Можно попробовать запулить и посмотреть
ну хочется вообще решение хорошее. ;) теоретически мы можем хранить кол-во верных символов если они равны длинне анаграммы значит профит. игого получим О(N) решение.
Wietcewitch
Здравствуйте Сделал калькулятор, но возникло две проблемы и не могу понять как их решить. 1)Хочу чтобы он работал только с двумя числами, но если вбить 1 + 2 + 3, то он выдаст ответ 3(1 + 2), а я хочу чтобы throw new Exception("Неверное значение") 2) При рандомном тексте( hasdada) мой калькулятор пытается этот текст поймать в первый аргумент, у него это не выходит и он выдает Index 2 out of bounds for length 1, а я хочу чтобы throw exception был. Код тут https://pastebin.com/9KTD2umB Как это технически сделать?
Andrii
ну хочется вообще решение хорошее. ;) теоретически мы можем хранить кол-во верных символов если они равны длинне анаграммы значит профит. игого получим О(N) решение.
Ну... если у нас что-то вроде ccaccaccaccaccacca и строка aac, то всё грустно... Но в целом можно из дикта удалять последнюю первую букву и инкрементировать последнюю
Igor
Ну... если у нас что-то вроде ccaccaccaccaccacca и строка aac, то всё грустно... Но в целом можно из дикта удалять последнюю первую букву и инкрементировать последнюю
да про это речь .. а потом просто ождаемый дикт и текущий ... при добавлении убавлении букв кол-во верных символов меняется на модуль разницы кол-ва этих символов. бля проще в коде чем словами ;)
lvt
хотя там вроде O(n*m) получается где m длина p
lvt
или ошибаюсь?..
Igor
хотя там вроде O(n*m) получается где m длина p
ошибаешься ... мы каждую букву обработаем 2 раза ... ну не каждую а большинство ;) некоторые только один ;)
Igor
а как ты хэшем перестановки будешь делать?
Igor
хэши обычно если последовательность нужно проверять
Igor
если ты будешь каждый раз рехешировать ... то это О(len(p))
Igor
тогда да получишь m*n
Igor
а ну и сортировать ...
Igor
там как бы len(p) в квадрате не оказалась
Igor
т.е получим н куб решение
m700
а как ты хэшем перестановки будешь делать?
перебрать все анаграмы, замапить, и идти по окну проверять хэши
lvt
еще одно решение, лучше чем прошлое, но все еще полная пизда хд
Wietcewitch
! + 3
Спасибо, но это сильно усложнило задачу Хочу сделать, чтобы был throw, если длинна строки была больше 5 включительно и меньше 3 включительно А вот с этим вариантом не знаю что сделать
Igor
перебрать все анаграмы, замапить, и идти по окну проверять хэши
При длине анаграммы 10 у тебя будет 10! хэшей А макс длинна анаграммы 3*10**4 ... Те хэшей будет факториал этого числа
Wietcewitch
! + 3
А стоп, а если просто else добавить в конце с throw Типа if if if if else всё остальное и throw
Andrii
еще одно решение, лучше чем прошлое, но все еще полная пизда хд
А чего не сравнивать сразу dict? Почему сразу не запузытить туда все буквы с нулями?
Wietcewitch
Fail state через ошибки - худший вариант
Иного варианта я вообще не знаю
depre??ed
Приветствую, как можно правильно аннотировать эту часть кода? по Python 3.9
Wietcewitch
Но сейчас подумаю ещё
Andrii
chars = set(s) d = dict(zip(chars, [0] * len(chars))) dp = d.copy() for ch in p: dp[ch] += 1 ds = d.copy() for i in range(len(p)): ds[s[i]] += 1 for i, j in enumerate(range(len(p), len(s)+1)): if ds == dp: print('found!') ds[s[i]] -= 1 ds[s[j]] += 1 Что-то типа такого на глазок
Igor
Не успел свет вырубили, я вроде написал код но на лиит чекнушть не успел( ... Чуть позже вброшу
Andrii
Я не чекал, просто идея
Azamat
Приветствую, как можно правильно аннотировать эту часть кода? по Python 3.9
никак. по названию переменной все ясно. Комментарии точно лишний
Azamat
Приветствую, как можно правильно аннотировать эту часть кода? по Python 3.9
А кхм, если имеется ввиду добавить type-hint, то наверное так TEST_DATA: List[Tuple]
Igor
У мну шо то типа на компе инета нет) тож проверить не могу)
Igor
class Solution: def findAnagrams(self, s: str, p: str) -> List[int]: lp = len(p) res = [] pd = Counter(p) sd = Counter() incorrect = lp def add(c): nonlocal incorrect incorrect -= abs(pd[c] - sd[c]) sd.update((c)) incorrect += abs(pd[c] - sd[c]) def sub(c): nonlocal incorrect incorrect -= abs(pd[c] - sd[c]) sd.subtract((c)) incorrect += abs(pd[c] - sd[c]) for c in s[:lp]: add(c) if not incorrect: res.append(0) for i in range(1, len(s)-lp+1): sub(s[i-1]) add(s[i+lp-1]) if not incorrect: res.append(i) return res 309 мс ... по хорошему каунтер нужно менять на массив и функции инлайнить ... но заниматься я этим не буду ;) идея именно такая ... не чекать весь словарь. можно даже коррект инкоррект без пересчетов сделать ... но влом
lvt
жесть...
Igor
ну избавься от адд и сабстракт ... дергай их инлайн ... просто мне так было удобней
Wietcewitch
Как делать проверку на вбив рандомного текст в калькуляторе? По типу "adsasd" По количеству символов не выходит
Wietcewitch
Не давать вводить любые буквы
На входе только строка, к сожалению
Maksim Pozharskiy
На входе только строка, к сожалению
Игорь сверху накинул, регуляркой проверять ввод, что бы только цифры были
Igor
\d+\s*[+-*/]\s*\d+ что то типа ... не силен в них ...
Maksim Pozharskiy
Генераторов регулярок много в интернете, но тебе нужна одна из распространенных
Igor
\d+\s*[+\-*\/]\s*\d+ утак
Wietcewitch
\d+\s*[+\-*\/]\s*\d+ утак
А как это в код впихнуть?
Igor
в джаве не сарю сорян. пусть джависты скажут ;)
Евгений
Ребят,помогите с рандомом Нужно сделать прогу,которая бы рандомно ставила +, -, *, / Как это осуществить в питоне?
Igor
А как это в код впихнуть?
чат гпт говорит шо то типа String str = "1233 + 12332"; String pattern = "\d+\s*[+\-*\/]\s*\d+"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(str); if (m.matches()) { ну и import java.util.regex.Matcher; import java.util.regex.Pattern;
Евгений
Это ведь в качестве строки только? А в качестве операции реально?
Azamat
Это ведь в качестве строки только? А в качестве операции реально?
choice = random.choice('+-*/') if choice == 'x': pass elif choice == '-': pass ....
Igor
choice = random.choice('+-*/') if choice == 'x': pass elif choice == '-': pass ....
та нет можно сделать рандом чойс из массива операторов
Azamat
та нет можно сделать рандом чойс из массива операторов
choices = [ lambda a, b: a + b, lambda a, b: a - b, lambda a, b: a * b, lambda a, b: a / b ] random.choice(choices)(10, 5) так?)
Igor
choices = [ lambda a, b: a + b, lambda a, b: a - b, lambda a, b: a * b, lambda a, b: a / b ] random.choice(choices)(10, 5) так?)
import operator import random a = 10 b = 2 o = random.choice([operator.add, operator.sub, operator.mul, operator.truediv]) print(o(a, b)) ну или через лямбды да
Igor
К сожалению не сработало
import java.util.regex.Matcher; import java.util.regex.Pattern; public class MyClass { public static void main(String args[]) { String str = "1233 12332"; String pattern = "\\d+\\s*[+\\-*/]\\s*\\d+"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(str); if (m.matches()) { System.out.println("correct"); } else { System.out.println("incorrect"); } } }
Igor
там с экранированием забубоны
Wietcewitch
Это какой-то сложный вариант
Wietcewitch
Я уверен есть проще
Igor
🤷‍♀️
Igor
если человек знает регекспы то в нем нет ничего сложного. Думаю чтобы проверить все те случаи что проверяет регексп тебе прийдется написать тонну кода.