Pull to refresh
4
0,3
Rating
1
Subscribers
Send message

Решал как-то подобную задачу на codinGame и там у меня определение комбинации заняло всего строк 10 (правда функция выглядела как взрыв на фабрике символов хоть и написана была на c#)


Если что то функция под спойлером

На вход подается 5 отсортированных карт, каждая карта это число 0-51, к примеру 0-3 это четыре масти двойки, 4-7 четыре масти тройки


На выходе — число, больше число — сильнее комбинация, меньше — слабее, равное — равная. Учитывается и кикеры, и A2345


static int GetComboStrength(byte c0, byte c1, byte c2, byte c3, byte c4) // :troll:
{
    byte v0 = (byte) (c0 >> 2), v1 = (byte) (c1 >> 2), v2 = (byte) (c2 >> 2), v3 = (byte) (c3 >> 2), v4 = (byte) (c4 >> 2), cb = (byte)(c0 & 3);
    bool p01 = v0 == v1, p12 = v1 == v2, p23 = v2 == v3, p34 = v3 == v4;
    return p01 ? p12 ? p23 ? Pack(7,v0,v0,v0,v0,v4) : p34 ? Pack(6,v0,v0,v0,v4,v4) : Pack(3,v0,v0,v0,v4,v3) : p23 ? p34 ? Pack(6,v4,v4,v4,v0,v0) : Pack(2,v2,v2,v0,v0,v4) : 
        p34 ? Pack(2,v4,v4,v0,v0,v2) : Pack(1, v0,v0,v4,v3,v2) : p12 ? p23 ? p34 ? Pack(7,v4,v4,v4,v4,v0) : Pack(3,v1,v1,v1,v4,v0) : p34 ? Pack(2,v4,v4,v2,v2,v0) : 
        Pack(1,v2,v2,v4,v3,v0) : p23 ? p34 ? Pack(3,v3,v3,v3,v1,v0) : Pack(1,v3,v3,v4,v1,v0) : p34 ? Pack(1,v3,v3,v2,v1,v0) : 
        Pack((cb == (c1 & 3) && cb == (c2 & 3) && cb == (c3 & 3) && cb == (c4 & 3) ? 5 : 0) + (v0+3 == v3 && v0+2 == v2 && v0+1 == v1 && (v0+4 == v4 || v0==0 && v4==12) ? 4 : 0),v4,v3,v2,v1,v0);
}

static int Pack(int type, byte k0, byte k1, byte k2, byte k3, byte k4) {
    var res = k4 | (k3 << 4) | (k2 << 8) | (k1 << 12) | (k0 << 16) | (type << 20);
    if ((res & 0xFFFFF) == 0xC3210) // fix to order straight ending with A
        res -= 0x91104;
    return res;
}

Как это работает?

Вытаскивается 4 бита существенной информации: Первая карта равна второй (по значению), вторая равна третьей, третья равна четвертой, четвертая равна пятой


дальше все 16 (на самом деле 15 так как "все равны" это не вариант) вариантов комбинаций рассматриваются (для каждой комбинации кроме "все не равны" сразу очевиден результат, ну типа если с0==с1 и с2==с3==с4 то это фул хаус, и сразу понятно какой кикер первый и какой второй)


потом для случая "все не равны" еще проверяется стрит и флаш (они суммируются так что стрит флаш оказывается больше)


Если что то в прод я так код не пишу, это была игра :)

Еще можно добавить что при написании библиотек приходится выставлять публичный интерфейс наружу (или, к примеру, читать json по сети), и вот тут то без указаний типа никакой линтер не скажет ничего более ценного чем "ээээ ну а тут будет any"

Кроме того, я не согласен что не ставя типы экономится время.


Немножно времени экономися сначала, но потом:


