Piet es un lenguaje de programación interesante por varias razones. Hoy nos centraremos en una razón: el comando roll . El comando roll fue originalmente de PostScript y es una forma poderosa de manipular la pila.
El comando roll muestra los dos elementos superiores de la pila y los usa como parámetros. Llamaremos al primer valor reventado turns
y al segundo depth
. Un giro hacia la profundidad n tomará el elemento superior de la pila, lo convertirá en el enésimo elemento de la pila y moverá cada uno de los elementos por encima de uno. Si turns
es negativo, esto se hace en la dirección opuesta. Es decir, el enésimo elemento se mueve hacia arriba y los otros elementos se mueven hacia abajo. Esto se repite abs(turns)
veces.
Desafío
Escriba un programa o función que tome una pila y la devuelva después de ejecutar un rollo.
Reglas
- La entrada y salida pueden estar en una lista, matriz, cadena con un delimitador, pasado en un elemento a la vez, o cualquier otro formato razonable. La salida debe estar en el mismo formato que la entrada.
depth
nunca será negativo y nunca será mayor que la longitud de la pila.- La pila de entrada siempre contendrá al menos dos elementos.
- Este es el código de golf, por lo que gana la respuesta más corta en cada idioma. Como tal, no aceptaré una respuesta.
- Las lagunas estándar están prohibidas.
Casos de prueba
in: out:
2
4
1 3
2 4
3 1
4 2
5 5
6 6
in: out:
-2
3
1 2
2 3
3 1
in: out:
-42
0
1 1
2 2
3 3
4 4
5 5
Respuestas:
Haskell ,
6462 bytesEditar: -2 bytes: @xnor vio algo en lo que había pensado mal.
r
toma y devuelve una lista deInt
s.Pruébalo en línea!
splitAt n l
divide una listal
en el índicen
,mod
calcula el resto de la división,++
concatena listas.fuente
(%)=splitAt
infix.JavaScript (ES6),
4947 bytesEditar: ahorró 2 bytes gracias a @Shaggy al tomar los elementos de la pila como parámetros separados. Explicación:
1
mueve el elemento superior aldepth
elemento. Un giro de2
mueve los dos elementos superiores, etc. Sin embargo, también puede lograr esto moviendo los elementos entre giro y profundidad al frente.splice
elimina esos elementos y losconcat
antepone a los elementos restantes. (Podría haber utilizado una comprensión de matriz en su lugar, ya que tiene la misma longitud).slice
, el segundo parámetrosplice
es el número de elementos que se eliminarán.fuente
(t%d+d)%d
mismo quet%d
?%
es el resto, por lo que da una respuesta negativa cuandot
es negativa.(t,d,...a)=>
ya que las reglas permiten que la entrada se pase en un elemento a la vez.CJam, 31 bytes
La entrada y la salida son matrices en la pila, con el último elemento representando la parte superior de la pila.
Seguimiento de pila:
fuente
Mathematica,
5850 bytesEditar: Gracias a Martin Ender por guardar 8 bytes.
Explicación:
Función pura que espera una lista donde el comienzo de la lista representa la parte superior de la pila. Pasamos los elementos de la lista a la función pura
Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&
.x
se establece en la secuencia de elementos que comienza con el tercer argumento., luego rotamos los primeros elementos#2
(segundo argumento)x
hacia la izquierda#
(primer argumento) veces, luegoJoin
los elementos restantes dex
.Ahorraría
3
bytes si solo pasáramos los elementos de la pila como argumentos a la función directamente en lugar de estar en una lista inicialmente, pero luego los formatos de entrada y salida no coincidirían.Solución original:
Hay algo realmente satisfactorio en esta cadena de funciones infijadas. Reemplaza una lista con el primer elemento
t
, el segundo elementod
y los elementos restantesx
con el resultado de rotar los primerosd
elementos{x}
a lost
tiempos de la izquierda y unir los elementos restantes de{x}
.fuente
±
de un byte insetad de una regla de reemplazo, y otro 1 byte explotando de laTakeDrop
siguiente manera:±{t_,d_,x___}:=#~RotateLeft~t~Join~#2&@@{x}~TakeDrop~d
...&[1, 1, 3, 4]
y devolución{3, 4}
o haga eso manualmente con unApply
al principio:Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&@@#&
(para ser claros, mi primera sugerencia omite el@@#&
.)Rubí, 40 bytes.
Pruébalo en línea!
Toma la entrada como una lista, devuelve una lista. El hecho de que
rotate
exista un dispositivo incorporado que pueda manejar rotaciones positivas y negativas hace que esto sea trivial.fuente
Python,
141988774 bytes11 bytes guardados gracias a @Cole
Recibe la entrada como una lista, donde el último elemento es la parte superior de la pila.
Utiliza el truco 0ⁿ para filtrar la profundidad cero y el operador de módulo de ajuste de signos de Python para determinar la parte de la lista que se va a cortar.
fuente
f(s,t,d)
?f(s,t,d)
(la entrada es la pila completa).r=-t%d-d
. Además, la sustitucións*0**d
con els*(d<1)
recuento de bytes mantiene, pero tal vez mejora la legibilidad (no es que ese sea el objetivo). Sin embargo, no sabía eso0**0==1
en Python, eso es interesante.-t%d-d
como un valor (como antes), porque cuandod
está0
presente desencadenaría una excepción de división por cero.JavaScript ES6,
10992 bytesPruébalo en línea!
Recibe entradas en forma de una matriz de enteros.
También tiene el recuento de flecha: P
Explicación:
El código usa la función shift para extraer los dos primeros elementos de la lista.
Luego obtiene el valor absoluto del primer elemento, que es el número de vueltas.
Dado que Javascript está indexado a cero, el índice de profundidad debe reducirse en 1.
Si el índice de profundidad fuera 0 o 1, nada debería cambiar, pero debido a la disminución, el índice de 0 causaría cambios. Por lo tanto, salga del bucle si el índice de profundidad no es <= 0.
La función de empalme (a, b) devuelve el subconjunto de longitud b con el índice inicial a del conjunto y deja el conjunto original sin esos elementos.
Cuando se concatena con el resto de la matriz original, esta es una rotación única de la matriz en el índice de profundidad.
Al realizar esta operación n veces, donde n es el número de vueltas, la matriz resultante es el resultado del operador de balanceo.
fuente
Python 2 , 48 bytes
Pruébalo en línea!
fuente
TI-Basic,
141150 bytes (sin competencia)Edición: caso fijo donde la profundidad es cero (+9 bytes)
TI-Basic no admite listas de longitud 0, por lo que este enfoque no funcionará para una entrada de dos longitudes.
Explicación:
fuente
seq(
.Lote, 163 bytes
Toma la entrada como parámetros de línea de comandos y genera una lista separada por espacios. Los parámetros entre
t
yd
se extraen en lar
variable para que puedan anteponerse a las
variable, que recibe todos los demás parámetros.fuente