• 0.00

  • +0.09

task20.task2025

Задача не принимается — все требования выполнены, выручайте.

Число S состоит из M цифр, например, S=370 и M (количество цифр) = 3
Реализовать логику метода getNumbers, который должен среди натуральных чисел меньше N (long)
находить все числа, удовлетворяющие следующему критерию:
число S равно сумме его цифр, возведенных в M степень
getNumbers должен возвращать все такие числа в порядке возрастания.

Пример искомого числа:
370 = 3*3*3 + 7*7*7 + 0*0*0
8208 = 8*8*8*8 + 2*2*2*2 + 0*0*0*0 + 8*8*8*8

На выполнение дается 10 секунд и 50 МБ памяти.

public class Solution {

    private static List<Long> longList;
    private static int[] digitsMultiSet = new int[10];
    private static long[][] power;
    private static int number;
    private static long N;


    public static long[] getNumbers(long N) {
        Solution.N = N;
        long[] result = null;
        longList = new ArrayList<>();


        int length = 0;
        long tmp = N;
        while (tmp > 0) {
            tmp /= 10;
            length++;
        }
        power = new long[10][length + 1];
        for (int i = 0; i < power.length; i++) {
            long p = 1;
            for (int j = 0; j < power[0].length; j++) {
                power[i][j] = p;
                p *= i;
            }
        }

        for (number = 1; number <= length; number++) {
            search(0, number, 0);
        }


        Collections.sort(longList);
        result = new long[longList.size()];
        for (int i = 0; i < result.length; i++)
            result[i] = longList.get(i);

        return result;
    }

    private static void search(int digit, int unused, long pow) {
        if (digit == 10) {
            if (check(pow))
                longList.add(pow);
            return;
        }

        if (digit == 9) {
            digitsMultiSet[digit] = unused;
            search(digit + 1, 0, pow + unused * power[digit][number]);
        } else {
            for (int i = 0; i <= unused; i++) {
                digitsMultiSet[digit] = i;
                search(digit + 1, unused - i, pow + i * power[digit][number]);
            }
        }
    }

    private static boolean check(long pow) {
        if (Solution.N <= pow)
            return false;

        int[] testMultiSet = new int[10];

        while (pow > 0) {
            int i = (int) (pow % 10);
            testMultiSet[i]++;
            pow = pow / 10;
        }

        for (int i = 0; i < 10; i++) {
            if (testMultiSet[i] != digitsMultiSet[i])
                return false;
        }

        return true;
    }


