Concepto
Recordar los números puede ser difícil. Recordar una palabra puede ser más fácil. Con el fin de memorizar grandes números, creé una forma de pronunciarlos de forma similar a un discurso.
Reglas
Cada dígito se reemplaza primero por su letra correspondiente:
0 => O
1 => I
2 => R
3 => E
4 => A
5 => S
6 => G
7 => T
8 => B
9 => P
Después del reemplazo, se hacen dos cosas adicionales para mejorar la pronunciación:
Entre dos consonantes,
U
se agrega a.Entre dos vocales,
N
se agrega a.
Ejemplos / casos de prueba
512431 => SIRANENI
834677081 => BENAGUTUTOBI
3141592 => ENINANISUPUR
1234567890 => IRENASUGUTUBUPO
6164817 => GIGABIT
Que es imposible
- Letras y números mezclados en la misma palabra
- Dos consonantes sucesivas o dos vocales sucesivas.
- Cartas que no están en la lista de arriba
- Otros personajes
Reglas
El objetivo de este código de golf es crear un traductor bidireccional para este concepto.
- Su programa primero debe entender por sí mismo si se trata de una traducción de letra a número o de número a letra.
- Debe verificar que la entrada esté bien formada.
- Si todo es correcto, muestre la traducción.
- De lo contrario, muestre un mensaje de error, nada, devuelva un valor falso o bloquee el programa.
Detalles
- El número / cadena de entrada se puede ingresar en el formato que desee (stdin, argumento, ...)
- Este es el código de golf , por lo que gana la respuesta más corta.
- Las lagunas estándar están prohibidas.
GIGATESTER
serGIGATESUTER
?AB23
;AEI
;BB
;Z
;ACE
;giga
;!@#$
;-123
; etc. Además, según las reglas de validación, podemos convertir6164735732 => GIGATESTER
, peroGIGATESTER
resultará en un valor falso, debido aST
(regla de dos consonantes sucesivas). Según la configuración actual de su desafío, la parte principal del desafío es la validación, en lugar de la conversión. Estoy de acuerdo con eso, pero la validación debería definirse un poco mejor en ese caso.Respuestas:
JavaScript (ES6), 130 bytes
Toma la entrada como una cadena en ambas formas de traducción. Devuelve la traducción como una cadena o
false
en caso de una entrada no válida.Manifestación
Mostrar fragmento de código
fuente
Japt ,
6159928584 bytesToma la entrada como una cadena para ambas operaciones y devuelve una cadena para ambas o
false
para una entrada no válida. Supone que las entradas de números siempre contendrán varios dígitos, agregue 1 byte reemplazandoUÉ
porUn<space>
si no es válido. Devuelvefalse
para el caso de pruebaGIGATESTER
pero, de acuerdo con las reglas, eso debería ser una entrada no válida.Pruébelo: Números -> Letras o Letras -> Números
24 bytes guardados gracias a obarakon , quien también me convenció para retomar esto después de que lo abandoné antes. ¡Ojalá no lo hubiera hecho!332625 (!) Bytes se sacrificaron implementando una solución rápida (es decir, aún no se ha desarrollado completamente) para verificar la validez de la entrada.Explicación
(Aún no se ha actualizado a la última versión)
fuente
AEI
Python 3 , 147 bytes
Pruébalo en línea!
fuente
(Java OpenJDK 8) ,
416410399382376370 bytes-2 bytes gracias a @Cyoce
-17 bytes más gracias a una idea de @Cyoce
-6 bytes gracias a @KevinCruijssen
Pruébalo en línea!
Ugh, el reemplazo de Java es tan detallado.
Función que toma una cadena y devuelve la cadena traducida de número -> letra o viceversa. Se bloquea en una entrada no válida (puede ver esto en el ejemplo de tio donde se obtienen los valores correctos para los primeros 10 casos de prueba y luego se bloquea con un error de división por cero que se muestra en la vista de depuración)
Sin golf (el primer y el último término del bucle for se extraen para facilitar la lectura)
La expresión regular para hacer coincidir los números es simple, pero aquí está la expresión regular para hacer coincidir las letras con los números.
fuente
(s)->
if
declaración son asignaciones (que devuelven un valor), intente reemplazar elif
...else if
...else
con el operador condicional?:
, prefacioObject _=
para que sea una declaración válida. No estoy seguro de si esto realmente ayudaría al conteo de bytes, pero creo que lo hará.t
, porque solo la usa una vez. Entonces set.charAt(i)+""
convierte en"OIREASGTBP".charAt(i)+""
( -4 bytes ). Y puede colocar la última línea dentro del ciclo for después de lai<9;
declaración dentro del ciclo for. Entonces se convierte enfor(;i<9;s=b?s.replace(v,c):s.replace(c,v)){
( -1 byte ). Ah, y también puedes poner els=b?...
que viene justo después delint i=-1;
ciclo for:for(s=b?...;i<9;...
( -1 byte ).PHP;
129 127 267 259228 bytesEjecutar como tubería
-nR
o probarlo en línea .Descompostura
fuente
Java 8,
312308304301294290 bytes-4 bytes (308 → 304) para una corrección de errores (no sucede a menudo que el recuento de bytes disminuya cuando soluciono un error en mi código ...: D)
EDITAR: utiliza un enfoque diferente al de la respuesta Java de @ PunPun1000 al crear primero la cadena de retorno en un ciclo for sobre los caracteres, y luego usa una expresión regular más abstracta para validarla en el ternario de retorno (la entrada es todos dígitos, o son las vocales y consonantes dadas alternadas (sin vocales ni consonantes adyacentes).
Explicación:
Pruébalo aquí.
La validación regex:
fuente
05AB1E , 76 bytes
Pruébalo en línea!
Devuelve el valor falso
0
para una entrada no válida.fuente
Golpetazo ,
241 238235 bytesPruébalo en línea!
Menos golfizado:
fuente
PHP, 268 bytes
Pruébalo en línea!
fuente
Perl, 127 bytes
Línea de comando de 126 bytes + 1 byte
Uso:
Debe seguir todas las reglas de desafío: puede aceptar letras o números y producirá un error (división por cero) si falla la validación
fuente
NO
yUS
.Rubí , 205 + 1 = 206 bytes
Utiliza la
-p
bandera para +1 byte. Ahora con un exhaustivo sistema de validación de entrada.Pruébalo en línea!
fuente
Python 3, 741 bytes
Pruébalo en línea!
Hay mucho margen de mejora, lo sé.
fuente
sed, 123 bytes
Explicación
Primero, rodeamos los dígitos con
_
(para vocales) o=
(para consonantes).Si no hicimos ninguna sustitución, estamos convirtiendo letras a dígitos, por lo que es una simple sustitución y eliminar
U
yN
. Entonces déjalo.De lo contrario, nos ramificamos para etiquetar
a
, donde tratamos con vocales consecutivas y luego consonantes consecutivas. Luego transforme los dígitos en letras y elimine los caracteres marcadores que presentamos en el primer paso.fuente
Python3, 246 bytes
explicación:
dicttupla , más el elemento actualdicttuple es una tabla de verdad basada en dos elementos, ser vocal o nofuente
JavaScript (ES6), 120
Una función que toma la entrada como una cadena. Devuelve la cadena traducida correctamente si la entrada es válida, de lo contrario es falsa o la función se bloquea.
Menos golf
Prueba
fuente