34
\$\begingroup\$

Task

Given a positive integer n, output n+1 if n is odd, and output n-1 if n is even.

Input

A positive integer. You may assume that the integer is within the handling capability of the language.

Output

A positive integer, specified above.

Testcases

input output
    1      2
    2      1
    3      4
    4      3
    5      6
    6      5
    7      8
    8      7
  313    314
  314    313

Scoring

This is , so shortest answer in bytes wins.

Standard loopholes apply.

References

\$\endgroup\$
3
  • \$\begingroup\$ May we take input as unary? \$\endgroup\$
    – user41805
    Commented May 4, 2017 at 10:12
  • 4
    \$\begingroup\$ This would be, surprisingly, a lot easier if it was the other way around in some languages \$\endgroup\$ Commented May 5, 2017 at 17:41
  • 5
    \$\begingroup\$ @MistahFiggins That's well known enough that I'm pretty sure OP did it like this on purpose. \$\endgroup\$ Commented May 5, 2017 at 20:51

86 Answers 86

29
\$\begingroup\$

C, 20 bytes

f(x){return-(-x^1);}

Try it online.

\$\endgroup\$
10
  • 9
    \$\begingroup\$ f(x){x=-(-x^1);} \$\endgroup\$
    – Leaky Nun
    Commented May 4, 2017 at 8:50
  • 10
    \$\begingroup\$ @LeakyNun I am not writing a function lacking a return statement. \$\endgroup\$
    – feersum
    Commented May 4, 2017 at 9:08
  • 20
    \$\begingroup\$ @EriktheOutgolfer No. Nope. Nuh-uh. No. \$\endgroup\$
    – feersum
    Commented May 4, 2017 at 9:24
  • 13
    \$\begingroup\$ @Sisyphus But this is code-golf, and it works on my TIO link, so it's valid. \$\endgroup\$ Commented May 4, 2017 at 10:07
  • 11
    \$\begingroup\$ @EriktheOutgolfer If an answer relies on implementation specific behavior, it should specify an implementation. This answer doesn't, so that code would be invalid. \$\endgroup\$
    – Sisyphus
    Commented May 4, 2017 at 10:44
23
\$\begingroup\$

Stack Cats, 3 + 3 (-n) = 6 bytes

-*-

Try it online!

Needs the -n flag to work with numeric input and output.

Explanation

Stack Cats is usually far from competitive, because of its limited set of commands (all of which are injections, and most of which are involutions) and because every program needs to have mirror symmetry. However, one of the involutions is to toggle the least-significant bit of a number, and we can offset the value with unary negation which also exists. Luckily, that gives us a symmetric program, so we don't need to worry about anything else:

-   Multiply the input by -1.
*   Toggle the least significant bit of the value (i.e. take it XOR 1).
-   Multiply the result by -1.

Input and output are implicit at the beginning and end of the program, because taking input and producing output is not a reversible operation, so they can't be commands.

\$\endgroup\$
2
  • 1
    \$\begingroup\$ Are flags always counted with the additional space, I don't think I've seen other answers using flags (like Perl) do that? EDIT: Ok nvm, found the relevant meta post. "I count those as a difference in character count to the shortest equivalent invocation without them." ... "perl -nle 'stuff' is 2 characters more than perl -e 'stuff', so it counts for 2 more characters". So (space)-n is 3 bytes more than without the flag. \$\endgroup\$ Commented May 4, 2017 at 9:29
  • \$\begingroup\$ @KevinCruijssen It depends on how many bytes you actually need to add to a usual invocation. In Perl and many other production languages, you can invoke the code with -e "code" and then insert additional flags before the e, e.g. -pe "code". Then the -p flag is only one byte. However, Stack Cats has no such -e argument, so you always need to add the full <sp>-n to the command, and hence it's three bytes. \$\endgroup\$ Commented May 4, 2017 at 9:31
14
\$\begingroup\$

x86 Assembly, 9 bytes (for competing entry)

Everyone who is attempting this challenge in high-level languages is missing out on the real fun of manipulating raw bits. There are so many subtle variations on ways to do this, it's insane—and a lot of fun to think about. Here are a few solutions that I devised in 32-bit x86 assembly language.

