返回数字的翻转版本


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.