返回数字的翻转版本


18

当数字显示在计算器上时,可以考虑该数字的各种变换是什么样的。例如,在七段显示器上,如下所示显示了2:

enter image description here

当水平翻转时,它看起来像这样:

enter image description here

这样,2的镜像为5。

挑战中的任务是获取一个数字,然后返回作为其镜像的数字(如果可能)。如果其镜像看起来不像数字,则返回旋转180度的数字(如果可能)。如果都不是,则返回-1。

这是程序需要处理的输入和输出的完整列表:

Input   Output
0       0
1       -1
2       5
3       -1
4       -1
5       2
6       9
7       -1
8       8
9       6

作为挑战,最短的代码胜出!


17
我不同意你的最后一点- 1 7段显示器上会简单地翻转到另一侧,所以1应该午睡1
Jwosty

29
我对如何翻转每个数字感到困惑。如果2变为5,然后6应该成为向后9,而不是9。但是,如果6变为9,则该倒装仅仅是一个旋转,从而2变为另一个2而不是5
kernigh

6
旋转180度的6、9,水平翻转的2、5和1、3实际上是它们在垂直轴上的反射。
jimmy23013

22
问题中定义的翻译完全不一致。为什么2和5会翻转,而3不会呢?
雷纳特2014年

4
我注意到有关可切换数字的一个奇怪事实:它们形成相反的二进制模式,即2 = 010、5 = 101。6 = 0110,9 = 1001。任何人都可以在解决方案中使用这个事实吗?
Jack Aidley 2014年

Answers:


32

哈斯克尔- 43 31

没有花哨的43个字符。

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

通过使其成为部分功能,将其减少到31个字符。

f=([0,-1,5,-1,-1,2,9,-1,8,6]!!)

4
我笑了。+1。
seequ 2014年

6
+1用于使用Haskell 完全执行规范。说!
recursion.ninja 2014年

1
我认为您不需要f=第二个解决方案,因为它是一个有效的表达式
Cyoce

23

高尔夫脚本,15 14

我再次阅读了规范,发现输入必须是字符串。

"0.5..29.86"\?

跑步:

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

旧版本(具有整数输入):

[0.5..2 9.8 6]?

较新的版本(14字节)在某种程度上受到aditsu的CJam回答的启发


1
简直不敢相信我没想到...
丹尼斯




8

CJam,20个字节

