Take the 2-minute tour ×
Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.

Me thinks there aren't enough easy questions on here that beginners can attempt!

The challenge: Given a random input string of 1's and 0's such as:

10101110101010010100010001010110101001010

Write the shortest code that outputs the inverse like so:

01010001010101101011101110101001010110101
share|improve this question
6  
+1 for the first sentence. Very very true! –  Chris Cirefice Jun 10 at 14:53
    
A solution in Java would be funny –  hdante Jun 10 at 18:13

38 Answers 38

J (5)

Assumes the input string is in variable b.

b='0'

This does not do what it would do in most languages...

The J comparison operator is just = (=: and =. are global and local assignment, respectively). However, = doesn't work like the normal == operator: it compares item-by-item. Keep in mind that an array is formed like this: 0 2 3 2 3 1 2 3 4. 2 = 0 2 3 2 3 1 2 3 4 gives 0 1 0 1 0 0 1 0 0 for example. This is similar for a string: 'a'='abcadcadda' doesn't just return 0, it returns 1 0 0 1 0 0 1 0 0 1 (This can be extrapolated to mean 0 with */, which basically means all.) In this case however, this behavior is excelent, since we want a string of ones and zeros, or true's and false's. Since J's bools are 1 and 0, this results in an array of 1's and 0's (They aren't strings, and every other character other than 1 would also result in 0 in this array.) This doesn't need printing: J automatically prints the result of an expression. I hope this was adequate explanation, if not, please ask for something that isn't yet clear in the comments. This answer also could've been '0'&= (or =&'0'), but I felt that b='0' was clearer.

share|improve this answer
12  
+1 for a underhanded –  Kroltan Jun 8 at 10:49
    
Would you mind explaining how this works? I looked up some docs for J but I can't figure it out. –  Jarett Millard Jun 9 at 19:06
1  
I have tried J. Can't bend my mind to it. Guess I haven't found good docs. Here, have a +1 for being a madman. –  Sieg Jun 9 at 20:29
1  
And this is why I will never use J. –  Qix Jun 9 at 23:49
1  
@Qix As unreadable as J is, this one actually makes sense to me, and other languages that have operators that take a vector LHS and a scalar RHS do behave similarly. –  hvd Jun 10 at 9:02

GolfScript, 5 bytes

{1^}%

Try it online.

How it works

  • GolfScript reads the entire input from STDIN and places it on the stack as a string.

  • {}% goes through all characters in the string and executes the code block for all of them.

  • 1^ computes the exclusive OR of the characters ASCII code with 1. “0” corresponds to the ASCII code 48, “1” to ASCII code 49.

    Since 48 ^ 1 = 49 and 49 ^ 1 = 48, this turns 0's into 1's and 1's into 0's.

  • Once finished, GolfScript prints the modified string.

share|improve this answer
5  
Wait, golfscript? –  ToonAlfrink Jun 7 at 20:28
    
I had misinterpreted your question. Fixed now. –  sudo Jun 7 at 20:44
1  
@tolos: I've edited my answer. –  sudo Jun 8 at 1:25
5  
@ToonAlfrink Golfing languages such as GolfScript are accepted in all challenges, as long as they are 'general-purpose' meaning that they are not designed for specific challenges. –  kitcar2000 Jun 8 at 13:05
1  
@kitcar2000 I think he was more surprised that such a language existed, rather than shock of someone daring to use GolfScript in a code golf question ;) –  Chris Cirefice Jun 10 at 14:56

CJam - 4

q1f^

This xor's every character with 1.
Unlike the other CJam answer, I'm not assuming the input is already on the stack.

Try it at http://cjam.aditsu.net/

share|improve this answer
    
So that's how you use f. –  sudo Jun 8 at 13:44
    
@Dennis Indeed. You can use the sf forum to ask questions btw :) –  aditsu Jun 8 at 15:47

Bash+coreutils, 8 bytes

tr 01 10

Takes input from STDIN.


Or

sed, 8 bytes

y/01/10/
share|improve this answer
1  
I recently made a golfing library/alias set for Bash github.com/professorfish/bash-shelf. you can shave off one char with that: y 01 10 –  professorfish Jun 8 at 6:56
1  
Where is BASH involved here? What is BASH specific? Every shell can call tr... –  yeti Jun 8 at 10:48
1  
@yeti Not every shell calls commands like bash or zsh. In some shells that code alone is a syntax error –  mniip Jun 8 at 11:20
5  
It's probably safe to assume that "shell" means "POSIX-compatible shell" here... –  FireFly Jun 8 at 11:56
    
@professorfish you shave off one char, but then add 48 by including the function. How is that a win? –  Steven Penny Jun 11 at 0:50

CJam, 4 bytes

:~:!

Assumes the original string is already on the stack. Prints the modified string.

Try it online by pasting the following Code:

