数字键词搜索


20

给定一个介于1到999之间(含1和999)的整数,如果它在标准数字键盘上的3x3正方形数字1-9中的任何位置水平,垂直或对角地向前或向后出现,则输出真实值:

789
456
123

如果没有出现该数字,则输出一个伪造的值。

您需要输出真实值的确切65个数字是:

1
2
3
4
5
6
7
8
9
12
14
15
21
23
24
25
26
32
35
36
41
42
45
47
48
51
52
53
54
56
57
58
59
62
63
65
68
69
74
75
78
84
85
86
87
89
95
96
98
123
147
159
258
321
357
369
456
654
741
753
789
852
951
963
987

其他一切都是虚假的。

以字节为单位的最短代码获胜。



输入可以包含0,可以是字符串。
加尔文的爱好

我看到路易斯·门多(Luis Mendo)在不久的将来出现MATL答案。
魔术章鱼缸

Answers:


16

JavaScript(ES6),83 ... 74 73字节

将输入作为字符串。

n=>1/([a,b,c]=[...n].map(v=>--v+v/3|0))||45242>>(a^b)&(~c&&n<99|b*2==a+c)

ETHproductions节省了3个字节

怎么运行的

我们通过根据数字所属行对每个数字应用偏移量来变换数字键盘:

  • 顶行+1
  • 中间行为0
  • -1为底行。

以下所有代码均以十六进制表示。

7 8 9      8 9 A  (+1)
4 5 6  =>  4 5 6  (unchanged)
1 2 3      0 1 2  (-1)

让我们考虑这些新键码的所有XOR组合。连续键用括号突出显示。

XOR|  0   1   2   4   5   6   8   9   A 
---+------------------------------------
 0 |  0  [1]  2  [4] [5]  6   8   9   A 
 1 | [1]  0  [3] [5] [4] [7]  9   8   B 
 2 |  2  [3]  0   6  [7] [4]  A   B   8 
 4 | [4] [5]  6   0  [1]  2  [C] [D]  E 
 5 | [5] [4] [7] [1]  0  [3] [D] [C] [F]
 6 |  6  [7] [4]  2  [3]  0   E  [F] [C]
 8 |  8   9   A  [C] [D]  E   0  [1]  2 
 9 |  9   8   B  [D] [C] [F] [1]  0  [3]
 A |  A   B   8   E  [F] [C]  2  [3]  0 

我们可以看到,只有且仅当两个键的代码异或导致以下值之一时,两个键才是连续的:

1, 3, 4, 5, 7, C, D, F

此列表可以打包到以下二进制掩码中:

  FEDCBA9876543210
  ----------------
0b1011000010111010 = 0xB0BA = 45242

因此,测试以确定两个键码(a,b)是否对应于两个连续键:

45242 >> (a ^ b) & 1

对于三个关键代码(a,b,c),我们需要此附加测试:

b * 2 == a + c

例:

a = 0xA
b = 0x6
c = 0x2

0xB0BA >> (0xA ^ 0x6) & 1 == 0xB0BA >> 0xC & 1 == 1
=> 0xA and 0x6 are contiguous key codes

0x6 * 2 == 0xA + 0x2
=> 0xA, 0x6 and 0x2 are contiguous key codes on the same row, column or diagonal

演示版

此代码段输出真实值列表。


Coercion在这里是您的朋友:a-.5任何a包含(零或)一个整数的数组都返回true 。n=>([a,b,c]=[...n].map(v=>--v+v/3|0))-.5||n%10&&n<100|b*2==a+c&&45242&1<<(a^b)
ETHproductions 2016年

@ETHproductions啊,太好了!1/a我认为它甚至更短,并且应该也能正常工作。
Arnauld 2013年

5

Python3,72个字节

lambda n,s="123 456 789 741 852 963 42 753 86 26 159 84 ":n in s+s[::-1]

输入被当作字符串。

欢迎打高尔夫球!:D


这是否将数字作为字符串?
FlipTack

@ Flp.Tkc是的。我会在帖子中提及。谢谢!
Yytsi

@TuukkaX字符串中还有一个额外的空格s,您可以节省1个字节。
Gurupad Mamadapur

@GurupadMamadapur我不明白为什么我要将当前的72个字节的解决方案更改为您的74个字节的解决方案...:D如果您引用我的string s,其后有一个空格84,则您不正确,因为这是必需的。如果不包含空格,则结果字符串将具有链“ 8448”,这将导致失败的测试用例。谢谢你的建议!
Yytsi

