Laberinto , 28 25 24 23 22 bytes
" >
?!?:|}\{@
@\?"":)!
¡Esto fue muy divertido! :) Ese es, con mucho, el programa Labyrinth más densamente comprimido que he escrito hasta ahora. Tenía tantas versiones en 20 y 21 bytes que casi funcionaron que todavía dudo que esto sea óptimo ...
Esto toma la entrada como una lista de enteros positivos (con un delimitador arbitrario) e imprime el resultado en STDOUT como enteros delimitados por salto de línea.
La búsqueda de 20/21 bytes: he verificado todos los programas del formulario
" XX
?!?X}\{@
@\?XX)!
donde Xhay algún carácter razonable por fuerza bruta, pero no encontró ninguna solución válida. Por supuesto, eso no significa que no exista una solución más corta, pero no es posible forzar programas de 20 bytes sin una cantidad decente de suposiciones en su estructura.
Explicación
(La explicación está un poco desactualizada, pero todavía no estoy convencido de que la solución sea óptima, por lo que esperaré con la actualización).
Por lo tanto, normalmente se supone que los programas Laberinto parecen laberintos. Mientras el puntero de instrucciones se encuentre en un corredor, seguirá ese corredor. Cuando la IP golpea cualquier tipo de cruce, la dirección se determina en función del valor superior de la pila principal de Labyrinth (Labyrinth tiene dos pilas, con una cantidad infinita de ceros en la parte inferior). Eso normalmente significa que cualquier bucle no trivial será bastante costoso, porque si tiene celdas sin pared en todo el lugar, todo es una unión, y en la mayoría de los casos la parte superior de la pila no tendrá el valor correcto para la IP tomar el camino que le gustaría tomar. Entonces, lo que debe hacer es ampliar los bucles de modo que tengan un todo en el centro con solo un punto de entrada y salida bien definido cada uno.
Pero esta vez tuve mucha suerte y todo encajó tan bien que pude juntarlo todo en un gran grupo. :)
El flujo de control comienza en el _sur. El _empuja un cero en la pila principal. Puede parecer un no-op, pero esto aumenta la profundidad de la pila (no implícita) a la 1que necesitaremos más adelante.
?lee un entero de STDIN. Si no hay más números enteros para leer, esto empuja a cero. En ese caso, la IP sigue moviéndose hacia el sur y @finaliza el programa de inmediato (porque la lista de entrada está vacía). De lo contrario, la IP gira hacia el este.
Ahora estamos entrando en un circuito muy cerrado con dos puntos de salida:
!?;
\?
;
!imprime el entero de nuevo en STDOUT, dejando solo un cero en la pila. La IP sigue avanzando hacia el este y ?lee el siguiente número entero. Si eso no es cero, giramos a la derecha y avanzamos hacia el sur. ?lee otro (el siguiente índice par). Nuevamente, si eso no es cero, giramos a la derecha y nos movemos hacia el oeste.
Luego \imprime un salto de línea sin cambiar la pila, por lo que tomamos otra derecha, moviéndonos hacia el norte. !imprime el siguiente entero de índice par. Como ahora hay al menos un entero de índice impar (positivo) en la pila, seguimos girando a la derecha y el ciclo se repite.
Una vez que cualquiera de esos ?llega al final de la lista, empujan un cero y se mueven directamente al correspondiente ;, que descarta ese cero.
En el caso de que haya un solo elemento en la lista, hemos terminado (porque lo imprimimos de inmediato), por lo que la IP seguiría moviéndose hacia el Este hasta el final @, nuevamente terminando el programa (imprimiendo un final salto de línea en el camino).
De lo contrario, también necesitamos imprimir los enteros de índice impar. En ese caso, los dos caminos (desde los dos puntos de salida del primer bucle) se fusionan en el medio ", girando hacia el este en cualquier caso.
_empuja un cero para evitar girar a la izquierda @y ;descarta ese cero. Ahora entramos en un nuevo bucle:
"}
""
El IP ingresa esto en la celda inferior izquierda, moviéndose hacia el norte, girando alrededor del bucle en sentido horario. El }desplaza la parte superior de la pila principal a la pila auxiliar. Si bien todavía hay un elemento en la pila, la IP sigue haciendo lo suyo. Una vez que todo se ha desplazado a la pila auxiliar (y se ha revertido en el proceso), la IP continúa moviéndose hacia el Este, ingresando al último bucle:
\{@
#!
\imprime un salto de línea nuevamente, {mueve un elemento de la pila auxiliar de nuevo a main. Si todavía era un elemento de la lista, será positivo, y la IP gira hacia el sur, donde se imprime el elemento !. Luego #empuja la profundidad de la pila (y ahora aquí es donde la inicial _es importante, porque esto #asegura una profundidad de pila positiva), de modo que la IP todavía gire a la derecha, a través de la \y {otra vez.
Después de que imprimimos todo, {sacamos un cero de la parte inferior de la pila auxiliar, la IP continúa hacia el Este y @finaliza el programa.