Бонусное задание | 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 лекция
Недоступна
Факториал
На планете Линейный Хаос поиском факториала двузначных чисел на их планете принято занимать младенцев. Ну а мы подойдём по-взрослому, по-программистски, и напишем метод, вычисляющий факториал вплоть до введённого числа.
Комментарии (217)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Владислав16 уровень
среда, 15:39
В этот раз, задания мега-крутые😎
Дмитрий16 уровень, Ровно
17 февраля, 15:51
Как же я боялся рекурсии и BigInteger. Но ничего, почитал, разобрался, заняло минут 10. Хорошая ссыль от професора https://javarush.ru/groups/posts/2274-kak-ispoljhzovatjh-bigdecimal-v-java
Владислав16 уровень
четверг, 18:40
Прогрессивный программист видит новую информацию и думает "Хм, что-то новенькое? Интересно..." :)
Павел Ермишин16 уровень, Москва
11 февраля, 12:34
самая интересная задача это факториал. Изучил BigInteger)
Олег18 уровень, Москва
11 февраля, 08:40
Чуть голову не сломал, нельзя так - Должно быть Non-static block,а стоит в коде non-static block
СЕРГЕЙ19 уровень, Озёрск
13 января, 13:24
Уже поинтересней!!!
Евгений35 уровень, Москва
12 декабря 2019, 19:09
помнится мне в чистом коде описывается способ вычисления факториала рекурсией - как минимум плохим тоном, а как максимум - демонстрация явного непонимание для каких целей нужен такой механизм.
Peter18 уровень, Москва
14 февраля, 18:23
Если вы о Мартине, то у него много спорных моментов. В том числе и этот. Факториал легко написать при помощи классической хвостовой рекурсии, и это гуд. И компилятор сам развернет ее в цикл.
Вася Пупкин19 уровень, Москва
четверг, 20:29
Факториал с помощью рекурсии - чисто учебная задача для объяснения концепции рекурсии. Не по деревьям же сразу школьникам скакать.
Гудини23 уровень, Санкт-Петербург
11 ноября 2019, 23:54
Мне интересно, возможно ли решить последнюю задачу без классов BigInteger, BigDecimal? Может есть какое-то хитрое решение или что-то в этом роде.
Алексей18 уровень, Полысаево
19 ноября 2019, 01:43
Заинтриговал, начну решать с последней задачи.
Алексей18 уровень, Полысаево
19 ноября 2019, 04:10
В конечном счета тоже решил через BigDecimal. Потому что времени на реализацию собственного класса и механизма счета, основанного на разбитии больших чисел на массивы меньших чисел с рекурсивным изменением оказались не по душе. А лучше придумать не смог.
Гудини23 уровень, Санкт-Петербург
19 ноября 2019, 22:08
Как задача, звучит интересно.
Алексей18 уровень, Полысаево
20 ноября 2019, 02:01
Как задача для программиста интересная, кто-то же решал подобное, значит и нам по плечу. Но, времени на поиск такого решения нет как такового. За подобную задачу надо браться имея лучшее понимание инструмента(языка), чем сейчас.
Гудини23 уровень, Санкт-Петербург
20 ноября 2019, 11:57
Я имею введу как для javarush. Типа - реализовать сложение больших чисел с помощью массивов.
Олег20 уровень
26 ноября 2019, 13:51
я сначала так и решил, убил часа 3, а потом вспомнил, что есть такие классы)
Mike27 уровень, Новосибирск
27 ноября 2019, 04:09
Благо, я не увидел подсказки в виде изначального import'а BidDecimal в задаче и начал думать как можно обойти ограничение с вместимостью очень больших чисел в Java. Убил на это около 5-6 часов раздумий-кодинга-правок-дебага и т.д., и когда уже придумал основной алгоритм, увидел импорт BigDecimal'а... Посмеялся и... лег спать с мыслью что не сдамся и доделаю свой метод)) С утра сегодня доделал свой вариант. На который всего ушло около 7 часов. Ну и потом для разнообразия (после ознакомления с Биг'ами) за 15 минут запилил еще вариант через BigInteger)) Без бигов я решил задачу перемножением элементов массивов. Получился кусок говнокода. Но! Моего говнокода! И более того - работающего говнокода))) Так что теперь я умею перемножать массивы. Замерил время через массивы и через BI. Если нужно найти небольшой факториал, мой метод медленнее, но не значительно, ну а если нужно найти факториал, например, 15000, то конечно у меня все будет значительно медленнее. Но! Без ошибок! Извините, не сдержался)))
Mike27 уровень, Новосибирск
27 ноября 2019, 04:14
Вот результаты замеров для факториала 15000: Вычисление с помощью BI заняло: 374 мс 2746599033[и еще 56 тысяч 120 цифер] Вычисление с помощью массивов заняло: 39562 мс 2746599033[и еще 56 тысяч 120 цифер] И вот результаты для факториала 50: Вычисление с помощью BI заняло: 2 мс 30414093201713378043612608166064768844377641568960512000000000000 Вычисление с помощью массивов заняло: 6 мс 30414093201713378043612608166064768844377641568960512000000000000
Гудини23 уровень, Санкт-Петербург
28 ноября 2019, 19:46
Ого, факториал очень быстро растет. Наверное и нет ничего во вселенной к чему можно было бы применить такое число. Молодец. У тебя были коллекции или ты как-то подбирал размер?
Mike27 уровень, Новосибирск
30 ноября 2019, 06:51
Спасибо!) Ну может быть в астрономии и rocket science такие числа применимы 🙄 Надо бы поинтересоваться) Что касается решения, то я решил задачу с использованием трех массивов (ArrayList, первый - множимое, второй - множитель, третий - результат), в каждом из которых число любой размерности представлено элементами массива со значением от 0 до 9. И да, я подключил коллекциии ради одной единственной Collections.reverse (хотя и это можно сделать самому, тогда можно обойтись совсем без коллекций) для третьего массива (результат). Reverse понадобился после того, как я столкнулся с проблемой, что когда перемножаешь элементы массива на элементы другого массива, то очень часто идет увеличение размеров результирующего массива и соответственно весь массив сдвигается вправо, поэтому правильно записывать в него значения умножения в формате "справа налево <--" становится очень трудной задачей (может это и решаемо, но я не победил такой алгоритм). Побившись с этим какое-то время, я принял решение в результирующий массив записывать значения "слева направо -->". После проделанной работы с "справа налево" - сделать слева направо оказалось уже совсем не сложно. Ну а уже после того, как все значения получены, зеркалим результирующий массив и вот он - наш результат умножения. Профит)) Дальше закидываем результат в первый массив, во второй массив закидываем следующий множитель и так повторяем пока не найдем искомый факториал.
Гудини23 уровень, Санкт-Петербург
30 ноября 2019, 12:43
Мне как раз было интересно про ArrayList, это и есть коллекции. Возможно скорость можно увеличить, если изначально задавать размерность в конструкторе List<>(x). Хотя можно ли ее рассчитать хотя бы примерно не зная результата заранее это еще вопрос. Тогда массив не пересоздавался с копированием, лишние разы. Но в BigD... все равно быстрее наверное выйдет. В таких классах любят использовать бинарные операторы, а они экономнее всегда.
Gleb Vasiliev18 уровень, San Francisco
21 декабря 2019, 08:27
слушай, а поделись кодом в личных сообщениях пожалуйста :)
Mike27 уровень, Новосибирск
23 декабря 2019, 10:30
Проверяй)
Andriy Solovey26 уровень
6 января, 11:19
А можно мне тоже код глянуть?
Light17 уровень, Шанхай
16 января, 07:17
Посмотрите уравнение Евклида. Решается нахождения факториала через остатки от деления. 5 строк кода
Полина22 уровень
6 ноября 2019, 11:38
задачи "для духов" сложные, а "для старичков" - лёгкие😏
Татьяна28 уровень, Днепр
28 октября 2019, 13:48
Задачи дебаг пока решаю без дебага, но хотелось бы этот вопрос изучить - подскажите, что почитать по этому поводу для полного новичка в этом вопросе - большое спасибо все кто откликнется )
Евгений20 уровень
29 октября 2019, 15:15
Думаю нужно просто искать семинары по определенным IDE.
Дмитрий Благодаров16 уровень, Москва
1 ноября 2019, 11:37
https://codegym.cc/quests/lectures/questcollections.level09.lecture03
Татьяна28 уровень, Днепр
1 ноября 2019, 12:39
Спасибо, вот еще такую нашла - может пригодиться(особенно полезны комментарии, по-моему, для новичка): https://javarush.ru/groups/posts/753-rukovodstvo-poljhzovatelja-intellij-idea-otladchik
Дмитрий Благодаров16 уровень, Москва
5 ноября 2019, 08:42
Там не сказано, что перед всем этим нужно напротив нужной сроки поставить точку останова(break point). Из-за этого долго думал, почему не работает как надо в пошаговом режиме.
Dmitriy22 уровень
14 ноября 2019, 21:29
ставим breakpoint-ы и запускаем как дэбаг. Когда программа дойдет до точки она остановится подсветив строку и будет ждать пока Вы сами не начнете пошагово идти дальше. Там есть два варианта: идти входя в метод, или обходя его. Ну и таким образом легко находятся ошибки, ибо мы видим что происходит с переменными во время выполнения каждой строки кода
16 октября 2019, 19:49
Изучайте RegEx для работы со String`ом :) Задача "Парсер реквестов" решается в несколько десятков строк, включая считывание с клавиатуры. Если бы я вручную всё это прописывал, то... чокнулся бы. А так, несколько подобных строк и методов для работы с ними и все готово: "(?<=[\\?\\&]).+?(?=[\\=\\&])"
Гросу17 уровень, Одесса
28 октября 2019, 23:08
потратил 3 часа на парсера 🐒
Вадим Сотников30 уровень, Москва
30 ноября 2019, 07:55