Basit DTMF kod çözme: telefon anahtarını bulun!


11

Bu, umarım bazı yaratıcı cevaplara yol açabilecek basit bir zorluktur.

Wikipedia'dan alıntı : "Çift tonlu çok frekanslı sinyalleşme (DTMF), telefon ekipmanı ile diğer iletişim cihazları ve anahtarlama merkezleri arasındaki telefon hatları üzerinden ses frekansı bandı kullanan bir bant içi telekomünikasyon sinyalizasyon sistemidir."

Görev

Aşağıdaki tabloda sütun ve satır frekanslarını temsil eden iki tamsayı verildiğinde, göreviniz ilgili anahtarı çıkarmaktır:

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

Örnekler

  • Giriş ise [ 1209, 852 ], beklenen çıkış "7" dir.
  • Giriş ise [ 1477, 941 ], beklenen çıkış "#" olur.

kurallar

  • Girdiyi , iki ayrı değişken veya iki değişkenli bir dizi gibi makul bir biçimde tamsayı olarak almalısınız . Lütfen programınızın hangi sırayla beklediğini belirtin ( column_freq, row_freq veya row_freq, column_freq ).
  • Girişin geçerli olduğu garanti edilmektedir.
  • Bir karakteri yazdırmalı veya çıktı almalısınız . Ancak, sayısal tuşlar için bir tamsayı vermenize de izin verilir.
  • Bu , bu yüzden bayt en kısa cevap kazanır!

Yanıtlar:


2

Jöle , 19 bayt

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

Çevrimiçi deneyin!

Olarak girdi Alır row, columniki bağımsız değişken içinde.

Bu, 3*<first digit of row> + <column> + 6 % 14her biri için farklı bir değer vermek için kullanır . Bu [1,2,3,4,5,6,7,8,9,"*","0","#"," "," "]çıktı vermek için dizine eklenir . Alanlar gerçekten herhangi bir karakter olabilir; onlar sadece örtük bir mod 14 oluşturmak için tampon vardır.

Düşük seviye

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 bayt

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

Aralığında numaraları içine iki giriş eşleştirir [0, 13)hesaplayarak:
col % row % 83 % 16 % 13.
Currying sözdiziminde ( f(col)(row)) girdi alır ve tek karakterlik bir dize döndürür.

Test Durumları

Tarih

Eşlemede 8 boşa harcanan karakter gerektiren [0, 20)hesaplama aralığıyla başladı col % row % 29 % 20.


4

Haskell, 42 37 bayt

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

Bir dizeyi dizine eklemek için sadece matematik. Giriş sırası <column> # <row>örn 1336 # 697.

Çevrimiçi deneyin!

Düzenleme: @flawr kısa dizede çalışan bir formül buldu. Toplam -5 bayt. Teşekkürler!


1
Yaklaşımınızı optimize etmek için küçük bir program yazdım ve birkaç bayt kaydedebileceğiniz x#y="_1425__#9__*70836"!!mod(2*x+y)18
anlaşılıyor

3

MATL , 23 bayt

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

Girdiler: sütun sıklığı, sonra satır sıklığı.

Çevrimiçi deneyin!

açıklama

Sütun frekansını 13 ile çarpmak, satır frekansını eklemek ve modulo 79'u hesaplamak, 12 çift girişin her biri için farklı bir değer verir.

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 bayt

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

Çevrimiçi deneyin!

Açıklama:

&"~"/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.