hubert
41 уровень

Говнокод #15

Статья из группы Архив info.javarush
участников
result = result == 0 ? tempResult : (tempResult == 0 ? result : (result == tempResult ? result : result * tempResult));
Комментарии (10)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Izhak
Уровень 22
7 мая 2014, 19:06
ещё вариант
if ((result * tempResult) == 0) result +=  tempResult;
else if (result != tempResult) result *= tempResult;
Izhak
Уровень 22
7 мая 2014, 19:50
Или
if (result ==0 || tempResult == 0) result +=  tempResult;
else if (result != tempResult) result *= tempResult;
billybonce
Уровень 29
7 мая 2014, 18:33
а если через тернарный оператор то так:

result = result==0 ? 
        tempResult : (result & tempResult)!=0 ? 
                            result*tempResult : result;

очень читабельно, кстати, становится, если писать ":" под "?" — чтото типа двоичного дерева
billybonce
Уровень 29
7 мая 2014, 18:27

if (result==0) 
    result = tempResult;
else 
if ( (result & tempResult) !=0) 
    result*=tempResult;
Izhak
Уровень 22
7 мая 2014, 19:23
if (result==0) 
    result = tempResult;
else 
if ( (result & tempResult) !=0) 
    result*=tempResult;

1. У меня вопрос по поводу применения энда
Если мы сделаем
System.out.println((5 & 5) + " " + (7 & 6));
,
то вывод будет 5 6.
Что достаточно логично. побитовое умножение будет действовать так
0101 & 0101 = 0101
0111 & 0110 = 0110
А вот если взять 8 и 6, то получим 0
1000 & 0110 = 0
то есть побитовый энд не даёт верных результатов, которые бы показывали, что result и tempResult равны. Вопрос. Наверное, что-то надо подправить?
2. После проверки первого условия никак не проверяется — tempResult == 0 или нет.
billybonce
Уровень 29
7 мая 2014, 22:50
прав. я у себя чтото подумал что булеаны буду побитово складывать. а имел ввиду так:
if ( (result)!=0 && (tempResult)!=0 )


а вот про проверку tempResult == 0 после первого условия — ведь не важно уже проверять
если tempResult == 0 после того как result == 0, то как бы ни перемножали то будет ноль.

а по смыслу кода:
— если оба ненулевые — произведение двух
— если один нулевой, а другой ненулевой — сделать result равным ненулевому
— во всех остальных случаях можно ничего не делать вообще
Izhak
Уровень 22
8 мая 2014, 00:18
а если оба равны друг другу и ненулевые? :-) это уже не первый пункт.
billybonce
Уровень 29
8 мая 2014, 01:13
да всё, проверил уже. твои оба варианта работают, мои провальные — вот даже тесты написал, и через тернарный оператор меньше трёх строчек не вышло:
import java.util.Random;

public class testclass {

    public static int task(int result, int tempResult){
        result = result == 0 ?
        //1.если result == 0 -> result = tempResult.
        tempResult : (tempResult == 0 ?
        //2.если result !=0 то если tempResult == 0 -> result = result.
        result : (result == tempResult ?
        //3.если result !=0 и tempResult !=0 то если  result == tempResult -> result = result
        result : result * tempResult));
        //4. иначе result*=tempResult

        return result;
    }

    public static int solution(int result, int tempResult){
        result = result == 0 ?
                  tempResult :  result != tempResult && tempResult!= 0 ?
                                                    result*=tempResult : result;
        return result;
    }


    public static void main(String[] args){

    for (int i=0 ;i<10_000_000;i++){
        int rand1 = new Random(System.currentTimeMillis()).nextInt(100) - 100;
        int rand2 = new Random(System.currentTimeMillis()).nextInt(100) - 100;

        if( task(rand1,rand2) != solution(rand1,rand2) )
            throw new RuntimeException("test_failed");
    }

    }

}
Izhak
Уровень 22
8 мая 2014, 08:52
А по-моему в твоём варианте можно сделать красивее моего. А главное понятнее. Первое условие у тебя очень верно выделено. А вот второе должно быть комбинацией двух последних проверок. Рекомендую нарисовать ромбики с выходами влево и вправо — да и нет.
billybonce
Уровень 29
8 мая 2014, 20:28
ромбики, да, в итоге их и рисовал вчера) а по поводу того что получилось в итоге без тернарных операторов ничем принципиально от твоих вариантов и не отличается,
if ( result == 0)
            result = tempResult;
        else if(result!= tempResult && tempResult!=0)
            result*=tempResult;

а имеет плюс относительно тернарных только в отсутствии присваивании result=result в крайнем случае.
опять же, меня эта задачка убедила что их ничуть не сложнее обычных if-else читать)