Чуть больше времени тратится когда в следующий раз этот код пришлось почитать
Чуть больше времени тратится на написание дополнительных проверок который в системе с типами делать не нужно
Чуть больше времени тратится на написание дополнительных тестов, которые в системе с типами писать не нужно
Чуть больше времени тратится на коментирование (в тех случаях когда имя типа и есть достаточный комментарий)
Чуть больше времени тратится потом на рефакторинг
Систему с большим числом использований потом сложно менять "мало ли кто полагается на текущую деталь реализации". А для работы со старой системой приходится тратить чуть больше времени
и т.п.


В итоге, код которые "write once" и больше никогда не нужно менять/читать (скрипты и простейшие сервисы) получается выгоднее писать на языках без типизации. Но как только дело разрастается до серьезных вещей — на все приходится тратить "чуть больше времени".

Ну вот пример выше с координатами
Дано — куча функций, некоторые работают с 2d координатами, некоторые с 3d, некоторые даже и с теми и с теми.
Задача — у всех использований 2d координат заменить y на z (т.е. превратить 2d координату в 3d). 3d координаты не трогать.
Как решить эту задачу точно? В смысле без ложноположительных и ложноотрицательных срабатваний?
Бонус: Часть данных грузится с диска (к примеру)
Мега бонус: Если нужно поменять не все 2d координаты, а только часть (но существенную часть). В системе с типами можно просто "начать" менять, а дальше просто пофиксить все места где компилятор говорит что "вот тут тип неправильный".


Еще на всякий случай скажу что это не искусственная задача.

Упадет. Но по крайней мере в базе данных не окажется лицензионного соглашения в поле "широта" :)


Вообще-то все современные языки умеют приводить типы. И решать задачу "как получить int из json если там вдруг строка" должен автор библиотеки json сериализации (т.е. в 99% случаев — не пользователь библиотеки). Т.е. ситуация оказывается строго лучше — мы все также можем распарсить число пришедшее в json в виде строки, но только у нас теперь есть еще и дополнительные гарантии от компилятора.

Да. Поэтому и мой комментарий:


Мне так наоборот хочется разделить все числа посильнее, чтобы метры с килограммами сложить было нельзя.

метры вместо килограмм — редкая. Секунды вместо миллисекунд — уже почаще.


Строчки/числа пришедшие из враждебного внешнего мира должны на этапе парсинга валидироваться/конвертироваться, а не добираться до внутренней логики (так то там вообще null или объект может оказаться, сервис то сторонний, и если это не чекать то получится null island), и здесь как раз языки со статической типизацией сделают все что могут — либо сконвертируют, либо выдадут ошибку сразу при парсинге. Так то еще есть локаль, и в некоторых странах десятичный разделитель это точка, в других запятая, в третьих что-то типа апострофа. Тут никакие операторы уже не помогут если сразу корректно не сконвертить.


Вон даже в NASA ньютоны с фунтами путали, и грохали межпланетный зонд из-за этого.
Так то если писать код сразу без ошибок, без архитектурных просчетов, без "новичков", сразу зная (и понимая) все ТЗ целиком, если писать код 1 раз и никогда его не читать — типы (а также комментарии и тесты, читаемые названия переменных, да и вообще функции) не нужны.


Ну и самое главное преимущества из-за которого я никогда не смогу продуктивно работать на динамическом языке — это то что с нормальным инструментарием можно всегда точно сказать что какой-то объект/функция не используется, и точно найти все использования. Это очень сильно играет на чистоту кода — любое "старье" можно быстро отрефакторить или выпилить с минимальными шансами что-то сломать.

Ну кому как. Мне так наоборот хочется разделить все числа посильнее, чтобы метры с килограммами сложить было нельзя. Или чтобы id пользователя и id товара были разные типы, несмотря на то что оба номинально int (или string, неважно)

«Ритуальная шелуха» в современных статически типизированных языках существет только в интерфейсах методов и объектов. И в динамических языках она также существует, только занимает гораздо больше места (в виде проверок на правильность типов аргументов и/или тестов вида «что если передать объект неправильного типа»). В «проектах» на 20 строк кода такого, конечно, может и не быть.

