Numpad Word Search

20

Dado um número inteiro de 1 a 999 inclusive, imprima um valor verdadeiro se ele aparecer horizontal, verticalmente ou diagonalmente, para frente ou para trás, em qualquer lugar do quadrado 3x3 dos dígitos 1-9 em um teclado numérico padrão :

789
456
123

Se o número não aparecer, digite um valor falso.

Os 65 números exatos para os quais você precisa gerar verdade são:

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

Tudo o resto é falso.

O código mais curto em bytes vence.

Passatempos de Calvin
fonte
OEIS relevante .
Fatalize 4/12/16
A entrada pode conter 0, pode ser uma sequência.
Calvin's Hobbies
Eu vejo Luis Mendo aparecendo com uma resposta MATL no futuro próximo heh.
Magic Octopus Urn

Respostas:

16

JavaScript (ES6), 83 ... 74 73 bytes

Recebe a entrada como uma sequência.

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

Economizou 3 bytes graças a ETHproductions

Como funciona

Transformamos o teclado numérico aplicando um deslocamento para cada dígito de acordo com a linha à qual ele pertence:

  • +1 na linha superior
  • 0 para a linha do meio
  • -1 para a linha inferior.

Todos os códigos abaixo são representados em hexadecimal.

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

Vamos considerar todas as combinações XOR desses novos códigos de chave. Teclas contíguas são destacadas entre colchetes.

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 

Podemos ver que duas chaves são contíguas se, e somente se, XORing seus códigos levar a um dos seguintes valores:

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

Esta lista pode ser compactada na seguinte máscara binária:

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

Portanto, o teste para determinar se dois códigos de chave (a, b) correspondem a duas chaves contíguas:

45242 >> (a ^ b) & 1

Para três códigos-chave (a, b, c), precisamos deste teste adicional:

b * 2 == a + c

Exemplo:

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

Demo

Este trecho gera a lista de valores verdadeiros.

Arnauld
fonte
A coerção é sua amiga aqui: a-.5retorna true para qualquer matriz que acontenha (zero ou) um número inteiro. 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 4/16/16
@ETHproductions Ah, que bom! 1/aé ainda mais curto e deve funcionar tão bem, eu acho.
Arnauld
5

Python3, 72 bytes

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

A entrada é tomada como uma sequência.

Sugestões de golfe são bem-vindas! : D

Yytsi
fonte
Isso leva o número como uma string?
FlipTack 4/12/16
@ Flp.Tkc Sim, sim. Vou mencionar isso no post. Obrigado!
Yytsi 04/12/19
@TuukkaX existe um espaço adicional na string s, você pode salvar 1 byte.
Gurupad Mamadapur
@GurupadMamadapur Não vejo por que eu mudaria minha solução atual de 72 bytes para sua solução de 74 bytes ...: D E se você se referir à minha string s, que possui um espaço em branco depois 84, então você está incorreto, pois é necessário. Se não contivesse um espaço em branco, a sequência resultante teria uma cadeia '8448', o que levaria a casos de teste com falha. Obrigado pelas sugestões!
Yytsi
@TuukkaX Sim, você está certo sobre o espaço em branco extra, perdeu aquele :)
Gurupad Mamadapur
4

Befunge, 169 161 159 bytes

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<@.!!<

Experimente online!

As duas primeiras linhas estão apenas empurrando a lista de números de teste para a pilha. Isso é feito em ordem de tamanho, pois às vezes pode ser mais fácil gerar um número como um deslocamento do número anterior da série, em vez de gerá-lo do zero. Quando chegamos aos números maiores, às vezes também podemos salvar um byte, gerando-os em pares, por exemplo, "kV"3*\3*nos dá 258 e 321 em nove bytes, onde individualmente eles pegariam cinco bytes cada.

O loop principal está na linha três, executando da direita para a esquerda com o contorno. Isso apenas repete todos os números de teste na pilha, comparando o valor em si, o valor% 100 e o valor / 10. Se qualquer uma dessas combinações com o número de entrada ou o número <= 9, produzimos 1 e saímos. Se não houver correspondência, continuamos em loop. Se ficarmos sem números de teste na pilha, produziremos 0 e sairemos.

Agradeço a Mistah Figgins por me salvar alguns bytes.

James Holderness
fonte
Eu acho que você pode alterar a última linha 0<@.!!<para salvar 2 bytes. Isso depende do topo da pilha ser diferente de zero quando o IP desce na segunda seta. Experimente Online!
MildlyMilquetoast
3

Geléia , 29 24 19 bytes

Economizou 5 bytes graças à sugestão de @ Dennis de Ke Ɠ.

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

Experimente online!

Explicação

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
PurkkaKoodari
fonte
Se você ler a entrada de STDIN, 9s3µUŒD;;Z;ŒDµ;UKƓẇeconomiza 5 bytes.
Dennis
Você precisa reverter as linhas? Eles podem aparecer para frente ou para trás, portanto 123,456,789devem ser os mesmos que:789,456,123
Riley
@Riley Eu inverto cada linha, não as linhas como uma matriz. Acho que poderia ter sido mais claro lá. Enfim, é feito para obter metade das diagonais.
precisa saber é o seguinte
2

Ruby, 77 bytes

->n{!!((s='123 456 789 147 258 369 753 951 86 62 24 48 ')+s.reverse)["#{n}"]}
Vasu Adari
fonte
Você está criando uma sequência que é '123 456 789 147 258 369 753 951' + a mesma sequência invertida e verificando se o parâmetro foi encontrado na sequência, certo? Nesse caso, esta solução é inválida. Por exemplo, 86e 24falhará.
Yytsi 04/04/19
As regras dizem que você só precisa gerar um valor de verdade ou falsey, para que você não precise !!dos parênteses.
Jordan
0

festança, 75

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

gera algo e retorna 0 para todos os valores nessa lista

imprime nada e retorna 1 em todos os outros casos

izabera
fonte
0

Java, 397 bytes

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
fonte
Eu sou novo nisso ... desculpe qualquer esquecimento.
Nefi knomore
Olá e bem-vindo ao site! Editei sua postagem para que a seção de código seja exibida como código e adicionei uma contagem de bytes, que é padrão para respostas aqui. Esta competição é uma competição de código-golfe , o que significa que o objetivo final é tornar seu código o mais curto possível. Por exemplo, você pode usar nomes curtos de variáveis ​​e definir uma função em vez de uma classe completa. Eu não sou bom em Java, mas mais algumas dicas estão disponíveis aqui . Você deve tentar diminuir o seu código e editar a nova versão em sua postagem.
DJMcMayhem