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.

Given a one digit number, return the number "flipped". Imagine it is a seven-segment display, so 2 would be:

enter image description here

And when flipped horizontally it would make:

enter image description here

Therefore when 2 is entered, the algorithm should return 5. 6 and 9 would return 9 and 6 respectively. 8 and 0 wouldn't change, so they would just return untouched.

Numbers that don't flip, like 3, will return -1. Note that in this situation, 1 does not flip (and should return -1)

Shortest code wins!

Any language is allowed.


share|improve this question
13  
I disagree with your last point -- a 1 on a 7 segment display would simply be flipped to the other side, so 1 should nap to 1. –  Jwosty Jun 17 at 17:40
3  
You should specify I/O. Do you want a function, a program or anything specific? –  Dennis Jun 17 at 18:03
26  
I am confused about how to flip each digit. If 2 becomes 5, then 6 should become backwards 9, not 9. But if 6 becomes 9, then the flip is just a rotation, so 2 becomes another 2, not 5. –  kernigh Jun 17 at 18:41
6  
6, 9 rotated 180 deg, 2, 5 flipped horizontally, and 1, 3 in fact are reflections of themselves across the vertical axis. –  user23013 Jun 17 at 19:24
16  
The translations defined in the question are not consistent at all. Why do 2 and 5 flip, but 3 doesn't? –  Rynant Jun 17 at 19:29

37 Answers 37

Haskell - 43 31

43 characters without anything fancy.

f 0=0
f 8=8
f 2=5
f 5=2
f 6=9
f 9=6
f _= -1

Got it down to 31 characters by making it a partial function.

f=([0,-1,5,-1,-1,2,9,-1,8,6]!!)
share|improve this answer
4  
I laughed. Have a +1. –  Sieg Jun 17 at 20:03
4  
+1 For using Haskell to do exactly what the spec. says! –  awashburn Jun 18 at 18:48

GolfScript, 15 14

I read the spec again and found that the input must be a string.

"0.5..29.86"\?

To run:

echo -n 2 | ruby golfscript.rb a.gs

Old version(which has integer input):

[0.5..2 9.8 6]?

The newer one(14 byte) is somewhat inspired by the CJam answer by aditsu.

share|improve this answer
    
Can't believe I didn't think of that... –  Dennis Jun 17 at 18:04

PowerShell - 27

'0 5  29 86'.indexof($args)
share|improve this answer

Python 2.x - 28

'015..29.86'.find(`input()`)
share|improve this answer
1  
Python 2.x, specifically. –  Sieg Jun 17 at 19:36
4  
With Python 3, you could remove the `s and save 2 chars. –  Rynant Jun 17 at 19:39
    
Thanks TheRare and Rynant –  willem Jun 17 at 19:41

JavaScript 37 36

alert("0_5__29_86".search(prompt()))
share|improve this answer
    
use .search() and save a byte. –  Ismael Miguel Jun 18 at 13:03
    
@IsmaelMiguel Nice one, Thanks! –  DarkAjax Jun 18 at 13:46

CJam, 20 bytes

q25691347`"5296W"er~

Try it online.

Output

$ for i in {0..9}; { cjam <(echo 'q25691347`"5296W"er~') <<< $i; echo; }
0
-1
5
-1
-1
2
9
-1
8
6

How it works

