Холиварофорум

Не все, что говорят на Холиварке — правда!

Вы не вошли.

#26 2021-07-12 19:00:04

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Анон пишет:

Подпишусь, мой лвл недотягивает (в какой-то момент не вдупляю ни задачи, ни решения)), но интересно и мотивирующе. Когда анон растет над собой - :heart2: Терпения и настойчивости тебе))
(желающий в лвл-ап анон, который не может осознать режим в работа +2(3/4) часа учебы после)

Спасибо, анончик! Пусть у тебя найдутся силы и время, и произойдёт левел-ап!
Быть может, это будет полезно: попробуй начинать с малого, с получаса, а потом сделать это регулярной привычкой, где-то недели через 3 я уже сам начинал скучать без задач по вечерам)

анон-левел-апер

Отредактировано (2021-07-13 18:56:41)

#27 2021-07-14 08:27:31

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

В воскресенье с друзьями ходили на маленькой яхте, немного поучаствовал в управлении - помогал с парусами, дали постоять у штурвала, очень понравилось! Но устал, ещё и проснулся очень рано. Так что в понедельник отдыхал после работы (ещё и болела голова).

Решил две средние задачи, что-то недоволен собой: можно было решить быстрее и оптимальнее. И вообще, надо бы осваивать и применять что-то новое уже, например, бэктрекинг или графы (так начинай, ну!).

Массивы, сортировка, средний уровень - 31 минута

Дан массив. Элементы - другие массивы, длиной 2, представляют собой границы интервалов. Найти все интервалы, которые перекрывают друг друга, например (1, 4) и (3, 9), объединить их и вернуть результирующий массив, в данном примере ответ будет (1, 9)

Массивы, бинарный поиск(но это я узнал потом), средний уровень - 22 минуты (неоптимально, вернуться и перерешать потом!)

Дан массив чисел, вернуть индекс любого из пиков. Пик - элемент, который больше предыдущего и последующего элементов

анон-левел-апер

#28 2021-07-15 07:30:58

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Строки, жадные алгоритмы, средний уровень - 35 минут

Пусть каждой букве английского алфавита соответствует номер (от 1 и дальше). Даны два числа n и k, надо вернуть лексиграфически наименьшую возможную строку длинной n и чьё значение будет равно k, для n = 3, k = 27 ответ будет "aay"

Пожалуй, попрошу у рекрутёра дать уже задачку на решение. Пока назначили небольшой звонок. Стыдно сказать, но я как-то умудрился не заметить письма рекрутёра в почте, которые лежали уже 6 дней  :facepalm: К счастью, вроде бы ничего страшного.
Впрочем, я уже уверен, что задание я завалю. Но зато я не разочаруюсь, а быть мёртвым солдатом проще, когда ты уже смирился с тем, что умер и концентрируешься только на деле, не отвлекаясь на нервы, волнение и надежды.


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

Читал статью на хабре про прокрастинацию, интересно.

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

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



анон-левел-апер

Отредактировано (2021-07-15 07:36:43)

#29 2021-07-16 07:28:28

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

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

анон-левел-апер

Отредактировано (2021-07-16 08:37:10)

#30 2021-07-17 08:00:01

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Динамическое программирование, средний уровень: 1 час

Представьте пирамиду из бокалов. В эту пирамиду льют шампанское. Каждый бокал вмещает 1 единицу жидкости. Дан номер ряда и номер бокала в ряду, вернуть, сколько в бокале будет жидкости (дробное число), если налить во всю пирамиду заданное количество шампанского

анон-левел-апер

#31 2021-07-18 00:21:41

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Вчера рекрутёр, с которой я говорил раньше, прислала ссытку на тестовое задание на хакерранке. Сегодня проходил это задание.
Это было скорее не на чистые алгоритмы и структуры данных, скорее более приближенный к реальным условиям кейс.

Пусть есть стриминговый сервис, который выставил счёт, а счёт не совпадает с тем, что ожидает юзер. Так что надо проверить, правильно ли рассчитана стоимость сервсисов, которыми юзер пользовался

Потратил 2 часа - в основном дебаг и вспоминал некоторые подзабытые операции (в плане синтаксиса). : тестов прошло, 3 теста не прошло, я дебажил, но так и не понял, почему  :blabla:
Жду, что скажет рекрутёр. Наверное, скажет, что мол, извините, но нет  ¯_(ツ)_/¯

