Просте декодування 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 ], очікуваний вихід "#".

Правила

  • Ви повинні приймати дані як цілі числа в будь-якому розумному форматі, наприклад, двох окремих змінних або масиві двох змінних. Вкажіть, у якому порядку їх очікує ваша програма (або колонка_freq, рядок_фрек або рядок_фрек, стовпець_фрек ).
  • Вхід гарантовано є дійсним.
  • Ви повинні надрукувати або вивести символ . Однак вам також дозволяється вивести ціле число для цифрових ключів.
  • Це , тому найкоротша відповідь у байтах виграє!

Відповіді:


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#  "

8

JavaScript (ES6), 39 35 байт

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

Перекладає два входи в число в діапазоні [0, 13)шляхом обчислення:
col % row % 83 % 16 % 13.
Здійснює введення в синтаксис currying ( 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
недолік

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.