Crea una calculadora básica para números romanos.
Requisitos
- Soportes
+
,-
,*
,/
- La entrada y la salida deben esperar solo un prefijo de sustractor por símbolo (es decir, 3 no puede ser
IIV
porque hay dosI
antesV
) - Manipulación del principio de sustracción en la entrada y el mosto de salida en apoyo mínimo de las convenciones estándar modernas, en las que sólo potencias de diez se restan de los números más grandes (por ejemplo
I
,X
,C
sustractores son necesarios pero noV
,L
,D
) y la resta nunca se hace a partir de un número de más de 10 veces el sustractor (por ejemplo,IX
debe ser compatible peroIC
no es obligatorio). - La entrada y la salida se deben dejar de izquierda a derecha en orden de valor, comenzando por la más grande (es decir, 19 =
XIX
noIXX
, 10 es mayor que 9) - De izquierda a derecha, sin prioridad del operador, como si estuviera usando una calculadora manual.
- Admite números enteros positivos de entrada / salida entre 1-4999 (sin necesidad de V̅)
- No hay bibliotecas que hagan conversión de números romanos por usted
Para que usted decida
- Mayúsculas y minúsculas
- Espacios o sin espacios en la entrada
- ¿Qué sucede si obtienes una salida decimal? Truncado, sin respuesta, error, etc.
- Qué hacer para la salida que no puede manejar. Negativos o números demasiado grandes para imprimir.
- Ya sea para apoyar un uso más liberal del principio de resta que el requisito mínimo.
Crédito adicional
- -50 - Manejar hasta 99999 o más grande. Los símbolos deben incluir un vinculo
Entrada / salida de muestra
XIX + LXXX (19+80)
XCIX
XCIX + I / L * D + IV (99+1/50*500+4)
MIV
El código más corto gana.
code-golf
roman-numerals
Danny
fuente
fuente
IM = 999
requiere manejar números ?IM
. Si la salida esIM
oCMXCIX
para 999 depende de usted. Ambos se ajustan a los requisitos.Respuestas:
JavaScript (ES6), 238
Uso:
Versión anotada:
fuente
T-SQL, 1974-50 = 1924 bytes
Sé que jugar al golf en SQL es equivalente a jugar 18 hoyos con nada más que una cuña de arena, pero disfruté el desafío de este, y creo que logré hacer algunas cosas interesantes metodológicamente.
Esto admite el vinculum tanto para entrada como para salida. Adopté la convención de usar una tilde final para representarlo, por lo que V ~ es 5000, X ~ es 10000, etc. También debe manejar salidas de hasta 399,999 de acuerdo con el uso estándar moderno de números romanos. Después de eso, hará una codificación romana parcialmente no estándar de cualquier cosa en el rango admitido por INT.
Como todo es matemática entera, cualquier resultado no entero se redondea implícitamente.
Todavía estoy jugando con una solución basada en conjuntos para reemplazar algunos de los bucles WHILE que podrían reducir el recuento de bytes y ser un ejemplo más elegante de SQL idiomático. También se pueden obtener algunos bytes reduciendo el uso de alias de tabla a un mínimo. Pero como es esencialmente imposible de ganar en este idioma, en su mayoría solo estoy aquí para mostrar mi atuendo de Don Quijote. :)
SELECT @i en la parte superior repite la entrada:
Y el SELECCIONAR al final devuelve:
Y puede probarlo usted mismo en este SQLFiddle
Y volveré para agregar algunos comentarios sobre cómo funciona, porque ¿por qué publicar una respuesta obviamente perdida si no va a explotarla por su valor educativo?
fuente
Javascript -
482476 caracteresLa entrada / salida de muestra funciona:
También maneja mal grandes números:
Y acepta, pero no requiere, espacios también.
Pero, como estaba jugando al golf, tiene algunos problemas:
Esta versión alternativa maneja números de más de 5000 hasta 99999, pero tiene
600598584 caracteres:fuente
Javascript
479361348278253303 caracteres: 50 para números de soporte de hasta 1 millón, completo con soporte de vinculum:
Uso:
p(text)
por ejemplo,p('XIX + LXXX')
devolucionesXCIX
.Código con comentarios explicativos:
Esto funciona para las muestras dadas y para todas las demás que he probado. Ejemplos:
fuente
Ruby 2.1,
353 (y muchas otras iteraciones), 295 - 50 = 245El manejo del vinculum agrega ~ 23 caracteres.
Esto maneja "IL" o "VM" en la entrada, y falla sin error en negativos (va a entradas altas) o decimales (trunca), o cualquier espacio. Ahora también maneja un primer número negativo (aunque si el total es negativo, todavía falla mal). También falla mal si comienza con * o / o si el resultado es 4 millones o más.
Utiliza Object # send para la funcionalidad de "calculadora manual".
Sin golf:
fuente
Python 2 -
427418404401396395392 caracteresLee desde la entrada estándar. Solo maneja mayúsculas (podría hacer que no distinga entre mayúsculas y minúsculas al costo de 8 caracteres adicionales) y requiere espacios. No valida: no he probado para ver cómo se rompe en varios casos. Sin embargo, maneja números como VC = 95.
Y la versión sin golf:
Tengo la sensación de que Perl hubiera sido mejor, pero no sé lo suficiente. Sin embargo, para un primer intento de golf de código, me siento bastante bien con esto.
fuente
PHP -
549525524520 bytesNada demasiado innovador: normaliza los operadores para garantizar la precedencia de izquierda a derecha, convierte el romano al decimal, ejecuta
eval
la instrucción, por ejemplo, XCIX + I / L * D + IV se convierte en algo así como return ((((((+90 +9) + (+1)) / (+50)) * (+500)) + (+4)); , luego convierte el decimal de nuevo a romano.p.ej
fuente
Python - 446 bytes
Esto podría mejorarse considerablemente. Sentí que tenía que dar el primer golpe con Python. Hace 3 cosas en el primer pase
x
para incluir todas las combinaciones posibles encontradas (incluso si no se usan). Por ejemplo, mientrasXIX
se está lexed, los valores parciales de"X":10
,"XI":11
y"XIX":19
se añaden a la tabla de símbolosAl final, llama
eval
a la cadena original (excepto con parens agregados) y le da la tabla de símbolos.Luego simplemente pegué una solución conocida para convertir enteros a romanos, ya que había trabajado en esto lo suficiente ... por favor, siéntase libre de mejorar para que aprenda algo nuevo :)
fuente