q          " Read from STDIN. The leaves a string on the stack.            ";
25691347`  " Push the string '25691347'.                                   ";
"5296W"    " Push the string '5296W'.                                      ";
er         " Perform character transliteration.                            ";
~          " Evaluate the result. Examples: '2' returns 2, 'W' returns -1. ";
share|improve this answer

JavaScript (ECMAScript 6) 27

f=x=>'1060039097'[x]-(x!=6)

JavaScript (ECMAScript 5) 43

function f(x){return'1060039097'[x]-(x!=6)}

UPDATE: edc65 has suggested a much better technique. toothbrush has suggested a much better language. At this point, my primary contributions are debugging and gumption.

share|improve this answer
1  
If you change it to ECMAScript 6 (supported in Firefox), you could simply do x=>[0,-1,5,-1,-1,2,9,-1,8,6][x]. –  toothbrush Jun 17 at 20:17
    
At first, I nearly posted function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x], also thanks to Firefox. I wasn't going to win anyway, so I decided I'd just stick with the highest-compatibility answer. If I start switching languages for brevity, then I'll eventually start defining my own language for every challenge I do. But I'll go ahead and mention the ECMAScript 6 version anyway, since you suggested it –  Cory Jun 17 at 21:02
1  
Same concept but shorter (bye bye commas): x=>'106003907'[x]-(x!=6) –  edc65 Jun 17 at 22:44
    
@edc65 You know, I'd wanted to use a string, and I had completely blanked on the fact that I could coerce the result back to a number. A bizarre lapse. Yet I still wouldn't have come up with -(x!=6). Thank you. –  Cory Jun 18 at 0:08

BEFUNGE 93 - 18 14 20 Bytes

I guess the commentators are right, though Befunge being a 2d language lines are kinda different. Still, in this instant, the commentators are right.

&1g01g-.  
! &  #* )'

Steps:

&

Reads input as a numerical value x, and pushes it on the stack.

1g

Gets the character value c (so, like '!' = 33, or '*' = 42. An empty cell = 32) at position x, 1.

01g-.

Reads the character value of cell 0,1 (33), subtracts it from c, and outputs it as a numerical value.

share|improve this answer
2  
Quite nice. Have a +1. –  Sieg Jun 17 at 18:47
    
Please correct the length: it's 20 bytes –  har-wradim Jun 19 at 10:05
1  
You've actually been counting your bytes wrong. You used 19 bytes. We count newlines and spaces. But if you switch to Befunge 98, you can save one; change 1st line to: &1g'!-. –  Quincunx Jun 19 at 17:39

bash 29

tr 1-9 x5xx29x86|sed s/x/-1/g

e.g.

$ echo 0 1 2 3 4 5 6 7 8 9 | tr 1-9 x5xx29x86|sed s/x/-1/g
0 -1 5 -1 -1 2 9 -1 8 6
share|improve this answer
    
You can omit the ' around the sed expression. Also I think you can omit the g because the spec only supplies one digit at a time –  DigitalTrauma Jun 17 at 18:55
    
Thanks. It's just in the example, the submission itself doesn't use '. Liking the g for longer input! –  Yimin Rong Jun 17 at 19:57

Kona - 29

This function returns the element x from the array 0 -1 5...

f:{0 -1 5 -1 -1 2 9 -1 8 6@x}

Examples:

> f 2
  5
> f 5
  2
> f 8
  8
share|improve this answer
    
Is a vector by itself really allowed? –  Sieg Jun 17 at 19:17
    
@TheRare: Hmm, it does say "algorithm" so I suppose not. I'll change it and make it more like yours... –  Kyle Kanos Jun 17 at 19:43
    
Seems better, have a +1. –  Sieg Jun 17 at 19:53

JavaScript 36 37 41

alert('0x'+'65b558f5ec'[prompt()]-6)

as ES6 function - 27:

f=v=>'0x'+'65b558f5ec'[v]-6
share|improve this answer
2  
28: f=v=>~-[1,,6,,,3,10,,9,7][v] –  nderscore Jun 17 at 20:29
    
@nderscore You just love improving people's codes, don't you? –  Sieg Jun 17 at 20:56
3  
@TheRare I'm just on a quest to find the shortest javascript code. :) If someone else has already posted a good answer, it makes more sense to me to find optimizations in it rather than post a new answer that's almost a duplicate. I'm not here to compete, just to cooperate towards achieving this goal. –  nderscore Jun 17 at 21:00
    
@nderscore I have the same mentality as long as my idea is similar enough. Anyways, nice one. –  Sieg Jun 17 at 21:04
    
@nderscore You really gave me a motivation. I'm not sure if I can make it shorter, but I'll try :) –  core1024 Jun 17 at 23:11

J - 28 27 bytes

You know what I like? Simplicity (28 bytes). Note that in J, _1 is negative one (-1).

f=:{&0 _1 5 _1 _1 2 9 _1 8 6

Add a little complexity and you have 27 bytes.

f=:-{&0 2 _3 4 5 3 _3 8 0 3

Example:

   f 2
5
   f 6
9
   f 5
2
...
share|improve this answer

Perl, 27 26

Count includes the p flag

y/2569/5296/,s/[1347]/-1/

Usage:

$ echo 7 | perl -pe y/2569/5296/,s/[1347]/-1/
-1

Wait, did Perl just beat J? :)

share|improve this answer
    
+1 I was going to post y+0-9+9a4aa70a13+;$_=9-hex, which is the same length, but your is more original ;) –  core1024 Jun 18 at 20:35
1  
@core1024 : And it just got shorter ;) –  Zaid Jun 18 at 20:43
    
It didn't: echo 1 | perl -pe y/2569/5296/,s/[347]/-1/ –  core1024 Jun 18 at 20:48
    
@core1024 : I misread the specs, should be fixed now. It's still shorter than the J solution. –  Zaid Jun 18 at 21:05
    
There really is no concise way to do this in J, as values are strictly typed and numbers can't match strings. –  Sieg Jun 18 at 21:10

Sclipting, 11 characters

걄럣뉥밈결⓷方分결剩貶

Finally I have found a Windows computer with Visual Studio installed to build its interpreter. And it has defeated my GolfScript code easily.

It reads 18453063256\11\?/11%( in GolfScript.

share|improve this answer
1  
Interesting, but your GolfScript answer still wins. Unless the question states otherwise, length is measured in bytes. –  Dennis yesterday
    
@Dennis This was my 3rd or 4th answer on this site. I didn't know. And I think APL is an exception. –  user23013 yesterday
    
@Dennis And most people don't like Sclipting. :) –  user23013 yesterday
    
Not really an exception, we just let people choose their encoding. This answer would score 22 bytes, since that's its size using UTF-16. APL uses only 256 different characters, and there's an APL code page where once character is exactly one bytes. –  Dennis yesterday
    
@Dennis Ah, you are right. –  user23013 yesterday

ECMAScript 6, 24

f=x=>~-++'0n5nn29n86'[x]

Using normal JavaScript it would be 33:

alert(~-++'0n5nn29n86'[prompt()])
share|improve this answer

Marbelous 34 bytes

}0
=6=9=2=5=0=8?0
+3-3+3-3....--

It's not the shortest solution, but it's not the longest either.

How it works

}0 spawns a marble representing the first command line input. This marble drops down the next tick, onto the =6 cell. =6 is a comparison cell, it pushes any marble with value 6 down and all others to the right. This line-up of comparison cells pushes marbles right until they equal a desired value. 0 and 8 just fall through and get printed when tehy fall off the bottom of the board, 6 and 2, and 9 and 5 first get 3 added to them, subtracted from them respectively. If a marble doesn't equal any of the desired values, it lands on the ?0 cell, which turn any marble into a 0 marble1. This marble then gets decremented and falls off the board.

1 A ?n marble technically turns any marble into a marble between 0 and n. This has the nice side effect that ?0 turns anything into 0.

share|improve this answer

Python - 34

f=lambda n:ord("A@F@@CJ@IG"[n])-65
share|improve this answer
1  
33 f=lambda n:ord(" "[n])-3 working with space codeskulptor.org/#user34_Q7NbNvQy55_0.py –  Dylan Madisetti Jun 17 at 18:33
    
You might want to explain how and why this works –  Riot Jun 17 at 18:39
    
Using the ascii table asciitable.com the white spaces chosen are printable in python. it actually looks something like &#002;&#002;&#008;&#002;&#002;&#005;&#012;&#002;&#011;&#009; It's minus 3 for the reason that -1 leaves a null character which is no good, and minus 2 leaves a line feed which is reserved in python –  Dylan Madisetti Jun 17 at 18:52

Java, 58 59

int f(int i){int[]a={1,0,6,0,0,3,10,0,9,7};return a[i]-1;}

OR

int f(int i){return new int[]{1,0,6,0,0,3,10,0,9,7}[i]-1;}
share|improve this answer
    
You can make your code a bit shorter if you add 1 to each value in array and after [i] substract 1. –  Barteks2x Jun 17 at 18:43
    
@Barteks2x Good point; thanks –  Ypnypn Jun 17 at 19:18

CJam - 14

Input/output version:

"0 5  29 86"q#

Stack version (assumes the number is on the stack):

[0W5WWY9W8 6]=

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

share|improve this answer
    
There's no Wikipedia article about CJAM, and the link just goes to a blank fiddler. Where would you find information about the language and its established releases? –  Panzercrisis Jun 19 at 15:38
    
Looks like this is it: sourceforge.net/projects/cjam –  Panzercrisis Jun 19 at 15:40
    
@Panzercrisis cjam.aditsu.net has "CJam" linked to the sourceforge page –  aditsu Jun 19 at 23:40

JavaScript 42 37

Run it on the console of your browser

alert(~-[1,,6,,,3,10,,9,7][prompt()])
share|improve this answer

C - 117 108 106 77 76 bytes

a[]={1,0,6,0,0,3,10,0,9,7};main(int c,char**b){printf("%d",a[*b[1]-48]-1);}

Not the best language for golfing, but oh well...
Compile with gcc progname.c -o progname. (Ignore the warnings, or add -include stdio.h to the compile command.)

Usage: ./progname <number>

EDIT

As per @bebe's suggestion, here is an example that takes the input from STDIN instead:

C - 68 51 bytes

main(){printf("%d","106003:097"[getchar()-48]-49);}
share|improve this answer
    
using d=*b[1]-48 could be a good idea –  bebe Jun 17 at 20:08
    
@bebe Ah yes, thanks! –  BenjiWiebe Jun 17 at 20:46
1  
main(){printf("%d",(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1);} sorry for bothering you this much but i find this a bit shorter. –  bebe Jun 17 at 20:53
    
You can save another character by making the array global so you don't need the cast. a[]={1,0,6,0,0,3,10,0,9,7};main(){printf("%d",a[getchar()-48]-1);} –  Allbeert Jun 18 at 14:18
1  
main(){printf("%d","106003:097"[getchar()-48]-49);} 51 bytes –  bebe Jun 18 at 21:25

Java - 49

long f(int a){return(0x790a300601L>>(a*4)&15)-1;}

Here, 0x790a300601 is a value stuffed with the desired outputs, with one added to make them positive. The values are stored in nibbles within the value, so a bit of shifting and masking is required to pop them out.

Java - 100 (fun option)

int f(int a){Random r=new Random(0x2000A2F47D6Fl);int b=0;for(;a>=0;a--)b=r.nextInt(11)-1;
return b;}

Not the smallest option, but a bit of fun. I found a random seed that produces the correct values when called X times (where 0 >= X <= 9).

share|improve this answer

Python - 92

f=lambda x:x if x in(0,8)else(5if x==2 else(2if x==5 else(6if x==9 else(9if x==6 else -1))))

Usage:

>>> f(2)
5
>>> f(3)
-1
share|improve this answer
    
def f(x): will make it a byte shorter. Also "[a,b][x==5]" is shorter then and equivalent to "a if x==5 else b" –  Pinna_be Jun 17 at 21:42
    
Also, a small change would be to put the if x==9 last and say x>8 instead, saving a character. –  Pinna_be Jun 17 at 21:49
1  
@Pinna_be: You’re forgetting the return. –  minitech Jun 18 at 5:09

Python - 73 bytes

r=[2,5,2,9,6,9,8,8,0,0]
f=lambda x:-1 if x not in r else r[r.index(x)+1]

Or, for one digit numbers only :

r=[0,-1,5,-1,-1,2,9,-1,8,6]
f=lambda x:r[x]
share|improve this answer
    
why not altogether f=(lambda x:[-1,-1,5,-1,-1,2,9,-1,8,6][x])(x) –  Dylan Madisetti Jun 17 at 18:24
    
43 def f(x):print[-1,-1,5,-1,-1,2,9,-1,8,6][x] –  Dylan Madisetti Jun 17 at 18:56

PowerShell 32

(0,-1,5,-1,-1,2,9,-1,8,6)[$args]
share|improve this answer

F# - 37 bytes

let f n=[0;-1;5;-1;-1;2;9;-1;8;6].[n]

Usage:

> f 2
val it : int = 5
> f 9
val it : int = 6
> f 4
val it : int = -1
share|improve this answer
    
Fails for 0 and 8 –  Dancrumb Jun 17 at 22:30
    
I missed that in the rules, thanks! –  Jwosty Jun 17 at 22:31

Java, 75

int f(int i){return i>8?6:i>7?8:i>6?-1:i>5?9:i>4?2:i>2?-1:i>1?5:i>0?-1:0;}
share|improve this answer
    
i>8:-1 will return -1 for input 9 when it should return 6, won't it? –  corsiKa Jun 17 at 21:52
    
@corsiKa Indeed. –  Ypnypn Jun 17 at 23:47

TI-BASIC, 35

{1,0,6,0,0,3,10,0,9,7}→L1:L1(X+1)-1

Previous attempt, 42:

6(X=2)+3(X=5)+10(X=6)+9(X=8)+7(X=9)-1+(X=0
share|improve this answer

MATLAB - 35

I would wrap this in a function with n as the only parameter.

f=[0,-1,5,-1,-1,2,9,-1,8,6];
f(n+1)

35 characters.

share|improve this answer

C++ 85

Uses nested ternary statements.

int main(){int a;cin>>a;a=(a==2)?5:(a==5?2:(a==6?9:(a==9?6:(a%8==0?a:-1))));cout<<a;}
share|improve this answer
    
Doesn't C++ inherit the abuse of integers for Booleans of C? –  Peter Taylor Jun 18 at 9:58
    
@PeterTaylor Yes C++ accepts integers, but I don't want 'a' modified until the end. –  bacchusbeale Jun 18 at 11:10
    
No need to modify a. I was thinking that (a==X)?Y:Z can be (a-X)?Z:Y to save a few bytes. –  Peter Taylor Jun 18 at 14:13

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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