    public static void main(String[] args) throws InterruptedException {
        long start = System.currentTimeMillis();
        System.out.println(Arrays.toString(getNumbers(Integer.MAX_VALUE)));
        long end = System.currentTimeMillis();
        System.out.println(end - start + " millisecond");
        System.out.println("memory: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024) + " mb");

    }
}

task30.task3003

Все требования задания, как всегда, учтены, вывод информации совпадает с образцом, на задача не принимается, в чем может быть проблема?

Условие:
1. Создай Producer и Consumer (См. комментарий к методу main).
2. Создай методы toString, equals и hashCode в классе ShareItem. Для этого в IntelliJ IDEA в теле класса ShareItem выполни:
2.1. Alt+Enter -> toString() -> Enter.
2.2. Alt+Enter -> equals() and hashCode() -> click all ‘Next’-s.
2.3. Реализацию методов toString(), equals() и hashCode() оставь такими, какими их сгенерировала IntelliJ IDEA.
3. В Producer и Consumer реализуй метод run так, чтобы вызов метода interrupt прерывал работу consumer и producer трэдов.
4. Реализация метода run для Producer:
4.1. Используя метод offer добавь в очередь 9 ShareItem-ов с такими параметрами: («ShareItem-N«, N), где N — номер элемента от 1 до 9.
4.2. Перед каждым добавлением выведи фразу «Элемент ‘ShareItem-N‘ добавлен«. Используй System.out.format.
4.3. Усыпи трэд на 0.1 секунды.
4.4. Если у очереди есть Consumer, не занятый работой, то выведи фразу «Consumer в ожидании!«.
Просмотри методы интерфейса TransferQueue, там есть нужный метод.
5. Реализация метода run для Consumer:
5.1. Усыпи трэд на 0.45 секунды.
5.2. В бесконечном цикле забери элемент из очереди методом take и выведи в консоль «Processing item.toString()«.
6. Сверь вывод с файлом output.txt.
7. Стек-трейс не выводи в консоль.
8. Для вывода любой информации на экран используй System.out.format.

output.txt:
Элемент 'ShareItem-1' добавлен
Элемент 'ShareItem-2' добавлен
Элемент 'ShareItem-3' добавлен
Элемент 'ShareItem-4' добавлен
Элемент 'ShareItem-5' добавлен
Processing ShareItem{description='ShareItem-1', itemId=1}
Processing ShareItem{description='ShareItem-2', itemId=2}
Processing ShareItem{description='ShareItem-3', itemId=3}
Processing ShareItem{description='ShareItem-4', itemId=4}
Processing ShareItem{description='ShareItem-5', itemId=5}
Consumer в ожидании!
Элемент 'ShareItem-6' добавлен
Processing ShareItem{description='ShareItem-6', itemId=6}
Consumer в ожидании!
Элемент 'ShareItem-7' добавлен
Processing ShareItem{description='ShareItem-7', itemId=7}
Consumer в ожидании!
Элемент 'ShareItem-8' добавлен
Processing ShareItem{description='ShareItem-8', itemId=8}
Consumer в ожидании!
Элемент 'ShareItem-9' добавлен
Processing ShareItem{description='ShareItem-9', itemId=9}
Consumer в ожидании!

Solution:
public class Solution {
    /*
    1. Создай класс Producer. Для этого на красном имени класса нажми Alt+Enter -> Create Class ...
    2. Стань на имени аргумента в конструкторе (queue) и нажми Alt+Enter -> Create Field for Parameter 'queue' -> Enter -> Enter. Имя поля - queue.
    3. Стань на подчеркнутой строке - описании класса. Далее Alt+Enter -> Implement Methods -> Enter.
    4. Проделай п.1-3 для класса Consumer.
     */

    public static void main(String[] args) throws InterruptedException {
        TransferQueue<ShareItem> queue = new LinkedTransferQueue<>();

        Thread producer = new Thread(new Producer(queue));
        Thread consumer = new Thread(new Consumer(queue));
        producer.start();
        consumer.start();

        Thread.sleep(1500);

        producer.interrupt();
        consumer.interrupt();
    }
}


ShareItem:
public class ShareItem {
    public String description;
    public int itemId;

    public ShareItem() {
        this("Test Item", 0);
    }

    public ShareItem(String description) {
        this(description, 0);
    }

    public ShareItem(int itemId) {
        this("Test Item", itemId);
    }

    public ShareItem(String description, int itemId) {
        this.description = description;
        this.itemId = itemId;
    }

    public String getDescription() {
        return description;
    }

    public int getItemId() {
        return itemId;
    }

    @Override
    public String toString() {
        return "ShareItem{" +
                "description='" + description + '\'' +
                ", itemId=" + itemId +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        ShareItem shareItem = (ShareItem) o;

        if (itemId != shareItem.itemId) return false;
        return description != null ? description.equals(shareItem.description) : shareItem.description == null;
    }

    @Override
    public int hashCode() {
        int result = description != null ? description.hashCode() : 0;
        result = 31 * result + itemId;
        return result;
    }
}


Producer:
public class Producer implements Runnable
{
    private TransferQueue<ShareItem> queue;

    public Producer(TransferQueue<ShareItem> queue)
    {
        this.queue = queue;
    }

