Смотритель: hubert

Какая-то ерунда с балансом черной материи!!!

Уважаемая администрация сайта JavaRush. В целом вы сделали достойный ресурс, который помогает окунуться в мир Java. Пусть он не дает полной картины, и не учит многому, а только основам, но в любом случае — Мне нравится. Почти все. Нравится и новый сайт (хотя и старый был тоже очень не плох, хотя да, новые тенденции, новые веяния и прочее, прочее, прочее). Даже новый валидатор хорошо, как бы его не ругали, но с ним реально стало лучше, хоть и бывают случаи «вымораживания» )))). Но в целом все достаточно не плохо. Т.е. очень хорошо.

И вот возвращаюсь к тому, что нравится почти все.

Об этом ПОЧТИ ВСЕ и хочется поговорить.

Новый баланс материи какой-то глупый, либо не правильный. Были подозрения на это очень давно, и вот перейдя на уровень с 4.JavaCollection 1 лекция — работа с файлами, я просто посчитал сколько материи заработается за одну эту лекцию и сколько спишется. Поолучается совсем ерунда.
За 1 лекцию списывается 336 черной материи, а заработать можно вселишь только 198. Т.е получается какое-то полное не соответствие того, что можно заработать и того, что можно потратить. Баланс нарушен — т.е. его нет совсем.

198 != 336, ни как, ни сколько не равно, ни больше чем списано. А совсем, совсем меньше того, что нужно.

И про это уже было написано в какой-то из тем. Но что поменялось? Все осталось то же самое.

Это настораживает и немного пугает.

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

Заранее спасибо за понимание.

level18.lesson10.home06 - "ну и как тут? " или "енибади, хелп!"

ну и как всегда Джавараш ничего нормально придумать не может… дада, посмею это сказать
кто что скажет-подскажет/поможет?
Я работаю на Маке, по етому не вкурсе как скрафтить файл для теста для подобных задачек..
package com.javarush.test.level18.lesson10.home06;

/* Встречаемость символов
Программа запускается с одним параметром - именем файла, который содержит английский текст.
Посчитать частоту встречания каждого символа.
Отсортировать результат по возрастанию кода ASCII (почитать в инете). Пример: ','=44, 's'=115, 't'=116
Вывести на консоль отсортированный результат:
[символ1]  частота1
[символ2]  частота2
Закрыть потоки. Не использовать try-with-resources

Пример вывода:
, 19
- 7
f 361
*/

import java.io.FileInputStream;
import java.io.IOException;

public class Solution {
    public static void main(String[] args) throws IOException {
        FileInputStream input = new FileInputStream(args[0]);
        byte[] freqList = new byte[128]; //создали список уже "отсортирован" по возростанию ascii кода

        while(input.available() > 0){ //читаем по каждому байту
            int b = input.read();
            freqList[b]++; // и просто инкрементируем "счетчик" того или иного байта который нам попался
        }
        input.close();

        for (int i : freqList){
            int ch = freqList[i];
            System.out.println((char)ch + i);
        }
    }
}

level18.lesson10.home05 что за чертовщина происходит??? п.с работаю на маке, так что проверить действие файлов не могу/не умею

package com.javarush.test.level18.lesson10.home05;

/* Округление чисел
Считать с консоли 2 имени файла
Первый файл содержит вещественные(дробные) числа, разделенные пробелом. Например, 3.1415
Округлить числа до целых и записать через пробел во второй файл
Закрыть потоки. Не использовать try-with-resources
Принцип округления:
3.49 - 3
3.50 - 4
3.51 - 4
-3.49 - -3
-3.50 - -3
-3.51 - -4
*/

import java.io.*;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String file1 = reader.readLine();
        String file2 = reader.readLine();
        reader.close();
        FileInputStream input = new FileInputStream(file1);
        FileWriter output = new FileWriter(file2);

        while(input.available() > 0){
            float flo = Math.round(input.read());
            output.write(flo + " ");
        }
        output.close();
        reader.close();
        input.close();

    }
}
  • ,

com.javarush.task.task18.task1813

Подскажите где я не прав в ходе рассуждения.

Задание
AmigoOutputStream
1 Измени класс AmigoOutputStream так, чтобы он стал Wrapper-ом для класса FileOutputStream. Используй наследование.
2 При вызове метода close() должны выполняться следующая последовательность действий:
2.1 Вызвать метод flush().
2.2 Дописать следующий текст «JavaRush © All rights reserved.«, используй метод getBytes().
2.3 Закрыть поток методом close().

