首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算电话号码中的旋转拨号脉冲数(包括字母)

计算电话号码中的旋转拨号脉冲数(包括字母)
EN

Code Golf用户
提问于 2019-05-23 02:51:25
回答 7查看 3.1K关注 0票数 37

在你祖父母的时代,拨打电话号码是用这样一个旋转刻度盘来完成的:

要拨号每一个数字,把你的手指在相应的洞,拉到手指停止,并释放它。一个机制将导致刻度盘旋转回到它的休息位置,电话将断开和重新连接一个电路指定的次数,使可听到的点击。

拨号数字N需要N个这样的“脉冲”,除了N=0是10个脉冲。

旋转电话具有大数字(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中的非金色查找表和函数:

代码语言:javascript
复制
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
EN

回答 7

Code Golf用户

发布于 2019-05-23 04:05:50

C# (可视化C#交互式编译器),51字节

代码语言:javascript
复制
n=>n.Sum(x=>x>64?(x-59-x/83-x/90)/3:x>47?1-~x%~9:0)

由于@递归而保存了1个字节

由于@ExpiredData观察到只有() +-/.将在输入中,所以保存了10个字节

在网上试试!

代码语言:javascript
复制
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
票数 9
EN

Code Golf用户

发布于 2019-05-23 03:39:43

Python 2,74字节

代码语言:javascript
复制
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值执行一些运算。第一个选项检查字母,第二个选项检查数字。输入中允许的所有标点符号都是ASCII值小于48个的字符,这一澄清让我简化了逻辑,但是现在一种新的方法可能更好。

Python 2,84字节

代码语言:javascript
复制
lambda s:sum(1+'1xxxx2ABCx3DEFx4GHIx5JKLx6MNOx7PQRS8TUVx9WXYZ0'.find(c)/5for c in s)

在网上试试!

使用硬编码的查找字符串,每块由5个字符组成的字符对应于以1开头的每个值。空格中填充x,不能在大写的输入中。偶然的是,没有出现在字符串中的字符会为-1生成.find,它给出的求和值为零。

票数 5
EN

Code Golf用户

发布于 2019-05-23 07:27:56

J,39字节

代码语言:javascript
复制
1#.'?@CFILOSVZ'&I.+11|1+'1234567890'i.]

在网上试试!

阿德姆APL解决方案的一个端口

票数 4
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/185993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档