    @Override
    public void run()
    {
        try
        {
            for (int i = 1; i <= 9; i++)
            {
                ShareItem shareItem = new ShareItem("ShareItem-" + i, i);
                System.out.format("Элемент '%s' добавлен\n", shareItem.getDescription());
                queue.offer(shareItem);

                Thread.sleep(100);

                if (queue.hasWaitingConsumer()) {
                    System.out.format("Consumer в ожидании!\n");
                }
            }
        }
        catch (InterruptedException ignore)
        {
        }
    }
}


Consumer:
public class Consumer implements Runnable
{
    private TransferQueue<ShareItem> queue;

    public Consumer(TransferQueue<ShareItem> queue)
    {
        this.queue = queue;
    }

    @Override
    public void run()
    {
        try
        {
            Thread.sleep(450);
            while (true)
            {
                System.out.format("Processing " + queue.take().toString() + "\n");
            }
        }
        catch (InterruptedException ignore)
        {
        }
    }
}

task.task30.task3002

Уже перепробовал кучу вариантов, так ничего и не помогло решить эту задачу, подскажите, в чем тут может быть проблема?

/*
Используя метод Integer.parseInt(String, int) реализуй логику метода convertToDecimalSystem,
который должен переводить переданную строку в десятичное число и возвращать его в виде строки.
*/
public class Solution {

    public static void main(String[] args) {
        System.out.println(convertToDecimalSystem("0x16")); //22
        System.out.println(convertToDecimalSystem("012"));  //10
        System.out.println(convertToDecimalSystem("0b10")); //2
        System.out.println(convertToDecimalSystem("62"));   //62
    }

    public static String convertToDecimalSystem(String s) {
        //напишите тут ваш код
        if (s.startsWith("0x")) {
            s = s.substring(2);
            return String.valueOf(Integer.parseInt(s, 16));
        }
        else if (s.startsWith("0b")) {
            s = s.substring(2);
            return String.valueOf(Integer.parseInt(s, 2));
        }
        else if (s.startsWith("0") && s.length() > 1) {
            s = s.substring(1);
            return String.valueOf(Integer.parseInt(s, 8));
        }
        else
            return s;
    }
}

Валидатор отказывается принимать задачи.

Уже который день сталкиваюсь с тем, что валидатор не принимает полностью рабочие задачи! На моем счету их уже накопилось целых три (думаю, скоро их будет гораздо больше) и над одной из них (com.javarush.task.task20.task2025) я просидел два дня, потом просто плюнул.
У меня вопрос. Как можно было так запороть проект просто поняв дизайн и изменив порядок задач?
Ведь на старой версии сайта все эти задачи без проблем принимались.
Я прекрасно знаю, что теперь открыт доступ к первой версии явараш, но нафига мне все эти танцы с бубном, чтобы откатиться? Выпустили сырой продукт, так ладно был бы это бесплатный сервис, но нет, люди платят деньги и ожидают получить качественный результат, и сейчас все просто тратят время на тестирование и поиск багов. Замечательно!
В общем вот список задач, которые не поддаются решению:
com.javarush.task.task20.task2025;
com.javarush.task.task30.task3002;
com.javarush.task.task30.task3008.big08.

+com.javarush.task.task30.task3010

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

P.S. Новый дизайн проекта и плагина меня порадовал.

level26.lesson15.big01 Задание 4

Никак не могу пройти тест на сервере, уже все перепробовал!

Задание 4
1. Выберем операцию, с которой мы сможем начать.
Подумаем. В банкомате еще денег нет, поэтому INFO и WITHDRAW протестить не получится.
Начнем с операции DEPOSIT — поместить деньги.
Считаем с консоли код валюты, потом считаем номинал и количество банкнот, а потом добавим их в манипулятор.

2. Чтобы считать код валюты, добавим статический метод String askCurrencyCode() в ConsoleHelper.
Этот метод должен предлагать пользователю ввести код валюты, проверять, что код содержит 3 символа.
Если данные некорректны, то сообщить об этом пользователю и повторить.
Если данные валидны, то перевести код в верхний регистр и вернуть.

3. Чтобы считать номинал и количество банкнот, добавим статический метод String[] getValidTwoDigits(String currencyCode) в ConsoleHelper.
Этот метод должен предлагать пользователю ввести два целых положительных числа.
Первое число — номинал, второе — количество банкнот.
Никаких валидаторов на номинал нет. Т.е. 1200 — это нормальный номинал.
Если данные некорректны, то сообщить об этом пользователю и повторить.
Пример вводимых данных:
200 5

4. В классе CurrencyManipulator создайте метод void addAmount(int denomination, int count),
который добавит введенные номинал и количество банкнот

5. Пора уже увидеть приложение в действии.
В методе main захардкодь логику пункта 1.
Кстати, чтобы не было проблем с тестами на стороне сервера, добавь в метод main первой строчкой Locale.setDefault(Locale.ENGLISH);
Запускаем, дебажим, смотрим.

public class CurrencyManipulatorFactory
{
    private static Map<String, CurrencyManipulator> manipulators = new HashMap<>();