Вот недавно была задачка. В проекте использовались 2d координаты (x, y) в одном домене. Потом понадобилось соединить их с другим доменом в котором использовались 3d координаты (x, y, z) причем «y» там означала высота, и правильная конвертация была такая: (x, y) => (x, 0, y) т.е. y переименовывался в z

Я могу только представить какая это была бы боль в структурно типизированном языке или вообще языке без типов. Но к счастью язык был статически типизируемым и все что понадобилось — это пара предоставляемых IDE рефакторов плюс обновить несколько математических функций.
Интересно, какое количество посетителей дочитало только до этого коммента?
Похоже на то что у ютуба/твитча не так много российских рекламодателей, плюс они еще пытаются «задротов» на уровне таргетинга отрезать, вот и остается одна яндекс-станция.
Возник такой же вопрос. Когда я учился, ДЗ писали в углу доски в виде номеров из учебника.
Помню даже когда болел сильно классе в третьем мне сказали «каждый день решай из последующего параграфа один пример и одну задачу»
Тут еще проблема в том что если Intel выпускает новый процессор в котором добавятся out-of-order блоки или теневые регистры — то все программы начинут работать немного быстрее. А если выходит новый VLIW процессор с еще больше увеличенной длиной слова, то старые программы быстрее работать не начинают, а новые начинают занимать еще больше места.
Старые поколения консолей тоже останутся тормозящим фактором, еще как минимум год-два игры будут делать в двух вариантах.
Я думаю что в игровом компе для «ААА» игр ssd уже несколько лет как стандарт. Новое поколение консолей ускорит процесс. А игры попроще можно и в оперативку загрузить.
Можно пойти дальше и придумать — к примеру — какое нибудь уникальное слово. Которое в случае чего можно поменять и не нужно покапать новое кольцо. Можно назвать такое слово «слово-пропуск», по английски — «pass word»
Что весьма похоже на объявление типа. А если понадобится целое напишет a|0. А если строка — a + "".

А если понадобится вектор к примеру, то придется писать тесты «что будет если передать вместо вектора улыбающуюся какашку»
Ну по крайней мере гугл пока не имеет полномочий вломиться с факелами и вилами
Я не физик по образованию, но физику изучал. Пишу комментарий специально не глядя в другие комменты, и осознаю что могут быть ошибки!
Мои ответы
Букварь Арнольда — стоит 7 копеек, решил быстро

Толстой и три шапки — вся система потеряла 25р и всю потерю всял продавец — т.е. 25р

Вольт в степени ампер — можно считать что вольт и ампер это такая непонятная величина (похожая на переменную) которую можно выносить за скобки и т.п.
Тогда 3 вольт + 5 ампер сложить конечно можно, но получится не 8 чего-то, а «3 вольт и 5 ампер» (также как если сложить 3x и 5y то получится не 8 чего-то а 3x+5y). Математически проблем нет, физического смысла ноль.

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

Землетрясения и земная ось
Насчет оси ответ дан в вопросе. Насчет угловой скорости — еще как может, за счет перераспределения массы, см. фигурное катание

Юла в миске
Не уверен что точно, но полагаю что вектор силы трения направлен вдоль стенки что приводит к ускорению юлы вдоль стенки (а т.к. стенка круглая то юла и вылетает). Если это так, то юла будет вылетать против направления своего вращения.

Камень пробивает лед
Интересный вопрос, даже не представляю
Камень толкает лед, лед толкает воду, вода временно расступается, эээ, в общем, не знаю :)

Ложка сахара
Как я понимаю задача не предлагает ответа. Если мы не выставляем пинцетом крупинки вручную, и они обтесывались друг о друга, то можно сказать что крупинка в среднем это выпуклый объект, соответственно лежащая устойчиво крупинка имеет одну точку «максимальной высоты» и никаких локальных максимумов за которые можно было бы зацепиться. Тогда другая крупинка (на слое выше) может устойчиво находиться только в «пазах» между крупинками на слое ниже, и тогда угол наклона будет примерно 45 градусов.
Угол выше чем 45 градусов можно создать за счет эффектов силы трения (но это будет неустойчиво), за счет других сил (к примеру если крупинки влажные то они могут удерживатсья силами поверхностного натяжения НО это не для сахара т.к. он впитывает влагу), за счет деформации крупинок под действием силы тяжести (для чайной ложки сахара можно пренебречь), за счет межатомных связей (если крупинки рандомные или насыпаны рандомно то можно пренебречь)

