숫자 패드 단어 검색


20

1에서 999까지의 정수가 주어지면 표준 숫자 키패드 에서 1-9의 3x3 제곱 자릿수의 어느 곳에서든 가로, 세로 또는 대각선으로 앞뒤로 나타나는 경우 정확한 값을 출력하십시오 .

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이 포함될 수 있으며 문자열 일 수 있습니다.
Calvin 's Hobbies

가까운 시일 내에 Luis Mendo가 MATL 답변으로 표시되는 것을 볼 수 있습니다.
Magic Octopus Urn

답변:


16

자바 스크립트 (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)

ETH 프로덕션 덕분에 3 바이트 절약

작동 원리

숫자 행을 해당 행에 따라 각 숫자에 오프셋을 적용하여 숫자 패드를 변환합니다.

  • 맨 위 행에 +1
  • 가운데 행의 경우 0
  • 맨 아래 행의 경우 -1입니다.

아래의 모든 코드는 16 진수로 표시됩니다.

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 

코드를 XOR하면 다음 값 중 하나가 발생하는 경우에만 두 개의 키가 연속적임을 알 수 있습니다.

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

데모

이 스 니펫은 정확한 값의 목록을 출력합니다.


강제는 여기에 당신의 친구입니다 : (0 또는 1) 정수를 포함하는 a-.5모든 배열에 대해 true를 반환합니다 a. 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

@ETHproductions 아, 좋아! 1/a더 짧아서 잘 작동해야한다고 생각합니다.
Arnauld

5

Python3, 72 바이트

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

입력은 문자열로 간주됩니다.

골프 제안을 환영합니다! :디


이 숫자를 문자열로 사용합니까?
FlipTack

@ Flp.Tkc 그렇습니다. 나는 포스트에서 그것을 언급 할 것이다. 감사!
Yytsi

@TuukkaX string에 추가 공간이 있으며 s1 바이트를 절약 할 수 있습니다.
Gurupad Mamadapur

@GurupadMamadapur 현재 72 바이트 솔루션을 74 바이트 솔루션으로 변경하는 이유를 모르겠습니다 ... : D 그리고 s공백이있는 내 문자열을 참조하면 84필요하기 때문에 잘못되었습니다. 공백을 포함하지 않으면 결과 문자열에 체인 '8448'이 생겨 테스트 케이스가 실패합니다. 그래도 제안에 감사드립니다!
Yytsi

@TuukkaX 그래, 당신은 여분의 공백에 대한 맞아요은 놓친 하나 :
Gurupad Mamadapur

4

비 펀지, 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*개별적으로 5 바이트를 차지하는 9 바이트로 258 및 321을 제공합니다.

메인 루프는 줄 3에 ​​있으며, 줄 바꿈으로 오른쪽에서 왼쪽으로 실행됩니다. 이것은 스택의 모든 테스트 번호를 반복하여 값 자체, value % 100 및 value / 10을 비교합니다. 입력 번호 또는 숫자 <= 9와 일치하는 것이 있으면 1을 출력하고 종료합니다. 일치하는 것이 없으면 계속 반복합니다. 스택에서 테스트 번호가 부족하면 0을 출력하고 종료합니다.

몇 바이트를 절약 해 준 Mistah Figgins 에게 감사드립니다 .


마지막 줄을 변경하여 0<@.!!<2 바이트를 절약 할 수 있다고 생각합니다 . 이것은 IP가 두 번째 화살표로 내려갈 때 스택의 상단이 0이 아닌 것에 의존합니다. 온라인으로 사용해보십시오!
MildlyMilquetoast

3

젤리 , 29 24 19 바이트

@Dennis의 제안 K및 덕분에 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 바이트를 저장합니다.
Dennis

행을 뒤집어 야합니까? 앞뒤로 나타날 수 123,456,789있으므로 다음과 같아야합니다.789,456,123
Riley

@ Riley 배열이 아닌 각 행을 뒤집습니다. 나는 거기에서 더 명확했을 수 있다고 생각합니다. 어쨌든, 대각선의 절반을 얻기 위해 수행됩니다.
PurkkaKoodari

2

루비, 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'+ 동일한 문자열을 뒤집은 문자열을 만들고 매개 변수가 문자열에 있는지 확인합니까? 그렇다면이 솔루션은 유효하지 않습니다. 예를 들어, 8624실패합니다.
Yytsi

규칙에 따르면 진실 또는 거짓 값만 출력하면되므로 !!괄호는 필요하지 않습니다 .
Jordan

0

배쉬, 75

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

무언가를 출력하고 해당 목록의 모든 값에 대해 0을 반환합니다

다른 모든 경우에는 아무것도 인쇄하지 않고 1을 반환합니다.


0

자바, 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

안녕하세요, 사이트에 오신 것을 환영합니다! 코드 섹션이 코드로 표시되고 바이트 수를 추가하도록 게시물을 편집했으며 여기에 대답의 표준입니다. 이 경쟁은 코드-골프 경쟁으로, 궁극적 인 목표는 코드를 최대한 짧게 만드는 것입니다. 예를 들어 짧은 변수 이름을 사용하고 전체 클래스 대신 함수를 정의 할 수 있습니다. Java에 능숙하지는 않지만 여기에서 더 많은 팁을 얻을 수 있습니다 . 코드를 더 짧게 만든 다음 게시물의 새 버전 을 수정 해야합니다.
DJMcMayhem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.