1
\$\begingroup\$

Let's say I have a condition expression x and that I want to check if it is TRUE or FALSE depending on the value of a boolean y:

y ? x : !x

Is there a way to express it without repeating x expression? Something like how we can get a number or its opposite depending on a bool, without repeating the number in the expression:

number * (opposite ? -1 : 1)

Example, note the repetition of date.hour < 12 that I want to avoid:

tellTheThruth = FALSE; // or TRUE 
if (tellTheThruth && date.hour < 12 || !tellTheThruth && !(date.hour < 12) {
    print "It's AM"
} else {
    print "It's PM" 
} 

Is it possible in all common languages (I was thinking in Javascript and I can't find a solution)? If not, is there some language in which you can?

\$\endgroup\$

closed as off-topic by isaacg, Alex A. Nov 24 '15 at 2:34

  • This question does not appear to be about programming puzzles or code golf within the scope defined in the help center.
If this question can be reworded to fit the rules in the help center, please edit the question.

  • 2
    \$\begingroup\$ Checking whether the two bools are equal should work: y==x, or tellTheTruth == (date.hour < 12). Are you asking though for actual code, where readability is a concern, or for brevity in code golf contests? \$\endgroup\$ – xnor Nov 24 '15 at 0:41
  • 1
    \$\begingroup\$ You could always get 1 or 0 for truthy and falsey respectively and then XOR them, is that what you want? example: tellTheTruth ^ (date.hour < 12) \$\endgroup\$ – Downgoat Nov 24 '15 at 0:43
  • 6
    \$\begingroup\$ voting to re-open. golfing tips questions are on-topic here. \$\endgroup\$ – Sparr Nov 24 '15 at 1:01
  • 1
    \$\begingroup\$ Like I said in chat, his question explicitly asks about removing repetition of an expression (x) \$\endgroup\$ – Sparr Nov 24 '15 at 1:29
  • 4
    \$\begingroup\$ I'm voting to close this question as off-topic because it doesn't really look like a code-golfing tips question to me. \$\endgroup\$ – isaacg Nov 24 '15 at 1:47
6
\$\begingroup\$

for two booleans x and y, y ? x : !x can be rewritten as y ^ !x (y XOR NOT x) or similar in most languages.

\$\endgroup\$
1
\$\begingroup\$

Haskell

import Data.Bool.Extras
bool=<<not

bool from Data.Bool.Extras is similar to the ? operator in other languages. It takes 3 arguments, a False case, a True case and a boolean to decide which one to use. =<< works here in function context ( i.e. (f=<<g) x is f (g x) x), so we can use it as (bool=<<not) <x> <y> which is bool (not <x>) <x> <y>.

Example: (bool=<<not) True False -> False.

\$\endgroup\$

Not the answer you're looking for? Browse other questions tagged or ask your own question.