анон-левел-апер

#32 2021-07-20 08:03:26

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Рекрутёр написала, что команда посмотрела на моё решение и хочет следующее собеседование  :chearleader:
Будет в пятницу, на 45 минут, будут расспрашивать про опыт работы, проекты, технологии возможен кодинг.

В пятиницу и сегодня медленно, но верно побеждал прокрастинацию на работе (писал интеграционные тесты на type script), после работы решил две задачи.

Массивы, хэш-таблицы, сортировка(?), средний уровень - 20 минут

Дан массив целых чисел и целое число k. Вернуть k наиболее часто встречающихся в массиве элементов

Массивы, бинарный поиск, средний уровень - 24 минуты (та, что я решал как часть челленджа, но решал не бинарным поиском, лол)

Дан массив чисел, вернуть индекс любого из пиков. Пик - элемент, который больше предыдущего и последующего элементов

А вчера ещё удалось позаниматься хобби немного.

З.Ы. Моё тестовое задание, которое я отправил, выглядело немножко говнокодно, но после его разбора в воскресенье я знаю, что можно улучшить. Подход к имплементации. Функциональный стиль выглядит читабельнее, проще в дебаге, чем когда вся логика запихана в одну функцию. А ведь я было думал сначала разбить всю программу на несколько функций, но что-то вот подумал, что зачем плодить сущности. Тепер знаю, что (и где, и почему) я был не прав.

анон-левел-апер

Отредактировано (2021-07-20 08:07:14)

#33 2021-07-21 07:56:12

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Массивы, матрицы, среднйи уровень - 40 минут

Дана матрица, представляющая собой поле для морского боя. На поле расположены корабли. Корабль обозначает символ(ы) X. Корабли могут быть размером 1 на 1, 1 на некоторое количество столбцов, некоторое количество строк на 1, скажем, 1 на 5 или 7 на 1. Между кораблями есть как минимум одна пустая строка/столбец с каждой стороны. Вернуть число кораблей на поле

Сегодня в обед доехали то молла, я взял себе большую миску поке. Вообще отличное настроение сегодня днём было. А вот к вечеру, к окончанию рабочего дня что-то силы меня просто внезапно покинули.

анон-левел-апер

#34 2021-07-22 08:48:35

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

It is Wednesday, my dudes!
Сегодня и в четверг отдыхаю от задачек после работы, чтобы в пятницу утром быть свежим, не усталым и не упоротым.

анон-левел-апер

#35 2021-07-24 07:58:24

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

С утра было собеседование, на 45 минут, ничего особо сложного, вопросы по ООП с примерами, дополни функцию, чтобы возвращала то, что нужно и напиши тест-кейсы, на третий вопрос почти не осталось времени, но я сформулировал идею решения, а потом, после собеседования, быстро закодил и отправил (почему нет). Жду, что ответят.

Сегодня же с двумя другими рекрутёрами говорил, один отправил ссылку на тестовое задание, с другим буду на следующей неделе говорить.

На работе задолбался, потому что думал, что автотесты подменяют билд (а не должны), а всё оказалось проще - кастомная дженкис джоба отправляет в систему управления тесткейсами вместо постфикса билда свой айдишник. Теперь надо разобраться почему.

Гулял, ел вкусные помидоры на ужин.

анон-левел-апер

#36 2021-07-25 08:22:28

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Накупил ягод и съел все на завтрак.

Валялся, отдыхал, вечером решил попробовать свои силы в соревновании на литкоде, там каждую неделю проводится одно соревнование, а каждые две недели - ещё и другое. В общем, я где-то семь тысяч девятисотый из около 14 тысяч участников, лал. Решил одну задачку, начал решать вторую, получил неверный ответ, когда отправлял код второй, начал думать, как переделать, и когда понял, как можно попробовать решить, вышло время. Штош. Решу в другой день.

Дана строка из строчных букв, заменить каждую букву её порядковым номером в алфавите, перевести получившуюся строку в целочисленный тип и сложить все цифры получившегося числа указанное количество раз

Вторую задачу напишу, как решу. А сейчас лениво проведу субботний вечер на диване с чаем.

анон-левел-апер

