36
\$\begingroup\$

Blatant rip-off of a rip-off. Go upvote those!

Your task, if you wish to accept it, is to write a program/function that outputs/returns its integer input/argument. The tricky part is that if I reverse your source code, the output must be the original integer negated.

Examples

Let's say your source code is ABC and its input is 4. If I write CBA instead and run it, the output must be -4.

Let's say your source code is ABC and its input is -2. If I write CBA instead and run it, the output must be 2.

An input of 0 may give 0 or -0, however, if you do support signed zero, -0 should give 0.

\$\endgroup\$
  • 5
    \$\begingroup\$ Why do we need a copy of the same question? \$\endgroup\$ – Christian Sep 18 at 7:30
  • 5
    \$\begingroup\$ @Christian That one outputs a constant number (and its negation) whereas this one has to take input and return/negate it. A very different job in a lot of languages. \$\endgroup\$ – Adám Sep 18 at 7:32
  • 5
    \$\begingroup\$ A yes, now I see the difference. One needs to read VERY carefully \$\endgroup\$ – Christian Sep 18 at 7:34
  • \$\begingroup\$ If using a structured language like C#, are you just reversing lines? \$\endgroup\$ – PerpetualJ Sep 19 at 2:31
  • \$\begingroup\$ @PerpetualJ No, look at the source like list of characters, some of which are line breaks. \$\endgroup\$ – Adám Sep 19 at 5:42

50 Answers 50

1
\$\begingroup\$

Japt, 3 bytes

TnU

Try it | Reversed

Same method as my earlier solution, with T being 0 and U being the input.

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

V (vim), 5 bytes

É-ó--

Try it online!

Hexdump:

00000000: c92d f32d 2d                             .-.--
\$\endgroup\$
1
\$\begingroup\$

Stax, 2 bytes

pN

Run and debug it

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

Klein, 2 bytes

Works in all 12 topologies!

@-

Try it online!

Reverse

-@

Try it online!

- negates the input and @ ends the program

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

Ruby -p , 7+1 = 8 bytes

#-?<<>$

Try it online!

Reverse:

Try it online!

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

MathGolf, 4 bytes

*b╘k

Try it online or try it online reversed.

Explanation:

Regular:

*     # Multiply the (implicit) input with the (implicit) input
      #  STACK: [input**2]
 b    # Push -1
      #  STACK [input**2, -1]
  ╘   # Discard everything on the stack
      #  STACK: []
   k  # Push the input as integer
      #  STACK: [input]
      # (output the entire stack joined together as result)

Reversed:

k     # Push the input as integer
      #  STACK: [input]
 ╘    # Discard everything on the stack
      #  STACK: []
  b   # Push -1
      #  STACK: [-1]
   *  # Multiple the (implicit) input with this -1
      #  STACK: [-input]
      # (output the entire stack joined together as result)

And to answer your question: no, MathGolf does not have a 1-byte negate for integers. There is ~ for -n-1, but unfortunately nothing for -n (so *b could alternatively be )~ for the same byte-count).

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

Excel VBA, 12

?[A1]'[1A]-?

Reversed:

?-[A1]'[1A]?

Input is cell A1 of the ActiveSheet. Comments still work in the Immediate Window :)

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

Japt, 3 bytes

n U

Try it

Try it reversed

3 bytes

nÎN

Try it

Try it reversed

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

C++ (gcc), 29 bytes

#define f(x)x//x-)x(g enifed#

Try it online!

Fixed issue brought up by @Nick Kennedy

\$\endgroup\$
  • 1
    \$\begingroup\$ This is shown the wrong way round; it should return the input when called without reversing the code. \$\endgroup\$ – Nick Kennedy Sep 18 at 10:51
  • \$\begingroup\$ Is #define f//- f enifed# (call as f x) cheating? ;) \$\endgroup\$ – Quentin Sep 19 at 15:54
1
\$\begingroup\$

Runic Enchantments, 4 bytes

i@Zi

Try it online! Try it reversed!

Its the answer I originally wrote on the other challenge when I misread the description.

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

Gol><>, 4 bytes

Ih-I

One byte golfed off courtesy of JoKing

Try it online!

\$\endgroup\$
  • \$\begingroup\$ @JoKing Thank you very much, is that a negate operation? I honestly forgot that there was one \$\endgroup\$ – KrystosTheOverlord Sep 18 at 23:43
  • \$\begingroup\$ @JoKing Ohhhhh, I didn't know that, thank you very much for enlightening me on that operation \$\endgroup\$ – KrystosTheOverlord Sep 19 at 0:16
1
\$\begingroup\$

Scala, 6 bytes

+_//_-

Try it online!

Unfortunately a function can't just contain a _ to return the first argument, but using unary_+ will return the value unchanged.

Once flipped, the code is -_ which does a unary_- on the first argument, which flips the sign.

\$\endgroup\$
  • 1
    \$\begingroup\$ Shouldn't this be _//_-? However, _-0 seems like a valid solution. \$\endgroup\$ – Adám Sep 18 at 18:45
  • \$\begingroup\$ @Adám It should be +_//_-. Unfortunately can't have _ as the body of the function, but doing +_ returns the value unchanged. Thanks for point it out! \$\endgroup\$ – Soapy Sep 19 at 8:43
