ถอดรหัส 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 )
  • อินพุตรับประกันว่าถูกต้อง
  • คุณต้องพิมพ์หรือส่งออกของตัวละคร อย่างไรก็ตามคุณได้รับอนุญาตให้ส่งออกจำนวนเต็มสำหรับคีย์หลัก
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!

คำตอบ:


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","#"," "," "]เพื่อให้เอาท์พุท ช่องว่างอาจเป็นอักขระใด ๆ ก็ได้ พวกมันเป็นเพียงบัฟเฟอร์ในการสร้าง 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) รับอินพุตเป็น currying syntax ( ) และส่งคืนสตริงอักขระเดี่ยว
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
ข้อบกพร่อง

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.