Требования:
1. Метод main изменять нельзя.
2. Класс AmigoOutputStream должен наследоваться от класса FileOutputStream.
3. Класс AmigoOutputStream должен принимать в конструкторе обьект типа FileOutputStream.
4. Все методы write(), flush(), close() в классе AmigoOutputStream должны делегировать свое выполнение объекту FileOutputStream.
5. Метод close() должен сначала вызвать метод flush(), затем дописать текст, затем закрыть поток.

Рыба:
public class AmigoOutputStream {
    public static String fileName = "C:/tmp/result.txt";

    public static void main(String[] args) throws FileNotFoundException {
        new AmigoOutputStream(new FileOutputStream(fileName));
    }

}


1. Хотят наследование — ну окей, добавляем
public class AmigoOutputStream extends FileOutputStream

2. Но в конструкторе хотят увидеть:

    private FileOutputStream fileOutputStream;
    public AmigoOutputStream(FileOutputStream fileOutputStream) throws FileNotFoundException {
        super(fileName);
        this.fileOutputStream = fileOutputStream;
    }


Но в main у нас:
new AmigoOutputStream(new FileOutputStream(fileName));


Т.е. в консруктор я принимаю FileOutputStream(fileName), но мне приходится еще дергать super(fileName);

Зачем fileName использовать два раза?

Ну и я не понимаю — мы создаем объект AmigoOutputStream как потомом FileOutputStream, но работает внутри AmigoOutputStream с другим FileOutputStream (который private FileOutputStream fileOutputStream)
  • ,

Спрячьте требования задач под кат!

Дорогие разработчики,

Большая просьба спрятать под кат требования к задачам, по которым идет тест решения. Ну или шрифтом черным по черному писать, чтобы только при выделении было видно.
А то реальный спойлер.

Думаю, что многие меня поддержат.
  • ,

task19.task1920 Выход за пределы массива

Друзья, подскажите пожалуйста в чем может быть проблема. Компилятор ругается на выход за пределы массива при добавлении элементов в map; конкретно ArrayIndexOutOfBoundsException: 1 Я уже пробовал копировать вставлять решения других людей, у которых вроде как все работало, но у меня летит этот Exception ArrayIndexOutOfBoundException В качестве входного файла (args[0]) взял txt файл такого содержания

/*Petrov 2
Sidorov 6
Ivanov 1.35
Petrov 3.1
Ivanov 5
Elnikov 10
Elnikov 1.1
Agutin 11.1*/


Как я понимаю при таком варианте мне должно вывести в итоге Agutin 11.1 Elnikov 11.1

package com.javarush.task.task19.task1920;
/*
В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя значение
где [имя] — String, [значение] — double. [имя] и [значение] разделены пробелом.
Для каждого имени посчитать сумму всех его значений.
Вывести в консоль имена в алфавитном порядке, у которых максимальная сумма.
Имена разделять пробелом либо выводить с новой строки.
Закрыть потоки.
*/
    public class Solution {
        public static void main(String[] args) throws IOException {    
            BufferedReader reader = new BufferedReader(new FileReader(args[0]));
            Map<String, Double> map = new TreeMap<>();
            while (reader.ready()) {
                String[] s = reader.readLine().split(" ");
                if (map.containsKey(s[0])) {
                    map.put(s[0], map.get(s[0]) + Double.parseDouble(s[1]));
                } else {
                    map.put(s[0], Double.parseDouble(s[1]));
                }
            }
            reader.close();
            Double max = 0.0;
            for (Double d : map.values()) {
                if (d > max) max = d;
            }
            for (Double d : map.values()) {
                if (d == max) System.out.println(map.get(d));
            }
        }
    }

task30.task3010 не проходит тестирование, прошу помочь

Добрый день. прошу помощи в решении задания task30.task3010.

Минимальное допустимое основание системы счисления
В метод main первым аргументом приходит строка, которая содержит последовательность символов (Все символы в строке имеют коды в таблице ASCII от 32 до 127 включительно). Длина строки не превышает 255 символов. Нужно реализовать программу, которая по входящей строке определит, является ли содержимое строки записью числа в системе счисления с основанием не больше 36 включительно. Если является — нужно вывести минимальное основание системы счисления, в которой это число может существовать. Если не является — необходимо вывести «incorrect».
В системах счисления с основанием большим 10 в качестве цифр используются латинские буквы. К примеру, числу 35 в десятичной системе соответствует число «Z» в системе с основанием 36. Так как рассматриваем позиционные системы счисления — минимальное основание, которое должна выводить программа, это 2.
Если возникают любые исключения — перехватывай их и не выводи стек-трейс.

Пример1:
Вход:
00
Ожидаемый вывод:
2

Пример2:
Вход:
12AS08z
Ожидаемый вывод:
36

Пример3:
Вход:
12AS08Z/
Ожидаемый вывод:
incorrect

