Votre tâche consiste à calculer le nombre total d'appuis sur les touches nécessaires pour saisir un texte donné sur un ancien téléphone portable.
Les keymaps sont:
1:1
2:abcABC2
3:defDEF3
4:ghiGHI4
5:jklJKL5
6:mnoMNO6
7:pqrsPQRS7
8:tuvTUV8
9:wxyzWXYZ9
0:<space><newline>0
Pour taper exaMPle TExt 01
, vous devez appuyer 33 99 2 6666 77777 555 33 0 8888 33333 99 8 0 <a 1-sec pause here in real life but we'll ignore it>000 1
sur un total de 37 touches.
La *
touche fait apparaître une carte de caractères spéciaux:
.,'?!
"-()@
/:_;+
&%*=<
>£€$¥
¤[]{}
\~^¡¿
§#|`
avec le premier ( .
) en surbrillance. Vous pouvez vous déplacer pour mettre en surbrillance le caractère requis à l'aide des touches de navigation rectangulaires et il faut appuyer sur une autre touche pour sélectionner.
Donc, pour insérer $
, vous appuyez sur *↓↓↓↓→→→<select>
soit un total de 9 touches.
- L'entrée se fera à partir d'un fichier appelé
source
placé dans le répertoire / répertoire courant de votre programme. EDIT: Par requêtes dans les commentaires, j'ajouteSTDIN
comme méthode d'entrée valide. Toutes mes excuses pour avoir modifié la spécification après avoir reçu des réponses. - Vous devez sortir
Total key presses <total_keypresses>
- Si le fichier d'entrée contient un caractère qui ne se trouve pas dans le clavier donné, votre programme doit sortir
Invalid character <character> in source
et quitter.
En bref, l'entrée et la sortie de votre programme doivent ressembler à celles de ce script python (non golfé):
# This Python file uses the following encoding: utf-8
from __future__ import print_function
import sys
general_dict = { '1':1,
'a':1, 'b':2, 'c':3, 'A':4, 'B':5, 'C':6, '2':7,
'd':1, 'e':2, 'f':3, 'D':4, 'E':5, 'F':6, '3':7,
'g':1, 'h':2, 'i':3, 'G':4, 'H':5, 'I':6, '4':7,
'j':1, 'k':2, 'l':3, 'J':4, 'K':5, 'L':6, '5':7,
'm':1, 'n':2, 'o':3, 'M':4, 'N':5, 'O':6, '6':7,
'p':1, 'q':2, 'r':3, 's':4, 'P':5, 'Q':6, 'R':7, 'S':8, '7':9,
't':1, 'u':2, 'v':3, 'T':4, 'U':5, 'V':6, '8':7,
'w':1, 'x':2, 'y':3, 'z':4, 'W':5, 'X':6, 'Y':7, 'Z':8, '9':9,
' ':1, '\n':2, '0':3
}
special_chars = ['.',',',"'",'?','!','"','-','(',')','@','/',':','_',';','+','&','%','*','=','<','>','£','€','$','¥','¤','[',']','{','}','\\','~','^','¡','¿','§','#','|','`']
for x in special_chars:
general_dict[x]=(special_chars.index(x)/5) + (special_chars.index(x)%5) + 2
key_press_total = 0
with open('source') as f: # or # with sys.stdin as f:
for line in f:
for character in line:
if character in general_dict:
key_press_total+=general_dict[character]
else:
print('Invalid character',character,'in source')
sys.exit(1)
print('Total key presses',key_press_total)
Il s'agit du code-golf, le programme le plus court en victoires d'octets.
Avertissement sans vergogne: j'ai fait ce défi d'avoir des traductions du script python ci-dessus dans différentes langues qui seront utilisées pour marquer ce défi dans le bac à sable .
1ce5a2fdd0316e37c0a07d151d02db766a3adbb7
.Réponses:
GolfScript, 219 caractères
Approche de base à l'aide d'une table de recherche:
Essayez ici .
la source
source
, pas de STDIN"#{File.read('source')}"
"#{File.read'source'}"
Rubis 2.0, 232
Schéma d'encodage très simple jusqu'à présent: plus de 75% des caractères sont utilisés pour les littéraux chaîne / tableau ...
la source
CJam, 207 octets
Ce programme contient 207 caractères. Avec l'encodage approprié (Windows-1252), il tient dans 207 octets.
Notez que Stack Exchange convertit les onglets (que j'utilise comme délimiteur dans la table de recherche) en espaces, vous ne pouvez donc pas copier et coller le code ci-dessus.
Usage
Encodage Windows-1252
Encodage UTF-8
la source
PHP,
711708676 caractères (lecture depuis STDIN maintenant)Mon premier golf jusqu'à présent :)
Je voulais essayer une approche plutôt non conventionnelle. Au lieu d'avoir une liste de chaque caractère et le nombre de clics nécessaires pour le créer, j'utilise les valeurs ASCII du caractère et calcule les pressions de touches requises. Je pensais que cela m'épargnerait d'abord certains personnages, maintenant je pense que c'est encore plus long qu'une approche par tableau.
Mon problème principal est les touches 7 et 9, qui ont 4 lettres, au lieu de 3. Par conséquent, je devais créer quelques solutions de rechange, ce qui a fait exploser mon code de près de 200 caractères.
Version non golfée
Je suppose qu'il y a encore beaucoup de place à l'amélioration, mais j'en suis assez content.
Une autre mauvaise chose est l'utilisation requise de
iconv()
pour la liste des caractères spéciaux. Certains d'entre eux (€
,,¥
...) ne sont pas supportés nativement par PHP.la source
utf8_decode
fonctionnerait bien pour tous les caractères sauf de€
. C'est pourquoi j'ai dû utiliser à laiconv
place. Mon code ne calcule pas ces caractères spéciaux comme il le fait avec les caractères normaux, car ils ne sont pas en ordre et je ne peux pas travailler de manière fiable avec leurs valeurs ASCII respectives. Il utilise une liste normale pour eux.Python 3, 239 caractères
la source
JavaScript (E6) 291
Éditer
Version shell, utilisant le shell spydermonkey. Lire à partir d'un fichier «source», écrire sur sdtout
Essayez d'abord, fonctionne dans la console FireFox en utilisant un popup pour l'entrée et la sortie
Lisible
la source
VBScript 435
Ne prend pas en charge les caractères non ASCII. J'étais assez loin avec mon code, donc j'ai pensé le poster pour référence. Je ne pense pas que quelqu'un d'autre ait utilisé cette approche.
la source