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
1  
+1 for the first sentence. Very very true! –  Chris Cirefice 29 mins ago
add comment

32 Answers

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.

share|improve this answer
8  
+1 for a underhanded –  Kroltan 2 days ago
    
Would you mind explaining how this works? I looked up some docs for J but I can't figure it out. –  Jarett 20 hours ago
    
@Jarett There you go. –  Synthetica 19 hours ago
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. –  TheRare 18 hours ago
1  
And this is why I will never use J. –  Qix 15 hours ago
show 2 more comments

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
4  
Wait, golfscript? –  ToonAlfrink 2 days ago
    
I had misinterpreted your question. Fixed now. –  Dennis 2 days ago
    
I'm always amazed at what can be accomplished in GolfScript. Would you mind explaining the code? –  tolos 2 days ago
1  
@tolos: I've edited my answer. –  Dennis 2 days ago
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 2 days ago
show 1 more comment

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 2 days ago
1  
Where is BASH involved here? What is BASH specific? Every shell can call tr... –  yeti 2 days ago
1  
@yeti Not every shell calls commands like bash or zsh. In some shells that code alone is a syntax error –  mniip 2 days ago
5  
It's probably safe to assume that "shell" means "POSIX-compatible shell" here... –  FireFly 2 days ago
add comment

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. –  Dennis 2 days ago
    
@Dennis Indeed. You can use the sf forum to ask questions btw :) –  aditsu yesterday
add comment

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
add comment

PHP - 19 bytes

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

Yea, not really original, I guess!

share|improve this answer
5  
+1 for the (ab)use of numeric array keys. –  Ilmari Karonen yesterday
add comment

Brainfuck (70)

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

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
    
++++++++[<++++++>-] why not this for 48? 8*6 vs. 4*4*3 –  Cruncher 1 hour ago
add comment

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
5  
Simpler & shorter: i(char*s){while(*s)*s++^=1;} –  edc65 2 days ago
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 yesterday
4  
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 yesterday
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 23 hours ago
    
@millinon Proof! –  deed02392 1 hour ago
add comment

x86 machine code on DOS - 27 25 22 bytes

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                                 |...|..|

Can be easily run in DosBox as a .COM file; expects the input on the command line.

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
add comment

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 yesterday
    
I like to actually output and input. –  nderscore yesterday
    
@nderscore Save 2 chars: p=prompt(p().replace(/./g,x=>x^1)) –  Gaurang Tandon yesterday
    
@GaurangTandon it would have to be (p=prompt)(p().replace(/./g,x=>x^1)) and that's the same length. –  nderscore yesterday
    
@nderscore I too thought it to be that way, but it worked without the parenthesis too, strangely. –  Gaurang Tandon yesterday
show 2 more comments

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) –  TheRare 2 days ago
    
@TheRare I didn't, thanks for that :) –  BassemDy 2 days ago
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 –  TheRare 2 days ago
1  
Seems like you missed some spaces. Also, backticks can be used to replace repr(). ''.join(`1-int(x)`for x in'') –  TheRare 2 days ago
1  
Fyi, repr(x) for x < maxint is equal to str(x) –  TheRare 2 days ago
show 7 more comments

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 2 days ago
3  
You don't need single quotes here. –  xfix 2 days ago
add comment

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 yesterday
    
@willem For future reference, you can escape them with a backslash: `a\`b` -> a`b. –  nyuszika7h yesterday
    
@willem That doesn't work for input beginning with 0 or input which is bigger than maxint (in base10). –  TheRare yesterday
    
Thanks @nyuszika7h and didn't think about those cases TheRare so your solution is good –  willem yesterday
    
@willem Real easy to forget about stuff like that. :) –  TheRare yesterday
add comment

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 2 days ago
    
@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 2 days ago
    
Aww, cool, I did't know that! I mainly work in 2.7 :/ –  British Colour 2 days ago
add comment

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
add comment

Ruby: 23

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

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 yesterday
add comment

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
add comment

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 3 hours ago
    
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 1 hour ago
add comment

Scala, 33 bytes

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

Tcl - 23 bytes

string map {0 1 1 0} $s

Not quite the shortest but highly readable.

share|improve this answer
add comment

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 yesterday
    
thx, works perfectly! –  Pinna_be yesterday
add comment

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 yesterday
add comment

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
add comment

JavaScript 56

a=prompt()
for(b='',r=/./g;c=r.exec(a);b+=c^1);
alert(b)
share|improve this answer
add comment

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
add comment

Groovy - 31 chars

args[0].each{print it=="1"?0:1}
share|improve this answer
1  
groovy also has tr. e.g. b.tr('01','10') –  cfrick 54 mins ago
add comment

R, 27 characters

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

Usage:

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

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
add comment

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
add comment

protected by Community 2 days ago

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.