• ,

task.task19.task1922. Достало. Просто нереально.

Ищем нужные строки
Считать с консоли имя файла.
Вывести в консоль все строки из файла, которые содержат всего 2 слова из списка words.
Закрыть потоки.
Пример:
words содержит слова А, Б, В
Строки:


  • В Б А Д //3 слова из words, не подходит
  • Д А Д //1 слово из words, не подходит
  • Д А Б Д //2 слова — подходит, выводим

Второй день сижу уже на этой задаче. Все уж перепробывал, помогает только один способ — добавить пробел перед первой String. Код ниже берет файл без добавления пробела


public class Solution {
    public static List<String> words = new ArrayList<String>();

    static
    {
        words.add("файл");
        words.add("вид");
        words.add("В");
    }

    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String filename = reader.readLine();
        reader.close();
        BufferedReader fileReader = new BufferedReader(new FileReader(filename));
        ArrayList<String> lel = new ArrayList<>();
        int counter=0;

        String cand;
        String cand1;

        while(fileReader.ready())
        {
            String [] rowdata = fileReader.readLine().split("\\s+");

            for(int i=0; i < rowdata.length; i++)
            {
                cand = rowdata[i];

                for(int j=0; j < words.size(); j++)
                {
                    cand1 = words.get(j);

                    if(cand.equals(cand1))
                    {
                        lel.add(cand);
                        counter++;
                    }
                }
            }
        }

        if(counter==2)
        {
            for(String str : lel)
            {
                System.out.println(str);
            }
        }
        else lel.clear();
        fileReader.close();
    }
}

Они не равны. Почему - не знаю

Это очень интересно, учитывая, что последущие строки проходят проверку без проблем и увеличивают count

После проверки &quot;вид&quot;

Но первая String игнорится, непонятно почему

В итоге, я получаю только «вид» и «В», хотя по идее ничего получать не должен, так как повторений уже 3, что и происходит после добавления пробела.

Ну а теперь самое интересное, я меняю кодировку файла с UTF-8 на ANSI, для того, чтобы считывать латиницу.
и меняю сами слова на английские — все работает так как надо.

В условие заходит, count увеличивает

Бьюсь уже нереально долго. Надеюсь на вашу помощь, спасибо

Задачка 1920 "Самый богатый"

Задачка не проходит. Что может быть?

/* Самый богатый

В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя значение
String.

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

Пример входного файла:
Петров 0.501
Иванов 1.35
Петров 0.85

Пример вывода:
Петров

Валидатор задачу не пропускает, пишет:
Программа должна выводить в консоль имена, у которых максимальная сумма.

Может дело в кодировке файла, вот подметил такую вещь:
На файлах в кодировке UTF-8 без BOM все отрабатавает как надо.
Но если сделать кодировку UTF-8 (c BOM), то визуально, у одинаковых строк — будет разный hashcode.
А так как сравнение у map построено на хэш коде, появляются дупликаты в map. И может быть валидатор проверяет данные на основе своего файла в этой кодировке (c BOM) и — поэтому не проходит…
Но чтобы проверить это — лучше читать в байтах, а валидатор ругается если применить не FileReader. Вот ведь…

Тестовый файл:
Петров 0.85
Петров 0.85
Петров 0.6332
Петров 0.6332
Петров 0.6332
Иванов 1.35
Сидоров 1.2
Эльман 3.5995999999999997
Сидоров 0.85

Вывод:
Петров
Эльман
*/


package com.javarush.task.task19.task1920;
import java.io.*;
import java.util.Map;
import java.util.TreeMap;

public class Solution {
    public static void main(String[] args) throws IOException {
        TreeMap<String, Double> map = new TreeMap<>();
        BufferedReader fileReader = new BufferedReader(new FileReader(args[0]));

        double max = 0;
        while (fileReader.ready()) {
            String s = fileReader.readLine();
            String[] strs = s.split(" ");
            String key = strs[0];
            double value = Double.parseDouble(strs[1]);
            max = value;
            if (map.containsKey(key)) {
                map.put(key, map.get(strs[0]) + value);
            } else
                map.put(key, value);
        }
        fileReader.close();

        //Max
        for (Double a : map.values())
            if (max < a)
                max = a;

        //show
        for (Map.Entry<String, Double> pair : map.entrySet())
            if (pair.getValue() == max)
                System.out.print(pair.getKey()+" ");
    }
}
  • ,

package com.javarush.task.task16.task1627;