1
\$\begingroup\$

Perl 5 - 12 Bytes

say$_#_$-yas

Reversed

say-$_#_$yas

Abides by the -0 rule.

Does require the -nE flags on execution.

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

Retina 0.8.2, 13 12 bytes

-*$1#$
)^(|-

Try it online! It's impossible for the first line to match anything, so nothing happens. In reverse:

-|(^)
$#1$*-

Try it online! Explanation: Either a leading (implicitly) - or a leading empty string is matched. This is replaced with - repeated according to the number of empty strings that were matched.

Edit: Saved 1 byte thanks to @MartinEnder (although, cunningly, the reversed original worked with floating-point numbers in scientific notation). As he points out, Retina 1 would be a further byte shorter as its syntax for * is slightly different and does not require the adjacent $ (and it would therefore also modify illegal inputs such as -1# which this version ignores).

\$\endgroup\$
  • \$\begingroup\$ I don't think you need the ^ at the end. Also, Retina 1 would save a byte on $*. \$\endgroup\$ – Martin Ender Sep 21 at 10:15
1
\$\begingroup\$

BitCycle -U, 15 bytes

First, a word about the -U flag. Internally, BitCycle only deals in 1's and 0's, so to allow working with decimal integers, it has flags to convert decimal input to unary. In particular, -U allows for signed integers by adding a 0 to the front of any nonpositive integer's unary representation: 4 is 1111, -4 is 01111, and 0 is 0. The same transformation is applied in reverse to the output, with the convenient addition that empty output is treated as 0.

Forward

^> 

?!+?
 <0/ 

Try it online!

The leftmost ? gets the input, which goes straight into the ! to be output unchanged.

Reverse

 /0< 
?+!?

 >^

Try it online!

The leftmost ? gets the input. The + sends the leading 0 bit, if any, left (north), and the 1 bits right (south).

If there is a leading 0 bit, it hits the splitter / and turns east, deactivating the splitter. The < sends it west again, through the deactivated splitter and off the playfield. The 0 bit that started on the playfield also hits the < and goes through the deactivated splitter and off the playfield. Meanwhile, the 1 bits are directed around by the > and ^ and reach the !, where they are output.

If there is no leading 0 bit, the 0 bit that starts on the playfield hits the < and goes west to the splitter /. Since the splitter has not been deactivated, it directs the bit south, and the + sends it west into the output !. Meanwhile, the 1 bits are directed to the output, with enough delay to make sure they get there after the 0 bit.

TL;DR: Nonpositive inputs have their leading 0 bit stripped and their magnitude is output. Positive inputs have a leading 0 bit added and are thus output as negative numbers of the same magnitude.

\$\endgroup\$
  • \$\begingroup\$ @JoKing That's clever! It's really different from mine; do you want to post it yourself? \$\endgroup\$ – DLosc Sep 24 at 17:00
  • \$\begingroup\$ Posted \$\endgroup\$ – Jo King Sep 24 at 21:54
1
\$\begingroup\$

BitCycle -U, 14 bytes

<  ^
v/?!
+~ +

Try it online!

And reversed

+ ~+
!?/v
^  <

Try it online!

The -U flag translates input/output to signed Unary, i.e. unary 1s with a zero in front if the number is negative. The first program just pipes input (?) to the output (!) directly right of it.

The reverse instead takes only the first bit of the number with the / command and dupnegs (~). If it is a 1 then it sends 0 left and 1 right, where the +s redirect them to join the flow to the output. If the first bit is 0 instead, the 0 goes right and the 1 goes left, and the + redirect them away from the output. All in all, this has the behaviour of stripping a leading zero if the input has one, otherwise prepending a zero if it doesn't, which means inverting the sign of the input.

\$\endgroup\$
0
\$\begingroup\$

PHP, 20 bytes

<?=$argn;#;ngra$-=?<

Try it online!

\$\endgroup\$
0
\$\begingroup\$

Cubix, 5 bytes

@IO\n

Try it online!

Try it reversed!

\$\endgroup\$
0
\$\begingroup\$

Lua, 23 bytes

print(...)--)...-(tnirp

Try it online!

Comment abuse all over again.

\$\endgroup\$
0
\$\begingroup\$

Cascade, 6 bytes

# -
&#

Try it online!

and reversed:

#&
- #

Try it online!

I think this is the optimal answer for this question. In order to negate the input, we have to use the - operator, which means the code must be at least three wide so the left and the right operands aren't the same. It must then be two tall to have not loop infinitely. That means at least one row must be three wide, and the other has to be two wide, since if it was one wide, it must be the redirect to the #, which would have to be directly under it. Feel free to prove me wrong though.

Explanation:

For the initial program, we only execute # (integer output) on & (integer input). Basically, the only instructions that matter are:

#
&

For the reversed program, the # on the second line leads to - (left minus right). This wraps around the program, with the right being the &, and the left as an empty space, which is zero. This results in 0 - input, which is the negated input.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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