I apologize in advance that this isn't the typical code-golf answer. I'm going to ramble a lot about the thought process of iterative optimization (for size). Hopefully that's interesting and educational to a larger audience, but if you're the TL;DR type, I won't be offended if you skip to the end.

The obvious and efficient solution is to test whether the value is odd or even (which can be done efficiently by looking at the least-significant bit), and then select between n+1 or n−1 accordingly. Assuming that the input is passed as a parameter in the ECX register, and the result is returned in the EAX register, we get the following function:

F6 C1 01  |  test  cl, 1                      ; test last bit to see if odd or even
8D 41 01  |  lea   eax, DWORD PTR [ecx + 1]   ; set EAX to n+1 (without clobbering flags)
8D 49 FF  |  lea   ecx, DWORD PTR [ecx - 1]   ; set ECX to n-1 (without clobbering flags)
0F 44 C1  |  cmovz eax, ecx                   ; move in different result if input was even
C3        |  ret

(13 bytes)

But for code-golf purposes, those LEA instructions aren't great, since they take 3 bytes to encode. A simple DECrement of ECX would be much shorter (only one byte), but this affects flags, so we have to be a bit clever in how we arrange the code. We can do the decrement first, and the odd/even test second, but then we have to invert the result of the odd/even test.

Also, we can change the conditional-move instruction to a branch, which may make the code run more slowly (depending on how predictable the branch is—if the input alternates inconsistently between odd and even, a branch will be slower; if there's a pattern, it will be faster), which will save us another byte.

In fact, with this revision, the entire operation can be done in-place, using only a single register. This is great if you're inlining this code somewhere (and chances are, you would be, since it's so short).

    48     |  dec  eax          ; decrement first
    A8 01  |  test al, 1        ; test last bit to see if odd or even
    75 02  |  jnz  InputWasEven ; (decrement means test result is inverted)
    40     |  inc  eax          ; undo the decrement...
    40     |  inc  eax          ; ...and add 1
  InputWasEven:                 ; (two 1-byte INCs are shorter than one 3-byte ADD with 2)

(inlined: 7 bytes; as a function: 10 bytes)

But what if you did want to make it a function? No standard calling convention uses the same register to pass parameters as it does for the return value, so you'd need to add a register-register MOV instruction to the beginning or end of the function. This has virtually no cost in speed, but it does add 2 bytes. (The RET instruction also adds a byte, and there is a some overhead introduced by the need to make and return from a function call, which means this is one example where inlining produces both a speed and size benefit, rather than just being a classic speed-for-space tradeoff.) In all, written as a function, this code bloats to 10 bytes.

What else can we do in 10 bytes? If we care at all about performance (at least, predictable performance), it would be nice to get rid of that branch. Here is a branchless, bit-twiddling solution that is the same size in bytes. The basic premise is simple: we use a bitwise XOR to flip the last bit, converting an odd value into an even one, and vice versa. But there is one niggle—for odd inputs, that gives us n-1, while for even inputs, it gives us n+1— exactly opposite of what we want. So, to fix that, we perform the operation on a negative value, effectively flipping the sign.

8B C1     |  mov eax, ecx   ; copy parameter (ECX) to return register (EAX)
          |
F7 D8     |  neg eax        ; two's-complement negation
83 F0 01  |  xor eax, 1     ; XOR last bit to invert odd/even
F7 D8     |  neg eax        ; two's-complement negation
          |
C3        |  ret            ; return from function

(inlined: 7 bytes; as a function: 10 bytes)

Pretty slick; it's hard to see how that can be improved upon. One thing catches my eye, though: those two 2-byte NEG instructions. Frankly, two bytes seems like one byte too many to encode a simple negation, but that's the instruction set we have to work with. Are there any workarounds? Sure! If we XOR by -2, we can replace the second NEGation with an INCrement:

8B C1     |  mov eax, ecx
          |
F7 D8     |  neg eax
83 F0 FE  |  xor eax, -2
40        |  inc eax
          |
C3        |  ret

(inlined: 6 bytes; as a function: 9 bytes)