«Просто Землю вращают, куда захотят, наши сменные роты на марше»
Мм, по моему это очень простой вопрос. Когда кузнечик начнет прыгать, вся остальная земля начнет крутиться быстрее (медленнее). А когда закончит — прекратит. Таким образом кузнечик может сместить сутки на сколько-то часов/минут/секунд если будет прыгать достаточно долго. Но не сможет раскрутить землю (т.е. изменить продолжительность суток) на произвольную величину.

По ветру быстрее ветра
Может. Если будет двигаться по диагонали (при этом проекция скорости корабля на скорость ветра не выше чем скорость ветра, но движение по диагонали можно выдерживать за счет воды)

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

Пушка и ОТО
Я не очень хорошо знаю ОТО чтобы ответить. Но точно мону сказать что простые ответы там очень часто неправильные.
В теории относительнгости есть вещи которыми нельзя пренебрегать, иначе уткнешься в парадокс. К примеру инерциальностью и одновременностью.
Таким образом хоть и «Временем ускорения при выстреле пренебречь» можно, но самим ускорением нельзя! Система становится неинерциальной и правила меняются!
Если переформулировать задачу так:
«мимо земли сквозь нее летит снаряд (столкновением с землей пренебречь). По счастливой случайности на нем есть атомные часы, и в момент когда он протетает поверхность они оказываются синхронизированы с нашими» — и далее по задаче
То тогда проблема оказывается в одновременности — то что на снаряде часы синхронизированы с землей в момент пролета поверхности земли относительно земли, это еще не значит что они синхронизированы в момент пролета земли относительно снаряда (точнее, точно рассинхронизированы). Поэтому у такой постановки задачи как минимум два ответа.

Какой механизм столкновений, при котором установится распределение Максвелла?
Как обычно все распределения описывают идеальное состояние — т.е. бесконечный объем заполненый газом с фиксированным средним давлением, бесконечное количество частиц. В таком случае может появиться молекула с любой сколь угодно большой скоростью. В реальности — не может. Но «хвост» этого распределения настолько мал, что его можно не учитывать и спокойно применять распределение к реальным объемам с конечным (большим) числом частиц

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

Откуда взялась энергия?
Относительно земли, машина начала двигаться медленнее. Да и камень относительно земли полетел не с (2v) скоростью, а с какой-то поменьше, которая зависит от массы машины.
Если считать что у машины бесконечная масса, то тогда да, будет 2v а недостаток энергии взят из бесконечной кинетической энергии машины :)

Расширение Вселенной
Вселенная расширяется экспоненциально, а не линейно. В экспоненциально расширяющейся вселенной не доползет, в линейной доползет. Это даже меньше чем 2 минуты понадобилось. Но правда я не на 100% уверен в результате :)
Ну и вообще вся суть RAID в том что мы жертвуем объемом ради скорости/надежности, тогда как цель у SMR противоположная
Из относительно нового есть Quern — пожалуй самая myst-like игра за последние 5 лет
Еще есть Obduction — это от той же компании что и Myst, но возникает ощущение что под конец разработки у них резко кончился бюджет :(
Конечно среди вебкамщиц могут быть бабушки (а среди таксистов миллионеры) но все ими остаться не смогут — не хватит спроса.
И оказавшись без работы в 40-50 без образования/опыта найти что-нибудь кроме низкоквалифицированной работы практически нереально
Да, у популярной вебкамщицы, которая еще и умеет вкладываться в инвестиции в будущее, да еще и в такие, которые не прогорят, скорее всего такой проблемы не будет

Но просто, при прочих равных зарабатывать «выше среднего» но не получая квалификации — это создавать проблемы себе будущему

Information

Rating
3,020-th
Registered
Activity