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.