
Прислали фото с последнего собрания. Жаль, что в этом году поездка сорвалась, но им и без неё весело:
val set = mutableSetOf<Char>()
string.forEach { set.add(it) }
if (set.contains('9')) set.remove('3')
if (set.contains('8')) set.remove('2' и '4')
if (set.contains('6')) set.remove('2' и '3')
if (set.contains('4')) set.remove('2')
set.remove('1')
set.remove('0')
2. Потом я оптимизировал проверку делимости BigInteger, используя признаки делимости на 2, 4, 5 и 8. Но эта оптимизация уже не дала сильный прирост, как предыдущая. И всё равно решение задачи не принимали из-за 11-го теста.Map<Ref>, чтобы не пробегать второй раз для записи в него.
data class Ref(var value: BigInteger)
...
val dividend = readLine()!!.toBigInteger()
val applicable = map[dividend] ?: Ref(dividend).also {
while (true) {
map[it.value] = it
if (test(it.value)) break
it.value = map[++it.value]?.value ?: continue
break
}
}
В результате решение задачи приняли с временем прохождения 1715 мс. Подумав над условием задачи, я понял, что для неё можно не использовать BigInteger, а достаточно использовать Long. Это позволило сократить время исполнения до 1169 мс, а использование памяти - в два раза (с 130000 до 60000 кб)
Вернулся в Пузырь, а тут дорогие миссии раздают. В принципе, чтобы заработать 50M надо ещё и потратить 20-30M. Но это только тому, кто закупает и везёт товар. А те, кто в Крыле, получают все 50M только за участие.

Как у нас принято, после новогоднего шоу устроили концерт. Как обычно, никто не знал, кто будет выступать. Сегодня это оказалась немецкая рокабилли-группа The Baseballs. Мне такое нравится - послушал с большим удовольствием. До Stray Cats может и не дотягивает, но до The Brian Setzer Orchestra или каких-нибудь Red Elvises - вполне. Прикольной фишкой мне показалось троеголосие. В какой-то момент они мне напомнили Van Canto. Им тоже подарили пижамы от JetBrains, а барабанщик вообще оказался фанатом PyCharm. Коллеги предлагают подарить ему лицензию.




Пока мой основной аккаунт болтается в центре галактики я решил присоединиться к нашей эскадрилье и немного повоевать на втором аккаунте. Начальный Sidewinder снарядил для боя и полетел в зону конфликта высокого уровня. Корветы лопались один за одним! А всё потому, что в крыле со мной были дружественные Anaconda и Federal Corvette. Вначале у меня было заработано около 2M кредитов, так на одних ваучерах я поднял 5М, а ещё связанную с боёвкой миссию выполнил - ещё 11М. Это, конечно, неплохой старт, но потом соратники поделились парой миссий по 50М каждая и я решил прикупить боевой Alliance Challenger.









Вот я и долетел до центра нашей галактики. Черная дыра тут гораздо больше, чем там, но обе они не такие уж и чёрные. В игре эта система представлена двойной системой, где в противовес сверхмассивной чёрной дыре присутствует массивная звезда, но в реальности там всё сложнее.
В честь дня рождения пошли сегодня за халявным тортиком, который приносят имениннику. Поднялись на четвёртый этаж, где вход напротив кинотеатра, а там перекрыто и сказано, что надо подниматься по отдельной лестнице. В Токио-City, где мы были недавно, так же. Выяснилось, что это постановление правительства о закрытии блоков питания, не имеющих отдельного входа с улицы. На мой взгляд, это такой же идиотизм, как и всё остальное, связанное с коронавирусом. Мне по-любому пришлось зайти в торговый центр, подняться на лифте, вернуться на улицу, а потом подниматься по отдельной лестнице, задыхаясь в маске.

Чтобы проникнуться динамическим программированием, один из друзей порекомендовал сайт CodeForces. Там можно зарегистрироваться с сыном и выполнять различные задачи из архива. Ну и проверять решение тоже можно. Поддерживается куча языков, даже Kotlin! Хорошая возможность прокачать навыки ещё и в нём.
fun main() {
val index = readLine()!!.split(' ').map { it.toInt() }[1] - 1
val list = readLine()!!.split(' ').map { it.toInt() }
val min = list[index].coerceAtLeast(1)
println(list.filter { it >= min }.count())
}
Это пример решения задачи Следующий раунд. Как можно заметить, я игнорирую нулевой результат readLine(), а из первого массива беру только второе число, так как первое понадобилось бы только для проверки длины второго массива. Не уверен, нужно ли задавать нижнее значение min как 1, но решение приняли:
Задано четыре числа. Требуется разбить их на две пары, чтобы сумма произведений в этих парах была максимальной. Например, для чисел 2,3,4,5 надо вывести 26 (2*3+4*5).
Для целого положительного числа от 1 до 1000 требуется найти число способов представить его в виде суммы нечётных слагаемых. Порядок слагаемых неважен. Например, для числа 6 надо вывести 4. Сами разбиения выводить не надо:
[1+1+1+1+1+1], [3+1+1+1], [3+3], [5+1]
Set для фильтрации. Потом ускорил в несколько сотен раз, отказавшись от Set. Это позволило мне обнаружить, что происходит переполнение для больших чисел. Посему мне пришлось заменить long на BigInteger, замедлив программу раза в два.fun count(array: IntArray, size: Int): BigInteger {
var count = BigInteger.ONE
val size2 = size - 2
if (size > 2 && array[size - 1] == 1 && array[size2] == 1) {
array[0] += 2
count = count.plus(count(list, array, size2))
array[0] -= 2
var index = 0
while (++index < size2) {
if (array[0] == array[index]) continue
if (array[0] == array[index] + 2) {
array[index] += 2
count = count.plus(count(list, array, size2))
array[index] -= 2
}
break
}
}
return count
}Тут стало очевидно, что после 170 мы перестаём укладываться в две секунды и подсчёт ответа для 400 занял более двух дней:in: 100; out: 444793; time: 21 ms in: 200; out: 487067746; time: 7958 ms in: 300; out: 114872472064; time: 1873429 ms in: 400; out: 11962163400706; time: 196301147 ms
Недавно у нас рядышком открылась мужская парикмахерская и мы с Лёшкой решили в ней постричься. Как оказалось, зря. В салонах стригут заметно лучше, хотя дольше и дороже. В Часцах и то лучше стригут. А в Питере хорошая парикмахерская была у армян в какой-то подворотне на Василевском острове. У нас же только салоны красоты...
15% * (18 712,82 - 18 046,28) рублей = 99,98 рублей.
Сегодня получал пакет на нашей почте. В предбанник набились пенсионеры, через которых туда-сюда администратор проводила людей, кто пришёл за посылкой. Я подумал было, почему они пенсию на дом не выписывают, но внутри услышал разговор. Одна из пенсионерок спросила, а где её знакомая почтальонша, чтобы поговорить, а ей ответили, что работает мобильная бригада, а обычные сотрудники на изоляции.
Прислали курьером из офиса подарок. Прикольная ветровка, чуть потеплее, чем предыдущая. У этой мне очень цвет нравится, гораздо позитивнее, чем у тёмной одежды, хотя и менее практично.
Пристрелка прошла более-менее неплохо, хотя Чарли можно было бы и не делать. Стрелял достаточно кучно, что от груди (слева), что самовзводом (справа).