Escriba un programa o función que incluya una lista no vacía de enteros positivos. Puede suponer que se ingresa en un formato razonable y conveniente como "1 2 3 4"
o [1, 2, 3, 4]
.
Los números en la lista de entrada representan los segmentos de un gráfico circular completo donde cada tamaño de segmento es proporcional a su número correspondiente y todos los sectores se organizan alrededor del gráfico en el orden dado.
Por ejemplo, el pastel para 1 2 3 4
es:
La pregunta que debe responder su código es: ¿alguna vez se divide el gráfico circular ? Es decir, ¿hay alguna vez una línea perfectamente recta desde un lado del círculo al otro, dividiéndola simétricamente en dos?
Es necesario para la producción de un Truthy valor si existe al menos una bisectriz y la salida de un Falsy valor si no hay ninguno .
En el 1 2 3 4
ejemplo hay una bisección entre 4 1
y, 2 3
por lo tanto, el resultado sería verdadero.
Pero para la entrada 1 2 3 4 5
no hay bisectriz, por lo que la salida sería falsa:
Ejemplos adicionales
Organizar números de manera diferente puede eliminar las bisectrices.
por ejemplo, 2 1 3 4
falso:
Si solo hay un número en la lista de entrada, el pastel no está dividido en dos.
por ejemplo, 10
falso:
Puede haber múltiples bisectrices. Mientras haya más de cero, la salida es verdadera.
ej. 6 6 12 12 12 11 1 12
→ verdad: (hay 3 bisectrices aquí)
Las bisecciones pueden existir incluso si no son visualmente obvias.
por ejemplo, 1000000 1000001
falso:
p. ej. 1000000 1000001 1
→ verdad:
(Gracias a nces.ed.gov por generar los gráficos circulares).
Casos de prueba
Truthy
1 2 3 4
6 6 12 12 12 11 1 12
1000000 1000001 1
1 2 3
1 1
42 42
1 17 9 13 2 7 3
3 1 2
10 20 10
Falsy
1 2 3 4 5
2 1 3 4
10
1000000 1000001
1
1 2
3 1 1
1 2 1 2 1 2
10 20 10 1
Tanteo
El código más corto en bytes gana. Tiebreaker es la respuesta anterior.
fuente
Respuestas:
J, 18 bytes
5 bytes gracias a Dennis.
@HelkaHomba : No.
Uso
Sin golf
Versión anterior de 23 bytes:
Uso
Sin golf
Explicación
Black_magic calcula la suma de todas las subcadenas. El
+/\
calcular las sumas parciales.Por ejemplo, se
a b c d
conviertea a+b a+b+c a+b+c+d
.El
-/~
entonces construye una tabla de sustracción basado en la entrada, por lo quex y z
se convierte en:Cuando se aplica a
a a+b a+b+c a+b+c+d
, el resultado sería:Esto calculó las sumas de todas las subcadenas que no contiene
a
.Esto garantiza que sea suficiente, ya que si una bisección contiene
a
, la otra bisección no contendráa
y tampoco se envolverá.fuente
+/e.&,2*+/\\.
Jalea ,
98 bytesDevuelve una lista no vacía (verdad) o una lista vacía (falsedad). Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Julia,
343029 bytes¡Gracias a @GlenO por jugar golf en 1 byte!
Pruébalo en línea!
Cómo funciona
Después de almacenar la suma acumulativa de 2x en x , restamos el vector de fila x ' del vector de columna x , produciendo la matriz de todas las diferencias posibles. Esencialmente, esto calcula las sumas de todas las subcadenas adyacentes de x que no contienen el primer valor, sus negativos y los 0 en la diagonal.
Finalmente, probamos si la suma de la matriz original x pertenece a la matriz generada. Si este es el caso, la suma de al menos una de las sublistas adyacentes es igual a exactamente la mitad de la suma de la lista completa, lo que significa que hay al menos una bisectriz.
fuente
Python 2, 64 bytes
Recurrentemente intenta eliminar elementos del frente o del final hasta que la suma de lo que queda sea igual a la suma de lo que se eliminó, lo que se almacena es
s
. Toma tiempo exponencial en la longitud de la lista.Dennis guardó 3 bytes con
pop
.fuente
f=lambda l,s=0:l and(sum(l)==s)*l+f(l[1:],s+l[0])+f(l,s+l.pop())
Haskell, 41 bytes
La idea es verificar si hay una sublista de
l
cuya suma sea igualsum l/2
. Generamos las sumas de estas sublistas comoscanr(:)[]l>>=scanl(+)0
. Veamos cómo funciona esto conl=[1,2,3]
Antiguos 43 bytes:
Genera la lista
c
de sumas acumulativas. Luego, verifica si dos de estas sumas difierensum l/2
verificando si es un elemento de la lista de diferencias(-)<$>c<*>c
.fuente
Pyth,
109 bytesPruébelo en el compilador Pyth .
Cómo funciona
fuente
En realidad, 21 bytes
Pruébalo en línea!
Este programa imprime un
0
para casos falsos y un entero positivo para casos verdaderos.Explicación:
Versión no competitiva, 10 bytes
Pruébalo en línea!
Este programa genera una lista vacía para casos falsos y una lista no vacía de lo contrario. Es esencialmente un puerto de la respuesta de Dennis's Jelly . No es competitiva porque la suma acumulativa y la funcionalidad de diferencia vectorizada son posteriores al desafío.
Explicación:
fuente
Python 2,
76747066 bytes¡Gracias a @xnor por jugar golf en
48 bytes!Pruébalo en Ideone . (casos de prueba más grandes excluidos)
fuente
n=sum(x)
para hacern in ...
; no está de más usar un valor mayor paran
.MATL , 10 bytes
La salida es el número de bisectrices.
Pruébalo en línea!
Explicación
El mismo enfoque que la respuesta de Dennis a Julia .
fuente
Rubí,
60 6053 bytesGenera todas las particiones posibles tomando cada rotación de la matriz de entrada y luego tomando todas las rebanadas de longitud 1 ..
n
, donden
es el tamaño de la matriz de entrada. Luego verifica si existe alguna partición con una suma de la mitad de la suma total de la matriz de entrada.fuente
JavaScript (ES6), 83 bytes
Genera todas las sumas posibles, luego verifica si la mitad de la última suma (que es la suma de la lista completa) aparece en la lista. (Generar las sumas en el orden un poco incómodo para organizar la suma que necesito ser la última guarda 4 bytes).
fuente
Dyalog APL, 12 bytes
Pruébelo con TryAPL .
Cómo funciona
fuente
Python 2 , 47 bytes
Pruébalo en línea!
Regresé 2,75 años después para superar mi antigua solución en más del 25% con un nuevo método.
Esta versión más larga de 1 byte es un poco más clara.
Pruébalo en línea!
La idea es almacenar el conjunto de sumas acumulativas
t
como bits dek
, estableciendo el bit2*t
para indicar quet
es una suma acumulativa. Luego, verificamos si dos sumas acumulativas difieren en la mitad de la suma de la lista (finalt
) cambiandok
tanto el bit y haciendo bit&
a bit con el original para ver que el resultado no es cero (verdad).fuente
APL, 25 caracteres
Asumiendo que la lista se da enX ← 1 2 3 4
.Explicación:
Primera nota que APL evalúa el formulario de derecha a izquierda. Luego:
X←⎕
toma la entrada del usuario y la almacena enX
⍴X
da la longitud deX
⍳⍴X
los números del 1 al⍴X
El
⍺
y⍵
en{2×+/⍺↑⍵↓X,X}
son el argumento izquierdo y derecho de una función diádica que estamos definiendo dentro de las llaves.⍺↑⍵↓X,X
parte:X,X
simplemente concatena X consigo mismo;↑
y↓
son tomar y soltar.+/
reduce / se pliega+
sobre la lista a su derechaEntonces
2 {2×+/⍺↑⍵↓X,X} 1
=2×+/2↑1↓X,X
=2×+/2↑1↓1 2 3 4 1 2 3 4
==
2×+/2↑2 3 4 1 2 3 4
=2×+/2 3
=2×5
=10
.∘.brace⍨idx
es justoidx ∘.brace idx
. (⍨
es el mapa diagonal;∘.
es el producto externo)Entonces esto nos da una matriz
⍴X
by⍴X
que contiene el doble de las sumas de todas las sublistas conectadas.Lo último que tenemos que hacer es verificar si la suma de
X
está en algún lugar dentro de esta matriz.(+/X)∊matrix
.fuente
Brachylog , 6 bytes
Pruébalo en línea!
Salidas por éxito o fracaso, impresión
true.
ofalse.
si se ejecuta como un programa.fuente
C,
161145129 bytesUngolfed tratar en línea
fuente
i<n;i++
ai++<n
(aunque es posible que deba lidiar con algunas compensaciones.)Haskell, 68 bytes
La función
f
primero crea una lista de las sumas de todos los segmentos posibles de la lista dada. Luego se compara con la suma total de elementos de la lista. Si llegamos a un punto en la mitad de la suma total, entonces sabemos que tenemos una bisección. También estoy usando el hecho de que si ustedtake
odrop
más elementos de los que hay en la lista, Haskell no arroja un error.fuente
Mathematica, 48 bytes
Función anónima, similar en acción a las numerosas otras respuestas.
Outer[Plus, #, -#]
, al actuar sobreAccumulate@#
(que a su vez actúa sobre la lista de entrada, dando una lista de totales sucesivos) genera esencialmente la misma tabla, como en la parte inferior de la respuesta de Leaky Nun.!FreeQ[..., Last@#/2]
comprueba si no(Last@#)/2
está ausente de la tabla resultante y es el último de los totales sucesivos, es decir, la suma de todos los elementos de la lista de entrada.Last@#
Si esta respuesta es algo interesante, no se debe a un nuevo algoritmo, sino a los trucos específicos de Mathematica; por ejemplo,
!FreeQ
es agradable, en comparación conMemberQ
, ya que no requiere un aplanamiento de la tabla que verifica y guarda un byte.fuente
!FreeQ[2Tr/@Subsequences@#,Tr@#]&
debería funcionar, pero no tendré 10.4 disponible para probarlo durante los próximos 10 días más o menos.APL (NARS), caracteres 95, bytes 190
Considere una matriz de entrada de 4 elementos: 1 2 3 4. ¿Cómo podemos elegir lo útil para esta partición de ejercicio de ese conjunto? Después de que algunos piensan que la partición de estos 4 elementos que podemos usar se describe en el número binario de la izquierda:
(1001 o 1011 ecc podrían estar en ese conjunto, pero ya tenemos 0110 y 0100 ecc), así que solo para escribir una función que a partir del número de elemento de la matriz de entrada construya estos números binarios ... sería:
que de la entrada 1 2 4 8 [2 ^ 0..lenBytesArgument-1] encuentre 3 6 12, 7 14, 15; así que encuentre el binario de estos números y utilícelos para encontrar las particiones correctas de la matriz de entrada ... Probé la función c solo para esos 4 elementos de entrada, pero parece que está bien para otro número de elementos ...
prueba:
fuente