Introducciones
Una matriz booleana 2 × n se puede representar como una cadena de los cuatro caracteres . ':
. La cadena tiene una "fila superior" y una "fila inferior", con puntos que representan 1s y espacios vacíos que representan 0s. Por ejemplo, la matriz 2 × 6
1 0 1 0 0 1
0 0 0 1 0 1
se puede representar como ' '. :
. Su tarea es tomar una matriz en esta "forma comprimida" y rotar sus entradas un paso en el sentido de las agujas del reloj, como una cinta transportadora.
Entrada
Su entrada es una sola cadena sobre los caracteres . ':
. Su longitud está garantizada para ser al menos 2.
Salida
Su salida será la cadena de entrada, pero con cada punto girado un paso en el sentido de las agujas del reloj. Más explícitamente, los puntos en la fila superior más un lugar a la derecha, excepto el más a la derecha, que se mueve hacia abajo. Los puntos en la fila inferior se mueven un paso hacia la izquierda, excepto el extremo izquierdo, que se mueve hacia arriba. En particular, la cadena de salida debe tener la misma longitud que la original, y el espacio en blanco es significativo.
Ejemplo
Considere la cadena de entrada :..:'.
, que corresponde a la matriz 2 × 6
1 0 0 1 1 0
1 1 1 1 0 1
La versión rotada de esta matriz es
1 1 0 0 1 1
1 1 1 0 1 0
que corresponde a la cadena ::. :'
.
Reglas y puntaje
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten. Puede decidir si la entrada y la salida están entre comillas, y una nueva línea final también es aceptable en ambas.
Casos de prueba
Estos casos de prueba están entre comillas dobles.
" " -> " "
" ." -> ". "
". " -> "' "
"' " -> " '"
" '" -> " ."
": " -> "''"
"''" -> " :"
":." -> ":'"
":.'" -> ":'."
"..." -> ":. "
": :" -> "':."
"':." -> ".:'"
".:'" -> ": :"
" " -> " "
"::::" -> "::::"
":..:'." -> "::. :'"
" : .:'" -> ". '.. :"
": ''. :" -> "'' :'.."
"........" -> ":...... "
":::: " -> ":::'' "
" ::::" -> " ..:::"
" : : : : " -> ". : : : '"
".'.'.'.'.'" -> "'.'.'.'.'."
".. :: '.' :." -> ": ..'' .' :.'"
".' '.:: :.'. . ::.' '. . .::' :.'." -> "' ' .:.''..'.'. ..:' ' .'. ...'''..'.'"
s=>s.replace(/./g,(c,i)=>" '.:"[(i?q>' '&q!=".":c>"'")+(q=c,s[++i]?s[i]>"'":c>' '&c!=".")*2])
(voltee 2 partes para que pueda aumentar i, menosPerl,
706964636160 bytesIncluye +2 para
-lp
Ejecutar con la cadena de entrada en STDIN, p. Ej.
rotatedots.pl
:Explicación
El espacio
no se convierte en el código anterior. Para los cálculos
/2
y*2
se comportará como y se convertirá0
. En las otras posiciones formará parte de "o", pero los 1 bits de espacio son un subconjunto de los bits de uno0
y tendrán el mismo efecto que0
si se or-ed con cualquiera de los dígitos. Sólo si el personaje es o-ed con es un espacio que va a seguir siendo un espacio en lugar de convertirse en una0
. Pero eso está bien ya0
que de todos modos se habría convertido de nuevo al espacio.fuente
Retina , 66
Explicación
Comenzando con la entrada:
Las primeras 4 etapas construyen la matriz, usando
1
/e
para verdadero y0
/f
para falso para las filas superior / inferior, respectivamente. Las filas superior e inferior están entrelazadas juntas. Esto produciría una cadena como:Sin embargo, estas 4 etapas también mueven efectivamente la fila inferior 1 hacia la izquierda, simplemente invirtiendo el orden de las letras y los dígitos:
La
T
etapa de ransliteration invierte los dígitos hexadecimales solo para el primer y el último carácter, es decir, los reemplaza0-9a-f
porf-a9-0
. Esto tiene el efecto de mover el carácter inferior izquierdo hacia arriba a la fila superior y el carácter superior derecho hacia abajo a la fila inferior:La siguiente etapa intercambia cada par de letras y dígitos, moviendo así la fila superior 1 a la derecha. Anteriormente esto era así
(\D)(\d)
, pero resulta que(.)(\d)
es suficiente porque las sustituciones siempre ocurren de izquierda a derecha y, por lo tanto, los dos últimos dígitos no coincidirán erróneamente con esto, porque el penúltimo personaje ya habrá sido sustituido. La matriz ahora se ha rotado completamente según sea necesario:Las 4 etapas finales se traducen nuevamente al formato original:
Pruébalo en línea.
Todas las cajas de prueba, una por línea , se
m
agregan a laT
línea para permitir el tratamiento por separado de cada línea de entrada.fuente
Jalea,
323029 bytesTenga en cuenta el espacio final. Pruébalo en línea! o verificar todos los casos de prueba .
Antecedentes
Comenzamos considerando la cadena de entrada (por ejemplo,
:..:'.
) y su reverso.Para cada carácter en la fila superior, verificamos si pertenece
':
, y para cada carácter de la fila inferior si pertenece.:
. Esto le da a la matriz 2D de booleanoscuál es la matriz de la pregunta, con la fila inferior invertida.
Eliminamos el último booleano de cada fila, invierte el orden de las filas, anteponemos los booleanos en su orden original y finalmente invierte la fila superior.
Esto produce la matriz rotada de la pregunta.
Finalmente, consideramos que cada columna de Booleanos es un número binario e indexamos
'.:
para obtener los caracteres apropiados.Cómo funciona
fuente
Pyth
38362 bytes gracias a Jakube!
Pruébelo aquí o ejecute Test Suite .
Explicación:
fuente
L,hb_eb
es un byte más corta y.DR2T
crea también el producto cartesiano y algunos pares más, pero no lo hace y en un dígito y ayuda a ahorrar espacio..D
truco es realmente genial!Python 3,
145141130 bytesExplicación
La solución de golf utiliza la siguiente propiedad de zip:
zip('ABCD', 'xy') --> Ax By
por lo quezip(a[:l],a[l:])
puede reemplazarse porzip(a,a[l:])
y permitir eliminar la definición del
Resultados
fuente
Pyth, 66 bytes
Pruébalo aquí!
Explicación
Esto se puede dividir en 3 partes:
Convertir entrada
Esto es bastante trivial. Cada personaje se mapea de la siguiente manera:
El primero es un espacio en blanco.
Obtenemos una lista de 2 tuplas que transponemos para obtener las 2 filas de la matriz que luego se aplana.
Código
Girar
Tenemos la matriz como matriz plana en
J
y el ancho de la matriz enK
. La rotación se puede describir como:Código
Convertirlo de nuevo
fuente
Python 3,
166154153150146138137135132127 bytesEditar: He tomado prestado el uso de la respuesta Python
zip
de Erwan al final de la función.y su idea de usarResulta que las reversiones no fueron una buena idea para mi función. He cambiado mi uso de[::-1]
reversiones, aunque puse mi propio giro.format
golf para más. Movidoa
yb
directamente azip
jugar más golf (el no golfismo permanece sin cambios porque la separación dea
yb
allí es útil para evitar el desorden en mi explicación)Editar: Tomado
(some number)>>(n)&(2**something-1)
de esta respuesta por xnor en el desafío Music Interval Solver . El desorden que existezip(*[divmod(et cetera, 2) for i in input()])
probablemente se pueda jugar mejor, aunque me gusta la conveniencia que otorga el uso de dos tuplast
yv
.Sin golf:
fuente
Ruby,
166163 bytesYuck ...
transpose
es demasiado largo.Trucos usados aquí:
sprintf('%02b',x)
Para convertir"0"
,"1"
,"2"
,"3"
en"00"
,"01"
,"10"
, y"11"
respectivamente. Sorprendentemente, el segundo argumento no tiene que convertirse en un entero primero.La rotación se realiza a través de
a[1].push a[0].pop;a[0].unshift a[1].shift;
, lo que pensé que era al menos un poco inteligente (si no excesivamente detallado en Ruby). La simetría es estéticamente agradable, de todos modos: Pfuente
->s{a=s.tr(f=" .':",'001').chars;b=s.tr(f,'0101').chars;b<<a.pop;([b.shift]+a).zip(b).map{|x|x.join.to_i 2}.join.tr'0-3',f}
.map{|x|x.join.to_i 2}.join.tr'0-3',f
→.map{|x|f[x.join.to_i 2]}*''
Javascript ES6 125 bytes
Asigno cada carácter a un equivalente binario de dos dígitos
y estoy pensando en ellos como uno encima del otro
Lo guardo en n
Para cada carácter (0-3) de n, verifico sus vecinos, agregando el bit de orden más alto del vecino izquierdo al bit de orden más bajo del vecino derecho. si i == 0 (primer carácter) uso su propio bit de orden inferior en lugar del bit de orden superior del vecino izquierdo.
si n [i + 1]> - 1 significa que tenemos 0,1,2,3, así que cuando eso es falso, tocamos el último elemento.
Cuando eso sucede, uso el bit de orden más alto del personaje en lugar del bit más bajo del vecino correcto
mapear eso de regreso a
.':
tierra y unir esa matriz nuevamentefuente
MATL ,
4039 bytesPruébalo en línea! La versión vinculada ha sido
v
reparada por los&v
cambios en el idioma después de que se publicó esta respuesta .fuente
JavaScript, 311 bytes
Probablemente se puede mejorar mucho:
fuente
s[i-1]
? Eso podría ahorrar algunos bytes.s[i+1]
.<
lugar de==
podría ahorrarle bastantes bytes. También es posible que desee pagar Consejos para jugar<
lugar de==
JavaScript (ES6),
237210204188182178 bytesCrédito a @Downgoat por guardar 16 bytes en la revisión de 188 bytes
Actualización: tuve una onda cerebral y reduje la primera operación
s
a una solamap
llamada en lugar de dos llamadas separadasImpresión bonita y explicación
fuente
s=>(r=" .':",a=[],s=[...s].map(c=>('00'+r.indexOf(c).toString(2)).slice(-2)).map(n=>(a.push(n[0]),n[1]),a.splice(0,0,s.shift()),s.push(a.pop()),a.map((v,i)=>r[parseInt(v+s[i],2)]).join``)
funciona?Perl,
144142137131 bytesByte agregado para la
-n
bandera.Prácticamente el mismo algoritmo que mi respuesta de Ruby , solo que más corto, porque ... Perl.
Obviamente,
@a=(shift@b,@a)
es más corto queunshift@a,shift@b
.Por desgracia, estos son de la misma longitud:
¡Gracias a Ton Hospel por 5 bytes y msh210 por un byte!
fuente
..@a
lugar de..$#a
? (Tal vezoct
muere o devuelve 0 o algo. No lo he intentado)//g
sprintf
es muuuy largo.map$_%2,/./g
ymap$_/2|0,//g
casi tiene que ser más corto (no probado)Python 3,
294287283 bytesWaaayyyyyy demasiado tiempo, pero intentaré jugar al golf de algunos bytes:
fuente
Lua, 139 bytes
Uso:
fuente