q25691347`"5296W"er~

在线尝试。

输出量

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

怎么运行的

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

8

BEFUNGE 93 - 18 14个 20字节

我想评论员是对的,尽管Befunge作为2D语言行有点不同。尽管如此,在这一刻,评论员是正确的。

&1g01g-.  
! &  #* )'

脚步:

&

读取输入作为数值x,并将其压入堆栈。

1g

在位置x,1处获取字符值c(因此,例如'!'= 33或'*'=42。一个空单元格= 32)。

01g-.

读取单元格0,1(33)的字符值,将其从c中减去,然后将其输出为数值。


2
相当不错。+1。
seequ 2014年

请更正长度:20个字节
har-wradim

1
您实际上一直在计数错误的字节数。您使用了19个字节。我们计算换行符和空格。但是,如果您切换到Befunge 98,则可以保存一个。将第一行更改为:&1g'!-.
贾斯汀

8

Java的-49

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

在此,0x790a300601一个值填充了所需的输出,并添加了一个值使它们为正。这些值存储在该值内的半字节中,因此需要进行一些移位和屏蔽才能将它们弹出。

Java-100(有趣的选项)

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

不是最小的选择,而是一点乐趣。我发现一个随机种子可以在调用X次(其中0> = X <= 9)时产生正确的值。


聪明。+1
Cyoce

8

JavaScript(ECMAScript 6)25

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

JavaScript(ECMAScript 5)43

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

更新:edc65提出了一种更好的技术。牙刷建议使用一种更好的语言。在这一点上,我的主要贡献是调试和进取。


1
如果将其更改为ECMAScript 6(Firefox支持),则只需执行x=>[0,-1,5,-1,-1,2,9,-1,8,6][x]
牙刷

刚开始,我差点发布function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x],也感谢Firefox。无论如何我都不会赢,所以我决定只坚持兼容性最高的答案。如果我为了简洁起见而开始切换语言,那么我最终将开始为自己遇到的每一个挑战定义自己的语言。但是无论如何,我都会继续提到ECMAScript 6版本,因为您已经提出了建议
Keen

1
相同的概念,但更短(再见,逗号):x =>'106003907'[x]-(x!= 6)
edc65 2014年

@ edc65您知道,我想使用一个字符串,而我完全可以将结果强制转换为数字,这完全是空白。奇异的失误。但是我仍然不会想到-(x!=6)。谢谢。
肯恩(Keen)2014年


6

重击29

tr 1-9 x5xx29x86|sed s/x/-1/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

您可以省略'sed表达式周围。此外,我认为你可以忽略g,因为该规范只在一时间提供一个数字
数字创伤

谢谢。仅在示例中,提交本身不使用'。喜欢g较长的输入!


4

JavaScript 36 37 41

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

作为ES6功能-27:

f=v=>'0x'+'65b558f5ec'[v]-6

2
28:f=v=>~-[1,,6,,,3,10,,9,7][v]
nderscore

@nderscore您只是喜欢改进人们的密码,不是吗?
seequ 2014年

3
@TheRare我只是在寻找最短的javascript代码。:)如果其他人已经发布了一个好的答案,那么对我来说,在其中找到优化方法比发布一个几乎是重复的新答案更有意义。我不是在这里竞争,只是为了实现这个目标而合作。
nderscore 2014年

@nderscore只要我的想法足够相似,我就会保持相同的心态。无论如何,很好。
seequ 2014年

@nderscore你真的给了我动力。我不确定是否可以将其缩短,但我会尝试:)
core1024 2014年

4

滑动,11个字符

걄럣뉥밈결⓷方分결剩貶

最终,我找到了一台装有Visual Studio的Windows计算机,以构建其解释器。它轻松击败了我的GolfScript代码。

18453063256\11\?/11%(在GolfScript中读取。


2
有趣,但是您的GolfScript答案仍然可以解决。除非问题另有说明,否则长度以字节为单位。
丹尼斯2014年

@Dennis这是我在本网站上的第3或第4个答案。我不知道 我认为APL是个例外。
jimmy23013

@丹尼斯而且大多数人都不喜欢Sclipting。:)
jimmy23013

并不是一个例外,我们只是让人们选择他们的编码。这个答案将获得22个字节,因为这是使用UTF-16的大小。APL仅使用256个不同的字符,并且有一个APL代码页,其中一个字符正好是一个字节。
丹尼斯

@丹尼斯啊,你是对的。
jimmy23013

3

J- 28 27字节

你知道我喜欢什么吗?简单性(28个字节)。请注意,在J中_1为负一(-1)。

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

增加一点复杂度,您将拥有27个字节。

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

例:

   f 2
5
   f 6
9
   f 5
2
...


3

Perl,27 26岁

计数包括p标志

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

用法:

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

等一下,Perl刚打败J吗?:)


+1是我要发布的y+0-9+9a4aa70a13+;$_=9-hex,长度相同,但是您的
邮件

1
@ core1024:并且它变得更短;)
Zaid

它没有:echo 1 | perl -pe y/2569/5296/,s/[347]/-1/
core1024

@ core1024:我误读了规格,现在应该修复。它仍然比J解决方案短。
Zaid 2014年

在J中确实没有简洁的方法可以执行此操作,因为值是严格键入的,并且数字不能匹配字符串。
seequ 2014年

3

Marbelous 34字节

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

这不是最短的解决方案,但也不是最长的解决方案。

怎么运行的

}0生成代表第一个命令行输入的大理石。该大理石将下一个刻度滴下,滴到=6电池上。=6是一个比较单元,它会将值6的所有大理石向下推,而所有其他值向右推。比较单元的这种排列将大理石推向右边,直到它们等于所需的值。0和8刚掉下来并在板子底部掉落时被打印,6和2,以及9和5首先被添加3,分别从它们中减去。如果大理石不等于任何期望值,它将落在?0单元格上,这会将任何大理石变成0大理石1。然后,此大理石逐渐减少并从木板上掉下来。

1?n技术上讲,大理石将任何大理石变成0到n之间的大理石。这具有很好的副作用,可以?0将任何东西变为0。


2

MATLAB-35

我会将其包装在具有n唯一参数的函数中。

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

35个字符。


2

ECMAScript 6、24

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

使用普通的JavaScript,它将是33:

alert(~-++'0n5nn29n86'[prompt()])

2

TI-BASIC,24 22

-1+int(11fPart(11^Ans.0954191904

这会将可能的输出编码为存储为以11为底的浮点数的查找表。从表中提取小数点后的第(N + 1)个以11为底的数字,以获得反转数字的值。以11为底的数字是.106003A097,而这个少一的数字正好是0,-1,5,-1,-1,2,9,-1,8,6

edc65在6的情况下减去1的技巧导致了这种24字节的解决方案,其中⑩^(是一个1字节的令牌:

-(Ans≠6)+int(10fPart(.1060039097⑩^(Ans

字符串方法为29个字节:

-(Ans≠6)+expr(inString("1060039097",Ans+1,1

假设数字存储在X中,则数组方法(Ypnpyn也采用了)为30个字节:

{1,0,6,0,0,3,10,0,9,7}-1:Ans(X+1

24-> 22:删除了魔术常数的两位额外精度。


这几乎可以肯定是打到19,甚至是18。但是,我需要搜索正确的数字。
lirtosiast 2015年

2

C-47个字节[原为48个字节]

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

要添加86个字节的I / O(其他答案并非总是如此):

main(i){i=(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1;i<0?puts("-1"):putchar(i+48);}

1
哇,我不知道内联数组文字是什么东西。非常好的第一个答案,欢迎来到PPCG!(无需添加I / O 功能,提交就完全有效。)
Martin Ender

1

巨蟒-34

f=lambda n:ord("A@F@@CJ@IG"[n])-65

1
33 f=lambda n:ord(" "[n])-3 working with space codeskulptor.org/#user34_Q7NbNvQy55_0.py
Dylan Madisetti

You might want to explain how and why this works
Riot

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

1

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;}

You can make your code a bit shorter if you add 1 to each value in array and after [i] substract 1.
barteks2x

@Barteks2x Good point; thanks
Ypnypn

1

JavaScript 42 37

Run it on the console of your browser

alert(~-[1,,6,,,3,10,,9,7][prompt()])

1

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);}

using d=*b[1]-48 could be a good idea
bebe

@bebe Ah yes, thanks!
BenjiWiebe

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

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

2
main(){printf("%d","106003:097"[getchar()-48]-49);} 51 bytes
bebe

1

J (24, function)

(the input panel isn't playing nice. Paste the following in a python interpreter and my answer shall be revealed:)

print "f=:{&(_3+3 u:'^C^B^B^E^L^B^K\t')"


1

05AB1E, 13 bytes (non-competing)

0®5®®Y9®8 6¹@

Try it online!

-3 thanks to Emigna.

Explanation:

0®5®®Y9®8 6¹@ Takes an integer from STDIN.
0®5®®Y9®8 6   Push 0, r=-1, 5, r=-1, r=-1, Y=2, 9, r=-1, 8, 6.
           ¹  Push first input item.
            @ Pop and push the 0-indexed stack item at the respective index.

0®5®®Y9®8 6¹@ should work as well.
Emigna

@Emigna I had no idea, thanks!
Erik the Outgolfer

Good thinking with @. Not often you see that used :)
Emigna

@Emigna A byte shorter than )¹è or )sè.
Erik the Outgolfer


1

Jelly, 14 bytes (non-competing)

ị“-5--29-860”V

Try it online!

Explanation:

ị“-5--29-860”V Takes argument as an integer.
 “-5--29-860”  "-5--29-860" (1-indexed string).
ị              Return the xth char of the string above (y) (x=argument).
             V Eval. - is the same as -1.

ịV = žh‡ in 05AB1E
Magic Octopus Urn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.