Remplacer les numéros par leur lettre respective


23

Créez une fonction ou un programme qui prend un nombre en entrée et génère une chaîne dans laquelle les points de code ASCII pour l'alphabet minuscule et majuscule sont remplacés par leurs équivalents de caractères.

  • L'alphabet majuscule utilise les points de code: 65-90
  • L'alphabet minuscule utilise les points de code: 97-122

Si des chiffres adjacents dans l'entrée correspondent au point de code d'une lettre, cette lettre remplacera les chiffres dans la chaîne de sortie.

Règles:

  • L'entrée sera un entier positif avec entre 1 et 99 chiffres
  • Vous pouvez supposer que seule une entrée valide est donnée
  • Vous commencez à substituer au début de l'entier ( 976-> a6, pas 9L)
  • L'entrée peut être dans n'importe quel format approprié (la représentation des chaînes est OK)
  • La sortie peut être dans n'importe quel format approprié
  • Les règles standard s'appliquent

Exemples:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

Le code le plus court en octets gagne!


Classement

L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) en tant que liste des solutions les plus courtes par langue et b) en tant que classement général.

Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

## Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:

## Ruby, <s>104</s> <s>101</s> 96 bytes


2
"L'entrée sera un entier positif avec entre 1 et 99 chiffres" Dans à peu près n'importe quel langage de programmation que je connais, ce sera une chaîne avec entre 1 et 99 chiffres, car même un entier 64 bits ne contient que jusqu'à 19 décimales chiffres ...
TJ Crowder

3
@TJCrowder Je suppose qu'il voulait dire entier au sens mathématique, pas le type de données.
Dennis

1
@TJCrowder valide point :-) Bien que, si je ne me trompe pas, 1e99 est toujours techniquement un entier. long intne suffit pas, vous en avez besoin super long int.
Stewie Griffin

1
@StewieGriffin: Hah! :-) Je suis sûr qu'il y a une langue quelque part avec une telle chose.
TJ Crowder

Réponses:


2

Jolf, 18 16 octets

Essayez-le ici! Je savais que la fonction upperLower serait utile un jour! Remplacez ópar ΢ou utilisez simplement le lien d'interpréteur. Ceci est codé dans ISO 8859-7.

ρiLaΜGpwpuEdóH΅A
      pw           upper and lower
        pu         of the uppercase alphabet
     G    E        split by nothing (E = "")
    Μ      dóH     map each char to its numeric counterpart
  La               regex alternate array (e.g. La[1,2,3] => "1|2|3")
ρi            ΅A   replace input with the character code of the match (΅ is string lambda)

17

Perl, 39 38 octets

(1 octet ajouté pour le -pdrapeau.)

$"="|";s/@{[65..90,97..122]}/chr$&/ge
s/                           /          replace...
  @{[                      ]}           this string, treated as a regex:
     join"|",65..90,97..122             65|66|67|68|...|121|122
                                   /ge  ...with this string, eval()'d:
                                 $&     the entirety of the last match
                              chr       convert to char from ASCII code

Le bon outil pour le travail ™.

L'explication est obsolète après une petite optimisation (merci dev-null !) Qui le rend un seul octet plus court (mais un peu moins élégant): la $"variable représente quoi faire joinlors de l'interpolation d'un tableau dans une chaîne, donc le réglage $"="|"supprime le besoin de join.

Démo:

llama@llama:~$ perl -pe '$"="|";s/@{[65..90,97..122]}/chr$&/ge' 
1234567
12345C
3456789 
345CY
9865432
bA432
6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6711110010100071111108102
Code000Golf

Je suppose que vous pouvez enregistrer un seul octet en définissant $"="|"au lieu de rejoindre?
andlrc

par exemple. $"="|";s/@{[65..90,97..122]}/chr$&/ge
andlrc

@ dev-null Cela fonctionne, merci!
Poignée de porte

11

Javascript, 80 octets

s=>s.replace(/6[5-9]|[78]\d|9[0789]|1[01]\d|12[012]/g,x=>String.fromCharCode(x))

Voir regex en action ici: https://regex101.com/r/iX8bJ2/1

Par curiosité, une chose que j'ai apprise ici:

Je ne peux pas changer x=>String.fromCharCode(x)à String.fromCharCode cause ...


6

CJam, 22 octets

