Java Core, 5 уровень, 12 лекция, Задача: Факториал

День добрый господа.

Описание задачи:
Написать метод, который вычисляет факториал — произведение всех чисел от 1 до введенного числа включая его.
Пример: 4! = factorial(4) = 1*2*3*4 = 24
1. Ввести с консоли число меньше либо равно 150.
2. Реализовать функцию factorial.
3. Если введенное число меньше 0, то вывести 0.
0! = 1

Собственно мой код:

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try {
            int input = Integer.parseInt(reader.readLine());
            reader.close();
            if (input <= 150)
                System.out.println(factorial(input));
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public static String factorial(int n) {
        if (n == 0) return "1";
        else if (n < 0) return "0";

        return "" + (n * Integer.parseInt(factorial(n - 1)));
    }
}


Результаты выполнения:
-413
0

0
1

4
24

При отправке задания, прилетают ошибки валидации:
1. Программа должна выводить на экран факториал введенного числа.
2. Метод factorial должен возвращать строковое представление факториала числа переданного ему в качестве параметра.

Ну и мой вопрос — WTF?

UPD 26.04.2017: Вопрос снят. При вводе 150 на выходе имеем 0.

"Считаем слово" Почему не принимает?

Какой-то ад. Код выполняет задачу при любых условиях, валидацию не проходит. Задача была решена разными способами, ниже самый простой вариант, где меньше возможностей для ошибки.