Another one of the oddities of the x86 instruction set is the multipurpose LEA instruction, which can do a register-register move, a register-register addition, offsetting by a constant, and scaling all in a single instruction!

8B C1        |  mov eax, ecx
83 E0 01     |  and eax, 1        ; set EAX to 1 if even, or 0 if odd
8D 44 41 FF  |  lea eax, DWORD PTR [ecx + eax*2 - 1]
C3           |  ret

(10 bytes)

The AND instruction is like the TEST instruction we used previously, in that both do a bitwise-AND and set flags accordingly, but AND actually updates the destination operand. The LEA instruction then scales this by 2, adds the original input value, and decrements by 1. If the input value was odd, this subtracts 1 (2×0 − 1 = −1) from it; if the input value was even, this adds 1 (2×1 − 1 = 1) to it.

This is a very fast and efficient way to write the code, since much of the execution can be done in the front-end, but it doesn't buy us much in the way of bytes, since it takes so many to encode a complex LEA instruction. This version also doesn't work as well for inlining purposes, as it requires that the original input value be preserved as an input of the LEA instruction. So with this last optimization attempt, we've actually gone backwards, suggesting it might be time to stop.


Thus, for the final competing entry, we have a 9-byte function that takes the input value in the ECX register (a semi-standard register-based calling convention on 32-bit x86), and returns the result in the EAX register (as with all x86 calling conventions):

           SwapParity PROC
8B C1         mov eax, ecx
F7 D8         neg eax
83 F0 FE      xor eax, -2
40            inc eax
C3            ret
           SwapParity ENDP

Ready to assemble with MASM; call from C as:

extern int __fastcall SwapParity(int value);                 // MSVC
extern int __attribute__((fastcall)) SwapParity(int value);  // GNU   
\$\endgroup\$
1
  • \$\begingroup\$ Wouldn't just dec eax; xor eax, 1; inc eax work and save one byte more? \$\endgroup\$ Commented May 5, 2017 at 12:51
12
\$\begingroup\$

Jelly, 3 bytes

-*ạ

Try it online!

Pseudocode: abs((-1)**n - n)

\$\endgroup\$
3
  • 1
    \$\begingroup\$ I was actually planning to (ab)use -1. \$\endgroup\$ Commented May 4, 2017 at 8:48
  • \$\begingroup\$ Sorry for that. \$\endgroup\$
    – Leaky Nun
    Commented May 4, 2017 at 8:48
  • \$\begingroup\$ There isn't any sorry, well done! I didn't figure out how to do it quickly enough... \$\endgroup\$ Commented May 4, 2017 at 8:50
12
\$\begingroup\$

Python3, 20 18 bytes

lambda n:n-1+n%2*2

Pretty simple. First we calculate n-1 and decide whether to add 2 to it, or not.

If n is even --> n mod 2 will be 0, thus we'll add 2*0 to n-1, resulting in n-1.

If n is odd --> n mod 2 will be 1, thus we'll add 2*1 to n-1, resulting in n+1.

I prefer an explanation that I made with MS paint & a laptop touchpad... Visual explanation

\$\endgroup\$
12
\$\begingroup\$

Python, 16 bytes

lambda x:-(-x^1)

Try it online!

\$\endgroup\$
3
  • 4
    \$\begingroup\$ Brute forcing doesn't find any shorter solution using characters in "x+-012~|&^()*/%". \$\endgroup\$
    – xnor
    Commented May 4, 2017 at 9:00
  • \$\begingroup\$ @xnor Good thing I got it then! \$\endgroup\$
    – sagiksp
    Commented May 4, 2017 at 9:02
  • 1
    \$\begingroup\$ And it looks like there are no other same-length solutions except the trivial rearrangement -(1^-x). \$\endgroup\$
    – xnor
    Commented May 4, 2017 at 9:18
10
\$\begingroup\$

MATL, 7 bytes

Q:HePG)

This avoids any arithmetical operations. Try it online!

Explanation

Consider input 4 as an example.

Q    % Implicit input. Add 1
     % STACK: 5
:    % Range
     % STACK: [1 2 3 4 5]
