Подтвердить что ты не робот

Может! A! =!! b ^!! -! A ||! +! A |! C вернуть что-либо, кроме 1?

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

Этот маленький очаровательный

!a!=!!b^!!-!a||!+!a|!c

всегда возвращался 1. Я попытался объяснить это, но я отказался от потери всех ! s.

Есть ли значения для a, b и c, которые не возвращают 1? Если нет, то почему он всегда возвращает 1?

4b9b3361

Ответ 1

Короткий ответ, да. a = false, b = false, c = true является встречным примером, потому что ваше уравнение идентично (!!a || !!b || !c).

Длинный ответ:

!a!=!!b^!!-!a||!+!a|!c

является

(((!a) != (!!b)) ^ (!!(-!a))) || ((!+!a)|!c)

которая сводится к

((Boolean(a) == Boolean(b)) ^ (!a)) || (Boolean(a) | !c)

поэтому все a, b и c рассматриваются только как значения правды/ложности, и результат должен быть 1 или 0, так как | и ^ оба принудительного булева к номерам.

Итак, очевидно (из проверки права на ||), если либо a является правдивым, либо c является ложным, вы получаете 1.

Если a ложно и c правдиво, у вас есть две возможности:

  • b является правдой, в этом случае предложение ^ равно 1, поэтому право на || никогда не достигается.
  • b false, и в этом случае предложение ^ равно 0, поэтому право || доминирует для создания 0.

Ответ 2

Как насчет этого:

var a = undefined, b=undefined, c=!a
alert(!a!=!!b^!!-!a||!+!a|!c)
// Output: 0

Live demo.

Ответ 3

Вы даже попробовали запустить его в нескольких циклах:

for(var a = 0; a<100; a++) {
    for(var b = 0; b<100; b++) {  
        for(var c = 0; c<100; c++) {
            if((!a!=!!b^!!-!a||!+!a|!c) == 0) {
                console.log(a,b, c);
            }
        }
    }
}


a b c
=====
0 0 1
0 0 2
0 0 3
0 0 4
0 0 5
0 0 6
0 0 7
0 0 8
0 0 9
0 0 10
0 0 11
0 0 12
0 0 13
0 0 14
0 0 15
0 0 16
0 0 17
0 0 18
0 0 19
0 0 20
0 0 21
0 0 22
0 0 23
0 0 24
0 0 25
0 0 26
0 0 27
0 0 28
0 0 29
0 0 30
0 0 31
0 0 32
0 0 33
0 0 34
0 0 35
0 0 36
0 0 37
0 0 38
0 0 39
0 0 40
0 0 41
0 0 42
0 0 43
0 0 44
0 0 45
0 0 46
0 0 47
0 0 48
0 0 49
0 0 50
0 0 51
0 0 52
0 0 53
0 0 54
0 0 55
0 0 56
0 0 57
0 0 58
0 0 59
0 0 60
0 0 61
0 0 62
0 0 63
0 0 64
0 0 65
0 0 66
0 0 67
0 0 68
0 0 69
0 0 70
0 0 71
0 0 72
0 0 73
0 0 74
0 0 75
0 0 76
0 0 77
0 0 78
0 0 79
0 0 80
0 0 81
0 0 82
0 0 83
0 0 84
0 0 85
0 0 86
0 0 87
0 0 88
0 0 89
0 0 90
0 0 91
0 0 92
0 0 93
0 0 94
0 0 95
0 0 96
0 0 97
0 0 98
0 0 99

Ответ 4

Попробуйте эту демонстрацию: http://jsfiddle.net/ugfsW/

a = 0, b = 0, c = 1 = > Результат: 0

Результат всегда 0, если у вас a = 0, b = 0 (c не является дискриминантным).
Я предполагаю, что Domain (a) = Domain (b) = Domain (c)

Ответ 6

Вы должны использовать контрольную модель для этого. Он даст вам все значения, которые будут выводить 0 или 1:-) Spin - очень популярная проверка модели, например.