Una secuencia de enteros es una secuencia si la diferencia entre dos números consecutivos en esta secuencia es -1 o 1 y su primer elemento es 0.
Más precisamente: a1, a2, ..., an es una secuencia si:
For any k (1 ≤ k < n): |a[k] - a[k+1]|=1,
a[1]=0
Entrada
n
- número de elementos en la secuencias
- suma de elementos en la secuencia
Salida
- un conjunto de una secuencia / lista / matriz / etc. de longitud
n
con suma de elementoss
, si es posible - un conjunto / lista / matriz / etc vacío si no es posible
Ejemplos
Para la entrada 8 4
, la salida podría ser [0 1 2 1 0 -1 0 1]
o [0 -1 0 1 0 1 2 1]
. Puede haber otras posibilidades.
Para la entrada 3 5
, la salida está vacía []
, ya que no se puede hacer.
Reglas
Este es un código de golf, la respuesta más corta en bytes gana. Los envíos deben ser un programa o función. La entrada / salida se puede dar de cualquiera de las formas estándar .
(l-1)*l/2
y-(l-1)*l/2
que tienen la misma paridad que(l-1)*l/2
.Respuestas:
CJam,
56 47 4434 bytesAquí hay muchas posibilidades de mejora, pero aquí va el primer intento:
Créditos a Dennis por la forma eficiente de hacer la
{ ... }%
parte.Imprime la representación de matriz si es posible, de lo contrario
""
Pruébalo en línea aquí
fuente
{}%
parte de su código no se parece en nada a la mía (que es solo el código de @ PeterTaylor, que reemplaza los puntos con guiones bajos). Si aporté algo a su código, es el{}=
operador ..._{_W=)+}%\{_W=(+}%+
cuál estaba haciendo primero dos copias, agregué 1 a la primera, restando 1 de la otra. Su ejemplo me hizo descubrir cómo hacerlo en un{ ... }%
bloque. Con respecto a esto{ ... }=
, ya lo había reducido tanto en mi experimentación, aunque todavía no lo publiqué.3 5
la salida debería ser[]
y no""
[]p
en CJam solo sale a""
. Entonces es cómo el lenguaje representa matrices vacías.JavaScript (E6) 79
82No hay necesidad de fuerza bruta o enumeración de todas las tuplas.
Vea una secuencia de longitud n como n -1 pasos, cada paso es un incremento o decremento.
Tenga en cuenta que solo puede cambiar un incremento por una disminución, la suma varía en 2, por lo que para cualquier longitud dada la suma es siempre par o siempre impar.
Teniendo todos los incrementos, la secuencia es 0, 1, 2, 3, ..., n-1 y sabemos que la suma es (n-1) * n / 2
Cambiando el último paso, la suma cambia en 2, entonces el el último paso pesa 2.
Cambiando el penúltimo paso, la suma cambia en 4, por lo que el último paso pesa 4. Esto se debe a que el paso sucesivo se basa en la suma parcial hasta el momento.
Al cambiar el paso anterior, la suma cambia en 6, por lo que el último paso pesa 6 (no 8, no son números binarios).
...
Cambiar el primer paso pesa (n-1) * 2
Algoritmo
Código sin golf
Prueba en la consola Firefox / FireBug
Salida
fuente
GolfScript (
4139 bytes)Demostración en línea
Gracias a Dennis por 41-> 39.
fuente
,0=
a?
. Un puerto directo a CJam sería 5 bytes más corto:L1,al~:S;({{_W=(+_)))+}%}*{:+S=}=p
{ ... }%
bloque. En mi código, tenía dos, estaba tratando de reducirlo a 1. Tal como está el algoritmo real, creo que tanto Peter como yo publicamos el mismo algoritmo casi al mismo tiempo.Mathematica, 73 bytes
Solución simple de fuerza bruta.
Estoy generando todas las opciones de pasos. Luego los convierto en listas acumuladas para obtener las secuencias de una. Y luego estoy buscando el primero cuya suma es igual al segundo parámetro. Si no existe, el valor predeterminado es
{}
.fuente
Haskell, 56 bytes
Explicación:
1,-1
y longitud n-1:replicateM n-1[-1,1]
Ejemplo:
replicateM 2 [-1,1]
==[[-1,-1],[-1,1],[1,-1],[1,1]]
scanl
tiene un bajo rendimiento, pero hace el trabajo correcto aquí.n
donde la suma ess
fuente
Control.Monad
solo por usar,replicateM
que ya es demasiado largo. ¿Qué otra función monádica puedes usar para simularreplicateM
?head$
a su solución.head
no regresa[]
por[] :: [[a]]
- y odio los errores.mapM(\x->[1,-1])[2..n]
lugar desequence
yreplicate
.Pitón, 138
fuente
CJam,
655854 bytesApenas más corto que mi solución de Mathematica, pero eso es principalmente mi culpa por no seguir usando CJam correctamente:
Es literalmente el mismo algoritmo: obtener todas las
n-1
tuplas de{1, -1}
. Encuentre el primero cuya acumulación es la misma ques
, anteponga a0
. Imprima una matriz vacía si no se encuentra ninguna.fuente
CJam, 40
Otro enfoque en CJam.
fuente
Rubí (136)
fuente
J, 47 caracteres
Comprueba cada secuencia como muchas otras respuestas. Intentará hacer una solución de O (n) más corta.
fuente
APL 38
Ejemplo:
Este, como muchos otros, simplemente fuerza bruta a través de cada combinación para encontrar uno que coincida, si no se encuentra no devuelve nada. En realidad, intenta algunas combinaciones más de una vez para acortar el código.
fuente