He   % Reshape with 2 rows in column-major order. Pads with a zero if needed
     % STACK: [1 3 5;
               2 4 0]
P    % Flip vertically
     % STACK: [2 4 0;
               1 3 5]
G    % Push input again
     % STACK: [2 4 0;
               1 3 5], 4
)    % Index, 1-based, in column major order. Implicitly display
     % STACK: 3
  
\$\endgroup\$
1
  • 1
    \$\begingroup\$ Nice! Like it ! \$\endgroup\$ Commented May 4, 2017 at 9:00
7
\$\begingroup\$

Python, 68 bytes

lambda x:[m.floor(x-m.cos(m.pi*x)) for m in [__import__('math')]][0]

In the spirit of a unique approach. The following graph shows the function (with purple dots representing the first 10 cases). It should in theory be possible to construct a solution for this question based on most (all?) periodic functions (e.g. sin, tan, sec). In fact, substituting cos for sec in the code as is should work.

Graph demonstrating function

\$\endgroup\$
7
\$\begingroup\$

Braingolf v0.1, 11 10 bytes

.1>2,%?+:-

Try it online! (Second argument is the Braingolf code, third argument is the input)

Saved a byte thanks to Neil

First ever competing braingolf answer :D

Explanation:

.            Duplicate the top of the stack
 1>          Push 1 to the bottom of the stack
   2         Push 2 to stack
    ,%       Pop last 2 items, mod them and push result
      ?      If last item > 0
       +     Add the 1 to the input
        :    Else
         -   Subtract the 1 from the input

             No semicolon in code so print last item

Braingolf v0.2, 9 bytes

.2%?1+:1-

Try it online! (Second argument is the Braingolf code, third argument is the input)

See above for explanation. Only difference is in Braingolf v0.2, the default behaviour of diadic operators, and the function of the , modifier, are reversed, meaning the 2 commas in the v0.1 answer are no longer needed.

\$\endgroup\$
12
  • 5
    \$\begingroup\$ Congratulations on your new language! \$\endgroup\$
    – Leaky Nun
    Commented May 4, 2017 at 8:30
  • \$\begingroup\$ Does .1<2,%?+:- do what I think it does? \$\endgroup\$
    – Neil
    Commented May 4, 2017 at 9:31
  • \$\begingroup\$ @Neil not quite, you'd need a comma before the - to make it perform the operation the correct way around, in which case it'd still be the same length as my answer \$\endgroup\$
    – Mayube
    Commented May 4, 2017 at 9:33
  • \$\begingroup\$ @Mayube I was expecting the < to rotate the 1 below the input, so that it would be in the correct place already. \$\endgroup\$
    – Neil
    Commented May 4, 2017 at 9:34
  • \$\begingroup\$ @Neil if the input is an even number, by the time it reaches the - the stack looks like this: [n,1] braingolf operators are reversed, so it would perform 1 - n, which would result in -(n-1), wheras the desired result is simply n-1 \$\endgroup\$
    – Mayube
    Commented May 4, 2017 at 9:37
5
\$\begingroup\$

Cubix, 10 9 bytes

cO1)I(//@

Try it online

Explanation

Net version

    c O
    1 )