#37 2021-07-26 01:36:33

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Делал тестовое задание с утра.
Позиция та же, SDET, рекрутёр говорила, что "Кодить не надо, надо тест-кейсы написать.Там за час можно справиться, но вообще 2 часа даётся". Я такой ну ок, пройду в воскресенье. Хотя меня насторожило, зачем час на тесткейсы, ну может, там дают код, надо разобрать его и запилить тест-кейсы.
Проснулся немного упоротый, но решил всё равно не откладывать. Открыл ссылку на кодерпад. Прочитал задание. И понял, что надо кодить.
Две функции - одна для генерации уникального случайного телефонного номера, другая - для генерации случайног уникального емейла.
А потом написать тесты для этих функций.
Написал сначала функцию для телефона и для емейла без гарантии уникальности (каков шанс, что функция выдаст два одинаковых случайных номера или адреса?..), написал тесты. Тесты прошли. Посмотрел, что времени остаётся уже не очень много. Задизайнил в голове и написал уникальность для телефона - тесты по-прежнему проходят. Применил ту же логику для емейла - ошибка. Тут я занервничал, начал пытаться дебажить (уверен, дело было в моей невнимательности или ошибки копипаста. Блин, я же говорил тебе, что нервы и спешка - твои враги, ну!), в итоге, плюнул, откатился к версии функции, где нет гарантированной уникальности (но тесты проходит), и тут тестовое задание само себя отправило и закрылось.  :smoke:
Ок.

Теперь я нервничаю и бомблюсь от всего, и разболелась голова.

анон-левел-апер

#38 2021-07-27 08:01:43

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

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

Сегодня добил задачку, которая попалась на соревновании.
Задача новая, поэтому тэгов к ней не добавили. Можно использовать динамическое программирование, можно манипуляции битами, можно бэктрекинг. Средний уровень, 1 час и 6 минут.

Дано два массива одинаковой длины - студенты и преподы. В каждом массиве - несколько других массивов с 0 и 1, это ответы на некоторый опросник. Можно посчитать рейтинг каждого препода и каждого студента по числу совпадающих ответов. Найти максимально возможную сумму рейтингов. Но одному преподу должен соответствовать только один студент

анон-левел-апер

#39 2021-07-28 07:58:43

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Массивы, два указателя, сортировка, средний уровень - 55 минут

Дан массив целых чисел и целое число. Найти сумму трёх элементов этого массива, наиболее близкую к заданному числу

анон-левел-апер

#40 2021-07-30 07:29:50

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Понял, что жутко устал после работы (на самой работе было сложновато концентрироваться), и решил дать себе отдых. Завтра встречаемся с коллегами в кафе впервые за всё время, будем есть морских гадов.

анон-левел-апер

#41 2021-08-03 05:17:56

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Завтра утром, перед работой, техническое собеседование на час, и я совсем немного нервничаю. Компания мне нравится. С другой стороны, худшее, что может случиться - меня туда не возьмут. То есть в моей жизни ничего не поменяется. Приемлемо.
Если пройду это собеседование - будет ещё одно, уже на полдня. Тоже приемлемо.

анон-левел-апер

Отредактировано (2021-08-03 05:18:48)

#42 2021-08-04 08:52:44

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Итак, утром перед работой было собеседование.

