Переходим дорогу вслепую

  • 3
  • Недоступна
Допустим, мы точно знаем, что в начале каждого часа на нашем светофоре в течение 3 минут горит зелёный, потом минуту — жёлтый, и ещё минуту — красный свет, а затем всё повторяется. Наша программа должна определить, какой свет горит сейчас («сейчас» — это некое вещественное число, определяющееся временем в минутах, прошедших с начала очередного часа).
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (259)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
Алексей5 уровень, Москва
12 ноября, 21:22
Не могу никак понять, как логически дойти до того, что остаток от деления попадает в нужный интервал времени работы светофора. буду благодарен за объяснение.
Albert8 уровень
1 октября, 16:58
Тоже тупил над %, не сразу сообразил, что остаток от деления, например 2/5 будет 2, а не 4. Те, кто еще не решил обратите внимание на то, как работает оператор % и думаю, что дальше сами разберетесь. PS полный цикл у светофора занимает 5 мин. (то есть 3/5 это зеленый, дальше до 4/5 желтый и т.д.) Успехов ! -_-
OlegTheC7 уровень
10 октября, 08:38
Такая же история. После этой задачи лучше прочувствовал работу оператора %
Денис7 уровень, Екатеринбург
20 сентября, 17:46
Решение придумал практически сразу, но долго тупил на самом простом - %. Не мог толком понять как работает этот оператор. Если кому интересно здесь хорошее объяснение: https://vertex-academy.com/tutorials/ru/delenie-po-modulyu-v-java/
вчера, 15:32
Спасибо :)
Maksim Berenshteyn8 уровень
15 сентября, 21:09
Кто то может подсказать, не понимаю одну вещь. Ввожу число 347. С остатком деления на 5 остается 4 и цвет соответственно красный должен быть. А выдает зеленый. Программа компиляцию и проверку прошла.
Олег6 уровень
13 октября, 16:05
потому что остаток не 4, а 2
Ayrat16 уровень, Казань
9 августа, 13:08
"зелёный" был скопирован с текста задания - не верно. Написано самим - не верно. Переписано 10 000 раз - не верно. Гори в аду "зелёный". P.S. Программа работает корректно, проверялась не раз
Vladislav8 уровень, Москва
8 августа, 21:52
Привет привет)) что не так? подскажите пожалуйста public class Solution { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String n1 = reader.readLine(); double a = Double.parseDouble(n1); double b = a % 5; if (b >= 0.0 && b <= 2.9) System.out.println("зелёный"); else if (b >= 3.0 && b <= 3.9) System.out.println("жёлтый"); else if (b >= 4.0 && b <= 4.9) System.out.println("красный"); } }
Анатолий Осипов9 уровень, Санкт-Петербург
9 августа, 16:50
1)Вместо "<=2.9" лучше использовать "<3", поскольку при времени, например, 7.999 у вас ничего не будет выводиться. 2) import java.io.*;
Roman20 уровень, Москва
15 сентября, 14:09
0.0 писать совсем необязательно.
Светлана15 уровень, Кубань
23 октября, 17:20
Ввести с клавиатуры вещественное число t, означающее время в минутах, прошедшее с начала очередного часа.
ilgar5 уровень, Secaucus
29 октября, 13:58
kajetsya nashol, <= 2.9 ili < 3 eto odno i toje zdes problem net. problemi s " {}" poprobuy , kogda else if s odnoy strokoy kajetsya nelza poluchaetsya .
Anastasia Kunitsyna14 уровень, Москва
6 августа, 20:06
/* Комментарий удален */
flounder19 уровень
13 августа, 15:51
думаю, нужно использовать >= вместо >
Roman20 уровень, Москва
15 сентября, 14:10
Это отлично, но вот что делать в случае, если рассматриваемый период времени сменится с 60 минут до 600 минут? Писать код в 10 раз большего размера?
Anastasia Kunitsyna14 уровень, Москва
15 сентября, 14:33
:-) согласна) Поэтому и отмечала неоптимальность кода) Пока остаточное деление не знала, надо же было как-то пытаться решать задачу)
Алексей5 уровень, Санкт-Петербург
21 октября, 21:27
код чтобы размять пальчики)
Светлана15 уровень, Кубань
23 октября, 17:20
Ввести с клавиатуры вещественное число t, означающее время в минутах, прошедшее с начала очередного часа.
Nick10 уровень
вчера, 10:15
я понимаю, что вы учитесь, но ничего личного... Код не читабелен. Попробуйте переписать может и не оптимальный, не самый крутой код, но чтобы он оставался читабельным.
Danny F14 уровень, Москва
5 августа, 11:49
package com.javarush.task.task04.task0416;

/*
Переходим дорогу вслепую
*/

import java.io.*;