    private CurrencyManipulatorFactory()
    {
    }

    public static CurrencyManipulator getManipulatorByCurrencyCode(String currencyCode)
    {
        if (manipulators.containsKey(currencyCode))
            return manipulators.get(currencyCode);
        else
        {
            CurrencyManipulator current = new CurrencyManipulator(currencyCode);
            manipulators.put(currencyCode, current);
            return current;
        }
    }
}


public class CurrencyManipulator
{
    private String currencyCode;
    private Map<Integer, Integer> denominations = new HashMap<>();

    public CurrencyManipulator(String currencyCode)
    {
        this.currencyCode = currencyCode;
    }

    public String getCurrencyCode()
    {
        return currencyCode;
    }

    public void addAmount(int denomination, int count) {
        if (denominations.containsKey(denomination))
            denominations.put(denomination, denominations.get(denominations) + count);
        else
            denominations.put(denomination, count);
    }
}


public class ConsoleHelper
{
    private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static void writeMessage(String message)
    {
        System.out.println(message);
    }

    public static String readString()
    {

        String line = "";
        try
        {
            line = reader.readLine();
        }
        catch (IOException e)
        {
        }
        return line;
    }

    public static String askCurrencyCode()
    {
        writeMessage("Enter the currency code.");
        String s = readString();
        while (s.length() != 3)
        {
            writeMessage("The code must contain three characters!");
            s = readString();
        }
        return s.toUpperCase();
    }

    public static String[] getValidTwoDigits(String currencyCode)
    {
        writeMessage("Enter the value and quantity of banknotes through the gap.");
        String[] denomination;
        while (true)
        {
            denomination = readString().split(" ");
            if (denomination.length != 2)
                writeMessage("Enter the value and quantity of banknotes through the gap!");
            else
            {
                try
                {
                    if (Integer.parseInt(denomination[0]) <= 0 || Integer.parseInt(denomination[1]) <= 0)
                        writeMessage("Denomination and quantity should not be zero!");
                    else
                        break;
                } catch (NumberFormatException e)
                {
                    writeMessage("Valid only numbers!");
                }
            }
        }
        return denomination;
    }
}


public class CashMachine
{
    public static void main(String[] args)
    {
        Locale.setDefault(Locale.ENGLISH);
        String s = ConsoleHelper.askCurrencyCode();
        CurrencyManipulator currencyManipulator = CurrencyManipulatorFactory.getManipulatorByCurrencyCode(s);
        String[] digits = ConsoleHelper.getValidTwoDigits(s);
        currencyManipulator.addAmount(Integer.parseInt(digits[0]), Integer.parseInt(digits[1]));
        System.out.println(currencyManipulator.getCurrencyCode());
    }
}