在你祖父母的时代,拨打电话号码是用这样一个旋转刻度盘来完成的:
要拨号每一个数字,把你的手指在相应的洞,拉到手指停止,并释放它。一个机制将导致刻度盘旋转回到它的休息位置,电话将断开和重新连接一个电路指定的次数,使可听到的点击。
拨号数字N需要N个这样的“脉冲”,除了N=0是10个脉冲。
旋转电话具有大数字(8,9,0)比小数字(1,2,3)更长的拨号时间。这是绘制早期区号地图时的一个重要考虑因素,以及为什么人口密度(和电话线)密度较高的纽约市获得212 (只有5个脉冲),而907 (26个脉冲)则流向人口稀少的阿拉斯加州。当然,当触控拨号变得流行时,这一切都变得无关紧要了.
挑战
以尽可能少的字节编写一个程序或函数,该程序或函数以包含电话号码的字符串(或字符序列)作为输入,并输出其旋转拨号脉冲数。这些数字应计算如下:
请注意,刻度盘上的数字2-9有与之相关的拉丁字母.它们最初是为命名交易所设计的,但后者被重新分配给音词和文本消息输入系统。
您必须支持在您的电话号码中使用字母的E.161分配数字:
您可以假设输入已经折叠到大写或小写.
必须允许任意使用字符()+-./和空格作为格式分隔符。如果更容易实现,您可以选择允许任何非字母数字字符用于此目的。
这些字符对脉冲计数没有贡献。
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→11867-5309→48713 555 0123→42+1 (212) PE6-5000→571-800-FLOWERS→69PUZZLES→48发布于 2019-05-23 04:05:50
n=>n.Sum(x=>x>64?(x-59-x/83-x/90)/3:x>47?1-~x%~9:0)由于@递归而保存了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发布于 2019-05-23 03:39:43
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个的字符,这一澄清让我简化了逻辑,但是现在一种新的方法可能更好。
lambda s:sum(1+'1xxxx2ABCx3DEFx4GHIx5JKLx6MNOx7PQRS8TUVx9WXYZ0'.find(c)/5for c in s)使用硬编码的查找字符串,每块由5个字符组成的字符对应于以1开头的每个值。空格中填充x,不能在大写的输入中。偶然的是,没有出现在字符串中的字符会为-1生成.find,它给出的求和值为零。
发布于 2019-05-23 07:27:56
https://codegolf.stackexchange.com/questions/185993
复制相似问题