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.

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:







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.





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!


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


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.


1

REXX, 57 bytes

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

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!


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

Buen truco con el -bxor1.
AdmBorkBork



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}@'

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!



0

sed, 44 bytes

y/1234567890abcdefghij/abcdefghij1234567890/

Un poco aburrido, lo admito.

Pruebas:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.