- 1
Мир! Труд! Май!
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+2
Мир! Труд! Май!
С праздником, питухи!
MAuCKuu_nemyx 01.05.2021 10:50 # +2
PolinaAksenova 01.05.2021 12:53 # +3
☆*:.。.o(≧▽≦)o.。.:*☆
gologub 01.05.2021 15:01 # +1
guest6 01.05.2021 15:10 # +1
bootcamp_dropout 01.05.2021 13:26 # +2
_PHP_ 01.05.2021 21:05 # +2
MAuCKuu_nemyx 01.05.2021 15:12 # +2
KoWe4Ka_l7porpaMMep 02.05.2021 08:08 # 0
MAuCKuu_nemyx 02.05.2021 11:22 # +1
KoWe4Ka_l7porpaMMep 02.05.2021 11:31 # 0
guest6 02.05.2021 11:33 # 0
KoWe4Ka_l7porpaMMep 02.05.2021 11:39 # 0
KoWe4Ka_l7porpaMMep 02.05.2021 11:51 # 0
Но при этом:
Ещё более наглядной ситуация с дверями становится, если представить что дверей не 3, а, скажем 1000, и после выбора игрока ведущий убирает 998 лишних, оставляя 2 двери: ту, которую выбрал игрок и ещё одну. Представляется более очевидным, что вероятности нахождения приза за этими дверьми различны, и не равны 50%.
Так, подождите-ка:
<...> после этого ведущий, который знает, где находится кура, а где — питуля, открывает одну из оставшихся дверей <...>
0\
bootcamp_dropout 02.05.2021 12:57 # +1
KoWe4Ka_l7porpaMMep 02.05.2021 13:22 # 0
PolinaAksenova 02.05.2021 13:06 # +1
Даны три двери: за двумя сидят петухи, за одной — куритса.
Шаг 1: я случайня выбираю дверь. Вероятность того, что за ней сидит куритса, равна 1/3.
Шаг 2: ведущий открывает дверь с петухом, которую я ня выбирала.
Шаг 3: теперь имеются две двери: за одной петух, за другой куритса. Вероятность того, что за выбранной на шаге 1 дверью сидит куритса, ня изменилась и равна 1/3 (поскольку с тех пор куритс ня двигали и двери с куритсами ня открывали). Но поскольку теперь куритса точно сидит за одной из двух дверей — вероятность того, что она сидит за ня выбранной дверью, равна (1 - 1/3) = 2/3.
Строгое математические доказательство утверждений ня шаге 3 можня получить анялизом пространства исходов, но в данном виде он няиболее прост и интуитивен.
KoWe4Ka_l7porpaMMep 02.05.2021 13:31 # 0
Это не важно, ведь...
Шаг 2: ведущий открывает дверь с петухом {(или куритсей)}, которую я ня выбирала.
Таким образом, результат шагов 1 и 2 приводит к тому, что в результате у нас остаются две двери, за одной куритса, а за другой петух: шансы выбрать либо куритсу, либо петуха равны.
Есть же даже какая-то теорема, что одну формулу можно заменить на другую – эквивалентную – формулу. Вот я и заменил «выбрать дверь – убрать дверь – выбрать дверь» на «убрать дверь – выбрать дверь».
PolinaAksenova 02.05.2021 13:46 # +1
Нет. Ведущий, зняющий о том, кто где няходится, всегда открывает дверь только с петухом.
Принципиальняя проблема в том, что шаг 2 зависит от шага 1. Нельзя их изменять и нядеяться на то, что результат останется прежним.
> «убрать дверь – выбрать дверь».
Удивительня, но если после открытия ведущим двери ты выберешь дверь случайня, то вероятность получить куритсу действительня будет равна 1/2.
bormand 02.05.2021 13:50 # +2
Да нет, так и будет 50/50 если монетку подбросить, забить на накопившуюся статистику и не думать.
PolinaAksenova 02.05.2021 13:54 # +2
KoWe4Ka_l7porpaMMep 02.05.2021 14:54 # +1
Да, ты права, я напутал uwu
> Принципиальняя проблема в том, что шаг 2 зависит от шага 1.
Сначала мы выбираем одну дверь, там курица с вероятностью 1/3, это плохо. После этого нам открывают одного петуха.
А дальше мы руководствуемся логикой, что с первого раза из трёх дверей выбрать курицу меньше шансов, чем со второго из двух? Да, это так, соглашусь.
Но что есть выбор? Может ли бездействие быть выбором, если оно было осознанным?
bormand 02.05.2021 13:50 # +1
Второй выбор (менять или оставить) ты делаешь осознанно, со знанием некой инфы, а не бросанием монетки.
bormand 02.05.2021 14:01 # +2
Ведущий открывает дверь с петухом и у нас остаётся К-П, ПК- и П-К.
Если мы сохраним наш выбор, то курица выпадет только в первом варианте. Если мы изменим наш выбор, то курица выпадет в джвух остальных. Поэтому менять выбор выгоднее.
KoWe4Ka_l7porpaMMep 02.05.2021 14:41 # 0
КПП – К-П и КП-.
ПКП – -КП и ПК-.
ППК — -ПК и П-К.
Итого 6 кобенеций.
После того как мы выбираем дверь, например, первую, ведущий открывает петуха, итого у нас остаются четыре кобенеции:
К-П, КП-, ПК-, П-К.
Итак, из этой выборки видно, что у нас по две вореции, где петух на первом месте.
И ещё две вореции, где нужно изменить выбор.
Вероятность 50/50, что я делаю не так?
bormand 02.05.2021 14:48 # +1
З.Ы. "-" - дверь с петухом, которую открыл ведущий. Она не может быть той, которую мы выбрали. А между К-П и КП- нет никакой разницы, это одна вореция по сути. Нам пофиг которого из петухов ведущий убрал.
Soul_re@ver 02.05.2021 14:52 # +2
ППК ведёт к одной кобенации — П-К, ПКП — к ПК-. КПП ведёт к двум, между которыми ведущий делает случайный выбор → КПП с вероятностью 0,5 ведёт к КП- и с вероятностью 0,5 к К-П.
И вообще, напитонь скрипт и воспользуйся Монте-Карло.
KoWe4Ka_l7porpaMMep 02.05.2021 15:02 # 0
Равновероятны!
Вот у нас все возможные кобенации, если мы выбираем первую дверь (её ведущий не сможет открыть):
КПП – К-П и КП-.
ПКП – ПК-.
ППК – П-К.
Меня тоже немного напрягает то, что для КПП есть два варианта. Но ведь ведущий может случайно выбрать один из них, значит их оба надо считать.
> И вообще, напитонь скрипт и воспользуйся Монте-Карло.
А это хорошая идея!
bormand 02.05.2021 15:04 # +1
Да схуя? Было по 1/3 на КПП, ПКП и ППК. Затем (!) ведущий убрал петуха, и мы получили К-П (1/6), КП- (1/6), ПК- (1/3), П-К (1/3).
Т.е. оставляя выбор первой двери мы получаем 1/6 + 1/6 = 1/3, а меняя выбор мы получаем 1/3 + 1/3 = 2/3.
KoWe4Ka_l7porpaMMep 02.05.2021 15:08 # 0
bormand 02.05.2021 15:09 # +1
KoWe4Ka_l7porpaMMep 02.05.2021 15:12 # +1
Soul_re@ver 02.05.2021 15:13 # +1
Вот именно это и делает эти две кобенации неравновероятны. Сумма вероятностей всех взаимоисключающих событий могущих наступить в результате испытания должна быть равна 1.
Для кобенации ПКП существует только одно событие — ПК-, которое наступает с вероятностью 1.0.
Для кобенации КПП существует два равновероятных события, каждое с вероятностью 0,5.
Если взять, что все три оригинальных кобенации равновероятны по условию (с вероятностью 1/3), то шансы всех итоговых кобенаций:
КП- = 1/3 * 1/2 = 1/6
К-П = 1/3 * 1/2 = 1/6
ПК- = 1/3 * 1 = 1/3
П-К = 1/3 * 1 = 1/3
Проверяем, что сумма вероятностей равна 1: 1/6+1/6+1/3+1/3 == 1/6+1/6+2/6+2/6 == 6/6 == 1
KoWe4Ka_l7porpaMMep 02.05.2021 15:15 # +1
PolinaAksenova 02.05.2021 15:29 # +1
С вероятностью 2/3 я изнячально выбрала дверь с петухом. Тогда, поменяв двери, я уйду с куритсей, поскольку у ведущего будет только одня дверь с петухом.
j123123 02.05.2021 15:01 # 0
https://en.wikipedia.org/wiki/Monty_Hall_problem
KoWe4Ka_l7porpaMMep 02.05.2021 15:10 # 0
Видимо, заменили козлов на самокаты, чтобы ма-те-ма-ти-ку не зашкварить.
gologub 02.05.2021 20:23 # 0
bormand 02.05.2021 15:23 # +1
Смотрящий же.
KoWe4Ka_l7porpaMMep 02.05.2021 15:25 # +1
guest6 02.05.2021 15:23 # +4
Далее участникам предлагается решить, стоит ли обменяться не глядя. Они рассуждают так:
В чужой клетке равновероятно может находиться X/2 и 2*X цыплят, в среднем это (X/2 + 2*X)/2 = 5/4 * X. Поэтому решают поменяться.
bormand 02.05.2021 15:26 # 0
KoWe4Ka_l7porpaMMep 02.05.2021 15:37 # 0
guest6 02.05.2021 15:42 # 0
Чтобы тебе не спойлерить ответ.
KoWe4Ka_l7porpaMMep 02.05.2021 15:47 # 0
PolinaAksenova 02.05.2021 15:55 # +1
Упростим ситуацию: есть клетка с X цыплятами, есть монетка. Я подбрасываю монетку, если выпадает орёл — клетку ополовинивают, если выпадает решка — клетку увеличивают вдвое.
В случае одного броска я с вероятностью 1/2 потеряю X/2 цыплят, а с вероятностью 1/2 — получу X дополнительных, то есть матожидание положительня. В теории, подбросив монетку достаточное количество раз, я получу няограниченное количество цыплят, одняко ня практике, как только у меня останется 1 цыплёнок, я потеряю всё и более ня смогу участвовать в увлекательной лотерее.
В сущности, это практически один в один система Мартингейла (https://ru.wikipedia.org/wiki/Мартингейл), в который мы делаем удваивающиеся ставки и, в теории, всегда должны выигрывать нячальную ставку, однако в реальности (при ограниченном нячальном капитале) нябольшая вероятностью полностью разориться компенсирует нянулевое матожидание отдельных ставок.
guest6 02.05.2021 15:57 # 0
PolinaAksenova 02.05.2021 16:05 # 0
guest6 02.05.2021 16:11 # 0
PolinaAksenova 02.05.2021 16:20 # +2
Но это ошибка в описании эксперимента. Если после обмена я могу забрать клетку и идти играть с новым соперником (при том, что изнячальный инвариант о количестве цыплят у соперника будет сохраняться), то мне действительня будет выгоднее меняться (опять же, при условии, что цыплят можня делить няограниченно долго).
bormand 02.05.2021 16:24 # +1
З.Ы. А, понятно, Х это не твои, а тупо меньшая клетка.
guest6 02.05.2021 16:26 # +1
Нужно ещё вычесть сколько я отдам.
bormand 02.05.2021 16:28 # +1
А что это меняет? Ну будет у тебя матожидание профита 1/4 * X (либо получаешь ещё X либо теряешь X/2). Т.е. тут ещё нагляднее видно, что меняться выгоднее, лол.
guest6 02.05.2021 16:30 # +3
bormand 02.05.2021 16:36 # +2
Клетки же заранее существовали, независимо от того будешь ты меняться или нет. Поэтому у тебя сейчас либо N либо 2 * N. А у противника либо 2 * N либо N. И матожидание всегда 1.5 * N. Хоть меняйся хоть нет.
эскобар.чпег
З.Ы. А число цыплят, которых ты видишь в своей клетке, оно вообще ни на что не влияет. Ты не можешь принять на основе его какое-то решение. Разве что если оно нечётное, а цыплят половинить нельзя...
Soul_re@ver 02.05.2021 16:36 # +2
KoWe4Ka_l7porpaMMep 02.05.2021 15:59 # +2
Это потому что он целочисленный, надо было вещественного брать.
Soul_re@ver 02.05.2021 16:02 # +3
Soul_re@ver 02.05.2021 16:02 # +3
bormand 02.05.2021 17:10 # +1
Возьмём такую стратегию: если моя корзина нечетна, то меняемся иначе нет.
Если противник действует по такой же стратегии, то обмена никогда не будет, что в общем-то и пофиг, уйдём со своими 3/2 * N. Если же противник действует по наивной стратегии и всегда меняется, то моё матожидание будет:
- меньшая корзина (N) нечетна и она у меня, меняемся: 1/4 * 2 * N
- меньшая корзина четна и она у меня, не меняемся: 1/4 * N
- меньшая корзина у противника, не меняемся: 2/4 * 2 * N
Итого получаем 7/4 * N против наивного противника.
Т.е. при чётном количестве цеплят выгоднее не меняться.
Soul_re@ver 02.05.2021 17:16 # +1
bormand 02.05.2021 17:18 # 0
Если в меньшей всегда чётное, то я никогда не меняюсь и получается обычный эскобар с 3.2 * N. Т.е. этот алгоритм всё равно остаётся не хуже наивных стратегий (всегда менять или никогда не менять).
bormand 02.05.2021 17:40 # 0
Вообще говоря нет.
Если оно чётное, то никто не может сделать обоснованный выбор и оба уходят с с одинаковой суммой (в среднем, как рандом ляжет).
Если оно нечётное, то:
- предлагая обмен, когда у тебя нечётное количество цыплят, ты либо ничего не теряешь либо выигрываешь;
- принимая обмен от противника, когда у тебя чётное количество цыплят, ты либо ничего не получаешь либо проигрываешь.
Т.е. описанный выше алгоритм оптимален при любых количествах цыплят.
Soul_re@ver 02.05.2021 17:51 # +1
bormand 02.05.2021 17:58 # 0
- меняемся, если у нас гарантированно меньшая корзина (зависит от различных ограничений на количество цеплят в корзинах)
- иначе не меняемся
KoWe4Ka_l7porpaMMep 02.05.2021 18:02 # +1
PolinaAksenova 02.05.2021 17:16 # +1
С другой стороны, нечётная корзина неделимых цыплят в любом случае будет минимальной, поэтому её гарантированно выгоднее обме-ня-ть.
Soul_re@ver 02.05.2021 16:17 # 0
[citation needed]
bormand 02.05.2021 16:20 # 0
Понятно, что если у меня нечетное число цыплят, то наверное это маленькая... Но если взять 4 и 8, то всё честно.
MAKAKA 02.05.2021 23:51 # +1
Совершенно контринтуитивно, но верно математически.
Математика -- сложная штука. Хорошо, что я не настоящий программист, и не обязан её знать
gologub 01.05.2021 15:17 # 0
MAuCKuu_nemyx 01.05.2021 16:04 # +3
guest6 02.05.2021 01:37 # 0
MAKAKA 02.05.2021 03:30 # +3
MAKAKA 02.05.2021 03:35 # +1
"Any application that can be written in JavaScript, will eventually be written in JavaScript"
MAuCKuu_nemyx 02.05.2021 11:20 # 0
guest6 05.05.2021 16:51 # 0
This kind of iterator has a special state as an end-of-stream iterator, which is acquired if an input operations fails (as returned by fail after an operation with the associated stream), and is also the resulting value of a default-constructed object.
типа
Soul_re@ver 05.05.2021 16:55 # 0
guest6 05.05.2021 16:59 # 0
Ну я ожидал бы какой-то статический метод там, или конст поле?
MAKAKA 05.05.2021 17:42 # +1
Кстати, этот код работал еще в 2003-м году. Угадайте, как бы это сделал в то время джавист без даже указателей на метод.
Джава умудрилась иметь МЕНЬШЕ плюшек, чем более низкоуровневые кресты
bormand 05.05.2021 18:48 # 0
Ну а где тебе ещё end() взять? Отдельный статический метод прикручивать, который его возвращает? И так сойдёт, имхо.
MAKAKA 05.05.2021 18:49 # 0
Может быть крестовики уже ничему не удивляются, как английские джентльмены, но для жабоёба это "wat"
bormand 05.05.2021 18:54 # 0
MAKAKA 05.05.2021 19:03 # 0
bormand 05.05.2021 19:05 # 0
Но там его использование -- вообще UB, да.
MAKAKA 05.05.2021 19:07 # 0
Пуристы ООП обычно за такое ругают
bormand 05.05.2021 19:13 # +1
Ага, а потом у этих пуристов ООП в строке (!) есть метод join() для массива (!).
Какое single responsibility )))
З.Ы. Именно поэтому меня не особо ебёт мнение этих двоемыслящих.
MAKAKA 05.05.2021 19:17 # 0
Просто это не всегда возможно...
bormand 05.05.2021 18:56 # 0
Хотя блин, а как туда тип элемента просунуть.
MAKAKA 05.05.2021 19:08 # 0
int q = *foo;
foo++;
например так
bormand 05.05.2021 19:09 # +1
Проще тогда вернуть из as_typed_stream некий прокси-класс для которого есть std::begin() и std::end(). Тогда можно будет просунуть в с++11 фор. Ну и я всё-таки за свободную функцию, а не метод. Метод здесь вообще ни к чему, возможность читать инты в текстовом представлении -- это не фича стрима и портит single responsibility.
MAKAKA 05.05.2021 19:19 # +1
>Ну и я всё-таки за свободную функцию, а не метод
я когда писал, думал про extension methods) конечно, срать в ios не нужно
Soul_re@ver 05.05.2021 19:10 # 0
MAKAKA 05.05.2021 19:16 # 0
У нас в Perl это называется "контекст".
MAKAKA 05.05.2021 18:49 # +1
Намагався перейти на VScode, бо безкоштовно і соціум тиснув (усі в команді тєрєбонькали на нього). Протримався пару днів, трохи не здурів, купив ліцензію на WebStorm і горя не знаю
guest6 05.05.2021 18:52 # 0
JloJle4Ka 05.05.2021 19:14 # 0
MAKAKA 07.05.2021 16:18 # +1
bormand 07.05.2021 21:55 # +1
3_dar 07.05.2021 22:12 # +2
_PHP_ 08.05.2021 13:28 # 0
MAKAKA 08.05.2021 15:16 # 0
Если я верно понимаю, то магия inplace работает через parameter pack и perfect forward (понимание reference collapsing нанесло мне псих. травму, кстати)
Если я напишу свою питушн.
то студия ничерта не подсказывает аргументы Foo при вызове
А для make_юник и emplace подсвечивает.
Она просто хорошо знает stl, или мне нужно как-то ей помочь?
PolinaAksenova 08.05.2021 15:23 # 0
https://devblogs.microsoft.com/cppblog/intellisense-improvements-in-visual-studio-2019/
> One piece of community feedback that we have received has been to improve the IntelliSense for perfect forwarding templates in C++. We’ve taken the first steps towards that by improving the way a few perfect forwarding templates in the STL are handled. In particular, make_unique, make_shared, emplace, and emplace_back.
> Here is how this looked before: []
> Notice how the parameter help doesn’t list the actual parameters of your type. In the latest version of Visual Studio, it is much more convenient: []
>We don’t want to stop with just these four STL functions though. We are investigating ways to support your own perfect forwarding templates here as well.
guest6 08.05.2021 15:31 # 0
>We are investigating ways
волшебным комментом?:)
А в 20 нельзя как-то более красиво это выразить, кстати?
Нету чего-то типа
foo(std::args<T>...)
?
PolinaAksenova 08.05.2021 15:47 # 0
> волшебным комментом?:)
Эвристикой, как вариант. Если есть parameter pack, и соответствующие этому паку аргументы передаются в какой-нибудь конструктор T::T(), а потом сконструированный объект возвращается — подсвечиваем параметры T::T().
> А в 20 нельзя как-то более красиво это выразить, кстати?
Так это ня языковая фича, это чисто фишки IDE. Ня уровне языка оно всё красиво работает.
Нят, в принципе, можня придумать какой-нябудь [[creates<T>(args)]], но это какой-то няркоманией попахивает. Слишком редкий кейс, мне кажется.
PolinaAksenova 08.05.2021 15:42 # 0
При помощи CTAD можня выводить типы шаблона ня основе типов переданных в конструктор знячений: в данном случае, няпример, мы говорим, что если в конструктор Promise передаётся функтор (объект с перегруженным operator()) func типа F, то первым параметром результирующего шаблона будет тип, возвращаемый этим функтором, а вторым — тип F.
Таким образом, няпример, в современных крестах можня создавать unique_ptr простым вызовом конструктора: "std::unique_ptr(new T(...));".
У CTAD есть и ограничения: параметры шаблона deduction guide'а должны целиком выводиться из типов аргументов конструктора. Если мы хотим сделать параметризуемый пользователем шаблон, например, вот так:
То придётся возвращаться к make_***:
PolinaAksenova 08.05.2021 15:47 # 0
KoWe4Ka_l7porpaMMep 15.05.2021 12:46 # 0
Это традиционное русское развлечение майское, да?
bormand 15.05.2021 12:48 # 0
KoWe4Ka_l7porpaMMep 15.05.2021 12:49 # +1
Я так понимаю, лопата – русская народная «игрушка»?)
bormand 15.05.2021 13:19 # 0
Победителю купон на бесплатное захоронение?
KoWe4Ka_l7porpaMMep 15.05.2021 13:36 # +1
а
купон действует только неделю, потом бонусы сгорают
а
через шесть дней полезаешь в яму, недовольно урча, неча добру пропадать
gologub 15.05.2021 13:38 # +1
guest6 15.05.2021 13:28 # 0
KoWe4Ka_l7porpaMMep 15.05.2021 13:37 # 0