Бонусное задание | 12 лекция | 5 уровень

5 уровень, 12 лекция
Открыта

— Здорово, боец!

— Здравия желаю, товарищ капитан!

— У меня для тебя шикарная новость. Вот тебе задания для закрепления полученных навыков. Выполняй их каждый день, и твои навыки будут расти с неимоверной скоростью. Они специально разработаны для выполнения их в Intellij IDEA.

8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
Разные методы для разных типов
Итак, полиморфизм. Вы о нём ещё не забыли? Тогда решаем следующую задачку: считываем с консоли данные, пока не будет введено слово "exit". Для каждого значения, кроме "exit", вызываем метод print, какой именно принт — зависит от значения. Например, если значение содержит точку, то вызываем print для Double, а если это число от 0 до 128 — то для short.
8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
Тренировка мозга
Найдите логическую ошибку: утка (Duck) должна корректно реализовывать интерфейс CanMove. Исправьте ошибку так, чтобы получить правильный результат.
8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
ООП. Перегрузка
Перегрузите метод info(Object s) в классе Tree дважды, чтобы получилось 3 метода info(Object s), info(Number s), info(String s). После этого разберитесь с методом info(Object s) и создайте функциональность новых методов по аналогии. Например, для метода info(Number s) результат может быть таким: «Дерево № 123 , метод Number, параметр Short.
8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
Закрепляем паттерн Singleton
Разберёмся с паттерном Singleton на примере светила и планет солнечной системы. Для начала займитесь поиском и найдите где-нибудь в интернете пример "ленивой" реализации Singleton и создайте по образу и подобию три Singleton-класса: Sun, Moon и Earth. Затем реализуйите в них интерфейс Planet. И проделайте ещё парочку операций.
8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
Перегрузка конструкторов
В этой задаче нам предстоит создать класс Solution и его потомка SubSolution, а для этого потомка — создать конструкторы и исправить их модификаторы доступа так, чтобы получить три конструктора с разными модификаторами (кроме private).
8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
Порядок загрузки переменных
Итак, полезная задачка на отладку. У вас есть код, в котором нужно разобраться: узнайте, что и в какой последовательности инициализируется. Для этого можно использовать отладчик в IntelliJ IDEA и его брейкпоинты. Затем исправьте порядок инициализации так, чтобы получить определённый результат.
8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
Файл в статическом блоке
Инициализируйте переменную Statics.FILE_NAME полным путем к файлу с данными, который содержит несколько строк. После этого в статическом блоке считайте из файла с именем Statics.FILE_NAME все строки, и добавьте их по отдельности в List lines.
8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
Дебаг, дебаг, и еще раз дебаг
Снова и снова мы ищем чужие ошибки и исправляем их... Такова наша программистская доля. Наша программа снова выводит что-то не то: закралась ошибка (всего одна!). Найти и обезвредить! Для этого воспользуйтесь дебаггером IntelliJ IDEA.
8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
Парсер реквестов
Считайте с консоли URL-ссылку. Затем выведите на экран через пробел список всех параметров (Параметры идут после ? и разделяются &, например, lvl=15). URL содержит минимум 1 параметр. Если присутствует параметр obj, то передайте его значение в нужный метод alert.
8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
ООП. Hrivna — тоже деньги
Исправьте класс Hrivna так, чтоб избежать возникновения ошибки StackOverflowError. При этом, как ни парадоксально, Hrivna должна быть наследницей класса Money и в этом классе должен быть реализован метод getAmount.

— Те задания были для духов. Для дедушек я добавил бонусные задания повышенной сложности. Только для старослужащих.

