简单的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_freqrow_freq,column_freq)。
  • 输入保证有效。
  • 您必须打印或输出一个字符。但是,您也可以为数字键输出一个整数。
  • 这是,因此最短答案以字节为单位!

Answers:


2

果冻,19字节

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

在线尝试!

需要输入的rowcolumn在两个参数。

这用于3*<first digit of row> + <column> + 6 % 14为每个值赋予不同的值。将其编入索引[1,2,3,4,5,6,7,8,9,"*","0","#"," "," "]以提供输出。空格实际上可以是任何字符;它们只是创建一个隐式mod 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))接受输入,并返回一个单字符字符串。

测试用例

历史

从with [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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.