"10101110101010010100010001010110101001010":~:!

How it works

  • :~ evaluates each character of the string, i.e., it replaces the character 0 with the integer 0.

  • :! computes the logical NOT of each integer. This turns 0's into 1's and 1's into 0's.

share|improve this answer

x86 machine code on DOS - 14 bytes

I think it doesn't get much shorter than this.

00000000  b4 08 cd 21 34 01 88 c2  b4 02 cd 21 eb f2        |...!4......!..|

This version features advanced interactivity™ - after running it from the command line, it spits out the "inverted" characters as long as you write the input digits (which are not echoed); to exit, just do a Ctrl-C.

Unlike the previous solution, this has some trouble running in DosBox - since DosBox doesn't support Ctrl-C correctly, you are forced to close the DosBox window if you want to exit. In a VM with DOS 6.0, instead, it runs as intended.

NASM source:

org 100h

section .text

start:
    mov ah,8
    int 21h
    xor al,1
    mov dl,al
    mov ah,2
    int 21h
    jmp start

Old solution - 27 25 22 bytes

This accepted its input from the command line; runs smoothly as a .COM file in DosBox.

00000000  bb 01 00 b4 02 8a 97 81  00 80 f2 01 cd 21 43 3a  |.............!C:|
00000010  1e 80 00 7c f0 c3                                 |...|..|

NASM input:

    org 100h

section .text

start:
    mov bx, 1
    mov ah, 2
loop:
    mov dl, byte[bx+81h]
    xor dl, 1
    int 21h
    inc bx
    cmp bl, byte[80h]
    jl loop
exit:
    ret
share|improve this answer
2  
+1 for code probably not many understand. –  Knerd Jun 10 at 15:41

PHP - 19 bytes

<?=strtr($s,[1,0]);

Yea, not really original, I guess!

share|improve this answer
6  
+1 for the (ab)use of numeric array keys. –  Ilmari Karonen Jun 9 at 5:14

Brainfuck (70 71)

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

Explanation:

>,[>,]                       Read characters until there are none left.
<[<]                         Return to start
>[<                          Loop as long as there are characters to invert
  +++++++[>-------<-]        Subtract 49 (ASCII value of 1)
  >[++<]                     If not 0, add 2
  +++[<++++>-]<[>>++++<<-]>> Add 48
  .                          Print
  [-]                        Set current cell to 0
>]                           Loop
share|improve this answer
1  
++++++++[<++++++>-] why not this for 48? 8*6 vs. 4*4*3 –  Cruncher Jun 10 at 13:30
    
@Cruncher Added. –  kitcar2000 Jun 10 at 19:32
    
Why did it get longer? is that because of the "bug fixing"? –  Cruncher Jun 10 at 19:52
    
@Cruncher Yes, I had to fix a bug where it would output a for 11. –  kitcar2000 Jun 10 at 20:15

C: 29

i(char*s){*s^=*s?i(s+1),1:0;}

Try it online here.

Thanks for pointing out the XOR trick, Dennis.

share|improve this answer
7  
Simpler & shorter: i(char*s){while(*s)*s++^=1;} –  edc65 Jun 8 at 9:45
1  
Thanks, @edc65! I'm not going to use that, though, since it's an iterative solution rather than a recursive one. I wouldn't want to take credit for it. It's worth noting that replacing your while with a for still results of a length of 28 characters. –  millinon Jun 9 at 13:47
6  
As you prefer. A recursive solution is not requested, and in my opinion, any time it is possibile, an iterative solution is better than a recursive one. Have fun applying this recursive call to a 10k string. –  edc65 Jun 9 at 14:24
1  
Since every call except for the last one is a tail recursive call, I'll bet that a compiler will convert it into a loop in order to re-use the stack frame. –  millinon Jun 9 at 15:28
1  
@millinon Proof! –  deed02392 Jun 10 at 13:50

Javascript (ES6) 36

alert(prompt().replace(/./g,x=>x^1))
share|improve this answer
    
Assuming input in s, s.replace(/./g,x=>x^1) are 22 chars. –  Oriol Jun 8 at 18:37
    
I like to actually output and input. –  nderscore Jun 8 at 19:38
    
@nderscore Save 2 chars: p=prompt(p().replace(/./g,x=>x^1)) –  Gaurang Tandon Jun 9 at 5:21
    
@GaurangTandon it would have to be (p=prompt)(p().replace(/./g,x=>x^1)) and that's the same length. –  nderscore Jun 9 at 13:19
    
@nderscore I too thought it to be that way, but it worked without the parenthesis too, strangely. –  Gaurang Tandon Jun 9 at 13:39

Python 2.7 – 29

Oh how much this first one sucks. Pretty ugly, this one is. 63 chars.

''.join([bin(~0)[3:] if x == '0' else bin(~1)[4:] for x in ''])

