Пошук слів на цифрах


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 

Ми можемо бачити, що два ключі є суміжними лише тоді, і лише тоді, коли XORing їх кодів призводить до одного з наступних значень:

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повертає істину для будь-якого масиву, 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 Так, ти правий про додатковий пробіл, пропустив це :)
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 і виходимо.

Дякую Місті Фіггінс, що врятував мені пару байтів.


Я думаю, ви можете змінити останній рядок, 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

Правила говорять, що потрібно виводити лише значення "truthy" або "falsey", тому вам не потрібні !!чи супутні дужки.
Йорданія

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);}}

Я новачок у цьому .. люб’язно вибачте будь-яке забуття.
Nefi knomore

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