Convertir des nombres en lettres et vice-versa dans une chaîne

12

Sur la base d'une liste de nombres et de leurs lettres équivalentes, prenez une chaîne d'entrée, remplacez les caractères de cette chaîne par le nombre / lettre équivalent et sortez le résultat.

liste

  • 1 = a
  • 2 = b
  • 3 = c
  • 4 = d
  • 5 = e
  • 6 = f
  • 7 = g
  • 8 = h
  • 9 = i
  • 0 = j

Contribution

thisisastring1124

Production

t89s9s1str9n7aabd

Règles

  • Les chiffres sont équivalents aux lettres minuscules uniquement.
  • Tout caractère en dehors de la liste sera laissé tel quel.
  • La chaîne d'entrée ne doit pas contenir d'espaces.
  • Un programme ou une fonction complète est autorisé.
  • Puisqu'il s'agit de code-golf, le moins d'octets gagne.
Noir Antares
la source
2
Bienvenue chez PPCG. Beau défi!
Adám
2
Pouvons-nous remplacer les lettres majuscules à la place?
Adám
Seules les lettres minuscules, les lettres majuscules seraient hors de portée de la liste.
Noir Antares
L'entrée ne contiendra-t-elle que des lettres et des chiffres, ou d'autres caractères non-espace (par exemple, ponctuation) y seront-ils?
sundar
La chaîne d'entrée peut contenir tout autre caractère à l'exception des espaces, mais tout ce qui se trouve en dehors de la liste ne sera pas modifié dans la chaîne de sortie.
Noir Antares

Réponses:

14

bash, 18 octets

tr 1-90a-j a-j1-90

Essayez-le en ligne!

Poignée de porte
la source
Comment cela prend-il une entrée / une sortie? stdin et stdout?
Fund Monica's Lawsuit
@NicHartley Oui.
Poignée de porte
6

05AB1E , 13 9 octets

žmÁAT£J‡

Essayez-le en ligne!

Explication

žmÁ         # push 0987654321
   AT£      # push abcdefghij
      J     # join strings
       Â    # bifurcate
        ‡   # transliterate
Emigna
la source
5

Retina 0.8.2 , 12 octets

T`a-j09-1`Ro

Essayez-le en ligne! Explication:

T``

Effectuez une translittération.

a-j09-1

La liste des sources est les lettres a-j, puis 0, puis les chiffres 9-1.

Ro

La liste de destination est la liste source inversée, c'est-à-dire les chiffres 1-9, puis 0, puis les lettres j-a.

Neil
la source
3

Python 2 , 82 78 octets

lambda i,l='1234567890jihgfedcba':''.join((x,l[~l.find(x)])[x in l]for x in i)

Essayez-le en ligne!

-4 avec merci à @ovs

ElPedro
la source
3

R , 40 octets

function(s)chartr("0-9ja-i","ja-i0-9",s)

Essayez-le en ligne!

Étonnamment, R est décent à ce genre de défi de , car il a une trfonction similaire à celle de la réponse Bash . Je ne sais pas pourquoi il existe, mais j'en suis reconnaissant!

Giuseppe
la source
Incroyable! Ne savait pas que chartr () comprenait l'expression régulière.
snoram
@snoram pas tout à fait regex; il précise dans la documentation que "les plages sont prises en charge dans les spécifications, mais pas les classes de caractères et les caractères répétés".
Giuseppe
3

MS-SQL, 71 octets

SELECT TRANSLATE(v,'1234567890abcdefghij','abcdefghij1234567890')FROM t

La nouvelle fonction SQL 2017 TRANSLATEeffectue un remplacement de caractère individuel, elle est donc parfaitement adaptée à cette fin. Voir ma réponse similaire dans un défi précédent .

Entrée se fait par une table pré-existante t avec la colonne varchar v , selon nos règles IO . Pour remplacer uniquement les lettres minuscules, le tableau doit être créé à l'aide d'un classement sensible à la casse :

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)
BradC
la source
2

Pyth , 13 octets

Xz+jk+0_S9<GT

Essayez-le ici!

Explication

Xz+jk+0_S9<GT – Full program.
       _S9    – Yield [9, 8, 7, ..., 1]
     +0       – Prepend a 0.
   jk         – Join to a single string.
  +       <GT – And append the first 10 letters of the alphabet to it.
                Yields 0987654321abcdefghij.
Xz            – Transliterates the input from the above to the above reversed.
M. Xcoder
la source
1

REXX, 57 octets

