Escreva um programa ou função que inclua uma lista não vazia de números inteiros positivos. Você pode assumir que é inserido em um formato conveniente razoável, como "1 2 3 4"
ou [1, 2, 3, 4]
.
Os números na lista de entrada representam as fatias de um gráfico de pizza completo , em que cada tamanho de fatia é proporcional ao número correspondente e todas as fatias são organizadas em torno do gráfico na ordem fornecida.
Por exemplo, a torta para 1 2 3 4
é:
A pergunta que seu código deve responder é: O gráfico de pizza é dividido em duas partes ? Ou seja, existe sempre uma linha perfeitamente reta de um lado do círculo para o outro, dividindo-o simetricamente em dois?
Você precisa mostrar um truthy valor se houver pelo menos uma bissetriz e saída de um Falsas valor se não houver nenhum .
No 1 2 3 4
exemplo, há uma bissecção entre 4 1
e, 2 3
portanto, a saída seria verdadeira.
Mas, para entrada, 1 2 3 4 5
não há bissetor, portanto a saída seria falsa:
Exemplos adicionais
Organizar números de maneira diferente pode remover os bissetores.
por exemplo 2 1 3 4
→ falsy:
Se apenas um número estiver na lista de entrada, a torta não será dividida em partes.
por exemplo 10
→ falsy:
Pode haver vários bissetores. Desde que haja mais de zero, a saída é verdadeira.
por exemplo 6 6 12 12 12 11 1 12
→ truthy: (existem 3 bissetores aqui)
Podem existir bisseções mesmo que não sejam visualmente óbvias.
por exemplo 1000000 1000001
→ falsy:
por exemplo 1000000 1000001 1
→ verdade:
(Agradecemos a nces.ed.gov por gerar os gráficos de pizza.)
Casos de teste
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
Pontuação
O código mais curto em bytes vence. O desempatador é a resposta anterior.
fonte
Respostas:
J, 18 bytes
5 bytes graças a Dennis.
@HelkaHomba : Não.
Uso
Ungolfed
Versão anterior de 23 bytes:
Uso
Ungolfed
Explicação
A soma de todas as substrings é calculada pelo black_magic. O
+/\
calcular as somas parciais.Por exemplo,
a b c d
torna-sea a+b a+b+c a+b+c+d
.Em
-/~
seguida, constrói uma tabela de subtração com base na entrada,x y z
tornando-se:Quando aplicado
a a+b a+b+c a+b+c+d
, o resultado seria:Isso calculou as somas de todas as substrings que não contêm
a
.Isso garante que é suficiente, pois se uma bisseção contiver
a
, a outra não conteráa
e também não será contornada.fonte
+/e.&,2*+/\\.
Geléia ,
98 bytesRetornar uma lista não vazia (verdade) ou uma lista vazia (falsy). Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Julia,
343029 bytesGraças a @GlenO por jogar fora 1 byte!
Experimente online!
Como funciona
Depois de armazenar a soma acumulada de 2x em x , subtraímos o vetor de linha x ' do vetor de coluna x , produzindo a matriz de todas as diferenças possíveis. Essencialmente, isso calcula as somas de todas as sub-matrizes adjacentes de x que não contêm o primeiro valor, seus negativos e 0 na diagonal.
Finalmente, testamos se a soma da matriz original x pertence à matriz gerada. Se for esse o caso, a soma de pelo menos uma das sublistas adjacentes é igual à metade da soma da lista inteira, o que significa que há pelo menos uma bissetriz.
fonte
Python 2, 64 bytes
Recursivamente tenta remover elementos da frente ou do final até que a soma do que resta seja igual à soma do que foi excluído, que é armazenado
s
. Leva tempo exponencial no comprimento da lista.Dennis salvou 3 bytes com
pop
.fonte
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
A idéia é verificar se existe uma sub-lista
l
cuja soma é igualsum l/2
. Geramos as somas desses sublistas comoscanr(:)[]l>>=scanl(+)0
. Vamos ver como isso funciona coml=[1,2,3]
43 bytes antigos:
Gera a lista
c
de somas cumulativas. Em seguida, verifica se duas dessas somas diferemsum l/2
verificando se é um elemento da lista de diferenças(-)<$>c<*>c
.fonte
Pitão,
109 bytesTeste-o no Pyth Compiler .
Como funciona
fonte
Na verdade, 21 bytes
Experimente online!
Este programa imprime um
0
para casos falsos e um número inteiro positivo para casos verdadeiros.Explicação:
Versão não concorrente, 10 bytes
Experimente online!
Este programa gera uma lista vazia para casos falsos e uma lista não vazia caso contrário. É essencialmente um porto da resposta da geléia de Dennis . Não é concorrente porque a soma cumulativa e a funcionalidade de diferença vetorizada pós-desafio.
Explicação:
fonte
Python 2,
76747066 bytesGraças a @xnor por jogar fora
48 bytes!Teste em Ideone . (casos de teste maiores excluídos)
fonte
n=sum(x)
fazern in ...
; não custa usar um valor maior paran
.MATL , 10 bytes
A saída é o número de bissetores.
Experimente online!
Explicação
A mesma abordagem da resposta de Dennis para Julia .
fonte
Rubi,
6053 bytesGera todas as partições possíveis realizando todas as rotações da matriz de entrada e, em seguida, todas as fatias de comprimento 1 ..
n
, onden
é o tamanho da matriz de entrada. Em seguida, verifica se existe alguma partição com uma soma metade da soma total da matriz de entrada.fonte
JavaScript (ES6), 83 bytes
Gera todas as somas possíveis e verifica se metade da última soma (que é a soma de toda a lista) aparece na lista. (Gerar as somas na ordem um pouco estranha para organizar a soma que eu preciso ser economiza 4 bytes pela última vez.)
fonte
Dyalog APL, 12 bytes
Teste com o TryAPL .
Como funciona
fonte
Python 2 , 47 bytes
Experimente online!
Voltei 2,75 anos depois para vencer minha solução antiga em mais de 25% usando um novo método.
Esta versão mais longa de 1 byte é um pouco mais clara.
Experimente online!
A idéia é armazenar o conjunto de somas cumulativas
t
como bits dek
, definindo bit2*t
para indicar quet
é uma soma cumulativa. Em seguida, verificamos se duas somas cumulativas diferem pela metade da soma da lista (finalt
), deslocando-sek
tanto assim e fazendo bit a bit&
com o original para ver se o resultado é diferente de zero (verdade).fonte
APL, 25 caracteres
Supondo que a lista seja apresentada emX ← 1 2 3 4
.Explicação:
Primeira nota que o APL avalia o formulário da direita para a esquerda. Então:
X←⎕
pega a entrada do usuário e a armazenaX
⍴X
dá o comprimento deX
⍳⍴X
os números de 1 a⍴X
The
⍺
e⍵
in{2×+/⍺↑⍵↓X,X}
são o argumento esquerdo e direito de uma função diádica que estamos definindo dentro do aparelho.⍺↑⍵↓X,X
parte:X,X
apenas concatena X consigo mesmo;↑
e↓
são pegar e largar.+/
reduz / dobra+
a lista à sua direitaEntão
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
é justoidx ∘.brace idx
. (⍨
é o mapa diagonal;∘.
é o produto externo)Portanto, isso nos dá uma matriz
⍴X
by⍴X
que contém duas vezes a soma de todas as sublistas conectadas.A última coisa que precisamos fazer é verificar se a soma de
X
está em algum lugar dentro dessa matriz.(+/X)∊matrix
.fonte
Braquilog , 6 bytes
Experimente online!
Resultados por sucesso ou falha, impressão
true.
oufalse.
se executados como um programa.fonte
C,
161145129 bytesTentativa sem golfe online
fonte
i<n;i++
parai++<n
(embora você pode precisar para lidar com algumas compensações.Haskell, 68 bytes
A função
f
primeiro cria uma lista das somas de todas as fatias possíveis da lista fornecida. Em seguida, ele se compara à soma total dos elementos da lista. Se chegarmos a algum ponto da metade da soma total, sabemos que temos uma bissecção. Também estou usando o fato de que, se vocêtake
oudrop
mais elementos do que existem na lista, Haskell não gera um erro.fonte
Mathematica, 48 bytes
Função anônima, semelhante em ação às inúmeras outras respostas.
Outer[Plus, #, -#]
, quando agir emAccumulate@#
(que por sua vez atua na lista de entrada, fornecendo uma lista de totais sucessivos) gera essencialmente a mesma tabela, como na parte inferior da resposta da freira furtiva.!FreeQ[..., Last@#/2]
verifica se não(Last@#)/2
está ausente da tabela resultante e é o último dos totais sucessivos, ou seja, a soma de todos os elementos da lista de entrada.Last@#
Se essa resposta for um tanto interessante, não é por causa de um novo algoritmo, mas mais pelos truques específicos do Mathematica; por exemplo,
!FreeQ
é bom, comparado aMemberQ
, já que não requer um achatamento da tabela que verifica e salva um byte.fonte
!FreeQ[2Tr/@Subsequences@#,Tr@#]&
deve funcionar, mas não terei o 10.4 disponível para testá-lo pelos próximos 10 dias.APL (NARS), caracteres 95, bytes 190
Considere uma matriz de entrada de 4 elementos: 1 2 3 4. Como podemos escolher o útil para esta partição de exercício desse conjunto? Alguns acham que a partição desses 4 elementos que podemos usar está descrita no número binário à esquerda:
(1001 ou 1011 ecc pode estar nesse conjunto, mas já temos 0110 e 0100 ecc), portanto, um chapéu apenas para escrever uma função que, a partir do número de elemento da matriz de entrada, construa esses números binários ... seria:
que da entrada 1 2 4 8 [2 ^ 0..lenBytesArgument-1] encontre 3 6 12, 7 14, 15; então encontre binário desses números e use-os para encontrar as partições certas da matriz de entrada ... Testei a função c apenas para essa entrada 4 elementos, mas parece que está ok para outro número de elementos ...
teste:
fonte