com.javarush.task.task19.task1907;
«Считаем слово»
Считать с консоли имя файла.
Файл содержит слова, разделенные знаками препинания.
Вывести в консоль количество слов «world«, которые встречаются в файле.


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solution {

    public static void main(String[] args) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        FileReader fileReader = new FileReader(reader.readLine());
        BufferedReader bufferedFileReader = new BufferedReader(fileReader);

        int count = 0;

        while (bufferedFileReader.ready()){

            String text = bufferedFileReader.readLine();
            text = text.toLowerCase();
            text = text.replaceAll("\\p{P}"," ");
            String[] mas = text.split(" ");

            for (int i=0;i<mas.length;i++){
                if ("world".equals(mas[i]))count++;
            }
        }

        reader.close();
        fileReader.close();
        bufferedFileReader.close();

        System.out.println(count);


Логика следующая:
1. считываем из файла строку
2. переводим в нижний регистр (на всякий. но и без этого не проходит)
3. заменяем всю пунктуацию на пробелы
4. по пробелам разбиваем строку текста на массив
5. подсчитываем количество совпадений
6. если есть ещё строка, повторяем пункты с 1 по 5
7. закрываем потоки и выводим количество совпадений

Тестовый файл:
«World? world ,world, world.world!world world
world»

Результат: 8

Где я ошибся?
  • ,

task29.task2909 Рефакторинг (12) (Решена)

Всем здравствуйте. Просто беда с задачей, уже мозги сломал. может кто сможет помочь:

Рефакторинг (12)

12.1. Объединение условных операторов.

12.1.1. Добавь внутренний метод, сообщающий, могут ли быть перевезены пассажиры

boolean canPassengersBeTransferred() в класс Car. Метод должен возвращать true, если

водитель доступен isDriverAvailable и есть топливо fuel.

12.1.2. Перепиши метод getNumberOfPassengersCanBeTransferred(), объединив условные

операторы (используй метод canPassengersBeTransferred()).

12.2. Объединение дублирующихся фрагментов в условных операторах. Перепиши метод

startMoving(), чтобы в нем не было повторяющихся вызовов функций.

12.3. Замена магического числа символьной константой. Замени магические числа в методе

getMaxSpeed() на константные переменные метода: MAX_TRUCK_SPEED,

MAX_SEDAN_SPEED и MAX_CABRIOLET_SPEED.

12.4. Замена условного оператора полиморфизмом.

12.4.1. Переопредели метод getMaxSpeed() в подклассах, избавившись от условного оператора.

12.4.2. Метод getMaxSpeed() в классе Car сделай абстрактным.

public abstract class Car {
    static public final int TRUCK = 0;
    static public final int SEDAN = 1;
    static public final int CABRIOLET = 2;

    double fuel;

    public double summerFuelConsumption;
    public double winterFuelConsumption;
    public double winterWarmingUp;

    private int type;

    private boolean driverAvailable;
    private int numberOfPassengers;

    protected Car(int type, int numberOfPassengers) {
        this.type = type;
        this.numberOfPassengers = numberOfPassengers;
    }

    public static Car create(int type, int numberOfPassengers){
        switch (type){
            case TRUCK:
                return new Truck(numberOfPassengers);
            case SEDAN:
                return new Sedan(numberOfPassengers);
            default:
                return new Cabriolet(numberOfPassengers);
        }
    }

    public void fill(double numberOfLiters) throws Exception{
        if (numberOfLiters < 0) {
            throw new Exception();
        }
        fuel += numberOfLiters;
    }

    public boolean isSummer(Date date , Date summerStart, Date summerEnd){
        return !(date.before(summerStart) || date.after(summerEnd));
    }

    public double getWinterConsumption(int length){
        return length * winterFuelConsumption + winterWarmingUp;
    }

    public double getSummerConsumption(int length){
        return length * summerFuelConsumption;
    }

    private boolean canPassengersBeTransferred(){
        return isDriverAvailable() && fuel > 0;
    }

    public double getTripConsumption(Date date, int length, Date SummerStart, Date SummerEnd) {
        if (!isSummer(date, SummerStart, SummerEnd)) {
            return getWinterConsumption(length);
        } else {
            return getSummerConsumption(length);
        }
    }

    public int getNumberOfPassengersCanBeTransferred() {
        if (!canPassengersBeTransferred())
            return 0;

        return numberOfPassengers;
    }

    public boolean isDriverAvailable() {
        return driverAvailable;
    }

    public void setDriverAvailable(boolean driverAvailable) {
        this.driverAvailable = driverAvailable;
    }

    public void startMoving() {
        if (numberOfPassengers > 0) {
            fastenPassengersBelts();
        }

        fastenDriverBelt();
    }

    public void fastenPassengersBelts() {
    }

    public void fastenDriverBelt() {
    }

    protected abstract int getMaxSpeed();
}


public class Truck extends Car{

    public Truck(int numberOfPassengers) {
        super(TRUCK, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        final int MAX_TRUCK_SPEED = 80;
        return MAX_TRUCK_SPEED;
    }
}


public class Sedan extends Car{

    public Sedan(int numberOfPassengers) {
        super(SEDAN, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        final int MAX_SEDAN_SPEED = 120;
        return MAX_SEDAN_SPEED;
    }
}


public class Cabriolet extends Car{

    public Cabriolet(int numberOfPassengers) {
        super(CABRIOLET, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        final int MAX_CABRIOLET_SPEED = 90;
        return MAX_CABRIOLET_SPEED;
    }
}


Валидатор выдаёт:


Может есть идеи? Заранее благодарен.

com.javarush.task.task19.task1906

/*
Четные байты
Считать с консоли 2 имени файла.
Вывести во второй файл все байты с четным индексом.

Пример:
второй байт, четвертый байт, шестой байт и т.д.

Закрыть потоки ввода-вывода.
*/

package com.javarush.task.task19.task1906;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;

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

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        FileReader fileReader = new FileReader(bufferedReader.readLine());
        FileWriter fileWriter = new FileWriter(bufferedReader.readLine());
        bufferedReader.close();

        int count = 1;

        while (fileReader.ready()){
            if ((count%2)==0){
                fileWriter.write(fileReader.read());
            }
            count++;
        }
        fileReader.close();
        fileWriter.close();
    }
}


Не проходит проверку. Подозреваю, что считывать нужно всё-таки байты, а не символы? Для этого нужно написать адаптер от FileReader к InputStream или как-то по-другому? Какой тогда интерфейс должен реализовывать класс-адаптер, если InputStream это не интерфейс? Или можно унаследоваться от InputStream? Помогите плс, кто шарит. Если что, в задаче обязательно использовать именно FileReader.

task.task20.task2002 Не хочет принимать гад

Буду очень благодарен, если кто-то все-таки сможет сказать, что же тут не так

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

    }

    public static class JavaRush {
        public List<User> users = new ArrayList<>();
        SimpleDateFormat form = new SimpleDateFormat("dd MM yyyy");

        public void save(OutputStream outputStream) throws Exception {
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream));
            int size = users.size();
            writer.println(size);
            if (size>0)
            {
                for(User us : users)
                {
//                    пишем имя
                    writer.println(us.getFirstName());

//                    пишем фамилию
                    writer.println(us.getLastName());

//                    пишем дату
                    writer.println(form.format(us.getBirthDate()));

//                    пишем пол
                    writer.println(us.isMale());

//                    пишем страну
                    writer.println(us.getCountry());


                }
            }
        }

        public void load(InputStream inputStream) throws Exception {
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                while (reader.ready())
                {  int size = Integer.parseInt(reader.readLine());
                    for(int i = 0;i<size;i++) {
                        User us = new User();

                        String name = reader.readLine();
                        if(name.equals("null"))
                        us.setFirstName(null);
                        else  us.setFirstName(name);

                        String last = reader.readLine();
                        if (last.equals("null"))
                        us.setLastName(null);
                        else us.setLastName(last);

                        String bd = reader.readLine();
                        if (bd.equals("null"))
                            us.setBirthDate(null);
                        else
                        us.setBirthDate(form.parse(bd));

                        String male = reader.readLine();
                        if (male.equals("true")) us.setMale(true);
                        else  us.setMale(false);

                        String cont = reader.readLine();
                        if (cont.equals("null"))
                        us.setCountry(null);
                        else us.setCountry(User.Country.valueOf(cont));
                        users.add(us);
                    }
                }
        }

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

            JavaRush javaRush = (JavaRush) o;

            return users != null ? users.equals(javaRush.users) : javaRush.users == null;

        }

        @Override
        public int hashCode() {
            return users != null ? users.hashCode() : 0;
        }
    }
}
  • ,