Здравствуйте! Решаю задачку на 16-ом уровне. Валидтаор не принимает:
package com.javarush.task.task16.task1627;

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public static void main(String[] args) throws InterruptedException {
        OnlineGame onlineGame = new OnlineGame();
        onlineGame.start();
    }

    public static class OnlineGame extends Thread {
        public static volatile boolean isWinnerFound = false;

        public static List<String> steps = new ArrayList<String>();

        static {
            steps.add("Начало игры");
            steps.add("Сбор ресурсов");
            steps.add("Рост экономики");
            steps.add("Убийство врагов");
        }

        protected Gamer gamer1 = new Gamer("Ivanov", 3);
        protected Gamer gamer2 = new Gamer("Petrov", 1);
        protected Gamer gamer3 = new Gamer("Sidorov", 5);

        public void run() {
            gamer1.start();
            gamer2.start();
            gamer3.start();

            while (!isWinnerFound) {
            }
            gamer1.interrupt();
            gamer2.interrupt();
            gamer3.interrupt();
        }
    }

    public static class Gamer extends Thread {
        private int rating;

        public Gamer(String name, int rating) {
            super(name);
            this.rating = rating;
        }

        @Override
        public void run() {
            //Add your code here - добавь код тут
            try
            {
                while (!OnlineGame.isWinnerFound)
                {
                    int i;
                    for (i = 0; i < OnlineGame.steps.size(); i++)
                    {
                        System.out.println(getName() + ":" + OnlineGame.steps.get(i));
                        Thread.sleep(1000/rating);
                    }
                    if (i == OnlineGame.steps.size())
                    {
                        System.out.println(getName() + ":победитель!");
                        OnlineGame.isWinnerFound = true;
                    }
                }
            }

            catch (Exception e)
            {
                System.out.println(getName() + ":проиграл");
            }
        }
    }
}

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

Уже который день сталкиваюсь с тем, что валидатор не принимает полностью рабочие задачи! На моем счету их уже накопилось целых три (думаю, скоро их будет гораздо больше) и над одной из них (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. Новый дизайн проекта и плагина меня порадовал.
  • ,

level18.lesson10.bonus03 интересный вопрос

Доброго времени суток знатоки!
Помогите разобраться… в целом, задача правильная, только если название продукта приходит «цельное», а не разделенное пробелами типа «Офигенная и крутая майка»
Подозревая что проблема вот тут:
String[] param = args[0].split(" ");

Есть идеи конкатировать название продукта до тех пор пока не натолкнусь на цифру цены.
Но! Если в названии продукта встречается цифра? Например «Штаны размер 44 серые»?
Подскажите как решать?)
  • ,

level18.lesson10.bonus03 интересный вопрос

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

/* Прайсы 2
CrUD для таблицы внутри файла
Считать с консоли имя файла для операций CrUD
Программа запускается с одним из следующих наборов параметров:
-u id productName price quantity
-d id
Значения параметров:
где id - 8 символов
productName - название товара, 30 chars (60 bytes)
price - цена, 8 символов
quantity - количество, 4 символа
-u  - обновляет данные товара с заданным id
-d  - производит физическое удаление товара с заданным id (все данные, которые относятся к переданному id)

В файле данные хранятся в следующей последовательности (без разделяющих пробелов):
id productName price quantity
Данные дополнены пробелами до их длины

Пример:
19846   Шорты пляжные синие           159.00  12
198478  Шорты пляжные черные с рисунко173.00  17
19847983Куртка для сноубордистов, разм10173.991234
*/

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

public class Solution {
    public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String fileName = reader.readLine();
        reader.close();
        String[] param = args[0].split(" ");
        String id = addSpase(param[0],8);
        String productName = addSpase(param[1],30);
        String price = addSpase(param[2],8);
        String quantity = addSpase(param[3],4);

        ArrayList<String> fileStrings = new ArrayList<String>();
        BufferedReader fileReader = new BufferedReader(new FileReader(fileName));
        boolean isUpdate = param[0].equals("-u");
        boolean isDelete = param[0].equals("-d");
        while (fileReader.ready()){
            String fileString = fileReader.readLine();
            String currentId = fileString.substring(0, 8);
            boolean isNeed = currentId.equals(id);

            if(isNeed) {
                if(isUpdate) {
                    fileStrings.add(id + productName + price + quantity);
                    continue;
                }
                if(isDelete) {
                    continue;
                }
            }
            fileStrings.add(fileString);
        }
        fileReader.close();

        BufferedWriter fileWritter = new BufferedWriter(new FileWriter(fileName));
        for (String fileString : fileStrings){
            fileWritter.write(fileString + "\n");
        }
        fileWritter.close();
    }

    private static String addSpase(String cell, int length)
    {
        return cell.concat(String.format("%" + (length-cell.length()) + "s", " "));
    }
}


Доброго времени суток знатоки!
Помогите разобраться… в целом, задача правильная, только если название продукта приходит «цельное», а не разделенное пробелами типа «Офигенная и крутая майка»
Подозревая что проблема вот тут:
String[] param = args[0].split(" ");

