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 Ii
lado 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 I
y i
, que siempre comienzan así:
Ii
>_>
se desplazaI
hacia la derecha por uno, si es posible, y luego se desplazai
hacia la derecha por uno.<_<
se desplazaI
hacia la izquierda por uno, si es posible, y luego se desplazai
hacia la izquierda por uno, si es posible.>_<
se desplazaI
hacia la derecha por uno, si es posible, y luego se desplazai
hacia la izquierda por uno, si es posible.<_>
se desplazaI
hacia la izquierda por uno, si es posible, y luego se desplazai
hacia la derecha por uno.
I
no 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 i
está directamente a su derecha (como está inicialmente).
i
no se puede desplazar hacia la izquierda si I
está directamente a su izquierda (como es inicialmente), pero siempre se puede desplazar hacia la derecha.
Tenga en cuenta que con estas reglas, I
siempre permanecerá a la izquierda de i
, y I
se intenta cambiar antes i
para todos los emoticones.
Su programa o función necesita imprimir o devolver una cadena de la Ii
lí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...i
porque 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 1I
y 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
-p
Ejecutar con la entrada en STDIN, p. Ej.
perl -p shifty.pl <<< ">_> <_< >_< <_>"
shifty.pl
:Explicación
La cadena de control alterna las instrucciones para
i
yI
y 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
i
yI
en 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$1
está configurado, muévasei
a la derecha:Si
$1
no está configurado, muévasei
a la izquierdaTenga en cuenta que al comienzo de la cadena de control cuando coincida
^
$1
no se establecerá, por lo que intenta moversei
hacia 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 dei
yI
se pierde. En perls más antiguos esto sería un defecto fatal. Sin embargo, los perls más recientes tienen elr
modificador 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
-p
opció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 deend
oe
- losA-Za-z
caracteres que no son palabras no necesitan espacios a su alrededor, ¿verdad? Eso afeitaría un byte porend
/e
if
ai
, ahorrando un byte por el uso, yend
quee
, salvando dos, pero lo dejóelse
solo? Incluso en este programa simple (5if
sy 2else
s), está desperdiciando más byteselse
de 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
Ii
al 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
s
hace que el metacarácter.
Regex coincida con las nuevas líneas. Esta etapa hace que un inicio>
coincida con elI
seguido 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
i
realidad es a menudo más simple, porque no tenemos que preocuparnos de agregar o quitar opcionalmente, yai
que siempre se puede mover a la derecha. Para losi
casos, 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
i
si ese carácter es un espacio, de lo contrario solo elimina el emoticón.fuente
s`^_>(.*)i( |$)?
=>s`^_>(.*)i
y su reemplazo$1$#2$* i
=>$1 i
, ys`^_<(.*?)( )?i
=>s`^_<(.*?) ?i
y su reemplazo$1i$2
=>$1i
.Python,
142141134122121 bytesGuardado 19 bytes gracias a xnor.
Ejemplo:
Explicación:
fuente
i
se quedará siempre más grande queI
?I
, puntosi
, sin necesidad de listas y uniones.GNU sed, 81 bytes
(incluido +1 para
-r
bandera)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 laI
izquierda y hacia la derecha, respectivamente._
para trabajar eni
lugar deI
i
no está delimitado por ningún borde derecho, así que no agregue ni consuma espacio a continuaciónIi
.s///e
siempre se usa/bin/sh
como shell, por lo que no pude acortar estosed '&'<<<Ii
como 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.i
y 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 expression
en 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
p
es el número de espacios antesI
;q
es el número de espacios entreI
yi
. 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
tests
es la cadena de caso de prueba multilínea):El programa lee cada flecha una a la vez, comenzando
I=1, i=2
y utilizando índices basados en 1. Los nombres de las variables son un poco engañosos ya que intercambian roles, después de cada char, seI
vuelvei
yi
seI
actualiza. 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
a
antes 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"
, peroStringReplace
solo buscaré coincidencias en las partes de la cadena que no han sido reemplazadas, por lo que dejamosFold
la funciónStringReplace
sobre 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