@TuukkaX是的,您对额外的空白是正确的,错过了一个:)
Gurupad Mamadapur

4

Befunge,169个 161 159字节

38*:2+"*0>DTV{51"3*\3*"kV"3*\3*"{w"3*\3*"mr"v
v:\&+*83:++66:+"c":+"?":+"$":++66:+"W":*6\*4<
_v#:\_v#*-+%+55g00*+55g02\*-g02\*-g00\`9::::p02/+55p00%"d":
0<@.!!<

在线尝试!

前两行只是将测试编号列表压入堆栈。这样做是按照大小顺序进行的,因为有时生成一个数字作为与系列中前一个数字的偏移量会比从头开始生成数字更容易。一旦获得更大的数字,有时还可以通过成对生成它们来节省一个字节,例如"kV"3*\3*,以九个字节给我们258和321,其中每个它们分别占用五个字节。

主循环在第三行,从右到左环绕执行。这只是遍历堆栈上的所有测试编号,比较值本身,值%100和值/ 10。如果其中任何一个与输入数字匹配或数字<= 9,则我们输出1并退出。如果没有匹配项,我们将继续循环。如果堆栈中的测试编号用尽,则输出0并退出。

感谢Mistah Figgins为我节省了几个字节。


我认为您可以将最后一行更改0<@.!!<为节省2个字节。当IP下降到第二个箭头时,这取决于堆栈的顶部非零。在线尝试!
MildlyMilquetoast,2016年

3

果冻29 24 19 字节

由于@Dennis对Kand 的建议,节省了5个字节Ɠ

9s3µUŒD;;Z;ŒDµ;UKƓẇ

在线尝试!

说明

9Rs3µUŒD;;Z;ŒDµ;UKƓẇ  Main link. Argument: number
9s3                   Split [1..9] into [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
   µ                  New monadic chain
    U                 Reverse the rows
     ŒD               Take the diagonals of the result
       ;              Append the original rows
        ;Z            Append the original columns
          ;ŒD         Append the original diagonals
             µ        New monadic chain
              ;U      Append the reverse of everything
                K     Join by spaces
                 Ɠẇ   Check if a line from STDIN is in the result

如果从STDIN读取输入,则9s3µUŒD;;Z;ŒDµ;UKƓẇ节省5个字节。
丹尼斯

您需要反转行吗?它们可以向前或向后出现,因此123,456,789应该与789,456,123
Riley's

@Riley我反转每一行,而不是将行作为数组。我想我本来可以更清楚一些。无论如何,这样做是为了获得一半的对角线。
PurkkaKoodari

2

Ruby,77个字节

->n{!!((s='123 456 789 147 258 369 753 951 86 62 24 48 ')+s.reverse)["#{n}"]}

您正在创建一个字符串'123 456 789 147 258 369 753 951'+颠倒相同的字符串,并检查是否在该字符串上找到了参数,对吗?如果是这样,则此解决方案无效。例如,86并且24将失败。
Yytsi

规则说,您只需要输出一个true或false值,所以您不需要!!或附带括号。
约旦

0

bash,75岁

printf %s\\n 123 456 789 741 852 963 42 753 86 26 159 84|tee >(rev)|grep $1

输出内容并为该列表中的所有值返回0

在所有其他情况下不输出任何内容并返回1


0

Java,397字节

public class Numpad {public static void main(String[] args){Scanner input=new Scanner(System.in);int in=input.nextInt();int h=in/100;int u=in%10;int t=(in%100)/10;boolean out=false;input.close();if(in<10)out=true;else if( h==0){int decider=Math.abs(t-u);if((decider==1)||(decider==3)||(decider==4))out=true;}else{if ( Math.abs(h-t) == Math.abs(t-u))out=true;}System.out.println("RESULT : "+out);}}

我是新来的..请原谅任何遗忘行为。
Nefi knomore '16

您好,欢迎光临本站!我已经编辑了您的帖子,以便将代码部分显示为代码并添加了字节数,这是此处答案的标准。这项竞赛是一场代码高尔夫竞赛,这意味着最终目标是使您的代码越短越好。例如,您可以使用简短的变量名,并定义一个函数而不是完整的类。我不太擅长Java,但是这里提供了更多技巧。您应该尝试缩短代码,然后将新版本编辑到您的帖子中。
DJMcMayhem
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.