package com.javarush.task.task08.task0812;

Завдання:
Cамая длинная последовательность
1. Создай список чисел.
2. Добавь в список 10 чисел с клавиатуры.
3. Вывести на экран длину самой длинной последовательности повторяющихся чисел в списке.


Пробував 2 колекціями ArrayList, також не приймало. Вже 1 колекцією ArrayList зробив, все одно не приймає.

package com.javarush.task.task08.task0812;

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

/* 
Cамая длинная последовательность
*/
public class Solution {
    static int count = 0;

    public static void main(String[] args) throws IOException {
        final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<Integer> list = new ArrayList<>();
        int number = 1;
        for (int i = 0; i < 10; i++) {
            list.add(Integer.parseInt(reader.readLine()));
        }

        for (int i = 1; i < list.size(); i++) {
            if (list.get(i - 1) == list.get(i)) {
                count++;
                if (i == 9) {
                    count++;
                }
            } else {
                count++;
                if (count > number) {
                    number = count;
                }
                count = 0;
            }

            if (count > number) {
                number = count;
            }
        }
        System.out.println(number);
    }
}

package com.javarush.test.level20.lesson02.task01;

Собственно проблема. При втором вызове метода load reader уже читает null'ы, в чем проблема?

/* Читаем и пишем в файл: Human
Реализуйте логику записи в файл и чтения из файла для класса Human
Поле name в классе Human не может быть пустым
В файле your_file_name.tmp может быть несколько объектов Human
Метод main реализован только для вас и не участвует в тестировании
*/

public class Solution {
    public static void main(String[] args) {
        //you can find your_file_name.tmp in your TMP directory or fix outputStream/inputStream according to your real file location
        //вы можете найти your_file_name.tmp в папке TMP или исправьте outputStream/inputStream в соответствии с путем к вашему реальному файлу
        try {

            File your_file_name = File.createTempFile("your_file_name", null);
            your_file_name = new File("1.txt");
            OutputStream outputStream = new FileOutputStream(your_file_name);
            InputStream inputStream = new FileInputStream(your_file_name);

            Human ivanov = new Human("Ivanov", new Asset("home"), new Asset("car"));
            Human petrov = new Human("petrov", new Asset("guitar"));
            Human sidorov = new Human("sidorov", new Asset("wife"));
            ivanov.save(outputStream);
            petrov.save(outputStream);
            sidorov.save(outputStream);
            outputStream.flush();

            Human somePerson = new Human();
            Human somePerson1 = new Human();
            Human somePerson2 = new Human();
            somePerson.load(inputStream);
            somePerson1.load(inputStream);
            somePerson2.load(inputStream);
            //check here that ivanov equals to somePerson - проверьте тут, что ivanov и somePerson равны
            inputStream.close();

        } catch (IOException e) {
            //e.printStackTrace();
            System.out.println("Oops, something wrong with my file");
        } catch (Exception e) {
            //e.printStackTrace();
            System.out.println("Oops, something wrong with save/load method");
        }
    }