public class Solution {
    public static void main(String[] args) throws Exception {
        //напишите тут ваш код
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        double color = Double.parseDouble(reader.readLine());

        if(color%5 < 3){
            System.out.println("зеленый");
        }else{
            if(color%5 <4){
                System.out.println("желтый");
            }else{
                System.out.println("красный");
            }
        }
    }
}
Сергей16 уровень
8 августа, 15:47
А что такое color%5
Анатолий Осипов9 уровень, Санкт-Петербург
9 августа, 16:44
остаток от деления на 5
Danny F14 уровень, Москва
18 августа, 01:34
да, как верно заметил Анатолий, остаток
Aleksandr Sankovskij8 уровень
18 октября, 21:30
Только надо чтобы при вводе 3 выводило желтый я это решил так
color%5 < 3 || color%5 != 3
Heorhii12 уровень, Киев
10 ноября, 12:45
Условие color%5 < 3 строгое. Проверка на неравенство 3-ем не нужна.
Pavel Ganus4 уровень
4 августа, 09:18
Добрый день, подскажите, пожалуйста, почему компилятор выдает ошибку? import java.io.*; public class Solution { public static void main(String[] args) throws Exception { //напишите тут ваш код BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); double t = Double.parseDouble(reader.readLine()); for (int a = 0; a <= 60; a += 5) { int b = a + 3; if (t >= a && t <= b) System.out.println("зеленый"); int c = b + 1; if (t >= b && t <= c) System.out.println("желтый"); int d = c + 1; if (t >= c && t <= d) System.out.println("красный"); }
Pavel Ganus4 уровень
4 августа, 11:13
я добавил три раза break; после "зеленый", "желтый" и "красный", но результат тот же: com/javarush/task/task04/task0416/Solution.java:29: error: reached end of file while parsing }
Pavel Ganus4 уровень
4 августа, 11:16
я поменял все целочисленные переменные (int) на вещественные - ничего не изменилось.
Pavel Ganus4 уровень
5 августа, 14:54
Я убрал = из выражений t <=, но это тоже не помогло.
Pavel Ganus4 уровень
6 августа, 09:50
Это ошибка говорит о том, что вы забыли поставить закрывающие скобки } класса Solution и метода Exception.
Nick10 уровень
31 июля, 11:33
А я походу тут самый хитровыклепанный, хех =) Чисто из интереса поглядел, кто как решил. Для разнообразия, закину сюда код свой:
Scanner sc = new Scanner(System.in);
    int t = (int) sc.nextFloat();

    switch (t % 5) {
        case 1:
        case 2:
        case 0:
            System.out.println("зелёный");
            break;
        case 3:
            System.out.println("жёлтый");
            break;
        case 4:
            System.out.println("красный");
            break;
}
Nick10 уровень
31 июля, 11:44
Если в кратце, то в конкретном случае, бесполезно иметь double или float, так как в конечном счете разницы в ответе никакой, а, как мне кажется, такое решение выглядит несколько более понятно и эстетично, к тому же проще и короче
Максим7 уровень, Киев
12 августа, 15:09
крутое решение, но вот вбей сюда время 2 минуты 30 сек))))
Nick10 уровень
16 августа, 07:44
Если Вы о том, что невозможно вбить это время туда, то это не совсем так. 2 мин 30 сек вполне себе ничего так переводятся в формат из секунд в, с вашего позволения, десятичный формат(взяв за фракцию времени 0,016666...67, что эквивалентно 1 сек). Не совсем верно конечно так называть это, но никак иначе не придумал назвать этот процесс. В этом случае получится что 2 мин 30 сек есть пресловутые 2,5 мин. Тогда 2 мин и 25 сек, будут 2.41666666666666666666666666666667 или 2,4 что в конце концов все равно будет равно 2ум и появится зеленый. Не было цели сделать удобно для юзера, была цель выполнить задание же =)
Владислав4 уровень, Москва
вчера, 06:51
Nick - решение крутяк, не пойму одного. Слова "что в конце концов все равно будет равно 2ум" - программа как-то округлит 2.4 до 2-х? Как она поймет, что 2.4 это case 2 ? А что в таком случае будет с 2.6
Nick10 уровень
вчера, 10:34
Спасибо =) Когда мы работаем с int, при операциях будет округляться результат до нижней границы, т.е. 2.5, 2.1 или даже 2.9999 станет в конце концов 2. Когда идет скан float, я его сразу привожу к типу int (пройдете дальше кстати по лекциям), что делает из рационального числа обычный int. А дальше работаем как с обычным int. Еще одна причина приведения переменной к int - это оператор switch, который работает только с byte, short, char, int и некоторыми другими включая классы-обертки. Можешь погуглить эти темы, но пока не особо есть смысл заморачиваться.