This one is a bit better but still not that fancy. 44 chars.

''.join([str(int(not(int(x)))) for x in ''])

Since int(x) and 1 returns int(x) if it's not 0 and otherwise False. The solution can be further reduced to 36 chars.

''.join([str(1-int(x)) for x in ''])

Since join() takes a generator the brackets can be removed. 32 chars.

''.join(str(1-int(x))for x in'')

And backticks can be used instead of str()

''.join(`1-int(x)`for x in'')

Reduced to 44 from 29 thanks to pointers from @TheRare

Finding one's complement is difficult in python since bin(-int) returns -0bxxx hence the above.

share|improve this answer
1  
Ya'know, (int(x) and 1) == int(x) –  Sieg Jun 8 at 10:47
    
@TheRare I didn't, thanks for that :) –  BassemDy Jun 8 at 11:33
1  
For the record: zero is false and nonzero is true. For any kind of sequence (list, string...) the same rule applies, but it's checked from the length of the sequence. Thus '' == False and 'hi' == True –  Sieg Jun 8 at 11:45
1  
Seems like you missed some spaces. Also, backticks can be used to replace repr(). ''.join(`1-int(x)`for x in'') –  Sieg Jun 8 at 11:53
1  
Fyi, repr(x) for x < maxint is equal to str(x) –  Sieg Jun 8 at 12:03

Perl, 9 characters

'y/10/01/'

The 9th character is the 'p' flag

Usage:

$ echo '10101001' | perl -pe 'y/10/01/'
share|improve this answer
2  
also works as a sed script y/10/01/ but one char shorter because it doesn't need any flags –  professorfish Jun 8 at 6:52
3  
You don't need single quotes here. –  xfix Jun 8 at 7:12

PHP > 5.4 -- 37 characters

foreach(str_split($s) as $v)echo 1^$v

$s is the input

Try it online

share|improve this answer
    
Clever abuse of the <kbd> tag. –  nyuszika7h Jun 9 at 11:04

Python 2.x - 44 bytes

print''.join(`1-int(x)`for x in raw_input())

Why make it complex, or use some cheaty variables?

share|improve this answer
    
Its possible to save some extra chars like this: print''.join('1-int(x)'for x in'input()'). I couldn't get the backticks in the comment code so substituted them by '. –  willem Jun 9 at 9:10
    
