Este desafío está inspirado en las matemáticas es un hecho. La programación no lo es .
La notación matemática para un factorial o un hecho es un signo de exclamación !
. El signo de exclamación también es un símbolo común not
en muchos lenguajes de programación.
Desafío:
Tome una cadena que contenga números y los caracteres: + !
como entrada y salida de lo siguiente:
Todo delante de un signo de exclamación debe evaluarse como una expresión matemática, así 2+2
sería 4
.
Todo después de un solo signo de exclamación debe agregarse como accesorios a lo que esté frente a él, por lo tanto: 2+2!5
debe dar 45
, porque 2+2=4
, y 5
es un accesorio. 2+2!5+5
debería dar 410
.
Como !
también significa not
, cualquier cosa que no sea un accesorio después del hecho no debe agregarse. Por lo tanto, 2+2!!5
debe dar 4
, ya 5
que no es un accesorio. Ahora, not(not(true))==true
así que 2+2!!!5
debería dar 45
. 2+2!!5!5+5
debería dar:, 410
porque 2+2=4
, seguido de un factorial y !5!5+5
. El primero 5
no es un hecho, sino que 5+5
está después de otro signo de exclamación y, por lo tanto, es un hecho, una vez más.
Aclaraciones:
- Los signos de exclamación no serán adyacentes a a
+
en ninguno de los lados. - No habrá
+
números principales (es5
, no+5
). - Opcionalmente, puede incluir un cero a la izquierda si ese es el resultado de la expresión frente a la primera
!
. Ambos4
y04
son salida aceptada para entrada:0+0!4
Resumen ejecutivo: evalúe cada suma (tratando !
como separadores). Luego descarte todos los números que aparecen después de un número par de !
(contando desde el comienzo de la cadena). Luego elimine todo !
.
Casos de prueba:
!
<- Empty string
5
5
12!
12
!87
87
!!5
<- Empty string
5+5!2+2
104
5+5!!2+2
10
1!2!3!4!5!6!7!8!9
12468
10+10!!2+2!!3+3!4+4
208
2!!3!5
25
2!!3!5!7
25
10!!!!!!!5
105
Este es el código de golf, por lo que gana el código más corto en bytes (en cada idioma). ¡Las explicaciones son altamente recomendadas!
25
(ver caso de prueba agregado). Más importante2!!3!5!7
aún25
, daría , porque hay un número par a la!
izquierda de la7
(por lo que no solo cuenta la carrera justo en frente del número, sino toda la!
izquierda).Row
?Respuestas:
Retina ,
353129 bytesAhorró 4 bytes al inspirarse en ETHproductions .
Gracias a Leo por guardar otros 2 bytes.
Pruébalo en línea!
fuente
JavaScript (ES6),
5856 bytesAhorró dos bytes gracias a Martin Ender .
Podría mejorarse de alguna manera ...
fuente
replace
.1+1!5
. Creo que te olvidasteeval
un poco antes del!
.Jalea , 16 bytes
Pruébalo en línea!
Explicación
La observación clave aquí es que podemos ejecutar los pasos "fuera de orden"; en lugar de evaluar las sumas y luego ignorar las que no nos gustan, podemos ignorar las sumas en posiciones no válidas y luego evaluar el resto.
La evaluación de una suma igual que
"10+10"
la evaluará a un número, por ejemplo20
, después de-evaluar en una cadena,"20"
. Repetir ese proceso no tiene ningún efecto adicional (es idempotente). Por lo tanto, evaluamos efectivamente cada elemento de la cadena, excepto la cadena nula, que permanece sin evaluar porque tiene una longitud cero.fuente
µ
en algún lugar (yµ
no funciona dentro de un bucle, lo que significa que necesitaría algo aún más detallado). Me las arreglé para hacer que funcione, tal comoṣ”!µḢW;m2$ȧVṾ$$€
, pero no es más corto (y tiene la característica de la pila de signos de dólar que tiende a ocurrir cuando se presiona la jalea hasta el borde de su capacidad para estructuras de control nido.)Jalea , 18 bytes
Pruébalo en línea!
¿Cómo?
fuente
0+0
en el medio de la entrada (en un lugar donde no se descarta); produce la cadena nula, aunque debería producir un dígito 0.CJam , 20 bytes
Pruébalo en línea! (Conjunto de pruebas separado por salto de línea).
fuente
Ruby ,
5856 + 1 =5957 bytesUsa la
-p
bandera. -2 bytes de Tutleman .Pruébalo en línea! (Se agregó una línea de código adicional para que tome todas las líneas de entrada e imprima la salida en diferentes líneas).
fuente
eval$1
, ¿no?Lote,
192184 bytesTener que manejar las cadenas vacías es inconveniente.
fuente
Pip , 18 bytes
Creo que esto es lo más corto posible ... aunque dije eso hace unas tres iteraciones también.
Toma entrada como argumento de línea de comando. Pruébalo en línea!
Explicación
fuente
R, 95 bytes
Probablemente haya margen de mejora, pero por el momento es lo mejor que se me ocurre.
fuente