Giải mã DTMF đơn giản: tìm khóa điện thoại!


11

Đây là một thách thức đơn giản mà hy vọng có thể dẫn đến một số câu trả lời sáng tạo.

Trích dẫn Wikipedia : "Tín hiệu đa tần số âm kép (DTMF) là một hệ thống tín hiệu viễn thông trong băng tần sử dụng băng tần thoại qua các đường dây điện thoại giữa thiết bị điện thoại và các thiết bị liên lạc và trung tâm chuyển mạch khác."

Bài tập

Cho hai số nguyên biểu thị tần số cột và hàng trong bảng sau, nhiệm vụ của bạn là xuất khóa tương ứng:

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

Ví dụ

  • Nếu đầu vào là [ 1209, 852 ], đầu ra dự kiến ​​là "7".
  • Nếu đầu vào là [ 1477, 941 ], đầu ra dự kiến ​​là "#".

Quy tắc

  • Bạn phải lấy đầu vào dưới dạng số nguyên ở bất kỳ định dạng hợp lý nào, chẳng hạn như hai biến riêng biệt hoặc một mảng gồm hai biến. Vui lòng xác định theo thứ tự chương trình của bạn đang mong đợi chúng (hoặc cột_freq, row_freq hoặc row_freq, cột_freq ).
  • Đầu vào được đảm bảo là hợp lệ.
  • Bạn phải in hoặc xuất ký tự . Tuy nhiên, bạn cũng được phép xuất một số nguyên cho các phím số.
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!

Câu trả lời:


2

Thạch , 19 byte

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

Hãy thử trực tuyến!

Đưa đầu vào là row, columntrong hai đối số.

Điều này sử dụng 3*<first digit of row> + <column> + 6 % 14để cung cấp một giá trị khác nhau cho mỗi. Điều này được lập chỉ mục [1,2,3,4,5,6,7,8,9,"*","0","#"," "," "]để cung cấp cho đầu ra. Các không gian thực sự có thể là bất kỳ nhân vật; chúng chỉ là bộ đệm để tạo mod 14 ẩn.

Cấp thấp

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 byte

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

Ánh xạ hai đầu vào thành số trong phạm vi [0, 13)bằng cách tính toán :
col % row % 83 % 16 % 13.
Đưa đầu vào theo cú pháp currying ( f(col)(row)) và trả về một chuỗi char đơn.

Các trường hợp thử nghiệm

Lịch sử

Bắt đầu với phạm vi [0, 20)tính toán col % row % 29 % 20, yêu cầu 8 ký tự bị lãng phí trong ánh xạ.


4

Haskell, 42 37 byte

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

Chỉ cần một số toán học để lập chỉ mục một chuỗi. Thứ tự đầu vào là <column> # <row>, ví dụ 1336 # 697.

Hãy thử trực tuyến!

Chỉnh sửa: @flawr tìm thấy một công thức hoạt động trên chuỗi ngắn hơn. Tổng thể -5 byte. Cảm ơn!


1
Tôi vừa viết một chương trình nhỏ để tối ưu hóa cách tiếp cận của bạn và có vẻ như bạn có thể lưu một vài byte:x#y="_1425__#9__*70836"!!mod(2*x+y)18
flawr

3

MATL , 23 byte

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

Đầu vào là: tần số cột, sau đó tần số hàng.

Hãy thử trực tuyến!

Giải trình

Nhân tần số cột với 13, thêm tần số hàng và tính toán modulo 79 mang lại một giá trị khác nhau cho mỗi trong số 12 cặp đầu vào.

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 byte

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

Hãy thử trực tuyến!

Giải trình:

&"~"/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.