電話番号(文字を含む)のロータリーダイヤルパルスをカウントする


34

祖父母の日、電話番号のダイヤルは次のようなロータリーダイヤルで行われました。

各数字をダイヤルするには、対応する穴に指を入れて指先まで引っ張り、離します。メカニズムにより、ダイヤルが静止位置に戻り、電話機は指定された回数だけ回路を切断および再接続し、カチッという音がします。

数字Nをダイヤルするには、10個のパルスであるN = 0を除き、そのような「パルス」をN 必要とします。

回転式電話には、大きい数字(8、9、0)が小さい数字(1、2、3)よりもダイヤルに時間がかかるという特性があります。これは、初期のエリアコードマップを作成する際の重要な考慮事項であり、人口(および電話回線)の密度が高いニューヨーク市が212(5パルスのみ)だったのに対し、907(26パルス)はまばらに住んでいたアラスカに行った理由です。もちろん、タッチトーンダイヤルが一般的になったとき、これはすべて無関係になりました。

チャレンジ

電話番号を含む文字列(または文字のシーケンス)を入力として受け取り、その回転ダイヤルパルスの数を出力するプログラムまたは関数を、できる限り少ないバイト数で書き込みます。これらは次のようにカウントされます。

  • 桁1〜9は、そのパルス数としてカウントされます。
  • 桁0は10パルスとしてカウントされます。

手紙

ダイヤルの2〜9の数字には、ラテンアルファベットの文字が関連付けられていることに注意してください。これらは元々は名前付き交換を対象としていましたが、後者は電話ワードやテキストメッセージ入力システムに再適用されました

E.161文字の数字への割り当てを使用して、電話番号に文字を含めることをサポートする必要があります。

  • A、B、C = 2
  • D、E、F = 3
  • G、H、I = 4
  • J、K、L = 5
  • M、N、O = 6
  • P、Q、R、S = 7
  • T、U、V = 8
  • W、X、Y、Z = 9

入力は、大文字または小文字のいずれかにすでに大文字変換されていると仮定できます。

その他のキャラクター

文字とスペースをフォーマット区切り文字として任意に使用できるようにする必要あります()+-./。実装が簡単な場合は、この目的で英数字以外の文字を許可することを選択できます

これらの文字は、パルスカウントには寄与しません。

サンプルコード

Pythonの非ゴルフルックアップテーブルと関数:

PULSES = {
    '1': 1,
    '2': 2, 'A': 2, 'B': 2, 'C': 2,
    '3': 3, 'D': 3, 'E': 3, 'F': 3,
    '4': 4, 'G': 4, 'H': 4, 'I': 4,
    '5': 5, 'J': 5, 'K': 5, 'L': 5,
    '6': 6, 'M': 6, 'N': 6, 'O': 6,
    '7': 7, 'P': 7, 'Q': 7, 'R': 7, 'S': 7,
    '8': 8, 'T': 8, 'U': 8, 'V': 8,
    '9': 9, 'W': 9, 'X': 9, 'Y': 9, 'Z': 9,
    '0': 10
}

def pulse_count(phone_num):
    return sum(PULSES.get(digit, 0) for digit in phone_num)

入力と出力の例

  • 911 →11
  • 867-5309 →48
  • 713 555 0123 →42
  • +1 (212) PE6-5000 →57
  • 1-800-FLOWERS →69
  • PUZZLES →48

