Простое декодирование DTMF: найдите ключ телефона!

11

Это простая задача, которая, надеюсь, может привести к творческим ответам.

Цитата из Википедии : «Двухтональная многочастотная сигнализация (DTMF) - это внутриполосная система телекоммуникационной сигнализации, использующая диапазон тональных частот по телефонным линиям между телефонным оборудованием и другими устройствами связи и коммутационными центрами».

задача

Учитывая два целых числа, представляющих частоты столбцов и строк в следующей таблице, ваша задача - вывести соответствующий ключ:

       | 1209 Hz | 1336 Hz | 1477 Hz
-------+---------+---------+---------
697 Hz |    1    |    2    |    3
770 Hz |    4    |    5    |    6
852 Hz |    7    |    8    |    9
941 Hz |    *    |    0    |    #

Примеры

  • Если это вход [ 1209, 852 ], то ожидаемый результат - «7».
  • Если ввод [ 1477, 941 ], то ожидаемый вывод - «#».

правила

  • Вы должны принимать входные данные как целые числа в любом приемлемом формате, таком как две отдельные переменные или массив из двух переменных. Пожалуйста, укажите, в каком порядке ваша программа ожидает их ( column_freq, row_freq или row_freq, column_freq ).
  • Вклад гарантированно будет действительным.
  • Вы должны напечатать или вывести символ . Тем не менее, вы также можете вывести целое число для цифровых клавиш.
  • Это , поэтому выигрывает самый короткий ответ в байтах!
Arnauld
источник

Ответы:

2

Желе , 19 байт

DḢ×3++6ị9R;“*0#  ”¤

Попробуйте онлайн!

Принимает входные данные как row, columnв двух аргументов.

Это использует, 3*<first digit of row> + <column> + 6 % 14чтобы дать различное значение для каждого. Это индексируется, [1,2,3,4,5,6,7,8,9,"*","0","#"," "," "]чтобы дать вывод. Пробелы могут быть любым персонажем; они просто буфер для создания неявного мода 14.

Низкий уровень

DḢ×3++6ị9R;“*0#  ”¤
D                     - digits (of <row>)
 Ḣ                    - head (get first element)
  ×3                  - multiply by 3
    +                 - add (<column>)
     +6               - add 6
       ị              - index into:
                  ¤   - the nilad:
        9R              - range(9)
          ;             - concatenate
           “*0#  ”      - the string "*0#  "
fireflame241
источник
8

JavaScript (ES6), 39 35 байт

a=>b=>"310*58# 47269"[a%b%83%16%13]

Переводит два входа в число в диапазоне [0, 13)путем вычисления:
col % row % 83 % 16 % 13.
Принимает ввод в карринг-синтаксисе ( f(col)(row)) и возвращает строку с одним символом.

Тестовые случаи

история

Начал с диапазона [0, 20)с расчетом col % row % 29 % 20, который потребовал 8 потерянных символов в отображении.

Джастин Маринер
источник
4

Haskell, 42 37 байт

x#y="_1425__#9__*70836"!!mod(2*x+y)18

Просто математика для индексации строки. Ввод заказа <column> # <row>, например 1336 # 697.

Попробуйте онлайн!

Редактировать: @flawr нашел формулу, которая работает на более короткой строке. Всего -5 байт. Благодаря!

Ними
источник
1
Я только что написал небольшую программу для оптимизации вашего подхода, и кажется, что вы можете сохранить несколько байтов:x#y="_1425__#9__*70836"!!mod(2*x+y)18
flawr
3

MATL , 23 байта

13*+79\'186#294*3750'w)

Входы: частота столбца, затем частота строки.

Попробуйте онлайн!

объяснение

Умножение частоты столбца на 13, добавление частоты строки и вычисление по модулю 79 дает различное значение для каждой из 12 пар входов.

13*               % First input (implicit) times 13
+                 % Add to second input (implicit)
79\               % Modulo 79
'186#294*3750'    % Push this string
w                 % Swap
)                 % Index
Луис Мендо
источник
1

Befunge , 34 байта

&"~"/9-4*&"d"/6-+1g,@
147*2580369#

Попробуйте онлайн!

Объяснение:

&"~"/9-4*                (Get number / 126 - 9) * 4 = 0, 4, or 8
         &"d"/6-         Get number / 100 - 6 = 0, 1, 2, or 3
                +        Add the above results - this becomes the x-coordinate in the "lookup table"
                 1g,@    Get a value on row 1 column x, output it, and end

источник