Поиск по словам


20

Учитывая целое число от 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, это может быть строка.
Увлечения Кэлвина

Я вижу, как Луис Мендо появляется с ответом MATL в ближайшем будущем, хе.
Волшебная Урна Осьминога

Ответы:


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)

Сохранено 3 байта благодаря ETHproductions

Как это устроено

Мы преобразуем цифровую панель, применяя смещение к каждой цифре в соответствии со строкой, к которой она принадлежит:

  • +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 

Мы можем видеть, что два ключа являются смежными тогда и только тогда, когда 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

демонстрация

Этот фрагмент выводит список истинных значений.


Принуждение - ваш друг здесь: 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еще короче и должно работать так же хорошо, я думаю.
Арно

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 байт.
Гурупад Мамадапур

@GurupadMamadapur Я не понимаю, почему я бы изменил свое текущее 72-байтовое решение на ваше 74-байтовое решение ...: D И если вы ссылаетесь на мою строку s, после которой есть пробел 84, то вы ошибаетесь, поскольку это требуется. Если он не будет содержать пробелы, полученная строка будет иметь цепочку «8448», что приведет к неудачным тестам. Спасибо за предложения, хотя!
Yytsi

@TuukkaX Да, вы правы насчет лишних пробелов, пропустили это :)
Гурупад Мамадапур

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 и завершаем работу.

Спасибо Мисте Фиггинсу за то, что он спас мне пару байтов.


Я думаю, что вы можете изменить последнюю строку, 0<@.!!<чтобы сохранить 2 байта. Это зависит от того, что вершина стека ненулевая, когда IP опускается на вторую стрелку. Попробуйте онлайн!
MildlyMilquetoast

3

Желе , 29 24 19 байт

Сохранено 5 байтов благодаря предложению @ Dennis Kи Ɠ.

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 Я переворачиваю каждую строку, а не строки в виде массива. Я думаю, я мог бы быть яснее там. Во всяком случае, это сделано для того, чтобы получить половину диагоналей.
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' + эту же строку в обратном порядке и проверяете, найден ли параметр в строке, верно? Если это так, то это решение недействительно. Например, 86и не 24получится.
Yytsi

Правила гласят, что вам нужно вывести только истинное или ложное значение, поэтому вам не нужны !!ни сопутствующие скобки.
Джордан

0

Баш, 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);}}

Я новичок в этом .. любезно извините любой забвение.
Нефий knomore

Здравствуйте и добро пожаловать на сайт! Я отредактировал ваше сообщение так, чтобы раздел кода отображался в виде кода, и добавил количество байтов, стандартное для ответов здесь. Это соревнование - соревнование по коду , означающее, что конечная цель - сделать ваш код максимально коротким. Например, вы можете использовать короткие имена переменных и определять функцию вместо полного класса. Я не большой на Java, но еще несколько советов доступны здесь . Вы должны попытаться сделать свой код короче, а затем отредактировать новую версию в своем посте.
DJMcMayhem
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.