文字が大文字に制限されているように、任意のASCII句読点とスペースは電話番号(+- ()*#.)に通常使用されているものに制限されていると思います。私が間違っている場合は修正してください。
アダム

1
@Adám:必要な句読点をいくつかの一般的な区切り文字に制限しました。意図的に*およびを含めません#。これらは、タッチトーン電話では特別な意味を持ち、ロータリではダイヤルできません。
dan04

1
すべて大文字の代わりにすべて小文字の入力を使用できますか?文字列の代わりに文字の配列を使用できますか?
グリムミー

1
私はタイムトラベラーです!私はタイムトラベラーです!私はタイムトラベラーです!子供の頃は間違いなくこのような携帯電話を使っていたので、明らかに私は自分の祖父です!!!!!!! 私はそれについて考えると、実際にはかなりむかつくです。ブリー!!!
ボブジャービス-モニカの復職

3
私は祖父です。私は1950年代にこのような電話を使用しました。そして、田舎の町に引っ越したとき、電話会社がタッチトーンサービスを提供していないことを発見しました。これは1985年でした!冗談じゃない!私の祖母は、フックとクランクを持った電話をパーラーに持っていました。受話口をフックから外し、クランクを回して配電盤オペレーターを取得しました。彼女は、直通ダイヤルが設定されたときに交換する必要がありました。
ウォルターミッティ

回答:


25

05AB1E19 18 17 15バイト

AÁ0ªā6+žq÷9š‡þO

オンラインでお試しください!

これは、πを使用する最初の答えです。なぜπを使用するのでしょうか?まあ、文字は順番に22233344455566677778889999に関連付けられています。ほとんどの数字は3回繰り返されますが、7は4回繰り返されます。平均すると、各桁が(3 + 1/7)回繰り返されると言えます。約3 + 1/7で、22/7よりもバイト数が少ない番号があるのではないかと思います。

これは4 9でなく4 7のみを与えるため、Zを特別なケースとして処理する必要があります。

A               # alphabet (abcdefghijklmnopqrstuvwxyz)
 Á              # rotate right (zabcdefghijklmnopqrstuvwxy)
  0ª            # append 0 (zabcdefghijklmnopqrstuvwxy0)

ā6+             # range [7..33]
   žq÷          # divide by π (22233344455566677778889991010)
      9š        # prepend 9 (922233344455566677778889991010)

‡               # transliterate the implicit input with the two lists above
                # this replaces z → 9, a → 2, … y → 9, 0 → 10
 þ              # remove all non-digits
  O             # sum

大文字ではなく小文字にする理由
dan04

1
@ dan04は、05AB1Eにプッシュするビルトイン"abcdefghijklmnopqrstuvwxyz"があり"ABCDEFGHIJKLMNOPQRSTUVWXYZ"ますが、ではありません。入力を小文字に変換するのではなく、アルファベットを大文字に変換することもできますが、それは同じバイト数です。
グリムミー

1
最初の2つのコマンドが不要になるように質問を編集しました。
dan04

3
@Jonah範囲を定数で除して目的のシーケンスを取得するというアイデアから始め、05AB1Eで「わずかに3つ以上」を表現するための最良の方法を探しながら、piが組み込みであることを思い出しました。
グリムミー

2
piを使用する場合は+1
ドラコニス

9

C#(Visual C#Interactive Compiler)、51バイト

n=>n.Sum(x=>x>64?(x-59-x/83-x/90)/3:x>47?1-~x%~9:0)

@recursiveのおかげで1バイト節約

() +-/.入力にのみ存在する@ExpiredDataの観測のおかげで10バイト節約

オンラインでお試しください!

n =>                     // Function taking input as string
  n.Sum(x =>             // Map each value 'x' through the following
    x>64 ?               //   If 'x' is an uppercase letter
      (x-59-x/83-x/90)/3 //     Take each char's ASCII value subtracted by 59, and subtract
                         //     one if the char is 'S' and one if the char is 'Z'
    : x>47 ?             //   Else if the char is a digit
      1-~x%~9            //   Take 1 - (-x - 1) % -10 (Maps 0 to 10, and 1-9 to themselves
    : 0                  //   Else, 0
  )                      // And sum it all up, then return it

4
-10ある~9コンテキストで動作するはずです。
再帰的な

@recursiveそれは賢明です、ありがとう
無知

1
入力は()+-。/スペースキーと64未満の数字のみで構成されるため、x <91チェックは冗長です。したがって、x> 64をチェックするだけで文字が大文字かどうかを判断できます(したがって、-5バイト)
期限切れのデータ

同じことが58から64は、入力になります範囲で何もするので、X <58のチェックのために行く
期限切れのデータ


5

APL(Dyalog Unicode)、27 バイトSBCS

匿名の暗黙の接頭辞関数。

+/'@ADGJMPTW'∘⍸+11|(1⌽⎕D)∘⍳

オンラインでお試しください!

(... )∘⍳ 見つけɩ:以下の文字列の各文字の* NDEXを
  、見つからなかった*要素のインデックス1つの+最大指数、すなわち11入手
⎕D  桁:"0123456789"

1⌽ 周期的に左に1ステップ回転します。 "1234567890"

11| 11 *で除算したときの除算剰余
  *これは、すべての非数字に0を与えます
+ それを以下に追加します:

'@ADGJMPTW'∘⍸ɩ nterval ɩ NDEX *各文字の
  *だから、[-∞、 "@")[ "@"、 "A")、0を与えるなど、[ "A"、 "D")は2を与え、1を与える
+/  総和こと


5

Python 2、74バイト

lambda s:sum([(n-59-n/83-n/90)/3,1-~n%~9][n<58]for n in map(ord,s)if n>47)

オンラインでお試しください!

各文字のASCII値に対して何らかの演算を行います。最初のオプションは文字をチェックし、2番目のオプションは数字をチェックします。入力で許可されるすべての句読文字は、ASCII値が48未満の文字であるという明確化により、ロジックを簡素化できますが、新しいメソッドを使用する方が全体的に改善される可能性があります。

Python 2、84バイト

lambda s:sum(1+'1xxxx2ABCx3DEFx4GHIx5JKLx6MNOx7PQRS8TUVx9WXYZ0'.find(c)/5for c in s)

オンラインでお試しください!

ハードコード化されたルックアップ文字列を使用します。5文字の各ブロックは、1で始まる各値を与える文字に対応します。空白は、で埋められxます。偶然にも、文字列に現れない文字は、ゼロの加数を与える-1ために生成され.findます。


5

JavaScript(Node.js)、... 76 69バイト

s=>s.replace(/\w/g,q=>w+=1/q?+q||10:parseInt(q,35)*.32-1|0||9,w=0)&&w

オンラインでお試しください!

-7ありがとう@Arnauld!

説明

 q |     1/q     |  +q  | parseInt(q,35)*.32 | parseInt(q,35)*.32-1|0 | Output
---+-------------+------+--------------------+------------------------+--------
 0 | Infinity(T) | 0(F) |         N/A        |           N/A          |   10
 1 |  1.0000(T)  | 1(T) |         N/A        |           N/A          |    1
 2 |  0.5000(T)  | 2(T) |         N/A        |           N/A          |    2
 3 |  0.3333(T)  | 3(T) |         N/A        |           N/A          |    3
 4 |  0.2500(T)  | 4(T) |         N/A        |           N/A          |    4
 5 |  0.2000(T)  | 5(T) |         N/A        |           N/A          |    5
 6 |  0.1666(T)  | 6(T) |         N/A        |           N/A          |    6
 7 |  0.1428(T)  | 7(T) |         N/A        |           N/A          |    7
 8 |  0.1250(T)  | 8(T) |         N/A        |           N/A          |    8
 9 |  0.1111(T)  | 9(T) |         N/A        |           N/A          |    9
 A |    NaN(F)   |  N/A |        3.20        |          2(T)          |    2
 B |    NaN(F)   |  N/A |        3.52        |          2(T)          |    2
 C |    NaN(F)   |  N/A |        3.84        |          2(T)          |    2
 D |    NaN(F)   |  N/A |        4.16        |          3(T)          |    3
 E |    NaN(F)   |  N/A |        4.48        |          3(T)          |    3
 F |    NaN(F)   |  N/A |        4.80        |          3(T)          |    3
 G |    NaN(F)   |  N/A |        5.12        |          4(T)          |    4
 H |    NaN(F)   |  N/A |        5.44        |          4(T)          |    4
 I |    NaN(F)   |  N/A |        5.76        |          4(T)          |    4
 J |    NaN(F)   |  N/A |        6.08        |          5(T)          |    5
 K |    NaN(F)   |  N/A |        6.40        |          5(T)          |    5
 L |    NaN(F)   |  N/A |        6.72        |          5(T)          |    5
 M |    NaN(F)   |  N/A |        7.04        |          6(T)          |    6
 N |    NaN(F)   |  N/A |        7.36        |          6(T)          |    6
 O |    NaN(F)   |  N/A |        7.68        |          6(T)          |    6
 P |    NaN(F)   |  N/A |        8.00        |          7(T)          |    7
 Q |    NaN(F)   |  N/A |        8.32        |          7(T)          |    7
 R |    NaN(F)   |  N/A |        8.64        |          7(T)          |    7
 S |    NaN(F)   |  N/A |        8.96        |          7(T)          |    7
 T |    NaN(F)   |  N/A |        9.28        |          8(T)          |    8
 U |    NaN(F)   |  N/A |        9.60        |          8(T)          |    8
 V |    NaN(F)   |  N/A |        9.92        |          8(T)          |    8
 W |    NaN(F)   |  N/A |       10.24        |          9(T)          |    9
 X |    NaN(F)   |  N/A |       10.56        |          9(T)          |    9
 Y |    NaN(F)   |  N/A |       10.88        |          9(T)          |    9
 Z |    NaN(F)   |  N/A |         NaN        |          0(F)          |    9

すべてが[space]().+-/にキャプチャされ/\w/gないため、合計には影響しません。




4

Retina 0.8.2、34バイト

T`WTPMJGDA`Rd
}T`L`2L
0
55
\d
$*
1

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

