Sustituir los números por sus respectivas letras.

23

Cree una función o programa que tome un número como entrada y genere una cadena donde los puntos de código ASCII para el alfabeto en mayúsculas y minúsculas se sustituyan por sus equivalentes de caracteres.

  • El alfabeto en mayúscula usa los puntos de código: 65-90
  • El alfabeto en minúscula usa los puntos de código: 97-122

Si cualquier dígito adyacente en la entrada es igual al punto de código de una letra, entonces esa letra reemplazará los dígitos en la cadena de salida.

Reglas:

  • La entrada será un número entero positivo con entre 1 y 99 dígitos.
  • Puede suponer que solo se proporciona una entrada válida
  • Empiezas a sustituir al comienzo del entero ( 976-> a6, no 9L)
  • La entrada puede estar en cualquier formato adecuado (la representación de cadena está bien)
  • La salida puede estar en cualquier formato adecuado
  • Aplican reglas estándar

Ejemplos:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

¡El código más corto en bytes gana!


Tabla de clasificación

El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

## Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Stewie Griffin
fuente
2
"La entrada será un número entero positivo con entre 1 y 99 dígitos" En casi cualquier lenguaje de programación que conozco, será una cadena con entre 1 y 99 dígitos, ya que incluso un int de 64 bits solo contiene hasta 19 decimales dígitos ...
TJ Crowder
3
@TJCrowder Supongo que quiso decir entero en el sentido matemático, no el tipo de datos.
Dennis
1
@TJCrowder punto válido :-) Aunque, si no me equivoco, 1e99 técnicamente sigue siendo un número entero. long intno es suficiente, lo necesitas super long int.
Stewie Griffin
1
@StewieGriffin: ¡Ja! :-) Estoy seguro de que hay un idioma en algún lugar con tal cosa.
TJ Crowder

Respuestas:

2

Jolf, 18 16 bytes

Pruébalo aquí! ¡Sabía que la función upperLower sería útil algún día! Reemplace ócon ΢, o simplemente use el enlace del intérprete. Esto está codificado en 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)
Conor O'Brien
fuente
17

Perl, 39 38 bytes

(1 byte agregado para la -pbandera).

$"="|";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

Herramienta adecuada para el trabajo ™.

La explicación está desactualizada después de una pequeña optimización (¡gracias dev-null !) Que lo hace un byte más corto (pero un poco menos elegante): la $"variable representa qué hacer joincuando se interpola una matriz en una cadena, por lo que la configuración $"="|"elimina la necesidad de join.

Manifestación:

llama@llama:~$ perl -pe '$"="|";s/@{[65..90,97..122]}/chr$&/ge' 
1234567
12345C
3456789 
345CY
9865432
bA432
6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6711110010100071111108102
Code000Golf
Pomo de la puerta
fuente
¿Supongo que puede guardar un solo byte configurando en $"="|"lugar de unirse?
andlrc
p.ej. $"="|";s/@{[65..90,97..122]}/chr$&/ge
andlrc
@ dev-null Eso funciona, ¡gracias!
Pomo de la puerta
11

Javascript, 80 bytes

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

Vea regex en acción aquí: https://regex101.com/r/iX8bJ2/1

Solo por curiosidad, una cosa que aprendí aquí:

No puedo cambiar x=>String.fromCharCode(x)a String.fromCharCode porque ...

remoto
fuente
6

CJam, 22 bytes

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

Pruébalo en línea!

Fondo

Simplemente reemplazar todas las ocurrencias de grupos de dígitos con las letras correspondientes (en el orden que elijamos) no cumplirá con la regla de izquierda a derecha.

En cambio, podemos generar todos los prefijos de la cadena de entrada e intentar hacer todas las sustituciones posibles mientras las generamos. Como ningún punto de código está contenido en otro punto de código, el orden de estos intentos no es importante.

Por ejemplo:

67466

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

C4B

Cómo funciona

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.
Dennis
fuente
4

PHP, 110 102 101 68 67 bytes

Desafío bastante difícil. Esto es lo mejor que se me ocurrió. Esta es una versión completamente nueva.

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

Corre así:

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • Se guardaron 8 bytes mediante el uso ctype_alphade preg_matchthx en manatwork
  • Se guardó 1 byte anteponiendo 0a la cadena en lugar de verificar la cadena no vacía: cuando el último carácter de la entrada es un 0, la subcadena que estoy tomando sería "0", que es falso, mientras que "00" es verdadero, para que no se salte la impresión de los últimos 0.
  • Ahorró 33 bytes masivos al usar strtrdespués de construir una matriz con pares de conversión
  • Guardado un byte mediante el uso de etiqueta de impresión corta
aross
fuente
1
Tendrás que cambiar la expresión regular a #[A-Z]#icomo la actual permitirá felizmente que "92" se transforme en "\". O intente en ctype_alpha()lugar de preg_match(). Hasta ahora parece funcionar.
manatwork
"0", which is falsy, whereas "00" is truthyBien hecho, PHP.
gato
3

Python 3, 211 189 188 bytes

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
  • Se guardaron 23 bytes reemplazando \ n con; gracias a Dennis

Prueba

ingrese la descripción de la imagen aquí

Argenis García
fuente
1
Si utiliza en ;lugar de saltos de línea, puede colocar todo el bucle while en una sola línea. Además, la primera línea puede convertirse 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 bytes

.Uu:G`CHHsrBG1+bZz

Mismo algoritmo que @Dennis. Es mucho más fácil codificar en Pyth en mi teléfono que 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

Gracias @isaacg

Probarlo aquí .

lirtosiast
fuente
Simplemente no puede permanecer fuera de este sitio en su teléfono, ¿puede ...?
Conor O'Brien
1
Especialmente cuando tengo el lujo de codificar en todos los ASCII imprimibles: D
lirtosiast
1
Eso es cierto, probablemente sea bueno tomar un descanso de toda esa gelatina ... Ya sabes, una dieta equilibrada;)
Conor O'Brien
0

05AB1E , 12 bytes

õsvy«žnvyÇy:

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

õ             # 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)

Alternativa de 12 bytes usando reducir por:

Å»«žnvyÇy:]θ

Pruébelo en línea o verifique todos los casos de prueba o vea una reducción paso a paso con solo los primeros 10 bytes .

Kevin Cruijssen
fuente