Introducción
Considere el siguiente ejemplo:
CODE
+ GOLF
——————
GREAT
Esta es una ecuación en la que cada letra representa un dígito decimal y las palabras representan números naturales (letras similares representan dígitos similares y letras diferentes representan dígitos diferentes). La tarea es hacer coincidir cada letra con su valor de dígito para que la ecuación sea correcta. Una solución para la ecuación anterior es:
9265
+ 1278
——————
10543
Tu tarea
Su tarea es escribir un programa o una función que pueda resolver tales ecuaciones como se ve arriba.
Entrada
La entrada es una cadena en el siguiente formato:
[A-Z]+\+[A-Z]+=[A-Z]+
Ejemplo:
CODE+GOLF=GREAT
AA+BB=CC
Se omiten los espacios y solo se utilizarán letras entre mayúscula A y Z (sin letras especiales o minúsculas).
Esta cadena se puede leer desde la entrada estándar, desde un archivo o como un parámetro de función.
Salida
Tiene las siguientes dos opciones para el formato de salida:
- la ecuación original con los dígitos sustituidos
- lista de las letras y sus valores
Si hay varias soluciones, se debe devolver cualquiera (pero solo una) de ellas. Si no hay soluciones, el programa debería devolver una cadena vacía o nula. La salida se puede devolver como una cadena, se puede escribir en la salida estándar o en un archivo.
Ejemplo:
9265+1278=10543
A=1 B=2 C=3
(puedes usar cualquier delimitador)
Reglas
- Para facilitar las cosas, los números se aceptan para comenzar con 0, pero puede manejar números con 0 a la izquierda como soluciones no válidas, depende de usted
- Letras similares representan dígitos similares y letras diferentes representan dígitos diferentes
- Puede usar cualquier idioma y la biblioteca estándar del idioma elegido (sin bibliotecas externas)
- No puede conectarse a ningún recurso en Internet (¿por qué lo haría de todos modos?)
- Esta es una tarea de golf de código, el código más corto gana. Los caracteres de espacio en blanco consecutivos cuentan como un solo carácter. (Entonces, cualquier programa escrito en espacios en blanco gana automáticamente)
Tengo una solución algo hacking usando 179 caracteres. Si algo no está claro, por favor pregúntame en los comentarios.
fuente
If there are no solutions, the program should return an empty string or null.
Los bucles infinitos aún no generan nada ... ¿puedo?Respuestas:
Python - 48 caracteres
Abusar de la regla del espacio en blanco.
Primero, convertí cada personaje en la respuesta de CesiumLifeJacket a su valor ASCII (podría haber escrito el mío pero soy flojo, y de todos modos no habría afectado el puntaje final). La cadena larga en mi solución es un espacio para cada uno de esos valores ASCII, y las pestañas que los separan. Dividir en pestañas, encontrar las longitudes, convertir de nuevo a caracteres y ejecutar.
SE convierte las pestañas en 4 espacios cada una, por lo que el copiado no funcionará. Solo tendrás que creerme :)
fuente
Ruby 2.0, 122 caracteres
Fuerza bruta barajando + eval!
Esto aún no cumple los criterios de devolver una cadena nula / vacía cuando no hay solución; simplemente gira infinitamente.Si no puede encontrar un resultado después de ~ 300 millones de iteraciones, devolverá cero. ¿Suficientemente cerca?Encuentra todas las letras únicas en la entrada, luego baraja repetidamente los dígitos 0-9 e intenta unirlas con las letras hasta que encuentra una configuración que funcione.
El código se presenta como una función llamada
f
que devuelve una cadena con los números sustituidos, como en la Opción de salida 1 anterior. Ejemplo de uso:El tiempo de ejecución para el
CODE+GOLF=GREAT
ejemplo en mi máquina varía de instantáneo a aproximadamente 6 segundos, ¡depende de la suerte que tenga con los barajaduras!Estoy particularmente descontento con el
gsub(/\b0/,'')
bit para eliminar los ceros a la izquierda, pero fue lo único que pude pensar para evitareval
interpretar los números como entradas octales.( BONIFICACIÓN : ¡Debido a que usa eval, funciona para expresiones arbitrarias de Ruby y no solo para la suma!)
fuente
permutation
, pero como dices, me preocupaba principalmente la longitud del código.LiveScript (179 caracteres)
Tiene un tiempo de ejecución determinista y relativamente rápido y también funciona con otros operadores (+, -, *).
fuente
Python,
256213 caracteresHorrible tiempo de ejecución, intentará mejorar aún más:
fuente
JavaScript 138
Fuerza bruta al azar.
Puede tomar un tiempo (mi mejor tiro
CODE+GOLF=GREAT
es de 3 segundos, mis peores 3 minutos).Pruébalo con una expresión simple como
A+B=C
fuente
Haskell, 222
Fuerza bruta. Intenta todas las coincidencias posibles hasta que encuentre una, o después de que haya terminado de probarlas todas. Estiré las reglas de salida: imprime algo parecido
[[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]
a la solución y, si no existe, imprime[]
. Avísame si necesito cambiar esto.fuente
CJam - 17
Total de 975 caracteres, pero 960 de ellos son espacios en blanco en 2 secuencias, por lo que esos cuentan como 2 caracteres, y junto con los otros 15, obtenemos 17.
975 puede parecer mucho, pero tenga en cuenta que la solución python de undergroundmonorail tiene 18862 caracteres, ellos solo estás en una sola línea :)
Puede ejecutarlo en http://cjam.aditsu.net/ para palabras cortas, pero probablemente debería usar el intérprete de java para las más largas. Con Java en mi computadora portátil, se
SEND+MORE=MONEY
ejecuta en 30-40 segundos yCODE+GOLF=GREAT
en casi 3 minutos. No acepta números que comienzan con 0 (porque eso no es genial).Aquí hay un programa que genera el programa anterior (también ayuda si StackExchange no muestra el espacio en blanco correctamente):
Las primeras 11 líneas contienen el programa original (no realmente golfizado) en una cadena, y la última línea realiza la conversión y agrega la parte de decodificación.
fuente
Powershell, 137 bytes
puerto de LiveScript
Script de prueba sin golf:
Salida:
fuente
PHP,
118113 bytesimprime dígitos debajo de las letras y sale del programa; se repite infinitamente si no se puede resolver. Ejecutar como tubería con
-nr
.Descompostura
fuente
PHP, 145 bytes
función recursiva, imprime la ecuación resuelta y sale del programa; vuelve
NULL
cuando no tiene solución.Pruébalo en línea
Descompostura
fuente