@willem For future reference, you can escape them with a backslash: `a\`b` -> a`b. –  nyuszika7h Jun 9 at 11:03
    
@willem That doesn't work for input beginning with 0 or input which is bigger than maxint (in base10). –  Sieg Jun 9 at 14:01
    
Thanks @nyuszika7h and didn't think about those cases TheRare so your solution is good –  willem Jun 9 at 14:18
    
@willem Real easy to forget about stuff like that. :) –  Sieg Jun 9 at 14:26

TI-BASIC, 7 bytes

This is a function that takes a binary string (through Ans) as input and returns the output as an inverted (not reversed) string, as specified. For more help, you can read through list application by not( on the TI-BASIC wiki. I'm using the compiled version because it is smaller:

»*r>Õ¸r

In hex:

BB 2A 72 3E D5 B8 72

Explanation

»*r - Take function input as string and convert to list

> - Pipe given list to the next operators

Õ¸r - Return the inverse of the list

share|improve this answer
    
what are all of the spaces at the end of »*r>Õ¸r ? –  kitcar2000 Jul 3 at 18:28
    
@kitcar2000 Oops, I used to have the HEX after that. But after I moved it, I forgot to remove the spaces... I have done it now. –  Timtech Jul 4 at 14:05

Python3, 39

Methinks Python is not the best language for this. :)

for i in input():print(1-int(i),end='')

If you care about having a newline after the output, here's a 43-character alternative:

print(''.join("01"[i<"1"]for i in input()))
share|improve this answer
    
Code will work without the end='' just a , will do :) - unless you care about there being no spaces –  British Colour Jun 8 at 1:29
    
@BritishColour, no, that's Python2. Python3's print function requires tweaking the end parameter to suppress a newline at the end of each print. Also, according to OP's specification, I think I do care about there being no spaces. :) Thanks for the comment, though! –  DLosc Jun 8 at 1:46
    
Aww, cool, I did't know that! I mainly work in 2.7 :/ –  British Colour Jun 8 at 1:47

Cobra - 89

class P
    def main
        r=''
        for i in Console.readLine,r+=if(i==c'1','0','1')
        print r
share|improve this answer

Ruby: 23

p $<.read.tr("01","10")
share|improve this answer

C# in LINQPad, 64 63

foreach(var c in Console.ReadLine())Console.Write((char)(c^1));

EDIT: removed one character by using XOR 1

share|improve this answer

J - 11 chars

Boolean values in J are represented as the integers 0 and 1, which of course are also valid indices into arrays (in this case, the 2-character array '01')

'01'{~'0'&=
share|improve this answer
    
I think this answer is technically more correct than the top J answer, which outputs a boolean array instead of a string. –  gar Jun 10 at 11:49
    
I actually didn't notice the top-ranked J solution when I posted (don't know how I missed it, but I did). To be fair to that solution, it does explicitly say "this doesn't do what the other solutions do". BTW, another way to express this (literal output) solution in 11 chars is [:,":@=&''0'' . –  Dan Bron Jun 10 at 14:05
    
Hi, thanks for another code! I will be learning more J from you guys. About that statement, I think he was referring to the equal sign, that it compares each item instead of assignment. –  gar Jun 10 at 16:23

Linux amd64 assembly version, 370 bytes, generates small ELF executable (392 bytes after strip --strip-all).

global _start

_start:
        mov rsi, [rsp+16] ; argv[1]
        xor rdx, rdx
loop:
        mov bl, [rsi+rdx]
        test bl, bl
        jz print
        xor bl, 1
        mov [rsi+rdx], bl
        inc rdx
        jmp loop
print:  
        mov rdi, 1 ; stdout
        mov rax, 1 ; write
        syscall
        mov rax, 60 ; exit
        xor rdi, rdi
        syscall
share|improve this answer

Pancake Stack, 532 bytes

Put this tasty pancake on top!
[]
Put this delicious pancake on top!
[#]
Put this  pancake on top!
How about a hotcake?
If the pancake is tasty, go over to "#".
Eat all of the pancakes!
Put this supercalifragilisticexpialidociouseventhoughtheso pancake on top!
Flip the pancakes on top!
Take from the top pancakes!
Flip the pancakes on top!
Take from the top pancakes!
Put this supercalifragilisticexpialidociouseventhoughthes pancake on top!
Put the top pancakes together!
Show me a pancake!
If the pancake is tasty, go over to "".

It assumes the input is terminated by a null character. The strategy is as follows:

  • Take a character of input
  • Subtract the ascii value of 1 from it.
  • Subtract that from 0 (yielding a 1 if we had 0, or a 0 if we had 1)
  • Add the ascii value of 0 to it
  • Print the char.
  • Repeat
share|improve this answer

Scala, 33 bytes

print(readLine map(c=>"10"(c&1)))
share|improve this answer

Tcl - 23 bytes

string map {0 1 1 0} $s

Not quite the shortest but highly readable.

share|improve this answer

python2, 31

''.join(['int(c)^1'for c in s])
share|improve this answer
    
You can save 3 bytes by replacing str(X) to the `X` in Python 2.x –  avall Jun 9 at 8:07
    
thx, works perfectly! –  Pinna_be Jun 9 at 12:03

Ruby, 37 32

$*[0].each_char{|x|p x==?0?1:0}
share|improve this answer
1  
32: $*[0].each_char{|x|p x==?0?1:0} –  Doorknob Jun 9 at 13:35

Powershell 41

(($args-split''-ne'')|%{1-bxor$_})-join''

Explanation:

It reads the input and splits it to turn it into an array. Then it iterates through every element of the array and uses the bitwise exclusive or to turn 1 to 0 and 0 to 1, and then joins the result and prints it to console...

share|improve this answer

Batch - 167 Bytes

@echo off&setlocal enabledelayedexpansion&set l=-1&set s=%~1&set o=%~1
:c
if defined s set/al+=1&set s=%s:~1%&goto c
for /l %%a in (%l%,-1,0)do set/p=!o:~%%a,1!<nul

Could be cut down a bit by using Powershell to get the length of the input - then again, it could be cut down a lot by using a different language.

share|improve this answer

R, 27 characters

chartr("01","10",scan(,""))

Usage:

> chartr("01","10",scan(,""))
1: 10101110101010010100010001010110101001010
2: 
Read 1 item
[1] "01010001010101101011101110101001010110101"
share|improve this answer

ECMAScript (28 bytes)

for(i of prompt(r=''))r+=1-i

Just subtraction.

Alternative 1 (28 bytes)

for(i of prompt(r=''))r+=i^1

A simple bitwise not.

Alternative 2 (29 bytes)

for(i of prompt(r=''))r+=2+~i

~'1' is -2 and ~'0' is -1, so 2+~i gives 0 for 1 and 1 for 0.

Alternative 3 (29 bytes)

for(i of prompt(r=''))r+=+!+i

The last + changes i to a number, ! converts it to a boolean (0 is false and anything else is true) and inverts it, and the first + converts it to a number (false becomes 0 and true becomes 1).

share|improve this answer

protected by Community Jun 8 at 14:19

Thank you for your interest in this question. Because it has attracted low-quality answers, posting an answer now requires 10 reputation on this site.

Would you like to answer one of these unanswered questions instead?

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