À l'époque de vos grands-parents, la composition d'un numéro de téléphone se faisait avec un cadran rotatif comme celui-ci:
Pour composer chaque chiffre, placez votre doigt dans le trou correspondant, tirez-le jusqu'à la butée et relâchez-le. Un mécanisme fera revenir le cadran dans sa position de repos et le téléphone déconnectera et reconnectera un circuit un nombre spécifié de fois, en produisant des clics audibles.
La composition du chiffre N nécessite N de telles "impulsions", à l'exception de N = 0 qui correspond à dix impulsions.
Les téléphones rotatifs ont la propriété que les gros chiffres (8, 9, 0) prennent plus de temps à composer que les petits chiffres (1, 2, 3). C’était là un facteur important dans l’établissement des premières cartes indicatrices interurbaines et des raisons pour lesquelles la ville de New York, avec sa densité de population (et sa ligne téléphonique) dense, s’élevait à 212 (seulement 5 impulsions), alors que 907 (26 impulsions) étaient destinées à l’Alaska peu peuplé. Bien sûr, tout cela est devenu inutile lorsque la numérotation à clavier est devenue populaire.
Le défi
Ecrivez, avec le moins d’octets possible, un programme ou une fonction prenant en entrée une chaîne de caractères (ou une séquence de caractères) contenant un numéro de téléphone et émettant son nombre d’impulsions de cadran rotatif. Ceux-ci doivent être comptés comme suit:
Chiffres
- Les chiffres 1 à 9 comptent comme ce nombre d'impulsions.
- Le chiffre 0 compte pour 10 impulsions.
Des lettres
Notez que les lettres 2 à 9 du cadran sont associées à des lettres de l'alphabet latin. Celles-ci étaient à l'origine destinées aux échanges nommés , mais ont été réappropriées pour les mots de téléphone et les systèmes de saisie de SMS.
Vous devez pouvoir utiliser des lettres dans vos numéros de téléphone, en utilisant l' affectation de lettres en chiffres 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
Vous pouvez supposer que l'entrée a déjà été pliée en majuscules ou en minuscules.
Autres personnages
Vous devez autoriser l'utilisation arbitraire des caractères ()+-./
et de l'espace en tant que séparateurs de formatage. Vous pouvez choisir d’autoriser tout caractère non alphanumérique à cette fin, s’il est plus facile à implémenter.
Ces caractères ne contribuent pas au nombre d'impulsions.
Exemple de code
Une table de recherche non-golfée et une fonction en 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)
Exemple d'entrée et de sortie
911
→ 11867-5309
→ 48713 555 0123
→ 42+1 (212) PE6-5000
→ 571-800-FLOWERS
→ 69PUZZLES
→ 48
+- ()*#.
), tout comme les lettres sont limitées à des majuscules. Corrige moi si je me trompe.*
et#
, qui ont une signification particulière sur les téléphones à clavier et ne sont pas numérotables sur des rotations.Réponses:
05AB1E ,
19181715 octetsEssayez-le en ligne!
C'est la première réponse à utiliser π. Pourquoi utiliser π, vous pourriez demander? Eh bien, les lettres sont associées à 22233344455566677778889999, dans l’ordre. Notez que la plupart des chiffres se répètent 3 fois, mais 7 se répètent 4 fois. On pourrait dire que chaque chiffre se répète (3 + 1/7) fois en moyenne. Je me demande s’il existe un nombre d’environ 3 + 1/7 et prenant moins d’octets que 22/7…
Cela donne seulement 4 7, pas 4 9, nous devons donc traiter Z comme cas spécial.
la source
"abcdefghijklmnopqrstuvwxyz"
, mais pas pour"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. Je pourrais convertir l'alphabet en majuscule plutôt que convertir l'entrée en minuscule, mais c'est le même décompte.C # (compilateur interactif Visual C #) , 51 octets
Enregistré 1 octet grâce à @recursive
Sauvegardé 10 octets grâce à l'observation de @ ExpiredData qui ne
() +-/.
sera que dans l'entréeEssayez-le en ligne!
la source
-10
est~9
, ce qui devrait fonctionner dans le contexte.APL (Dyalog Unicode) , SBCS 27 octets
Fonction de préfixe tacite anonyme.
Essayez-le en ligne!
(
…)∘⍳
Trouvez le ɩ ndex * de chaque caractère dans la chaîne suivante:* éléments non trouvés, obtenez l'index 1 + l'index maximum, c'est-à-dire 11
⎕D
les chiffres:"0123456789"
1⌽
faire une rotation cyclique d'un pas à gauche;"1234567890"
11|
division reste quand divisé par 11 ** cela donne 0 pour tous les chiffres non digitaux
…
+
ajoutez cela à ce qui suit:'@ADGJMPTW'∘⍸
le ɩ ntervalle ɩ ndex * pour chaque caractère* Alors [-∞, "@") donne 0, [ "@", "A") donne 1, [ "A", "D") donne 2, etc.
+/
sommela source
Python 2 , 74 octets
Essayez-le en ligne!
Fait un peu d'arithmétique sur la valeur ASCII pour chaque caractère. La première option vérifie les lettres et la deuxième option vérifie les chiffres. La clarification que tous les caractères de ponctuation autorisés dans l'entrée sont ceux avec des valeurs ASCII inférieures à 48 me permet de simplifier la logique, mais une nouvelle méthode pourrait tout à fait être meilleure.
Python 2 , 84 octets
Essayez-le en ligne!
Utilise une chaîne de recherche codée en dur, avec chaque bloc de 5 caractères correspondant aux caractères donnant chaque valeur commençant par 1. Les espaces vides sont remplis
x
, ce qui ne peut pas être dans l'entrée en majuscule. Heureusement, les caractères qui n'apparaissent pas dans la chaîne produisent-1
pour le.find
qui donne une somme de zéro.la source
JavaScript (Node.js) , ...
7669 octetsEssayez-le en ligne!
-7 merci @Arnauld!
Explication
Tous
[space]().+-/
ne sont pas capturés par/\w/g
, ils n'affecteront donc pas le total.la source
Perl 5
-p
,5251 octets@Grimy reçoit un crédit de -1
Essayez-le en ligne!
la source
/\d/g
devrait être/./g
pour -1 (oui, il gère toujours la ponctuation correctement).J , 39 octets
Essayez-le en ligne!
Un port de la solution APL d' Adám
la source
Retina 0.8.2 , 34 octets
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Convertissez les lettres
WTPMJGDA
en chiffres9..0
.Mélangez toutes les lettres restantes de 1 et répétez l'opération jusqu'à ce que toutes les lettres aient été converties en chiffres.
Remplacez
0
par55
car ils prennent le même nombre d'impulsions à composer.Prenez la somme numérique.
la source
K4 , 44 octets
Solution:
Exemples:
Explication:
Approche naïve, probablement assez golfable. Indice de recherche du personnage, score de recherche, somme.
la source
Perl 6 , 53 octets
Essayez-le en ligne!
Multiplie le code ASCII avec 0.313 au lieu de 1/3 et utilise OU au niveau du bit qui arrondit à zéro pour obtenir le biais correct .
la source
C (gcc) ,
94898680 octetsMerci à ceilingcat, nwellnhof et Rogem pour les suggestions.
Essayez-le en ligne!
la source
c<43U
lieu dec-17<26U
Bash , 256 octets
Vous pouvez remplacer les
(( … ))
constructions aveclet
un nombre d'octets identique. Il peut exister un bon algorithme pour réduire les déclarations de cas mais ne l’a pas trouvé jusqu’à présent. Avec un peu de retouche, vous pouvez aussi en faire une fonction (mais pas avec le même nombre d’octets ou avec moins, sauf si vous pouvez ignorer lefunction fname { … }
haut et le bas ).Essayez-le en ligne!
Une meilleure solution utilisant la technique du caractère de carte utilise l'
tr
outil:[Bash avec tr], 173 octets
Essayez-le en ligne!
la source
while((${#p}))
fonctionne en économisant trois octets.c=${p:0:1};case c in ([0-9]) ((d+=c?c:10));;
enregistre encore 16. Avec l'tr -dc 0-9
ajout au pipeline, vous n'avez plus besoin d'une déclaration de cas et l'ajout peut être incorporé à l'while
état&&
.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
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
.. les trois derniers 9 ne sont pas nécessaires car tr réutilisera le dernier caractère de remplacement si le deuxième argument est trop court.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
Gelée ,
33 à24 octetsEssayez-le en ligne!
Un lien monadique prenant une chaîne en tant qu'argument et renvoyant le nombre d'impulsions. Réécrit inspiré par la réponse de @ Grimy's 05AB1E , assurez-vous de les inviter à la vôtre!
la source
PowerShell ,
10910287 octetsEssayez-le en ligne!
EDIT: A utilisé l'idée de @ mazzy pour un commutateur regex avec un formatage de chaîne pour transtyper char -> int -> string et ne saisir que le premier 'chiffre'
Original:
J'espérais avoir moins de 100 octets, je vais donc continuer à regarder pour voir s'il y a quelque chose que je peux faire. Il y a probablement un moyen de supprimer la chaîne numérique
Désolé si cela est source de confusion car j'ai imbriqué des tableaux avec des déclarations d'indexation booléennes, mais -
Explication:
[char[]]"$args"|%{
lit l'entrée convertie en chaîne, puis l'explose en tableau de caractères et commence une boucle for-each en vérifiant()[$_-gt47]
si elle a()+-./
été entrée (toutes ont une valeur de caractère ascii <48)Remarque: Powershell accepte
$true
et$false
comme1
et0
respectivement pour les indices de tableauEnsuite, nous obtenons soit
48
les symboles, soit:('22233344455566677778889999'[$_-65],(58,$_)[$_-ne48])[$_-lt64]
Les
[$_-lt64]
chèques pour un numéro ou une lettre (tous supposés capital ici). S'il s'agit d'une lettre,'22233344455566677778889999'[$_-65]
réglez-le sur 0-25 pour indexer dans le tableau et générer la valeur d'impulsion (sous forme de caractère). Si le caractère est un nombre, nous examinons plutôt: la(58,$_)[$_-ne48]
recherche0
et la sortie58
ou simplement le caractère numérique lui-même.Tout autour
$a+= ... -=48
initialise une variable numérique $ a at0
et ajoute la sortie. La sortie est la valeur de caractère ascii d'un nombre, donc soustrayez48
.Remarque: si l'entrée était un symbole, nous l'
$a+=48-48
ignorons. Si c'était le cas0
, nous$a+=58-48
obtenons notre +10Enfin, il nous
;$a
suffit de sortir notre valeur finale après pour chaque bouclela source
=
reste de mes méthodes précédentes pour résoudre ce problème, merci pour le piège! Bien que, je n'ai pas vut*y
auparavant, pourriez-vous expliquer pourquoi cela fonctionne pour exploser la chaîne dans un tableau de caractères?-f
et[0]
.PowerShell ,
958579 octetsinspiré par la réponse de Nwellnhof .
inspiré par la réponse
[0]
de Sinusoid .Essayez-le en ligne!
Version déroulée:
la source
Stax , 21 octets
Exécuter et déboguer
la source
Kotlin , 113 octets
Essayez-le en ligne!
la source
Python 3 ,
134123 octetsEssayez-le en ligne!
-11 octets grâce à @ dan04
la source
'ADGJMPTWBEHKNQUXCFILNRVYSZ'
, vous pouvez réduire la chaîne de nombres à'23456789'*3+'79'
.