    public static class Human {
        public String name;
        public List<Asset> assets = new ArrayList<>();

        public Human() {
        }

        public Human(String name, Asset... assets) {
            this.name = name;
            if (assets != null) {
                this.assets.addAll(Arrays.asList(assets));
            }
        }

        public void save(OutputStream outputStream) throws Exception {
            PrintWriter writer = new PrintWriter(outputStream);
            writer.println(name);
            if (!assets.isEmpty()) {
                writer.println(true);
                writer.println(assets.size());
                for (Asset asset : assets) {
                    writer.println(asset.getName());
                    writer.println(asset.getPrice());
                }
            } else {
                writer.println(false);
            }
            writer.flush();
        }

        public void load(InputStream inputStream) throws Exception {
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            name = reader.readLine();
            if (reader.readLine().equals("true")) {
                int count = Integer.parseInt(reader.readLine());
                for(int i = 0; i < count; i ++) {
                    Asset asset = new Asset(reader.readLine());
                    asset.setPrice(Double.parseDouble(reader.readLine()));
                    assets.add(asset);
                }
            }
        }
    }
}
  • ,

Тестовое задание: "Написать Интерпретатор на язык BrainFuck"

Привет всем!

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

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

Мне бы тестовых данных:)
Почему-то не проходит(
/* Отслеживаем изменения
Считать в консоли 2 имени файла — file1, file2.
Файлы содержат строки, file2 является обновленной версией file1, часть строк совпадают.
Нужно создать объединенную версию строк, записать их в список lines
Операции ADDED и REMOVED не могут идти подряд, они всегда разделены SAME
Пример:
оригинальный редактированный общий
file1: file2: результат:(lines)

строка1 строка1 SAME строка1
строка2 REMOVED строка2
строка3 строка3 SAME строка3
строка4 REMOVED строка4
строка5 строка5 SAME строка5
строка0 ADDED строка0
строка1 строка1 SAME строка1
строка2 REMOVED строка2
строка3 строка3 SAME строка3
строка5 ADDED строка5
строка4 строка4 SAME строка4
строка5 REMOVED строка5
*/


    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String fileName1 = reader.readLine();
        String fileName2 = reader.readLine();

        BufferedReader iReader = new BufferedReader(new FileReader(fileName1));
        BufferedReader iReader2 = new BufferedReader(new FileReader(fileName2));

        ArrayList<String> file1 = new ArrayList<>();
        ArrayList<String> file2 = new ArrayList<>();

        while (iReader.ready()) {
            file1.add(iReader.readLine());
        }
        while (iReader2.ready()) {
            file2.add(iReader2.readLine());
        }

        int i = 0;
        int removed = 0;
        while (file1.size() > i) {
            String line1 = file1.get(i);
            String line2;
            if (file2.size() > i - removed) {
                line2 = file2.get(i - removed);
            }else{
                lines.add(new LineItem(Type.REMOVED, line1));
                break;
            }

            if (line1.equals(line2)) {
                lines.add(new LineItem(Type.SAME, line1));
            } else {
                String line22 = file2.get(i + 1 - removed);
                if (line1.equals(line22)) {
                    lines.add(new LineItem(Type.ADDED, line2));
                    lines.add(new LineItem(Type.SAME, line1));
                    removed--;
                } else {
                    lines.add(new LineItem(Type.REMOVED, line1));
                    removed++;
                }
            }
            i++;
        }


        reader.close();
        iReader.close();
        iReader2.close();
    }
  • ,

level16.lesson13.bonus02

Народ, помогите! Я че-т уже все перепробовал. Не понимаю, что не так