Есть идеи конкатировать название продукта до тех пор пока не натолкнусь на цифру цены.
Но! Если в названии продукта встречается цифра? Например «Штаны размер 44 серые»?
Подскажите как решать?)
  • ,

level08.lesson08.task02

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

package com.javarush.test.level08.lesson08.task02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Iterator;


/* Удалить все числа больше 10
Создать множество чисел(Set<Integer>), занести туда 20 различных чисел.
Удалить из множества все числа больше 10.
*/

public class Solution
{
    public static HashSet<Integer> createSet()
    {
        //напишите тут ваш код

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        HashSet<Integer> set = new HashSet<>();

        Integer setItem;

        for (int i = 0; i < 20; i++)
        {
            try{
                setItem = Integer.parseInt(reader.readLine());
                set.add(setItem);
            }catch (IOException exception){

            }
        }

        return set;

    }

    public static HashSet<Integer> removeAllNumbersMoreThan10(HashSet<Integer> set)
    {
        //напишите тут ваш код
        Integer number;

        for (Iterator<Integer> iter = set.iterator(); iter.hasNext(); )
        {

            number = iter.next();

            if(number > 10){
                iter.remove();
            }
        }

        return set;

    }

    public static void main (String[] args){

        HashSet<Integer> set = createSet();

        set = removeAllNumbersMoreThan10(set);

    }
}
  • ,

com.javarush.test.level19.lesson10.home06 - валидатор, пощади!


package com.javarush.test.level19.lesson10.home06;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.NumberFormat;
import java.util.*;

/* Замена чисел
1. В статическом блоке инициализировать словарь map парами [число-слово] от 0 до 12 включительно
Например, 0 - "ноль", 1 - "один", 2 - "два"
2. Считать с консоли имя файла
3. Заменить все числа на слова используя словарь map
4. Результат вывести на экран
5. Закрыть потоки. Не использовать try-with-resources

Пример данных:
Это стоит 1 бакс, а вот это - 12 .
Переменная имеет имя file1.
110 - это число.

Пример вывода:
Это стоит один бакс, а вот это - двенадцать .
Переменная имеет имя file1.
110 - это число.
*/

public class Solution {
    public static Map<Integer, String> map = new HashMap<Integer, String>();

    static {
        map.put(0, "ноль");
        map.put(1, "один");
        map.put(2, "два");
        map.put(3, "три");
        map.put(4, "четыре");
        map.put(5, "пять");
        map.put(6, "шесть");
        map.put(7, "семь");
        map.put(8, "восемь");
        map.put(9, "девять");
        map.put(10, "десять");
        map.put(11, "одинадцать");
        map.put(12, "двенадцать");
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String fileName = br.readLine();
        BufferedReader fr = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
        while (fr.ready()) {
            StringBuilder sb = new StringBuilder();
            sb.append(fr.readLine());
            List<String> list = Arrays.asList(sb.toString().split(" "));
            Set<Integer> set = map.keySet();
            for (int i = 0; i < list.size(); i++) {
                Integer digit;
                String current = list.get(i);
                if (current.matches("\\d+")) {
                    digit = Integer.parseInt(list.get(i));
                    if (set.contains(digit)) {
                        list.set(i, map.get(digit));
                    }
                }
            }
            for (int i = 0; i < list.size(); i++) {
                if (i != list.size() - 1) {
                    System.out.print(list.get(i) + " ");
                } else {
                    System.out.println(list.get(i));
                }
            }
        }
    }
}



Объясните пожалуйста почему не принимает, кто может.

level19.lesson10.bonus03 не принимается валидатором

