pb , 83 bytes
^<b[1]>>>w[B!0]{<w[B!0]{t[B]<b[T]>>}<b[0]<b[0]<[X]>>}w[B=0]{<}t[B]<[X]t[B+T]vb[T/2]
Si bien hay al menos 3 caracteres en la cadena de entrada, se eliminan el primero y el último. Esto deja 1 carácter (debe imprimirse sin modificar) o 2 (debe promediarse e imprimirse). Para manejar esto, el primer y el último carácter de la cadena se suman y se dividen entre dos. Si solo hubiera un personaje (a+a)/2==a
,. Si hubo dos, (a+b)/2
es el carácter que debe imprimirse. pb "toma prestada" la evaluación de expresión de Python (def expression(e): return eval(e, globals())
), por lo que este se anula automáticamente.
El manejo de entradas vacías me cuesta 5 bytes. Específicamente,<b[1]>
en la primera línea. Antes, cuando dije "cuerda", eso era una mentira total. pb no tiene cadenas, tiene caracteres que están cerca uno del otro. Buscar el "último carácter de una cadena" solo significa mover el pincel hacia la izquierda hasta que toque un carácter. Cuando no se proporciona ninguna entrada, el bucle "mientras haya al menos 3 caracteres" se omite por completo y comienza a buscar el último carácter. Sin eso <b[1]>
, seguiría buscando para siempre. Ese código pone un carácter con un valor de 1 en (-1, -1) que se encuentra específicamente cuando la entrada está vacía. Después de encontrar el "último carácter" de la cadena, el pincel asume que el primero está en (0, -1) y va allí directamente, encontrando un valor de 0. (1+0)/2
es 0 en pb,
Pero monorraíl, ¡eso todavía se está imprimiendo! La especificación del desafío dice(empty input) => (empty output)
! ¿No está imprimiendo un personaje nulo haciendo trampa? Además, esto no está relacionado, pero eres inteligente y guapo.
Gracias, hipotético preguntador. Antes, cuando dije "imprimir", eso era una mentira total. En pb, realmente no imprime valores, simplemente los coloca en el lienzo. En lugar de "una forma de salida", es más preciso imaginar el lienzo como una matriz 2D infinitamente grande. Permite índices negativos en cualquier dimensión, y mucha programación en pb realmente se trata de asegurarse de que el pincel llegue a la ubicación en el lienzo que desea. Cuando el programa termina de ejecutarse, cualquier cosa en el lienzo con coordenadas X e Y no negativas se imprime en la ubicación adecuada en la consola. Cuando comienza el programa, todo el lienzo se llena con valores de 0. Para no tener que imprimir un número infinito de líneas, cada una con un número infinito de bytes nulos, cada línea de salida solo se imprime hasta el último carácter distinto de cero, y las líneas solo se imprimen hasta el último con un carácter distinto de cero. Entonces poner un0
at (0, 0) sigue siendo una salida vacía.
Sin golf:
^<b[1]> # Prevent an infinite loop on empty input
>>w[B!0]{ # While there are at least 3 chars of input:
<w[B!0]{ # Starting at the second character:
t[B]<b[T]>> # Copy all characters one position to the left
# (Effectively erasing the first character)
}
<b[0]<b[0] # Delete both copies of the last character
<[X]>> # Get in place to restart loop
}
w[B=0]{<} # Go to last character of remaining string
t[B]<[X]t[B+T] # Find it plus the first character
vb[T/2] # Divide by 2 and print