8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
Осваивание статического блока
Cоздадим классы Plane и Helicopter, реализующие интерфейс CanFly, после чего в статическом методе reset класса Solution нужно считать с консоли параметр типа String и если он равен helicopter (plane), то статическому объекту CanFly result присвоить объект класса Helicopter (Plane). В статическом блоке инициализировать CanFly result вызвав метод reset.
8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
Template pattern
Создадим алгоритм работы баристы в классе DrinkMaker. Он будет выбирать подходящую чашку, класть ингредиенты и заливать жидкостью. Также создадим узкоспециализированные алгоритмы для чая и латте, унаследовав их от DrinkMaker.
8
Задача
Java Core,  5 уровень,  12 лекция
Недоступна
Факториал
На планете Линейный Хаос поиском факториала двузначных чисел на их планете принято занимать младенцев. Ну а мы подойдём по-взрослому, по-программистски, и напишем метод, вычисляющий факториал вплоть до введённого числа.
Комментарии (204)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Евгений19 уровень, Москва
четверг, 19:09
помнится мне в чистом коде описывается способ вычисления факториала рекурсией - как минимум плохим тоном, а как максимум - демонстрация явного непонимание для каких целей нужен такой механизм.
Гудини23 уровень, Санкт-Петербург
11 ноября, 23:54
Мне интересно, возможно ли решить последнюю задачу без классов BigInteger, BigDecimal? Может есть какое-то хитрое решение или что-то в этом роде.
Алексей17 уровень, Полысаево
19 ноября, 01:43
Заинтриговал, начну решать с последней задачи.
Алексей17 уровень, Полысаево
19 ноября, 04:10
В конечном счета тоже решил через BigDecimal. Потому что времени на реализацию собственного класса и механизма счета, основанного на разбитии больших чисел на массивы меньших чисел с рекурсивным изменением оказались не по душе. А лучше придумать не смог.
Гудини23 уровень, Санкт-Петербург
19 ноября, 22:08
Как задача, звучит интересно.
Алексей17 уровень, Полысаево
20 ноября, 02:01
Как задача для программиста интересная, кто-то же решал подобное, значит и нам по плечу. Но, времени на поиск такого решения нет как такового. За подобную задачу надо браться имея лучшее понимание инструмента(языка), чем сейчас.
Гудини23 уровень, Санкт-Петербург
20 ноября, 11:57
Я имею введу как для javarush. Типа - реализовать сложение больших чисел с помощью массивов.
Олег17 уровень
26 ноября, 13:51
я сначала так и решил, убил часа 3, а потом вспомнил, что есть такие классы)
Mike20 уровень, Новосибирск
27 ноября, 04:09
Благо, я не увидел подсказки в виде изначального import'а BidDecimal в задаче и начал думать как можно обойти ограничение с вместимостью очень больших чисел в Java. Убил на это около 5-6 часов раздумий-кодинга-правок-дебага и т.д., и когда уже придумал основной алгоритм, увидел импорт BigDecimal'а... Посмеялся и... лег спать с мыслью что не сдамся и доделаю свой метод)) С утра сегодня доделал свой вариант. На который всего ушло около 7 часов. Ну и потом для разнообразия (после ознакомления с Биг'ами) за 15 минут запилил еще вариант через BigInteger)) Без бигов я решил задачу перемножением элементов массивов. Получился кусок говнокода. Но! Моего говнокода! И более того - работающего говнокода))) Так что теперь я умею перемножать массивы. Замерил время через массивы и через BI. Если нужно найти небольшой факториал, мой метод медленнее, но не значительно, ну а если нужно найти факториал, например, 15000, то конечно у меня все будет значительно медленнее. Но! Без ошибок! Извините, не сдержался)))
Mike20 уровень, Новосибирск
27 ноября, 04:14
Вот результаты замеров для факториала 15000: Вычисление с помощью BI заняло: 374 мс 2746599033[и еще 56 тысяч 120 цифер] Вычисление с помощью массивов заняло: 39562 мс 2746599033[и еще 56 тысяч 120 цифер] И вот результаты для факториала 50: Вычисление с помощью BI заняло: 2 мс 30414093201713378043612608166064768844377641568960512000000000000 Вычисление с помощью массивов заняло: 6 мс 30414093201713378043612608166064768844377641568960512000000000000
Гудини23 уровень, Санкт-Петербург
28 ноября, 19:46
Ого, факториал очень быстро растет. Наверное и нет ничего во вселенной к чему можно было бы применить такое число. Молодец. У тебя были коллекции или ты как-то подбирал размер?
Mike20 уровень, Новосибирск
30 ноября, 06:51
Спасибо!) Ну может быть в астрономии и rocket science такие числа применимы 🙄 Надо бы поинтересоваться) Что касается решения, то я решил задачу с использованием трех массивов (ArrayList, первый - множимое, второй - множитель, третий - результат), в каждом из которых число любой размерности представлено элементами массива со значением от 0 до 9. И да, я подключил коллекциии ради одной единственной Collections.reverse (хотя и это можно сделать самому, тогда можно обойтись совсем без коллекций) для третьего массива (результат). Reverse понадобился после того, как я столкнулся с проблемой, что когда перемножаешь элементы массива на элементы другого массива, то очень часто идет увеличение размеров результирующего массива и соответственно весь массив сдвигается вправо, поэтому правильно записывать в него значения умножения в формате "справа налево <--" становится очень трудной задачей (может это и решаемо, но я не победил такой алгоритм). Побившись с этим какое-то время, я принял решение в результирующий массив записывать значения "слева направо -->". После проделанной работы с "справа налево" - сделать слева направо оказалось уже совсем не сложно. Ну а уже после того, как все значения получены, зеркалим результирующий массив и вот он - наш результат умножения. Профит)) Дальше закидываем результат в первый массив, во второй массив закидываем следующий множитель и так повторяем пока не найдем искомый факториал.
Гудини23 уровень, Санкт-Петербург
30 ноября, 12:43
Мне как раз было интересно про ArrayList, это и есть коллекции. Возможно скорость можно увеличить, если изначально задавать размерность в конструкторе List<>(x). Хотя можно ли ее рассчитать хотя бы примерно не зная результата заранее это еще вопрос. Тогда массив не пересоздавался с копированием, лишние разы. Но в BigD... все равно быстрее наверное выйдет. В таких классах любят использовать бинарные операторы, а они экономнее всегда.
Полина20 уровень
6 ноября, 11:38
задачи "для духов" сложные, а "для старичков" - лёгкие😏
Татьяна23 уровень, Днепр
28 октября, 13:48
Задачи дебаг пока решаю без дебага, но хотелось бы этот вопрос изучить - подскажите, что почитать по этому поводу для полного новичка в этом вопросе - большое спасибо все кто откликнется )
Евгений17 уровень
29 октября, 15:15
Думаю нужно просто искать семинары по определенным IDE.
Дмитрий Благодаров16 уровень, Москва
1 ноября, 11:37
https://codegym.cc/quests/lectures/questcollections.level09.lecture03
Татьяна23 уровень, Днепр
1 ноября, 12:39
Спасибо, вот еще такую нашла - может пригодиться(особенно полезны комментарии, по-моему, для новичка): https://javarush.ru/groups/posts/753-rukovodstvo-poljhzovatelja-intellij-idea-otladchik
Дмитрий Благодаров16 уровень, Москва
5 ноября, 08:42
Там не сказано, что перед всем этим нужно напротив нужной сроки поставить точку останова(break point). Из-за этого долго думал, почему не работает как надо в пошаговом режиме.
Dmitriy22 уровень
14 ноября, 21:29
ставим breakpoint-ы и запускаем как дэбаг. Когда программа дойдет до точки она остановится подсветив строку и будет ждать пока Вы сами не начнете пошагово идти дальше. Там есть два варианта: идти входя в метод, или обходя его. Ну и таким образом легко находятся ошибки, ибо мы видим что происходит с переменными во время выполнения каждой строки кода
16 октября, 19:49
Изучайте RegEx для работы со String`ом :) Задача "Парсер реквестов" решается в несколько десятков строк, включая считывание с клавиатуры. Если бы я вручную всё это прописывал, то... чокнулся бы. А так, несколько подобных строк и методов для работы с ними и все готово: "(?<=[\\?\\&]).+?(?=[\\=\\&])"
Гросу17 уровень, Одесса
28 октября, 23:08
потратил 3 часа на парсера 🐒
Вадим Сотников24 уровень, Москва
30 ноября, 07:55
Сергей Novichok17 уровень, Нижний Новгород
15 октября, 19:55
Ребята, посоветуйте, как с дебаггером разобраться! При пошаговой отладке лезет во все подключенные модули, как это убрать?
Шадияр24 уровень, Шымкент
16 октября, 12:29
Ставь breakpoint прямо в строке где public static void main(String[] args) { Потом жми на дебаг. И нажимай на кнопку F7. При каждой нажатии, она будет пошагова показывать алгоритм работы программы.
19 октября, 12:28
нажимай не ф7(или ф8, или что ты нажимаешь), а следующую кнопку (типа ф8, или ф9) - он будет скипать подключенные модули и идти дальше по твоим
Артём Уколов20 уровень, Москва
5 октября, 14:09
Это был самый тяжелый и долгий левел :((( 4 дня потратил это жесть... видимо дальше будет жара
GrooveDevelop24 уровень, Керчь
6 октября, 06:59
Последние 2 уровня Java Syntax были для меня гораздо сложннее, чем любой уровень Java Core. Тут как-то все гораздо приятнее идет.
Eugene K29 уровень, Санкт-Петербург
9 октября, 09:57
Но вы то не дошли еще до двух "последних" уровней Java Core)
GrooveDevelop24 уровень, Керчь
9 октября, 10:04
Согласен, но уровни по ООП на данный момент для меня были самые понятные и приятные
Алексей17 уровень, Санкт-Петербург
25 сентября, 14:42
все задачи с 1-ой попытки) кроме Template pattern, там со 2-ой из-за того что вместо pour() написал pure()😂
Zaur17 уровень
20 октября, 09:40
Будем иметь ввиду)
Александр Дудинский19 уровень, Днепр
23 сентября, 18:23
Какое отношение первая задача имеет к полиморфизму? Там обычная перегрузка методов
Justinian41 уровень, Киев
29 сентября, 01:21
тебя на собесе могут спросить тоже самое :) можешь потренировать ответ )
Александр Дудинский19 уровень, Днепр
30 сентября, 19:26
Полиморфизм - один интерфейс, множественная реализация. Где тут один интерфейс? Или я не правильно понял умные книги?
Justinian41 уровень, Киев
30 сентября, 20:41
Забавно что автор цитаты, слова которой ты цитируешь, считает что перегрузка к полиморфизму имеет отношение :) Книги это хорошо, но это мнение одного человека в конкретном контексте, и еще важно как ты читаешь.
(любой) Полиморфизм (это исключительно) - один интерфейс,
множественная реализация.
или
(в контексте ООП, как один с подвидов более общего термина)
Полиморфизм (можно рассматривать как) - один интерфейс, множественная реализация.
Одна и та же фраза. А прочитать можно совершенно по разному. Единого мнения на этот счет нет, ты имеешь право придерживаться любого мнения, но оно должно быть аргументированным и с учетом существования мнения других умных книжек и людей. Ответ на собесе что перегрузка не имеет никакого отношения к полиморфизму. В таком варианте скорее всего покажет интервьюеру что ты не особо заморачивался с пониманием что такое полиморфизм. Если ты скажешь что выделяют различные виды полиморфизма, назовешь различные виды по разным классфикацием, не обязательно с углублением в функторы и подтипы, и ты считаешь что истинный тру полиморфизм, это параметрический, это да. Твое мнение, какое бы не было примут. Если скажешь "Полиморфизм - один интерфейс, множественная реализация. " тоже мнение примется, поскольку интервьюер по идее поймет что речь за ООП, если захочет проверить твою эрудицию, то уточнит вопрос. И аккуратней читай, лови контекст,если в разделе по ООП, пишут определение полиморфизма, то учитывай этот контекст, что автор говорит за полиморфизм в его ООП понимании
Александр Дудинский19 уровень, Днепр
1 октября, 20:19
спасибо за такой развернутый ответ!
Justinian41 уровень, Киев
1 октября, 20:23
На здоровье, успехов! :)
Алексей16 уровень, Киев
12 сентября, 13:42
А где тут админы? В задаче "Парсер реквестов" не грузится условие:
Alexander Taluevsky17 уровень, Минск
24 сентября, 12:18
лучше его не видеть)) там чернь)
Алексей16 уровень, Киев
25 сентября, 09:49
Та очень даже ничего задача. Гораздо лучше, чем задача "Поиграем" 16го уровня, последний блок. :)