Требования:
1. Если возникло любое исключение — необходимо перехватить его и не выводить стек-трейс.
2. Если входящая строка содержит что-либо, кроме латинских букв и цифр — необходимо вывести «incorrect».
3. Если входящая строка корректна — необходимо вывести основание системы счисления.
4. Минимальное основание, которое выводит программа должно равняться 2.
5. Вывод программы должен соответствовать условию.

При проверке на сервере проходит всё кроме



public class Solution {
    public static void main(String[] args) {
        try {
            String num = args[0];

            if (!num.matches("\\w+")){
                System.out.println("incorrect");
                return;
            }

            for(int i = 2;i < 37;i++){
                try {
                    Long.parseLong(num, i);
                    System.out.println(i);
                    break;
                } catch (NumberFormatException e) {
                    /*NOP*/
                }
            }
        } catch (Exception e) {
            /*NOP*/
        }
    }
}

task30.task3002 не проходит тестирование РЕШЕНА

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

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

Требования:
1. Метод convertToDecimalSystem (String), возвращающий String, должен существовать.
2. Метод convertToDecimalSystem (String), возвращающий String, должен иметь модификаторы доступа: public, static.
3. Метод convertToDecimalSystem (String), возвращающий String, должен переводить переданную строку в десятичное число и возвращать его в виде строки.
4. Метод convertToDecimalSystem (String) должен вызывать метод Integer.parseInt(String, int).
5. Метод main (String[]), возвращающий void, должен иметь модификаторы доступа: public, static.

Четвёртый пункт ни в какую не проходит, хотя метод вызывается.

package com.javarush.task.task30.task3002;

/* 
Осваиваем методы класса Integer
*/
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) {
        //напишите тут ваш код
        String result ="";
        String tmp;
      if (s.startsWith("0x")){
          tmp = s.substring(2,s.length());
          result = String.valueOf(Integer.parseInt(tmp,16));
      }
      else if (s.startsWith("0b")){
          tmp = s.substring(2,s.length());
          result = String.valueOf(Integer.parseInt(tmp,2));
      }
      else if (s.startsWith("0")){
          tmp = s.substring(1,s.length());
          result = String.valueOf(Integer.parseInt(tmp,8));
      }
      else
          result = s;
        return result;
    }
}

task22.task2209

Условие:
В методе main считай с консоли имя файла, который содержит слова, разделенные пробелом.
В методе getLine используя StringBuilder расставь все слова в таком порядке, чтобы последняя буква данного слова совпадала с первой буквой следующего не учитывая регистр.
Каждое слово должно участвовать 1 раз.
Метод getLine должен возвращать любой вариант.
Слова разделять пробелом.
Вывести полученную строку на экран.

Пример тела входного файла:
Киев Нью-Йорк Амстердам Вена Мельбурн

Результат:
Амстердам Мельбурн Нью-Йорк Киев Вена

Требования:
1. Метод main должен считывать имя файла с клавиатуры.
2. В методе getLine должен быть использован StringBuilder
3. Метод getLine должен возвращать пустую строку(пустой StringBuilder) в случае если ему не были переданы параметры(слова).
4. Все слова переданные в метод getLine должны быть включены в результирующую строку, если это возможно.
5. Вывод на экран должен соответствовать условию задачи.

/////////

Я вот написал код, позволяющий найти все возможные варианты расстановки слов. Где-то получается длиннее, где-то короче и.т. д.
На картинке можно посмотреть комбинации.
Взял эти города — Пекин Гонконг Токио Москва Париж Лондон Киев Нью-Йорк Амстердам Вена Мельбурн Телявив Осака Оренбург Таганрог Гагарин.

Действительно ли нужно добавлять оставшиеся слова не попавшие никуда в конец? Просто об этом в условии ни хреналеона нету! И это бредово.

Метод getLine должен возвращать любой вариант. Это как понимать? Я должен возвращать какой-то рандомный варинат строки удовлетворяющий результату?

Сейчас валидатор не принимает:

(- тут я возвращаю самый длинный результат)
Все слова переданные в метод getLine должны быть включены в результирующую строку, если это возможно.

Вывод на экран должен соответствовать условию задачи. (казалось бы какому условию, просто через пробел да с большой буквы. Как он может не соответствовать?....)

package com.javarush.task.task22.task2209;

import java.io.*;
import java.util.ArrayList;

/*
Составить цепочку слов
*/
public class Solution {
    public static void main(String[] args) throws IOException {
        //...

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String fileName = reader.readLine();

        FileReader fileReader = new FileReader(fileName);


        StringBuilder file = new StringBuilder();
        while (fileReader.ready()){
            file.append((char) fileReader.read());
        }


        String[] strings = file.toString().split(" ");

        for (int x = 0; x< strings.length; x++){
           strings[x] = strings[x].toLowerCase();
        }

        StringBuilder result = getLine(strings);
        System.out.println(result.toString());
    }

