Convierte números en letras y viceversa en una cadena

12

Basado en una lista de números y sus letras equivalentes, tome una entrada de cadena, reemplace los caracteres de esa cadena con el número / letra equivalente y envíe el resultado.

Lista

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

Entrada

thisisastring1124

Salida

t89s9s1str9n7aabd

Reglas

  • Los números son equivalentes a letras minúsculas solamente.
  • Cualquier personaje fuera de la lista se dejará como está.
  • La cadena de entrada no debe contener espacios.
  • Se permite el programa completo o la función.
  • Como se trata de código de golf, gana menos bytes.
Noir Antares
fuente
2
Bienvenido a PPCG. Buen desafío!
Adám
2
¿Podemos cambiar letras mayúsculas en su lugar?
Adám
Solo letras minúsculas, letras mayúsculas estarían fuera del alcance de la lista.
Noir Antares
¿La entrada contendrá solo letras y números, o podría haber otros caracteres que no sean espacios (por ejemplo, puntuación)?
sundar - Restablecer Monica
La cadena de entrada puede contener cualquier otro carácter, excepto espacios, pero todo lo que esté fuera de la lista no se tocará en la cadena de salida.
Noir Antares

Respuestas:

14

bash, 18 bytes

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

Pruébalo en línea!

Pomo de la puerta
fuente
¿Cómo toma esto entrada / salida? stdin y stdout?
Financia la demanda de Mónica el
@NicHartley Sí.
Pomo de la puerta
6

05AB1E , 13 9 bytes

žmÁAT£J‡

Pruébalo en línea!

Explicación

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

Retina 0.8.2 , 12 bytes

T`a-j09-1`Ro

Pruébalo en línea! Explicación:

T``

Realizar una transliteración.

a-j09-1

La lista de origen son las letras a-j, luego 0, los dígitos 9-1.

Ro

La lista de destino es la lista de origen invertida, es decir, los dígitos 1-9, luego 0, luego las letras j-a.

Neil
fuente
3

Python 2 , 82 78 bytes

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

Pruébalo en línea!

-4 con agradecimiento a @ovs

ElPedro
fuente
3

JavaScript (ES6), 66 bytes

s=>s.replace(e=/[1a2b3c4d5e6f7g8h9i0j]/g,c=>e[e.search(c)^1],e+=e)

Pruébalo en línea!

Arnauld
fuente
3

R , 40 bytes

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

Pruébalo en línea!

Sorprendentemente, R es decente en este tipo de desafío de , porque tiene una trfunción similar a la de la respuesta Bash . No tengo idea de por qué existe, ¡pero estoy agradecido por ello!

Giuseppe
fuente
¡Increíble! No sabía chartr () entendió regex.
snoram
@snoram no es exactamente una expresión regular; especifica en la documentación que "los rangos son compatibles con las especificaciones, pero las clases de caracteres y los caracteres repetidos no".
Giuseppe
3

MS-SQL, 71 bytes

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

La nueva función SQL 2017 TRANSLATErealiza el reemplazo de caracteres individuales, por lo que es ideal para este propósito. Vea mi respuesta similar en un desafío anterior .

La entrada es a través de una tabla t existente con la columna varchar v , según nuestras reglas de IO . Para reemplazar solo letras minúsculas, la tabla debe crearse usando una intercalación entre mayúsculas y minúsculas :

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

Pyth , 13 bytes

Xz+jk+0_S9<GT

Pruébalo aquí!

Explicación

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.
Sr. Xcoder
fuente
1

REXX, 57 bytes

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

C (gcc) , 81 72 bytes

Gracias a Giacomo Garabello por las sugerencias.

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

Pruébalo en línea!

ErikF
fuente
Puede eliminar 6 caracteres alterando la cadena de entrada en lugar de imprimirla putchar(...)-> *s=...y otros 4 reemplazándolos *s-48U<11con ¡ *s<59 Pruébelo en línea!
Giacomo Garabello
@GiacomoGarabello se *s<59rompe si los caracteres como $están en la entrada, es por eso que lo hice *s-48U([0..47] se convierte en [-48 ..- 1], que se convierte en un gran valor sin signo). Como la pregunta no especificó si no -alnums eran válidos, fui con la interpretación más conservadora.
ErikF
Lo suficientemente justo. El OP comentó recientemente que todos los demás caracteres son válidos pero no el espacio. Pero aún puedes usar mi primera sugerencia
Giacomo Garabello el
1

Powershell, 94 bytes

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

Script de prueba:

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

&$f "thisisastring1124"

Explicación

  • $args - cadenas de argumentos
  • $args|% t*y- se expande al |ForEach-Object -Method ToCharArrayequivalente de"$args".ToCharArray()
  • ($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_)- encuentra un carácter en la cadena, devuelve una posición o -1 si no se encuentra. Deje que $ s almacena la cadena que contiene un carácter emparejado en las posiciones vecinas que difieren en el último bit: 0 + 1, 2 + 3, 4 + 5 ...
  • if(1+($p=...)) - si se encontró la posición
  • $p-bxor1 - bit de posición xor 1
mazzy
fuente
Buen truco con el -bxor1.
AdmBorkBork
0

R , 107 bytes

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)}

Pruébalo en línea!

Primer intento, definitivamente mejorable ...

digEmAll
fuente
chartres tu amigo aquí, creo.
Giuseppe
1
@Giuseppe: ¡genial! No sabía de la función chartr.
Publíquelo
0

Óxido , 96 bytes

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

Pruébalo en línea!

No es seguro para Unicode, si lo fuera, sería aún más largo.

Konrad Borowski
fuente
0

K4 , 38 bytes

Solución:

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

Explicación:

Busque cada carácter en la lista "abcdefghij1234567890"y luego indexe en la lista "1234567890abcdefghijX"dónde Xestá el carácter original.

Necesito encontrar una forma más corta de construir las cadenas ...

{(,/|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

Prima:

Otra solución para 38 bytes :

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

Yabasic , 135 bytes

Toma entrada de la consola y salidas a la consola.

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

Pruébalo en línea!

Taylor Scott
fuente
0

sed, 44 bytes

y/1234567890abcdefghij/abcdefghij1234567890/

Un poco aburrido, lo admito.

Pruebas:

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