El recuento de bytes asume la codificación ISO 8859-1.
S_`
%{2`
$`
}T01`p`_p
..
Mm`.¶.|^¶$
^0
Salidas 1
para la verdad y 0
para la falsedad.
Pruébalo en línea! (La primera línea habilita un conjunto de pruebas separado por salto de línea).
Explicación
Inspirado por una respuesta de mbomb007 recientemente desarrollé una ord()
implementación razonablemente corta en Retina. Esto se basa en gran medida en eso, aunque pude hacer algunas simplificaciones ya que no necesito un resultado decimal ya que solo necesito admitir ASCII imprimible (y solo me importa la paridad del resultado, por lo que terminé con un desplazamiento arbitrario también está bien).
Etapa 1: Split
S_`
Esto simplemente divide la entrada en sus caracteres individuales dividiéndolos alrededor de la coincidencia vacía y soltando los resultados vacíos al principio y al final con _
.
Etapa 2: reemplazar
%{2`
$`
los %{
le dice a Retina a) que esta etapa y la siguiente deben ejecutarse en un bucle hasta que la cadena deje de cambiar a través de una iteración completa, y que estas dos etapas deben aplicarse a cada línea (es decir, cada carácter) de la entrada por separado.
La etapa en sí es la técnica estándar para duplicar el primer carácter de la entrada. Emparejamos la cadena vacía (pero solo miramos las dos primeras coincidencias) e insertamos el prefijo de esa coincidencia. El prefijo de la primera coincidencia (al comienzo de la cadena) está vacío, por lo que esto no hace nada, y el prefijo de la segunda coincidencia es el primer carácter, que por lo tanto está duplicado.
Etapa 3: transliterar
}T01`p`_o
}
indica el final del ciclo. El escenario en sí mismo es una transliteración. 01
indica que solo debe aplicarse al primer carácter de la cadena. p
es una forma abreviada de todos los caracteres ASCII imprimibles y _
significa "eliminar". Entonces, si expandimos esto, la transliteración realiza la siguiente transformación:
from: !"#$%...
to: _ !"#$...
Entonces, los espacios se eliminan y todos los demás caracteres se reducen. Eso significa que estas dos etapas juntas crearán un rango de caracteres desde el espacio hasta el carácter dado (porque repetidamente duplicarán y disminuirán el primer carácter hasta que se convierta en un espacio en el que se cancele la duplicación y eliminación).
La longitud de este rango se puede usar para determinar la paridad del personaje.
Etapa 4: reemplazar
..
Simplemente dejamos caer todos los pares de caracteres. Esto borra las líneas de longitud par y reduce las líneas de longitud impar a un solo carácter (el carácter de entrada, de hecho, pero eso realmente no importa).
Etapa 5: partido
Mm`.¶.|^¶$
Es más fácil encontrar entradas que no sean pares, por lo que contamos el número de coincidencias de dos líneas vacías sucesivas o dos líneas sucesivas no vacías. Deberíamos conseguir0
contrario, entradas pares y algo distinto de cero.
Etapa 6: partido
^0
Todo lo que queda es invertir el resultado, lo que hacemos contando el número de coincidencias de esta expresión regular, que comprueba que la entrada comienza con a 0
. Esto solo es posible si el resultado de la primera etapa fue 0
.