#=1234567890
a='abcdefghij'
say translate(arg(1),a #,# a)
idrougge
la source
1

C (gcc) , 81 72 octets

Merci à Giacomo Garabello pour les suggestions.

f(char*s){for(;*s++=*s-97U<11?(*s-6)%10+48:*s-48U<11?(*s-9)%10+97:*s;);}

Essayez-le en ligne!

ErikF
la source
Vous pouvez supprimer 6 caractères en modifiant la chaîne d'entrée au lieu de l'imprimer putchar(...)-> *s=...et 4 autres en les remplaçant *s-48U<11par *s<59 Essayez-le en ligne!
Giacomo Garabello
@GiacomoGarabello se *s<59casse si des caractères comme $sont en entrée, c'est pourquoi je l'ai fait *s-48U([0..47] devient [-48 ..- 1], ce qui devient une grande valeur non signée.) Comme la question n'a pas précisé si non -alnums étaient valides, je suis allé avec l'interprétation plus conservatrice.
ErikF
C'est suffisant. L'OP a récemment commenté que tous les autres caractères sont valides mais pas l'espace. Mais vous pouvez toujours utiliser ma première suggestion
Giacomo Garabello
1

Powershell, 94 octets

-join($args|% t*y|%{if(1+($p=($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_))){$s[$p-bxor1]}else{$_}})

Script de test:

$f = {
-join($args|% t*y|%{if(1+($p=($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_))){$s[$p-bxor1]}else{$_}})
}

&$f "thisisastring1124"

Explication

  • $args - chaînes d'arguments
  • $args|% t*y- se développe à l' |ForEach-Object -Method ToCharArrayéquivalent de"$args".ToCharArray()
  • ($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_)- trouve un caractère dans la chaîne, renvoie une position ou -1 s'il n'est pas trouvé. Soit $ s stocke la chaîne qui contient un caractère apparié sur les positions voisines qui diffèrent par le dernier bit: 0 + 1, 2 + 3, 4 + 5 ....
  • if(1+($p=...)) - si le poste a été trouvé
  • $p-bxor1 - position bit xor 1
mazzy
la source
Belle astuce avec le -bxor1.
AdmBorkBork
0

R , 107 octets

function(s){a=utf8ToInt(s);l=a>96&a<107;n=a>47&a<58;a[n]=(a[n]-9)%%10+97;a[l]=(a[l]+4)%%10+48;intToUtf8(a)}

Essayez-le en ligne!

Première tentative, définitivement améliorable ...

digEmAll
la source
chartrest votre ami ici, je pense.
Giuseppe
1
@Giuseppe: génial! Je ne connaissais pas la fonction chartr. Veuillez le poster comme réponse, l'approche est totalement différente;)
digEmAll
0

Rouille , 96 octets

|x|x.bytes().map(|x|match
x{49..=57=>x+48,97..=105=>x-48,48=>106,106=>48,x=>x}as
char).collect()

Essayez-le en ligne!

Pas sûr pour Unicode, s'il l'était, il serait encore plus long.

Konrad Borowski
la source
0

K4 , 38 octets

Solution:

{(,/|x,a)(,/a:0 1_'10 11#'.Q`a`n)?x}@'

Explication:

Recherchez chaque caractère de la liste "abcdefghij1234567890", puis indexez-le dans la liste "1234567890abcdefghijX"où se Xtrouve le caractère d'origine.

Besoin de trouver un moyen plus court de construire les cordes ...

{(,/|x,a)(,/a:0 1_'10 11#'.Q`a`n)?x}@'
{                                  }@' / apply (@) lambda {} to each (')
                                 ?x    / lookup x in
         (                      )      / do this together
                          .Q`a`n       / index into .Q with a (gives a-z) and n (gives 0-9)
                   10 11#'             / take 10 from first list and 11 from second list
              0 1_'                    / drop 0 from first list and 1 from second list
            a:                         / save as a
          ,/                           / flatten
 (      )                              / do this together
     x,a                               / prepend x to a
    |                                  / reverse it
  ,/                                   / flatten

Prime:

Une autre solution pour 38 octets :

{(a,b,x)?[(b:1_11#.Q.n),a:10#.Q.a]x}@'
streetster
la source
0

Yabasic , 135 octets

Prend des entrées de la console et des sorties vers la console.

Input""s$
For i=1To Len(s$)
c$=Mid$(s$,i,1)
n=asc(c$)-96
If-38>n Then?chr$(143+n+11^(n=-48));ElsIf n<11Then?n*(10>n),"";Else?c$;Fi
Next

Essayez-le en ligne!

Taylor Scott
la source
0

sed, 44 octets

y/1234567890abcdefghij/abcdefghij1234567890/

Un peu ennuyeux, je l'avoue.

Essai:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
Kusalananda
la source