Помогите разобраться с причиной

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Solution
{
    public static void main(String[] args)
    {

        String tag = args[0];

        try
        {

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

            String text = "";
            FileReader fr = new FileReader(fileName);
            BufferedReader in = new BufferedReader(fr);
            while (in.ready())
            {
                text += in.readLine();
            }

            in.close();
            fr.close();
            ArrayList<Integer> startList = new ArrayList<>();
            ArrayList<Integer> endList = new ArrayList<>();

            Pattern pattern = Pattern.compile("<" + tag);
            Matcher matcher = pattern.matcher(text);

            int start = 0;
            while (matcher.find(start))
            {
                start = matcher.start();
                startList.add(start);
                start++;
            }

            Pattern pattern2 = Pattern.compile("/" + tag + ">");
            Matcher matcher2 = pattern2.matcher(text);

            start = 0;
            while (matcher2.find(start))
            {
                start = matcher2.start();
                endList.add(matcher2.end() - 1);
                start++;
            }

            TreeMap<Integer, Integer> map = new TreeMap<>();

            for (int i = 0; i < endList.size(); i++)
            {
                int currentEnd = endList.get(i);

                if (startList.size() == 1)
                {
                    map.put(startList.get(0), currentEnd);
                } else
                {
                    for (int j = 0; j < startList.size(); j++)
                    {
                        if (startList.get(j) > currentEnd)
                        {
                            map.put(startList.get(j - 1), currentEnd);
                            startList.remove(j - 1);
                            break;
                        }
                    }
                }
            }

            for (Integer integer : map.keySet())
            {
                System.out.println(text.substring(integer, map.get(integer) + 1));
            }


        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}
  • ,

com.javarush.test.level22.lesson13.task03

все условия проверяются, на все примеры выдает правильный ответ, а решение не принимается. Может надо проверять еще какие-то условия? Например, номер "-0501234567" выдает true и не нарушает не одного из условий, но на самом-то деле этот номер кривой…

/* Проверка номера телефона
Метод checkTelNumber должен проверять, является ли аргумент telNumber валидным номером телефона.
Критерии валидности:
1) если номер начинается с '+', то он содержит 12 цифр
2) если номер начинается с цифры или открывающей скобки, то он содержит 10 цифр
3) может содержать 0-2 знаков '-', которые не могут идти подряд
4) может содержать 1 пару скобок '(' и ')'  , причем если она есть, то она расположена левее знаков '-'
5) скобки внутри содержат четко 3 цифры
6) номер не содержит букв
7) номер заканчивается на цифру
*/
public class Solution
{

    public static boolean checkTelNumber(String telNumber)
    {
        boolean result = true;

        //1) если номер начинается с '+', то он содержит 12 цифр
        if(telNumber.substring(0,1).equals("+") && telNumber.replaceAll("\\D", "").length() != 12) result = false;
        //2) если номер начинается с цифры или открывающей скобки, то он содержит 10 цифр
        if(!telNumber.substring(0,1).equals("+") && telNumber.replaceAll("\\D", "").length() != 10) result = false;

        //3) может содержать 0-2 знаков '-', которые не могут идти подряд
        {
            int count = 0;
            for(int i = 0; i < telNumber.length(); i++)
            {
                if(telNumber.charAt(i) == '-') count++;
            }
            if(count > 2) result = false;
            if(count > 1 && telNumber.lastIndexOf("+") - telNumber.indexOf("+") < 2) result = false;
        }

        //4) может содержать 1 пару скобок '(' и ')'  , причем если она есть, то она расположена левее знаков '-'
        {
            int countOpen = 0;
            int countClose = 0;

            for(int i = 0; i < telNumber.length(); i++)
            {
                if(telNumber.charAt(i) == '(') countOpen++;
                if(telNumber.charAt(i) == ')') countClose++;
            }

            if(countClose != countOpen || countClose > 1 || countOpen > 1) result = false;
            if (telNumber.indexOf(")") != -1 && telNumber.indexOf("-") != -1 && telNumber.indexOf(")") > telNumber.indexOf("-")) result = false;

            //5) скобки внутри содержат четко 3 цифры
            if (telNumber.indexOf(")") != -1 && telNumber.indexOf(")") - telNumber.indexOf("(") != 4) result = false;

        }

        //6) номер не содержит букв
        if(telNumber.replaceAll("[A-Z, a-z]", "!").indexOf("!") != -1) result = false;

        //7) номер заканчивается на цифру
        if(!telNumber.replaceAll("\\d", "!").substring(telNumber.length()-1).equals("!")) result = false;

        return result;
    }
}
  • ,

==Городские легенды== JavaRush

Так как связано с решением задач, добавляю именно в данный тред.

Проверенные лично факты:
1. Неиспользуемые import-ы ведут к провалу попытки.
2. Незакрытые по завершению работы с ними потоки (и другие ранее открытые ресурсы) также ведут к провалу попытки.
3. Конструкции, содержащие анонимные классы, которые в дальнейшем явно не закрываются могут (не всегда!) привести к провалу, например вместо:
FileInputStream iStrm = new FileInputStream( new BufferedReader(new InputStreamReader(System.in)).readLine());
лучше написать гарантированное:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
FileInputStream inputStream = new FileInputStream( reader.readLine());
чтобы в дальнейшем закрыть ДВА потока, а не один, как в верхнем примере.
Хочется уточнить у администрации следующее:
1. Часто в форумах при провале попыток сдачи есть совет убрать пользовательские комментарии — они могут быть причиной провала? Это так, серьезно?! Пока (первые 20 уровней — не сталкивался с этим, правда и комментировал не так уж часто). На форуме есть даже ответы по типу, что помогло. Проясните, пожалуйста.
2. Попытка сдачи в полночь может привести к провалу (время рестарта сервера).

P.S. Пополняйте своими наблюдениями.