q{+'[,_el^{_is@\/*}/}*

Essayez-le en ligne!

Contexte

Le simple remplacement de toutes les occurrences de groupes de chiffres par les lettres correspondantes (dans l'ordre que nous choisissons) ne respectera pas la règle de gauche à droite.

Au lieu de cela, nous pouvons générer tous les préfixes de la chaîne d'entrée et tenter de faire toutes les substitutions possibles pendant que nous les générons. Puisqu'aucun point de code n'est contenu dans un autre point de code, l'ordre de ces tentatives n'est pas important.

Par exemple:

67466

6     -> 6
67    -> C
 C4   -> C4
 C46  -> C46
 C467 -> C4B

C4B

Comment ça marche

q                       Read all input from STDIN.
 {                  }*  Fold; push the first character, and for each subsequent
                        character, push it and do the following:
  +                       Append the character to the string on the stack.
   '[,_el^                Push the string of all ASCII letters.
                          See: http://codegolf.stackexchange.com/a/54348
          {       }/      For each ASCII letter:
           _                Push a copy of the letter.
            i               Convert to integer, i.e., compute its code point.
             s              Cast to string.
              @\            Rotate and swap.
                /           Split the modified input characters at occurrences (at
                            most one) of the string repr. of the code point.
                 *          Join, separating by the corresponding letter.

4

PHP, 110 102 101 68 67 octets

Défi assez difficile. C'est le mieux que j'ai pu trouver. Ceci est une toute nouvelle version.

for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);

Courez comme ceci:

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • 8 octets enregistrés en utilisant ctype_alphaau lieu depreg_match , thx pour manatwork
  • 1 octet enregistré en pré-paiement 0 la chaîne au lieu de vérifier la chaîne non vide: lorsque le dernier caractère de l'entrée est un 0, la sous-chaîne que je prends serait "0", ce qui est faux, tandis que "00" est vrai, il ne sautera donc pas l'impression du dernier 0.
  • Enregistré un énorme 33 octets en utilisant strtr après avoir construit un tableau avec des paires de conversion
  • Enregistrement d'un octet à l'aide d'une balise d'impression courte

1
Yo devra changer l'expression régulière pour #[A-Z]#ique l' expression actuelle permette avec plaisir que «92» soit transformé en «\». Ou essayez ctype_alpha()au lieu de preg_match(). Jusqu'ici semble fonctionner.
manatwork

"0", which is falsy, whereas "00" is truthyBon départ, PHP.
cat

3

Python 3, 211 189 188 octets

def f(c,i=0,n=""):
 while i<len(c):a=1;x=int(c[i:i+2]);a=2 if 64<x<91 or 96<x<100 else a;x=int(c[i:i+3]) if a<2 else x;a=3 if 99<x<123 else a;x=chr(x) if a>1 else c[i];n+=x;i+=a
 return n
  • 23 octets enregistrés en remplaçant \ n par; merci à Dennis

Tester

entrez la description de l'image ici


1
Si vous utilisez ;au lieu de sauts de ligne, vous pouvez placer la boucle while entière sur une seule ligne. De plus, la première ligne peut devenir def f(c,i=0,n=""):.
Dennis

1
a=1;a=2 if 64<x<91 or 96<x<100 else a-> a=1+(64<x<91or 96<x<100)etc
seequ

2

Pyth, 20 18 octets

.Uu:G`CHHsrBG1+bZz

Même algorithme que @Dennis. Il est beaucoup plus facile de coder en Pyth sur mon téléphone qu'en Jelly.

                implicit: z=input
.U              Reduce the following lambda b, Z over z
                b is the string being built; z is the next char
   u                Reduce the following lambda G,H over +bZ
                    G is the string, H is the next letter to match
     :                  Replace
       G                in G
       ` C H            the char code of H
       H                with H
     s rB            where H takes on values:
          G              the lowercase alphabet (that's the global value of G)
          1              concatenated to its uppercased self.
     +          
       b
       Z
   z

Merci @isaacg

Essayez-le ici .


Vous ne pouvez pas rester en dehors de ce site sur votre téléphone, pouvez-vous ...?
Conor O'Brien

1
Surtout quand j'ai le luxe de coder en ASCII imprimable: D
lirtosiast

1
C'est vrai, probablement agréable de faire une pause dans toute cette gelée ... Vous savez, une alimentation équilibrée;)
Conor O'Brien

0

05AB1E , 12 octets

õsvy«žnvyÇy:

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

õ             # Push an empty string ""
 sv           # Swap to get the (implicit) input-string, and loop over its characters:
   y«         #  Append the current character to the string
     žn       #  Push builtin "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
       v      #  Inner loop over each of these letters:
           :  #   Replace in the string all occurrences (should be either 0 or 1 occurrence)
        yÇ    #   of the ordinal value of the current letter
          y   #   by this letter
              # (after the loops, implicitly output the top of the stack as result)

Alternative de 12 octets utilisant la réduction par:

Å»«žnvyÇy:]θ

Essayez-le en ligne ou vérifiez tous les cas de test ou voyez une réduction pas à pas avec seulement les 10 premiers octets .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.