シンプルなDTMFデコード:電話キーを見つけてください!


11

これは単純な挑戦であり、うまくいけば創造的な答えが得られるかもしれません。

Wikipediaの引用:「デュアルトーン多重周波数信号(DTMF)は、電話機器と他の通信デバイスおよび交換センターとの間の電話回線で音声周波数帯域を使用する帯域内通信信号システムです。」

仕事

次の表の列と行の頻度を表す2つの整数が与えられた場合、タスクは対応するキーを出力することです。

       | 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 ]場合、予想される出力は「#」です。

ルール

  • 2つの独立した変数または2つの変数の配列など、妥当な形式の整数として入力を受け取る必要があります。プログラムが期待する順序(column_freq、row_freqまたはrow_freq、column_freqのいずれか)を指定してください。
  • 入力は有効であることが保証されています。
  • 文字を印刷または出力する必要があります。ただし、数字キーの整数を出力することもできます。
  • これはなので、バイト単位の最短回答が勝ちです!

回答:


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)計算して、2つの入力を範囲内の数値にマッピングします
col % row % 83 % 16 % 13
カリー化構文(f(col)(row))で入力を受け取り、単一文字の文字列を返します。

テストケース

歴史

[0, 20)withの計算範囲で開始し、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.