Что для меня было совершенно внезапным, так это вопрос, какой подход у меня будет к тестированию ручки  :smoke: .
Ненавижу вопросы такого типа. Вот вы тест-лид, как вы подойдёте к тестированию ручки? А как вы протестируете лампочку?.. А шарик для пинг-понга, а, а? Отдам своей команде, пусть тестируют, вот как.
Наверное, потому что мне никогда особо не было интересно тестирование само по себе. Тестирование того, что ты, лично ты задизайнил и закодил - да. Тест-план для тестирования готового продукта, который сделали другие - нуу тааак, можно я лучше попишу код или подебажу? А всё потому, что я дебил и несколько лет назад не свернул туда, куда надо. Теперь вот перекатываюсь в нужном направлении с переменным успехом.
Тем не менее я честно и старательно расписал свой подход (функционально - что в себя включает это, нефункционально - что в себя включает), привёл примеры, объяснил что и почему.
Вот будет забавно (и грустно), если именно из-за этих вот вопросов я завалю собеседование.
Углубляться собеседующий чувак не стал, переходил быстро к другим вопросам. Спросил про трейд-оффы: например, звук будет отличного качества, но выше определённой громкости сделать будет нельзя, играть будет слышно, но тихо или же громкость можно регулировать в более щироком диапазоне, но качество самого звука будет невысокое.
Потом был кодинг, довольно простой вопрос - задача сводилась к тому, чтобы пройтись по массиву, распарсить элементы строкового типа вида 'начало: успех', 'конец: успех', 'конец: неудача' и вывести сколько в общем неудач для каждого типа, то есть 'начало: 0', 'конец:1'.
Это было интересней. Нашёл небольшую ошибку после первого запуска, сразу предположил, в чём дело, подтвердил экспериментально и пофиксил. Правильно ответил на вопрос по коду, вроде "а что будет, если...".
Чувак пожелал удачи на дальнейших этапах после того, как поговорили ещё после собеседования (я задавал вопросы о компании). Не уверен, означает ли это, что он даёт положительный отзыв, и дальнейшие этапы в этот раз будут.
Вообще я ожидал, что всё собеседование будет посвящено кодингу, и задача будет вот как те, что решаю по вечерам, что-нибудь на динамическое программирование среднего уровня, например.

Жду ответа. Наверное, мне будет грустно, если я не пройду.

На работе выдавил из себя два пулл реквеста, ну не особо большие и сложные. Чувствовал проблемы с концентрацией((

Вечером после работы начал решать одну задачку (динамическое программирование, средний уровень), мой подход не сработал, и, промучавшись 40 минут, я полез в объяснение решения. Почитал. Не понял. Продолжу разбираться завтра.
Зато решил другую задачу, и мне дали 10 монет, потому что это была задача из каждодневного челленджа. Эта задача закрыта, то есть чтобы просто посмотреть её не в контексте челленджа, надо покупать подписку, так что я не знаю, какие у неё метки и уровень. В обсуждениях, которые открылись после того, как я отправил верное решение, было про поиск в глубину и бэктрекинг  :dontknow:

Пусть будет средний уровень, массивы. Решил за 39 минут.

Дан массив целых чисел, вернуть все возможные подмножества элементов, без повторений

анон-левел-апер

Отредактировано (2021-08-04 08:55:48)

#43 2021-08-04 13:36:40

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Оооо, какой крутой блог, анон!!  :heart2:
Я тоже одно время решал литкодовские задачи, и тоже на питоне)) Потом надоели и я надолго забросил, а сейчас снова интересно стало.

Скрытый текст

Вообще, можно я к тебе буду иногда залетать пообсуждать задачки?  :timid:

#44 2021-08-05 08:15:44

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Анон пишет:

Оооо, какой крутой блог, анон!!  :heart2:
Я тоже одно время решал литкодовские задачи, и тоже на питоне)) Потом надоели и я надолго забросил, а сейчас снова интересно стало.

Спасибо  :timid:  Питон рулит! :hug:

детали решения

Вообще, можно я к тебе буду иногда залетать пообсуждать задачки?  :timid:

Конечно, я буду только рад!  :friends: 

анон-левел-апер

#45 2021-08-05 11:31:29

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Анон пишет:

С сетом засада в том, что он и массив [1, 2], и массив [1, 2, 2], и массив [1, 1, 1, 2] превратит в сет (1, 2), а нам это не выгодно(с).

Скрытый текст

#46 2021-08-06 08:40:44

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Анон пишет:

Я решил как

 return set(chain.from_iterable(combinations(sorted(nums), r) for r in range(len(sorted(nums))+1)))

Да, я тоже с использованием комбинаций и chain решал)
Ок, понял, не сразу въехал в твоё решение что-то  =D

анон-левел-апер

Отредактировано (2021-08-06 08:48:37)

#47 2021-08-06 08:48:28

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Сегодня было несколько митингов, митинги вытягивают из меня энергию. Да я ещё и не высыпаюсь последнее время, так что часть дня я просто пялился в монитор расфокусированным взглядом. Другую часть дня я потратил на закрытие двух тасок, составление тест-плана для тестирования стабильности и его обсуждения с девелопером и менеджером, помощи другому девелоперу, у которого лапки , ещё запустил пару долгих джоб на бранчах, которые хочу замёржить.

