Este desafío es presentado por inspiración real (y trágica). Recientemente, la fila de números en mi teclado ha sido un poco esporádica. Las teclas 1-9
funcionan a veces, pero otras veces no tienen resultado. Como un ávido programador, ¡esto es horrible! (¿Ves ese signo de exclamación? Así es como sabes que están funcionando en este momento). No solo a menudo necesito los números, sino también los símbolos!@#$%^&*(
¡son completamente ineficaces la mitad del tiempo también! Como programador en C, en lugar de tomarme un tiempo libre de mi apretada agenda de garabatear código para arreglar mi laptop, he estado más interesado en solucionar el problema. En el transcurso de las últimas semanas, lentamente, todos los literales de números en mi código han sido reemplazados por hexadecimales para que no tenga que buscar números para copiar y pegar. Sin embargo, algunos números no son fáciles de escribir sin las teclas 1-9
. Por ejemplo, el número 1
no se puede escribir simplemente en hexadecimal, y he recurrido a reemplazar 1
s en mi código con 0xF - 0xE
. Las únicas teclas que se ven afectados son 1-9
, por lo mantengo pleno uso de símbolos como +
, -
, y /
. Sin embargo, no puedo usar multiplicación o paréntesis, como*
y a (
menudo se rompen. Esto lleva a tu desafío.
Entrada
Un número entero, n
stdin o el equivalente de su idioma. Si lo desea, el entero puede ir precedido o seguido de una nueva línea u otro carácter de espacio en blanco. Alternativamente, puede recibir información a través de un argumento de línea de comando.
Su programa debe responder correctamente a la entrada negativa y ser capaz de manejar al menos enteros con signo de 32 bits.
Salida
Su programa debería generar, de alguna forma observable, la forma más corta posible (en caracteres que no sean espacios en blanco) de escribir el número n
como una suma, diferencia o división de uno o más valores hexadecimales. Hay más de una forma de resolver este problema, y no es necesario que favorezca cualquier salida de igual longitud sobre cualquier otra.
La salida debe estar en la forma A % A % A...
donde A
es un valor hexadecimal siguiente que 0x
contiene solo dígitos A-F a-f
, y %
es uno de los símbolos -+/
. Vamos a /
describir la división entera, no el punto flotante.
(Tenga en cuenta que su resultado debería resultar n
al evaluar las divisiones primero, de izquierda a derecha, y luego sumas y restas, de izquierda a derecha, como es la convención).
Casos de prueba
De entrada y salida
1
0xF - 0xE
(o0xF-0xE
o0xB-0xA
o0xd - 0xc
o0xF/0xF
)15
0xF
255
0xFF
30
0xF + 0xF
Puntaje y Reglas
Este es el código de golf. Su puntaje preliminar es el número de bytes en su archivo fuente.
NO puede usar ninguno de los dígitos 1-9
en su fuente.
PUEDE usar símbolos !@#$%^&*(
en su fuente, pero cada uno tiene una penalización de +20 a su puntaje.
Su programa puede ser reemplazado por una función que tome n
como argumento siempre que esa función produzca algún tipo de salida legible por humanos. El valor de retorno de su función NO cuenta como salida.
Las lagunas estándar no están permitidas.
¡La puntuación más baja gana! ¡Buena suerte!
¿Me equivoqué con el formato / cuestionamiento / claridad? ¡Házmelo saber! ¡Esta es mi primera presentación a este sitio!
fuente
Respuestas:
JavaScript 287 (187 + 20 * 5)
295 (195 + 20 * 5) 338 (198 + 20 * 7)Una función que verifica todas las combinaciones posibles de los 6 dígitos hexadecimales permitidos (0xA a 0xF) y los 3 operadores permitidos. Salida a través de una ventana emergente y no devuelve un valor, según lo solicitado.
Solía [] agrupar expresiones separadas por comas, pero no podía evitar los 5
7corchetes abiertos para bucles y llamadas a funciones.Para evitar dígitos hay variables A, B, C para 1,2,3 (esto hace que el código sea aún más oscuro)
Editar código revisado enfocándose en evitar '('. Eliminado
if
sy creación explícita de RegExpCuidado: esta función es increíblemente lenta, excederá el límite de tiempo para un script en Firefox, incluso para entradas pequeñas como 90.
Para enumerar todas las expresiones posibles, uso un número que comienza en 3 y sube para siempre. Codificación de dígitos:
0,1,2 son los operadores +, -, /
4 a 9 son los dígitos hexadecimales A..F
3 no está permitido
Cada número se verifica con una expresión regular
/3|[0-2]{2}/
para evitar el dígito 3 y tener 2 operadores consecutivos (el comprobar también evitar operadores de arrastre y líderes - ver código)La cadena resultante es algo así como
0xA + 0xA - 0xD
JavaScript válido, por lo que uso eval para evaluarlo. Desafortunadamente, el operador '/' es de coma flotante y no es entero en JavaScript, por lo que no estoy 100% seguro de que el resultado sea un evento correcto para enterar el resultado final (pero estoy bastante seguro, dado que un pequeño error de redondeo no puede ser amplificado por un '*')Algo más
Ahora, algo más divertido. Utilicé un analizador de expresiones excesivamente simplificado para evitar la llamada de evaluación y, divertida, resultó ser mucho más rápido.
El analizador está realmente simplificado, en un analizador real V y O deben ser matrices que contengan la pila de valores pendientes y la pila de operadores pendientes. Aquí V es el único valor pendiente (y también el valor de retorno) y O es una cadena con un máximo de 2 caracteres. P contiene la tabla de precedencia de operadores, para '- + /' => '112'
Esto puntúa 275 + 4 * 20 => 355
Prueba En la consola Firefox / FireBug, cambie la alerta con retorno (mucho más utilizable)
Solo un poco menos obvio (pero sea paciente)
fuente
Python 2: 185 bytes + 2 * 20 = 225
Demasiado tiempo para una respuesta seria. Pero como todavía no hay respuestas, lo publicaré de todos modos.
product
crea todos los arreglos diferentes de los caracteres permitidos.exec
intenta descifrarlo. Lamentablemente, esto devuelve una excepción, de ahí el largotry - catch
bloque. Si el resultado está bien, se imprime y existe.2 veces de penalización, debido a esas llaves durante las llamadas a funciones.
fuente
0
no es un literal hexadecimal; (2) La división que involucra un número negativo en Python da un resultado diferente que en C.