    public static StringBuilder getLine(String... words) {

        if(words!=null && words.length!=0) {   // проверка на условие валидатора

            ArrayList<StringBuilder> megaList = new ArrayList<>(); // тут хранию все возможные комбинации

            ArrayList<String> originalList = new ArrayList<>();  // оригинальный лист стрингов

            for (String word : words) {
                originalList.add(word.toLowerCase()); // делаю всё с маленькой буквы
            }

            int k = originalList.size();   

            while (k > 0) {   //  повторяем цик столько раз, сколько у нас элементов в оригинальном массиве
                StringBuilder stringBuilder = new StringBuilder();
                ArrayList<String> copyOfList = new ArrayList<>(originalList);  // копия оригинального листа

                ArrayList<String> list = new ArrayList<>();  // лист где я храню подобранные слова

                list.add(copyOfList.get(k-1));  // начинаю с конца (не важно) сразу добавляю один (последний) в лист
                copyOfList.remove(k-1);  // и удаляю его из копии листа оригинала

                int n = copyOfList.size();
                while (n > 0) {  //  повторяем цик столько раз, сколько у нас элементов в оригинальном массиве

                    //тут стравниваем буквы, если есть совпадение, то удалячем из копии листа объект под индексом index
                    int index = -1;
                    for (int x = 0; x < copyOfList.size(); x++) {

                        String str1 = copyOfList.get(x);
                        String str2 = list.get(list.size() - 1);

                        char ch1 = str1.charAt(0);
                        char ch2 = str2.charAt(str2.length() - 1);

                        if (ch1 == ch2) {
                            list.add(str1);
                            index = x;
                            break;
                        }
                    }

                    if (index != -1) {
                        copyOfList.remove(index);
                    }

                    n--;
                }

                
                // возвращаем заглавные буквы и морфмируем stringBuilder
                for (String into : list) {
                    String str = into;
                    str = Character.toUpperCase(str.charAt(0)) + str.substring(1);

                    stringBuilder.append(str).append(" ");
                }
                // удаляем пробел 
                stringBuilder.replace(stringBuilder.length()-1,stringBuilder.length(),"");
                megaList.add(stringBuilder);

                k--;
            }

            // тут я просто нахожу самую длинную комбинацию
            int maxIndex=0;
            int lenght=megaList.get(0).length();

            for (int e = 1; e < megaList.size(); e++ ){
                if(megaList.get(e).length()>=lenght) {
                    lenght = megaList.get(e).length();
                    maxIndex = e;
                }
            }

          //  System.out.println(megaList);
            return megaList.get(maxIndex);
        }

    return new StringBuilder();
    }
}

Ошибка incompatible types в task14.task1405;

Всем привет. помогите разобраться, понимаю что решение простое… но что то не доходит какое именно!
ошибка
"
incompatible types: com.javarush.task.task14.task1405.Solution.Food cannot be converted to com.javarush.task.task14.task1405.Solution.Selectable:
Solution.java, line: 10, column: 33
"
Вывод компилятора:
com/javarush/task/task14/task1405/Solution.java:10: error: incompatible types: com.javarush.task.task14.task1405.Solution.Food cannot be converted to com.javarush.task.task14.task1405.Solution.Selectable
Selectable selectable = new Food();

/*
Food
1. Реализовать интерфейс Selectable в классе Food.
2. Метод onSelect() должен выводить на экран фразу «food was selected«.
3. Подумай, какие методы можно вызвать для переменной food и какие для selectable.
4. В методе foodMethods вызови методы onSelect, eat, если это возможно.
5. В методе selectableMethods вызови методы onSelect, eat, если это возможно.
6. Явное приведение типов не использовать.
*/

public class Solution {
    public static void main(String[] args) {
        Food food = new Food();
        Selectable selectable = new Food();
        Food newFood = (Food) selectable;

        foodMethods(food);
        selectableMethods(selectable);
    }

    public static void foodMethods(Food food) {
       food.eat();
        food.onSelect();

    }

    public static void selectableMethods(Selectable selectable) {
        selectable.onSelect();

    }

    interface Selectable {
        void onSelect();
    }

    static class Food {
        public void onSelect() {
            System.out.println("food was selected");
        }
        public void eat() {
            System.out.println("food was eaten");
        }
    }
}

Оценка попыток решения задач и конечный счет

Ребят, мне кажется что java rush ранее выдавала куда более красивую и правдоподобную статистику по тому как вы решили ту или иную задачу. Я имею ввиду среднее количество попыток на сколько успешнее вы решили задачу по сравнению с остальными. Что вы думаете на этот счет?