Рустам
Но если они не совпадут, то должен быть ответ false
Рустам
Тут этот случай игнорируется
Pavel
Мой вопрос можно ли это в более "плоской" форме записать?
за плоскую считается? let checkBrackets s = let brackets = "[](){}" let rec loop acc = function | ch :: t -> match acc, brackets.IndexOf(ch : char) with | _, -1 -> loop acc t | _, i when i % 2 = 0 -> loop (brackets.[i + 1] :: acc) t | [], _ -> false | ah :: at, _ -> if ch <> ah then false else loop at t | [] -> acc = [] loop [] [ yield! s ]
Рустам
Не знаю можно ли считать за плоскую, но довольно интересный конструкт выходит)
Pavel
можно даже if убрать
Рустам
На одну меньше чем у меня, но моя легче читается
Рустам
Так как у меня там достаточно примитивная логика
Igor
я поправил, там прежде чем head получить, нужно проверять на не пустой список
Pavel
На одну меньше чем у меня, но моя легче читается
вообще у тебя 4 уровня. 1 ты спрятал в функциях
Рустам
Да, верно
Рустам
👍
Ilya
ch, ah, at, t... Какие хорошие имена.
Рустам
Приёмчик с ...&& loop... понравился
Рустам
Возьму на вооружение
Igor
ch, ah, at, t... Какие хорошие имена.
немного похож на ирландский код))
Igor
вообще я бы конечно от списка отказался. В аккумуляторе даже кажется неправильно так память расходовать, а вот весь текст в список перегнать это уже перебор
Pavel
а теперь самое страшное let checkBrackets (s : string) = let rec loop acc xs = match acc, xs with | _, (ch & (91 | 40 | 123)) :: t -> loop ((ch / 90 + 1 + ch) :: acc) t | ah :: at, (ch & (93 | 41 | 125)) :: t when ch = ah -> loop at t | [], (93 | 41 | 125) :: t -> false | _, _ :: t -> loop acc t | acc, [] -> acc = [] loop [] [ yield! Seq.map int s ]
Igor
теперь надо натравить на это benchmarkdotnet
Igor
а спаны у меня, потому что у меня net core 3 стоит
Рустам
понял, значит спаны смогли бы сэкономить кучу памяти
Pavel
зачем? и так ясно что toList все сожрет
Igor
но мне кажется спаны раньше добавили, где-то в 2-2.2
Igor
там наверное нугет надо использовать
Igor
кстати мб fparsec можно теперь на спанах переписать?!
я до него не дошел еще, лежит у меня в закладках попробовать его
Ilya
Спаны ещё в 4.5 добавили. Год назад, считайте.
Ilya
В .net core 2.1
Ну я про F#. Там ещё всякие inref и outref добавляли.
Viacheslav
Ну я про F#. Там ещё всякие inref и outref добавляли.
Так его ж в .net core добавили. Версия языка тут не причём
Ilya
Так его ж в .net core добавили. Версия языка тут не причём
Да? А чо тут пишут про span support? https://devblogs.microsoft.com/dotnet/announcing-f-4-5/
Ilya
Не, если я не прав, то я не прав. Я в то время ещё с F# знаком не был.
Igor
его и туда и туда добавили, причем я вот недавно где-то читал, что у них разная реализация
Igor
или видео было...
Igor
а тьфу, фигню сказал, увидел 4.5 и подумал про net framework
Pavel
ch, ah, at, t... Какие хорошие имена.
в чем проблема с ними? это стандартные имена в функциональщине https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/list.fs#L206
Рустам
Везде спаны выходят в купе с .net core
Рустам
пока не получилось найти как подключить к .net
Igor
https://www.nuget.org/packages/System.Memory/
Pavel
Везде спаны выходят в купе с .net core
ожидаю что они для задачи проверки скобок ничего не дадут в сравнении с проходом по строке через индекс
Рустам
ожидаю что они для задачи проверки скобок ничего не дадут в сравнении с проходом по строке через индекс
а разве в случае с длинной строкой они не должны увеличить перформанс?
Рустам
за счёт отсутствия надобности в копировании множества раз подстрок или перевода строки в список?
Pavel
там выборка по символу будет, ничего не аллоциреутся. откуда там увеличению взяться?
Igor
for по символам самое то, спаны у меня только ради функционального подхода
Igor
хотя можно было вместо 2-х параметров использовать 3
Igor
массив, индекс и acc
Рустам
[ yield! s ] — но это меня смущает
Рустам
это разве не должно вызвать развёртывание строки в список?
Pavel
это разве не должно вызвать развёртывание строки в список?
должно. я не говорил что у меня проход по строке через индекс. переделать несложно
Igor
э.. в чем он функциональный?
вместо for у меня рекурсия
Igor
а ну собственно и acc же еще, там либо рекурсия, либо mutable придется использовать
Pavel
вместо for у меня рекурсия
все равно связи со спанами не нахожу
Igor
спан просто объединяет в себе ссылку на массив и индекс
Igor
и это структура на стеке
Pavel
let checkBrackets (s : string) = let brackets = "[](){}" let rec loop acc i = if i < s.Length then let ch = s.[i] match acc, brackets.IndexOf(ch : char) with | _, -1 -> loop acc (i + 1) | _, i when i % 2 = 0 -> loop (brackets.[i + 1] :: acc) (i + 1) | [], _ -> false | ah :: at, _ -> if ch <> ah then false else loop at (i + 1) else acc = [] loop [] 0
Pavel
все прекрасно без спанов делается
Рустам
интересно
Igor
я же и сказал, можно передавать индекс, ну наверное спаны лишние
Рустам
мне в принципе понятна логика стоящая за этим, а ощущения как-будто первый раз вижу
Рустам
читая про функциональный подход я как-будто потерял для себя императивные методы)
Vasiliy
Геймдиректор Control рассказал, что Бюро контроля из игры не просто так напоминает Фонд SCP — разработчики действительно вдохновлялись вымышленной организацией. Оказалось, что людям из администрации сообщества SCP это даже приятно. https://dtf.ru/games/70964
Vasiliy
лол. Так они взяли просто идею
Vasiliy
а не лого.
Shub
Ну я в курсе, что когда так делает капитал - то это «просто взяли идею, а не то, что», а когда это делаешь ты - то это плагиат.
Shub
Надо чувствовать разницу
Romɑn
я до него не дошел еще, лежит у меня в закладках попробовать его
Я посмотрел на его внутренности, там все на ансейфах. Сходу кажется что он эти спаны сам у себя заимплементил.
Vasily
кстати мб fparsec можно теперь на спанах переписать?!
Ну там напрашивается из- за бэктрекинга
Vasily
поясни?
Частая операция отматывания стрима назад
Vasily
Поэтому спаны там прямо ок
Romɑn
Поэтому спаны там прямо ок
ты не смотрел внутрь фпарсека?