Сил на задачки сегодня нет, буду отдыхать до понедельника, в понедельник утром - виртуальный онсайт с четырьмя, что ли, собеседующими. Взял отгул на полдня - часть следующей недели вся наша команда отдыхает, а надо бы закончить некоторую работу.

анон-левел-апер

#48 2021-08-08 21:33:59

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Завтра с утра собеседование, финальная часть, и вот я начал потихоньку волноваться  :facepalm: Я не хочу волноваться, и надо что-то с этим поделать, как-то отвлечься.
Ещё надо бы повторить ООП, разобрать на питоньих примерах, но мне дико лень и не хочется.

Сегодня надо отдохнуть как следует, а я понял, что разучился. Мне надо постоянно что-то делать: не одно хобби, так другое. Наверстать тот прогресс, на который раньше не было времени и сил, получить удовлетворение от завершения дела. Фоточек понаделать, хех. Вчера думал завершить один из проектов - подшить подол платья. Я намучался с машинкой, с попыткой понять того, как сделать правильно шов, как подвернуть и как подшить (я совсем недавно начал осваивать машинку), в итоге дико взбомбился от того, что никак не могу понять и при этом выбросил столько времени. Успокоился, остыл, решил, что ничего страшного, если я не сделаю это прямо сейчас, а сделаю чуть попозже. И начал готовить ткань для следующего проекта. Потом заставил себя взять и отдыхать - никаких напряганий мозга. Понял, что разучился  :sadcat: Быть может, имеет смысл просто отправиться гулять. И не хвататься то и дело за телефон, чтобы сфоткать то и сфоткать это! И не открывать инстаграм сегодня, где коллеги по хобби хвастаются своими проектами.

анон-левел-апер

#49 2021-08-09 01:41:57

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Поготовился, освежил знания по ООП, закодил примеры для лучшего понимания, впал в панику. Такое ощущение, что вскрылись бездны пробелов в моих знаниях и опыте, которые я не успею покрыть к завтрашнему собеседованию, ещё и готовился как-то через силу.

Если я не пройду - значит, я просто не подхожу по знаниям и опыту на ту должность в ту компанию, и это для всех же лучше, если они не наймут неподходящего человека. Если подхожу - значит, подхожу  :dontknow:

Пойду гулять

анон-левел-апер

#50 2021-08-10 09:12:14

Анон

Re: Вращаем бинарные деревья[айти][левел-ап][фехтование][дыбр][yes com]

Утро началось с собеседования, и собеседование показалось мне вовсе не таким тяжёлым, как я ожидал, не было задач на динамическое программирование и вращение бинарных деревьев. Знание ООП пригодились только в одном вопросе, но это ок.

Было четыре раунда, на первом мне показали код - несколько классов и попросили выполнить задания типа создай инстанс этого класса, создай инстанс того, причём подразумевалось, что инстанас первого класса будет нужен при создании инстанса второго, посчитай сколько всего сущностей родительского класса (тут пригодилось переменные класса). А также - вот код с разными ассертами, что будет, если я его запущу, а если поменяю и запущу, напиши fixture, что будет, если в fixture зафейлится assert (перечитал и понял, какой же это птичий язык, хех).

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

Третий раунд  с девопсом, он спросил, какие я знаю способы поделиться кодом в организации, как бы я публиковал свои питоновские либы, подробно обсудили задачи, которыми я занимаюсь каждый день, также он спросил меня, знаю ли я что такое list comprehension, я ответил, спросил, не хочет ли он, чтобы я записал несколько строк кода в одну используя это, он согласился, и я написал.

Четвёртый - тим лид, он тоже спрашивал, что мне нравится в их компании и продукте, обсуждали, как бы я разрешал конфликты, что я делал бы, если бы понял, что совсем не знаю, как делать задачу, какая задача была самая сложная в моём опыте и как я её решал.

В общем и целом, мне понравилось - дискуссии были интересными, люди - приятными, и мне показалось, что им нравится там работать.

Посмотрим, что мне ответят, обещали быстро.

Из другой компании до сих пор ни слуху, ни духу.

анон-левел-апер

Подвал форума

Основано на FluxBB, с модификациями Visman
Доработано специально для Холиварофорума