A los chicos ASCII de ojos temblorosos les gusta cambiar de ASCII Ii:
>_> <_< >_< <_>
Dada una cadena de personas cambiantes, separadas o líneas separadas, desplace el Iilado a lado, deje la pared y los cielos a la derecha:
Ii
La palanca de cambio más corta gana el premio.
¿Que qué?
Escriba un programa o función que incluya una cadena de una lista arbitraria de estos cuatro emoticones ASCII, separados por espacio o por nueva línea (con una nueva línea final opcional):
>_>
<_<
>_<
<_>
Por ejemplo, la entrada podría ser
>_> >_> <_>o
>_> >_> <_>(El método que admite depende de usted).
Cada emoticón realiza una acción diferente en los caracteres Iy i, que siempre comienzan así:
Ii
>_>se desplazaIhacia la derecha por uno, si es posible, y luego se desplazaihacia la derecha por uno.<_<se desplazaIhacia la izquierda por uno, si es posible, y luego se desplazaihacia la izquierda por uno, si es posible.>_<se desplazaIhacia la derecha por uno, si es posible, y luego se desplazaihacia la izquierda por uno, si es posible.<_>se desplazaIhacia la izquierda por uno, si es posible, y luego se desplazaihacia la derecha por uno.
Ino puede desplazarse a la izquierda si está en el borde izquierdo de la línea (como está inicialmente), y no puede desplazarse a la derecha si iestá directamente a su derecha (como está inicialmente).
ino se puede desplazar hacia la izquierda si Iestá directamente a su izquierda (como es inicialmente), pero siempre se puede desplazar hacia la derecha.
Tenga en cuenta que con estas reglas, Isiempre permanecerá a la izquierda de i, y Ise intenta cambiar antes ipara todos los emoticones.
Su programa o función necesita imprimir o devolver una cadena de la Iilínea final después de aplicar todos los cambios en el orden dado, usando espacios ( ) o puntos ( .) para el espacio vacío. Los espacios o puntos finales y una nueva línea final opcional se permiten opcionalmente en la salida. No mezcle espacios y períodos.
Por ejemplo, la entrada
>_> >_> <_>tiene salida
I...iporque los turnos se aplican como
start |Ii >_> |I.i >_> |.I.i <_> |I...i
El código más corto en bytes gana. Tiebreaker es la respuesta más votada.
Casos de prueba
#[id number]
[space separated input]
[output]
Utilizando .para mayor claridad.
#0
[empty string]
Ii
#1
>_>
I.i
#2
<_<
Ii
#3
>_<
Ii
#4
<_>
I.i
#5
>_> >_>
.I.i
#6
>_> <_<
Ii
#7
>_> >_<
.Ii
#8
>_> <_>
I..i
#9
<_< >_>
I.i
#10
<_< <_<
Ii
#11
<_< >_<
Ii
#12
<_< <_>
I.i
#13
>_< >_>
I.i
#14
>_< <_<
Ii
#15
>_< >_<
Ii
#16
>_< <_>
I.i
#17
<_> >_>
.I.i
#18
<_> <_<
Ii
#19
<_> >_<
.Ii
#20
<_> <_>
I..i
#21
>_> >_> <_>
I...i
#22
<_> >_> >_> >_> <_> <_<
.I...i
#23
<_> >_> >_> >_> <_> <_< >_< <_< >_<
..Ii
#24
>_> >_< >_> >_> >_> >_> >_> >_> <_> <_> <_<
...I.....i