T`WTPMJGDA`Rd

文字WTPMJGDAを数字に変換します9..0

}T`L`2L

残りのすべての文字を1ずつシャッフルし、すべての文字が数字に変換されるまで繰り返します。

0
55

交換する055、彼らがダイヤルするパルスの同じ数を取るよう。

\d
$*
1

デジタル合計を取ります。


3

K4、44バイト

溶液:

+/(1+(1+&(5#3),4 3 4),!10)(.Q.A,1_.Q.n,"0")?

例:

q)k)+/(1+(1+&(5#3),4 3 4),!10)(.Q.A,1_.Q.n,"0")?"911"
11
q)k)+/(1+(1+&(5#3),4 3 4),!10)(.Q.A,1_.Q.n,"0")?"867-5309"
48
q)k)+/(1+(1+&(5#3),4 3 4),!10)(.Q.A,1_.Q.n,"0")?"+1 (212) PE6-5000"
57
q)k)+/(1+(1+&(5#3),4 3 4),!10)(.Q.A,1_.Q.n,"0")?"1-800-FLOWERS"
69

説明:

ナイーブアプローチ、おそらくかなりゴルファーです。文字のルックアップインデックス、ルックアップスコア、合計。

+/(1+(1+&(5#3),4 3 4),!10)(.Q.A,1_.Q.n,"0")? / the solution
                                           ? / lookup
                          (               )  / do this together
                                       "0"   / string "0"
                                      ,      / join with
                                  .Q.n       / string "0123456789"
                                1_           / drop first
                               ,             / join with
                           .Q.A              / "A..Z"
  (                      )                   / do this together
                      !10                    / range 0..9
                     ,                       / join with
     (              )                        / do this together
               4 3 4                         / list (4;3;4)
              ,                              / join with
         (5#3)                               / list (3;3;3;3;3)
        &                                    / where, creates list 0 0 0 1 1 1 2 2 etc
      1+                                     / add 1
   1+                                        / add 1
+/                                           / sum up



2

Bash、256バイト

同一のバイトカウントの(( … ))構造を置き換えることができletます。caseステートメントを削減するための適切なアルゴリズムがあるかもしれませんが、これまでのところ見つかりませんでした。少し手直しすれば、それを関数にすることもできます(ただし、function fname { … }トップとテールを割り引くことができる場合を除き、同じバイトまたはそれより少ないバイトではありません)。

read p;while ((${#p}>0));do case ${p:0:1} in ([1-9]) ((d+=${p:0:1}));; ([0]) ((d+=10));; ([ABC) ((d+=2));; ([P-S]) ((d+=7));; ([W-Z]) ((d+=9));;([DEF]) ((d+=3));; ([GHI]) ((d+=4));; ([JKL]) ((d+=5));; ([MNO]) ((d+=6));; (?) d=$d; esac;p=${p#?};done;echo $d

オンラインでお試しください!

マップキャラクターテクニックを使用したより良いソリューションは、trツールを使用します。

[trでバッシュ]、173バイト

read p;p=$(echo $p|tr A-Z 22233344455566677778889999);while ((${#p}>0));do case ${p:0:1} in ([1-9]) ((d+=${p:0:1}));; ([0]) ((d+=10));; (?) d=$d; esac;p=${p#?}; done;echo $d

オンラインでお試しください!


もちろん私が見逃したアルゴリズムの1つは、AZで文字列の置換/翻訳を行うことです。これはいいだろう。上記に合わせて修正します。
PJF

while((${#p})) 動作し、3バイトを節約します。 c=${p:0:1};case c in ([0-9]) ((d+=c?c:10));;さらに16を保存しtr -dc 0-9ます。trパイプラインに追加された場合、caseステートメントはまったく必要なく、追加はでwhile条件にフォールドできます&&
Oh My Goodness

OMGに感謝します。私は三項の割り当てを頻繁に使用しないので、それを見逃しました。削除補完の興味深い使用も同様です(ただし、これは私のソリューションのように他の文字を無視することを前提としています)。私はのように133バイトにそれを得るために管理している: read p;p=$(echo $p|tr A-Z 22233344455566677778889999|tr -dc [0-9]);while ((${#p}));do c=${p:0:1}&&((d+=c?c:10));p=${p#?};done;echo $d
PJF

1
118:p=$(head -1|tr A-Z 22233344455566677778889|tr -dc 0-9);while((${#p}));do((d+=(c=${p:0:1})?c:10));p=${p#?};done;echo $d.. 2番目の引数が短すぎる場合、trは最後の置換文字を再利用するため、最後の3つの9は必要ありません。
Oh My Goodness

1
最初の例は、いくつかの不要なスペースを削除することにより、256から236に削減できます。 read p;while((${#p}>0));do case ${p:0:1} in ([1-9])((d+=${p:0:1}));;([0])((d+=10));;([ABC)((d+=2));;([P-S])((d+=7));;([W-Z])((d+=9));;([DEF])((d+=3));;([GHI])((d+=4));;([JKL])((d+=5));;([MNO])((d+=6));;(?)d=$d;esac;p=${p#?};done;echo $d
スティーブ・


2

PowerShell109 102 87バイト

$(switch -r($args|% t*y){\d{$_}[A-Y]{("{0}"-f(.313*$_-18))[0]}[Z]{9}0{10}})-join'+'|iex

オンラインでお試しください!

編集:@mazzyのアイデアを使用して、char-> int-> stringをキャストし、最初の「数字」のみを取得するいくつかの文字列フォーマットを持つ正規表現スイッチ

元の:

[char[]]"$args"|%{$a+=(48,(('22233344455566677778889999')[$_-65],(58,$_)[$_-ne48])[$_-lt64])[$_-gt47]-=48};$a

100バイト未満を取得することを望んでいたので、他にできることがあるかどうかを確認するためにそれを調べ続けます。おそらく数字の文字列を削除する方法があります

ブールインデックスステートメントを使用して配列をネストしているため、これが混乱する場合は申し訳ありませんが、

説明:

[char[]]"$args"|%{文字列としてキャストされた入力を読み取り、それをchar配列に展開し、入力された()[$_-gt47]かどうかをチェックしてfor-eachループを開始します()+-./(すべてASCII文字値<48)
注:Powershellは$true$falseas 1およびas を受け入れます0アレイインデックスのそれぞれについて

次に48、シンボル、または次のいずれかを取得します。
('22233344455566677778889999'[$_-65],(58,$_)[$_-ne48])[$_-lt64]

[$_-lt64]数字または文字のチェック(ここではすべて大文字と見なされます)。文字の場合、'22233344455566677778889999'[$_-65]0-25に変更して配列にインデックスを付け、パルス値を(charとして)出力します。文字が数字の場合は、代わりに次の(58,$_)[$_-ne48]ことを確認します。チェックし0て出力する58か、数値の文字自体だけを確認します。

すべての周りで$a+= ... -=48、数値変数$ aを初期化し0、出力を追加します。出力は数値のascii char値なので、減算し48ます。

注:入力がシンボルの場合、を取得し$a+=48-48、事実上無視します。それがあった場合は0、我々が得る$a+=58-48私たちを得ることが+10

最後に、;$afor-eachループ後の最終値を出力するだけです



ああ、そうです、余分な括弧があり、=そこに、これを解決する以前の方法から残った、キャッチのおかげです!しかし、私はt*y前に見たことがありませんが、なぜそれが文字列を文字配列に爆発させるのに役立つのか説明できますか?
正弦波


「<100バイト」を取得するには:オンラインで試してください!:)
幻想的な

良好なアイデア-f[0]
mazzy

2

PowerShell95 85 79バイト

nwellnhofの答えに触発されました

Sinusoidの回答に触発され[0]ました。

$(switch -r($args|% t*y){\d{$_}0{10}[A-Y]{"$(.313*$_-18)"[0]}Z{9}})-join'+'|iex

オンラインでお試しください!

展開されたバージョン:

$(
    switch -r($args|% toCharArray){
        \d    {$_}
        0     {10}
        [A-Y] {"$(.313*$_-18)"[0]}
        Z     {9}
    }
)-join '+'|Invoke-Expression
key .313*$_-18 "$(...)"[0]
--- ---------- -----------
  A      2.345 2
  B      2.658 2
  C      2.971 2
  D      3.284 3
  E      3.597 3
  F      3.910 3
  G      4.223 4
  H      4.536 4
  I      4.849 4
  J      5.162 5
  K      5.475 5
  L      5.788 5
  M      6.101 6
  N      6.414 6
  O      6.727 6
  P      7.040 7
  Q      7.353 7
  R      7.666 7
  S      7.979 7
  T      8.292 8
  U      8.605 8
  V      8.918 8
  W      9.231 9
  X      9.544 9
  Y      9.857 9

1
チームの努力!:D
正弦波



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.