package com.javarush.test.level16.lesson13.bonus02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/* Клубок
1. Создай 5 различных своих нитей c отличным от Thread типом:
1.1. нить 1 должна бесконечно выполняться;
1.2. нить 2 должна выводить "InterruptedException" при возникновении исключения InterruptedException;
1.3. нить 3 должна каждые полсекунды выводить "Ура";
1.4. нить 4 должна реализовать интерфейс Message, при вызове метода showWarning нить должна останавливаться;
1.5. нить 5 должна читать с консоли цифры пока не введено слово "N", а потом вывести в консоль сумму введенных цифр.
2. В статическом блоке добавь свои нити в List<Thread> threads в перечисленном порядке.
3. Нити не должны стартовать автоматически.
Подсказка: Нить 4 можно проверить методом isAlive()
*/

public class Solution {
    public static List<Thread> threads = new ArrayList<Thread>(5);

    static {
        threads.add(new Thread1());
        threads.add(new Thread2());
        threads.add(new Thread3());
        threads.add(new Thread4());
        threads.add(new Thread5());

    }

    public static class Thread1 extends Thread {

        @Override
        public void run() {
            while(true) {}
        }
    }


    public static class Thread2 extends Thread  {

        @Override
        public void run() {
            try {
                Thread.sleep(Integer.MAX_VALUE);
            } catch (InterruptedException e) {
                System.out.println("InterruptedException");
            }
        }
    }


    public static class Thread3 extends Thread {

        @Override
        public void run() {
            try {
                while(!Thread.interrupted()) {
                    System.out.println("Ура");
                    Thread.sleep(500);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }


    public static class Thread4 extends Thread  implements Message {

        @Override
        public void run() {

            while(!Thread.interrupted()) {}
        }

        @Override
        public void showWarning() {
            if (this.isAlive()) {
                this.interrupt();
            }
        }
    }


    public static class Thread5 extends Thread {
        private BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        private int counter;

        @Override
        public void run() {
            String line;
            try {
                while(true) {
                    line = reader.readLine();
                    if (line.equals("N")) {
                        break;
                    }
                    counter += Integer.parseInt(line);
                    reader.close();
                }
                System.out.println(counter);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


1.1. нить 1 должна бесконечно выполняться;
Выполняется

1.2. нить 2 должна выводить «InterruptedException» при возникновении исключения InterruptedException;
Нить ждет в слипе, пока не будет прервана, потом выводит строку в консоль

1.3. нить 3 должна каждые полсекунды выводить «Ура»;
Каждые полсекунды выводится «Ура»

1.4. нить 4 должна реализовать интерфейс Message, при вызове метода showWarning нить должна останавливаться;
Интерфейс реализован. Нить выполняется пока мы не прервем эту нить.
В некоторых решениях я видел this.join(), но прямо говоря, я не понимаю, зачем здесь join(), да и на прохождение задачи эта запись не влияет

1.5. нить 5 должна читать с консоли цифры пока не введено слово «N», а потом вывести в консоль сумму введенных цифр.
Читает. Считает. Выводит
  • ,

package com.javarush.test.level15.lesson12.home01;

Программа работает в соответствии с условиями задачи, но не проходит проверку.

package com.javarush.test.level15.lesson12.home01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения, кроме "exit", вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (true)
        {
            String s = reader.readLine();
            if (s.equals("exit")) break;
            if (s.matches("[1-9]+"))
            {
                int a = Integer.parseInt(s);
                if (a > 0 && a < 128)
                {
                    print((short) a);
                } else if (a >= 128)
                {
                    print(a);
                }
            } else if (s.matches("\\d+\\.\\d+"))
            {
                print(Double.parseDouble(s));
            } else print(s);
        }

    }

    public static void print(Double value)
    {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value)
    {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value)
    {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value)
    {
        System.out.println("Это тип Integer, значение " + value);
    }
}

Вопрос по задаче com.javarush.test.level18.lesson10.home06

Доброго времени суток! Возник вопрос по задаче. Решил таким способом (см. код). Вроде, все ок, но сервер не принимает. Можете навести на мысль? А то уже глаз замылился…

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

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

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

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

        for (int i = 0; i < 128; i++)
            map.put(i, 0);

        FileInputStream fileInputStream = new FileInputStream(args[0]);

        while (fileInputStream.available()>0){
            int i = fileInputStream.read();
            int count = map.get(i);
            count++;
            map.put(i,count);
        }

        for (Map.Entry<Integer,Integer> el:map.entrySet())
            if(el.getValue()>0){
                int i = el.getKey();
                System.out.println((char)i + " " + el.getValue());
            }

        fileInputStream.close();
    }
}