I ( / / @ . . .
. . . . . . . .
    . .
    . .

The executed characters are

I(1c)O@
I          Input
 (         Decrement
  1c       XOR with 1
    )      Increment
     O@    Output and exit
\$\endgroup\$
5
+100
\$\begingroup\$

APL (Dyalog Unicode), 6 bytes

-2 thanks to Razetime

⊢-¯1*⊢

Try it online!

Explanation:

 ⊢-¯1*⊢
   ¯1*⊢  ⍝ calculate ¯1*⍵ - for even ⍵: 1, for odd ⍵: ¯1.
 ⊢-      ⍝ subtract 1 for even, subtract ¯1 (add 1) for odd.
\$\endgroup\$
1
  • \$\begingroup\$ -2 \$\endgroup\$
    – Razetime
    Commented Dec 20, 2020 at 12:05
4
\$\begingroup\$

JavaScript (ES6), 14 13 12 10 bytes

n=>-(-n^1)
  • 1 byte saved thanks to Luke.
  • 2 bytes saved by porting feersum's C solution. (If that's frowned upon, please let me know and I'll roll back to my previous solution below)

Try It

f=
n=>-(-n^1)
i.addEventListener("input",_=>o.innerText=f(+i.value))
<input id=i type=number><pre id=o>


Original, 12 bytes

n=>n-1+n%2*2
\$\endgroup\$
0
3
\$\begingroup\$

PHP, 15 bytes

<?=-(-$argn^1);
\$\endgroup\$
2
  • 3
    \$\begingroup\$ How do I run this? I'm trying to test whether the ; is required, and have tried using a .php file and also echoing directly into php (php7 cli.) Each time I'm told that $argn is an undefined variable. \$\endgroup\$
    – Andrakis
    Commented May 4, 2017 at 11:51
  • 2
    \$\begingroup\$ @Andrakis With the F flag and a pipeline: echo 42 | php -F script.php. \$\endgroup\$
    – user63956
    Commented May 4, 2017 at 13:36
3
\$\begingroup\$

Javascript, 17 12 bytes

x=>x-(-1)**x

f=x=>x-(-1)**x;
<input id=i oninput=o.innerText=f(this.value) type=number><pre id=o>

Another approach, 10 bytes stolen from the C answer (sssshhh)

x=>-(-x^1)

f=x=>-(-x^1)
<input id=i oninput=o.innerText=f(this.value) type=number><pre id=o>

\$\endgroup\$
3
  • \$\begingroup\$ 1. you don't need to include the semicolon; 2. x=>x-(-1)**x \$\endgroup\$
    – Leaky Nun
    Commented May 4, 2017 at 8:43
  • \$\begingroup\$ Why the |0? Both solutions look as if they should automatically convert strings to numbers. (For the first solution, if you want to avoid decimals, use <input type=number>.) \$\endgroup\$
    – Neil
    Commented May 4, 2017 at 9:27
  • \$\begingroup\$ @Neil Thanks for notifying me! \$\endgroup\$ Commented May 4, 2017 at 9:28
3
\$\begingroup\$

Cubix, 11 bytes

u%2!I(/+@O<

Try it online!

Explanation

Net version:

    u %
    2 !
I ( / + @ O < .
. . . . . . . .
    . .
    . .

Characters are executed in following order:

I(2%!+O@
I        # Take a number as input
 (       # Decrement it
  2%     # Take the parity of the decremented number
         # (0 if the input is odd, 1 if it's even)
    !    # If that number is zero:
     +   #   Add 2
      O  # Output the number
       @ # Terminate the program
\$\endgroup\$
3
\$\begingroup\$

Brain-Flak, 36 bytes

(({})(())){({}[()]<([{}])>)}{}({}{})

Try it online!

I'm personally really happy with this answer because it is a lot shorter than what I would deem a traditional method of solving this problem.

Explanation

The first bit of code

(({})(()))

converts the stack from just n to

n + 1
  1
  n

Then while the top of the stack is non zero, we decrement it and flip the sign of the number under it

{({}[()]<([{}])>)}

The we remove the zero and add the two remaining numbers

{}({}{})
\$\endgroup\$
3
\$\begingroup\$

Vyxal r, 4 bytes

‹ue+

Try it Online!

Me and the boys porting risky be like

Explained

‹ue+
‹    # input - 1
 u   # -1
  e  # ^^ ** ^
   + # ^ + input
\$\endgroup\$
4
  • \$\begingroup\$ Huh, why doesn't N1^N work? \$\endgroup\$
    – user
    Commented Apr 9, 2021 at 20:19
  • \$\begingroup\$ @user most probably because ^ doesn't do exponation like you think it might. That's e \$\endgroup\$
    – lyxal
    Commented Apr 9, 2021 at 22:10
  • \$\begingroup\$ No, bitwise xor is what I was looking for. The most upvoted answer (in C) just does -(-x^1), so I was trying to turn that into Vyxal. I'm not sure what's going wrong, though. \$\endgroup\$
    – user
    Commented Apr 9, 2021 at 22:44
  • 1
    \$\begingroup\$ @user then you need the right caret: \$\endgroup\$
    – lyxal
    Commented Apr 9, 2021 at 23:05
2
\$\begingroup\$

Python, 20 bytes

lambda n:n+(n%2or-1)

n%2or-1 will return 1 if it's odd, but if it's even, n%2 is "false" (0), so it instead returns -1. Then we simply add that to n.

Previous solution, 23 bytes

lambda n:[n-1,n+1][n%2]

n%2 calculates the remainder when n is divided by 2. If it's even, this returns 0, and element 0 in this list is n-1. If it's odd, this returns 1, and element 1 in this list is n+1.

\$\endgroup\$
2
  • 1
    \$\begingroup\$ Use a lambda: lambda n:[n-1,n+1][n%2] \$\endgroup\$
    – Leaky Nun
    Commented May 4, 2017 at 8:35
  • \$\begingroup\$ Ah yes, so it was shorter in this case. Done, thanks! \$\endgroup\$ Commented May 4, 2017 at 8:36
2
\$\begingroup\$

Retina, 21 bytes

.+
$*
^11(?=(11)*$)


Try it online! My first Retina answer with two trailing newlines! Explanation: The first two lines convert from decimal to unary. The third and fourth lines subtract two from even numbers. The last line converts back to decimal, but adds one too.

\$\endgroup\$
2
\$\begingroup\$

05AB1E, 4 bytes

(1^(

Try it online!

\$\endgroup\$
2
  • \$\begingroup\$ Alternative 4 byte solution: Try it online!. \$\endgroup\$
    – sporkl
    Commented May 4, 2017 at 12:53
  • \$\begingroup\$ But Èi>ë< is so pretty ;_;. \$\endgroup\$ Commented Jul 17, 2017 at 16:51
2
\$\begingroup\$

Mathematica, 22 19 bytes

Saved 3 bytes thanks to Greg Martin!

#-1[-1][[#~Mod~2]]&

Previous answer, 22 bytes

#+{-1,1}[[#~Mod~2+1]]&

Explanation (for previous answer)

Mathematica has the nice feature that operations such as arithmetic automatically thread over lists.

In this case, we take Mod[#,2] which will return 0 or 1, but we need to add 1 because Mathematica lists are 1-indexed. If it's even, this comes out to 1, so #-1 is returned. If it's odd, this comes out to 2, so #+1 is returned.

\$\endgroup\$
2
  • 2
    \$\begingroup\$ You can save three bytes by abusing Mathematica's [[0]] capability: #-1[-1][[#~Mod~2]]&. \$\endgroup\$ Commented May 4, 2017 at 18:34
  • \$\begingroup\$ That's insane, never would've thought of that. Done, thanks! \$\endgroup\$ Commented May 5, 2017 at 3:40
2
\$\begingroup\$

Wise, 8 bytes

-::^~-^-

Try it online!

Explanation

If this were the other way around, (decrement if odd, increment if even), it would be quite easy to do this.

We would just flip the last bit.

::^~-^

The fix here is that we flip the last bit while negative. The negative numbers are 1 off from the negation of the numbers ~ so this creates an offset resolving the problem.

So we just take out program and wrap it in -.

-::^~-^-
\$\endgroup\$
0
2
\$\begingroup\$

R, 17 bytes

(n=scan())-(-1)^n

where n=scan() takes the digit value.

\$\endgroup\$
2
  • \$\begingroup\$ I think you need -(-1)^n rather than +(-1)^n since we need to return n-1 if n is even \$\endgroup\$
    – Giuseppe
    Commented Jul 13, 2017 at 18:25
  • \$\begingroup\$ @Giuseppe oh, yes, of course, foolish mistake \$\endgroup\$
    – runr
    Commented Jul 13, 2017 at 20:18
2
\$\begingroup\$

Python 3, 18 bytes

lambda n:n+n%2*2-1

Try it online!

Explanation: Take the modulo of "n" and double it

Subtract that off the original "n" and subtract another 1

Basically, the same but easier to understand:

lambda n:n-(1-n%2*2)
\$\endgroup\$
2
\$\begingroup\$

brainfuck (8-bit), 51 bytes

,[->>++>+<<<]+++[->>[-<++>]<[->++<]<]>>[>++<[-]]>-.

Try it online!

Requires a fixed 8-bit cell size.

Decided to do something entirely on my own.

Inspired by some meme ARM code I wrote to check if it is a multiple of 4 (screenshot)

Instead of modulo, negate+xor, or binary AND, I shift out all the bits but the lowest to determine if it is even or odd.

// Checks parity by shifting n << 7.
// Requires 8-bit cells
,             // [  n    0    0   0]
              // copy loop, shifting one once
[->>++>+<<<]  // [  0    0 n<<1   n]
              // n <<= 6
+++           // c = 3
[-            // loop 3 times, shifting twice
    >>[-<++>] // [  c n<<1    0   n]
     <[->++<] // [  c    0 n<<1   n]
<]            // end loop
              // if even:
              //   tape[2]==0
              // else:
              //   tape[2]==0x80
>>[           // if tape[2] != 0:
    >++<[-]   //   n += 2
]
>-            // n -= 1
.             // print n

Equivalent C:

uint8_t parity(uint8_t n)
{
    uint8_t is_odd = n << 7; 
    if (is_odd != 0)
        n += 2;
    return n - 1;
}

The input is a byte from stdin, and the output is a byte printed to stdout. 0-255 only.

The demo uses ASCII arithmetic.

boolfuck (joke), 3 bytes

,+;

Try it online!

For a real Boolfuck solution, see here

Operation works on 1-bit integers from stdin, prints to stdout. Obviously a joke.

\$\endgroup\$
2
\$\begingroup\$

Factor, 15 bytes

[ -1 over ^ - ]

Try it online!

Uses x-(-1)^x method as in many other answers (specifically inspired by the APL one).

In Factor, it is usually better (code-golf-wise) to minimize the number of conditionals, then minimize the number of functions overall (especially when the answer can be found with arithmetic, where all the functions have short names). The top answer beats a different arithmetic answer x+x%2*2-1 (23 bytes)

[ dup 2 mod 2 * + 1 - ]

Try it online!

and a conditional-based answer x+(x.odd()?1:-1) (21 bytes)

[ dup odd? 1 -1 ? + ]

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Python 3, 36 31 bytes

def f(n):return n+(-1)**(n%2+1)
\$\endgroup\$
3
  • 2
    \$\begingroup\$ Welcome to Code Golf! You can save a ton by removing whitespace and using a lambda as well as modifying the algorithm a little: lambda n:abs((-1)**n-n). \$\endgroup\$
    – Makonede
    Commented Apr 9, 2021 at 19:57
  • \$\begingroup\$ @Makonede Thanks for commenting, how do you remove whitespace? \$\endgroup\$ Commented Apr 9, 2021 at 19:58
  • 3
    \$\begingroup\$ You just... don't use whitespace. That's literally it. You don't need to make a function on multiple lines: def f(n):return n+(-1)**(n%2+1) works \$\endgroup\$
    – Makonede
    Commented Apr 9, 2021 at 19:59
2
\$\begingroup\$

Risky, 4 bytes

?+0--2?

Try it online!

Explanation

?        The input number
 +0      plus 0
   -     minus
    -    -1
     2   to the power of
      ?  the input number
\$\endgroup\$
1
\$\begingroup\$

Java 8, 16 10 bytes

n->-(-n^1)

Java 7, 34 28 bytes

int c(int n){return-(-n^1);}

Boring ports of @feersum's amazing C answer.
Try it here.


Old answers:

Java 8, 16 bytes

n->n%2<1?n-1:n+1

Java 7, 34 bytes

int c(int n){return--n%2>0?n:n+2;}

Explanation (of old Java 7 answer):

Try it here.

The answer above is a shorter variant of int c(int n){return n%2<1?n-1:n+1;} by getting rid of the space.

int c(int n){     // Method with integer parameter and integer return-type
  return--n%2>0?  //  If n-1 mod-2 is 1:
    n             //   Return n-1
   :              //  Else:
    n+2;          //   Return n+1
}                 // End of method
\$\endgroup\$
1
\$\begingroup\$

Japt, 6 bytes

n ^1 n

Try it online!

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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