Respuestas:
CJam, 33 bytes
Utiliza el mismo algoritmo que mi respuesta de Python , excepto con la indexación 0. Esencialmente:
<a -1 y>a 1Iy aplicari, alternamos qué posición actualizamos después de cada flechaGracias a @ MartinBüttner por jugar golf en el paso de salida, quitando 5 bytes.
Pruébalo en línea | Banco de pruebas
fuente
Perl,
595654 bytesIncluye +1 para
-pEjecutar con la entrada en STDIN, p. Ej.
perl -p shifty.pl <<< ">_> <_< >_< <_>"shifty.pl:Explicación
La cadena de control alterna las instrucciones para
iyIy la regla es la misma para ambos si las formula como:<Mover a la izquierda si hay un espacio a la izquierda>Muévase a la derecha si hay un espacio o final de cadena a la derechaAsí que voy a intercambiar
iyIen la cadena de destino en cada paso, así que solo necesito aplicar la regla a una letra. Este es ely/iI/Ii/Recorreré la cadena de control buscando
<y>usando una sustitución, que generalmente es la forma más corta en perl para procesar algo carácter por carácter. Para evitar tener que escribir$var =~, quiero la cadena de control en la variable predeterminada perl$_. Y también quiero una manera fácil de distinguir<de>. Todo esto se puede lograr usandoLa cadena de destino también quiero manipular usando sustituciones y, por la misma razón, también quiero eso
$_.$_ser dos cosas a la vez parece imposible.Sin embargo, puedo tener mi pastel y comerlo también porque el
$_interior del cuerpo de una sustitución no tiene que ser el mismo que el$_sustituido. Una vez que Perl comenzó a sustituir una cadena, esta cadena no cambiará incluso si cambia la variable de la que proviene originalmente la cadena. Entonces puedes hacer algo como:Quiero reemplazar el original
$_por el inicial"Ii"solo la primera vez que se ejecuta el cuerpo de sustitución (de lo contrario, sigo restableciendo la cadena de destino). Sin embargo, este reemplazo también tiene que suceder para una cadena de control vacía, por lo que incluso para la cadena de control vacía, el cuerpo debe ejecutarse al menos una vez. Para asegurarme de que la substición se ejecute un tiempo extra al comienzo de la cadena de control (incluso para cadenas de control vacías), cambio la sustitución a:Ejecutaré
y/iI/Ii/como lo primero dentro del código de sustitución. Si bien$_todavía es la cadena de control, esto todavía no contendrá ningunaIi, por lo que si la transliteración indica que no se cambió nada, ese es mi desencadenante de inicialización$_:Ahora puedo implementar el movimiento real de las letras. Desde que comienzo con un intercambio, todos los movimientos deben hacerse
i, noI. Si$1está configurado, muévaseia la derecha:Si
$1no está configurado, muévaseia la izquierdaTenga en cuenta que al comienzo de la cadena de control cuando coincida
^$1no se establecerá, por lo que intenta moverseihacia la izquierda en la cadena inicialIi. Esto no funcionará porque no hay espacio allí, por lo que la cadena inicial permanece intacta (es por eso que puse el()alrededor en>lugar de<)Solo queda un problema: al final de la sustitución externa
$_se establece como resultado de la sustitución externa, independientemente de lo que haya hecho$_dentro del cuerpo de sustitución. Entonces, la cadena de destino con la colocación adecuada deiyIse pierde. En perls más antiguos esto sería un defecto fatal. Sin embargo, los perls más recientes tienen elrmodificador que significa "hacer una copia de la cadena original, hacer su sustitución en eso y devolver la cadena resultante (en lugar del número de coincidencias)". Cuando uso eso aquí, el resultado es que la cadena de comando modificada se descarta mientras que el original$_no se ve afectado por Perl y se deja después de la sustitución. Sin embargo, lo inquietante que hago$_todavía se hace después de que Perl se haya quedado$_solo. Entonces al final$_será la cadena objetivo adecuada.La
-popción asegura que la cadena original esté dentro$_y también imprime la final$_.fuente
Ii, noiI.^coincidencia adicional significa que tengo que cambiarlos . Entonces la inicialización inversa es correcta.LittleLua - 178 bytes
Implementación directa.
Sin golf:
¿Qué es LittleLua?
LittleLua es un trabajo en progreso para tratar de nivelar los campos de juego entre mi idioma de elección para estos desafíos y lenguajes esotéricos que a menudo tienen incorporados extremadamente poderosos.
LittleLua es un intérprete Lua 5.3.6 con un módulo adicional (LittleLua.Lua), así como nombres de funciones y módulos reducidos. Estos cambios se expandirán durante el próximo día o dos, hasta que esté contento, pero tal como está, varios de los cambios más grandes entre LittleLua y un intérprete estándar de Lua son:
Las funciones y los módulos se reducen:
Construido en variables
LittleLua tiene varias variables integradas para reducir algunas tareas:
Funciones integradas
Actualmente una lista deprimentemente pequeña, pero aquí está:
fuente
$y use eso en lugar deendoe- losA-Za-zcaracteres que no son palabras no necesitan espacios a su alrededor, ¿verdad? Eso afeitaría un byte porend/eifai, ahorrando un byte por el uso, yendquee, salvando dos, pero lo dejóelsesolo? Incluso en este programa simple (5ifsy 2elses), está desperdiciando más byteselsede los que ahorraif. (¿Asumo que es una mejora planificada?)retina ,
10186Pruébalo en línea
¡Guardado 15 bytes gracias a daavko!
Toma entradas separadas por nuevas líneas y salidas con los ojos separados por espacios.
Explicación:
Explicaré paso a paso como de costumbre. Todas estas etapas están en el modo Reemplazar de Retina. Eso significa que la primera línea es una expresión regular y la segunda línea es una cadena de reemplazo.
Agregue la inicial
Iial final de la entrada.El backtick separa el escenario de las opciones. El carácter de opción
(indica que esta etapa es el inicio de un ciclo de etapas que se ejecutarán repetidamente en orden hasta que se complete un ciclo completo sin cambiar la entrada. Dado que este paréntesis abierto nunca se cierra, todas las etapas restantes son parte de este ciclo.La etapa real es muy simple, si el primer carácter de la cadena es una nueva línea, elimínela. Esto es solo para ayudar a facilitar el manejo de la entrada vacía, de lo contrario sería más divertido agregarlo a las dos últimas etapas.
Aquí, la opción
shace que el metacarácter.Regex coincida con las nuevas líneas. Esta etapa hace que un inicio>coincida con elIseguido por un espacio opcional. Luego reemplaza esa coincidencia con las cosas después del>, seguido por el espacio opcional (por lo que la cadena vacía si el espacio no puede coincidir), y luego elI.Esta etapa es muy similar a la anterior, solo el espacio opcional está antes del
I, y el orden y el ojo están invertidos.El manejo de la
irealidad es a menudo más simple, porque no tenemos que preocuparnos de agregar o quitar opcionalmente, yaique siempre se puede mover a la derecha. Para losicasos, eliminamos el guión bajo y el signo mayor / menor que, pero de lo contrario hacemos una lógica similar. Este agrega un espacio antes deli.De nuevo similar al anterior, pero elimina el carácter antes de
isi ese carácter es un espacio, de lo contrario solo elimina el emoticón.fuente
s`^_>(.*)i( |$)?=>s`^_>(.*)iy su reemplazo$1$#2$* i=>$1 i, ys`^_<(.*?)( )?i=>s`^_<(.*?) ?iy su reemplazo$1i$2=>$1i.Python,
142141134122121 bytesGuardado 19 bytes gracias a xnor.
Ejemplo:
Explicación:
fuente
ise quedará siempre más grande queI?I, puntosi, sin necesidad de listas y uniones.GNU sed, 81 bytes
(incluido +1 para
-rbandera)Esto crea un nuevo programa sed a partir de la entrada (que puede ver eliminando la última línea) y lo aplica al estado inicial
Ii.Explicación
<y>'sustituyen' comandos que se desplazan hacia laIizquierda y hacia la derecha, respectivamente._para trabajar enilugar deIino está delimitado por ningún borde derecho, así que no agregue ni consuma espacio a continuaciónIi.s///esiempre se usa/bin/shcomo shell, por lo que no pude acortar estosed '&'<<<Iicomo quería (esa es una sintaxis de redireccionamiento de Bash).Resultados de la prueba
fuente
Javascript (ES6)
176 171 168 155 148 147 142141 bytesUso
Degolfed (v6, v7 no es muy diferente)
fuente
=>{ ... }, podría hacer una expresión y guardar bastantes bytesMATL ,
5655504947 bytesPruébalo en línea!
fuente
Retina,
9186 bytesProbablemente no tomé el mejor enfoque, por lo que probablemente se pueda jugar más al golf. Y no, no copié FryAmTheEggman (sé que son realmente similares en nuestros enfoques). Ni siquiera vi su respuesta hasta después de que publiqué la mía.
Pruébalo en línea
fuente
( |)al final de la última partida, ya que nunca habrá espacio despuési. Además, de nuevo en la última línea de coincidencia, no es necesario cerrar el corchete para el bucle. El bucle no cerrado se cierra automáticamente al final del archivo en Retina.iy algo después de eso reemplazar. Olvidé cambiar eso.Javascript (ES6) 166 bytes
Usando la respuesta de Charlie Wynn, logré guardar 10 bytes definiendo Math.max como M y llamando a M cada vez que su script usa
(No escribí este golf, Charlie Wynn lo hizo aquí . Simplemente lo modifiqué para hacerlo más corto)
fuente
SyntaxError: missing : in conditional expressionen Firefox. Puede arreglarlo con_=>{I=0,i=1,M=Math.max;_.split` `.map(m=>(I=(m=m.split`_`)[0]=='<'?M(0,I-1):M(i-1,I+1))+(i=m[1]=='<'?M(I+1,i-1):i+1));(a=Array(i).fill`.`)[I]='I';return a.join``+'i'}, que tiene el mismo tamaño exacto.JavaScript (ES6), 115
118Editar: 3 bytes guardados gracias a CharlieWynn
pes el número de espacios antesI;qes el número de espacios entreIyi. Ninguno de los dos puede ser negativo.Menos golf
Prueba
fuente
Retina,
6158 bytes3 bytes guardados gracias a @FryAmTheEggman.
La explicación llega un poco más tarde.
Pruébalo en línea!
Código modificado con prueba de lote.
fuente
Python 2,
9692 bytesSolución bastante atractiva para un desafío inestable. Entrada como
f('>_> <_>'), salida como'I i'.Programa de verificación (suponiendo que
testses la cadena de caso de prueba multilínea):El programa lee cada flecha una a la vez, comenzando
I=1, i=2y utilizando índices basados en 1. Los nombres de las variables son un poco engañosos ya que intercambian roles, después de cada char, seIvuelveiyiseIactualiza. Un personaje solo se actualiza si no se movería a la posición del otro personaje ni a la posición 0.Por ejemplo, para
>_> <_> >_<nosotros hacemos:Esto da
' Ii'lo deseado.fuente
Lua, 104 bytes
Uso:
fuente
Javascript (ES5),
153125bytestoma una entrada estableciendo una variable
aantes de ejecutarAlgo no golfista:
fuente
Mathematica, 125 bytes
Función pura con primer argumento
#. La idea es que cada uno<_,>_,<, y>en los corresponde entrada a una regla de sustitución de cadenas."<_"|">_"|">"|"<"es un patrón de cadena que coincide con cualquiera de esas cuatro expresiones.StringCases[#,"<_"|">_"|">"|"<"]encontrará todos esos partidos. Luego reemplazamos (/.) cada uno"<_"con la regla de reemplazo de cadena".I"->"I.", cada uno">_"con la regla"I."->".I", y así sucesivamente. Luego, quiero aplicar secuencialmente cada regla de reemplazo a la cadena"Ii", peroStringReplacesolo buscaré coincidencias en las partes de la cadena que no han sido reemplazadas, por lo que dejamosFoldla funciónStringReplacesobre la lista de reglas de reemplazo con un valor inicial"Ii".Quizás sería más claro con un ejemplo (aquí se
%refiere a la salida de la celda anterior):fuente