Dada uma lista de números inteiros positivos, encontre o número de triângulos que podemos formar, de modo que seus comprimentos laterais sejam representados por três entradas distintas da lista de entrada.
(A inspiração vem do CR .)
Detalhes
- Um triângulo pode ser formado se todas as permutações dos três comprimentos laterais satisfizerem a desigualdade estrita do triângulo(Isso significa que , e devem ser mantidos.)a + b > c . a + b > c a + c > b b + c > a
- Os três comprimentos laterais devem aparecer em posições distintas da lista, mas não precisam necessariamente ser distintos aos pares.
- A ordem dos três números na lista de entrada não importa. Se considerarmos uma lista
a
e os três númerosa[i], a[j], a[k]
(em quei,j,k
os pares são diferentes),(a[i],a[j],a[k]), (a[i],a[k],a[j]), (a[j], a[i], a[k])
etc. todos serão considerados como o mesmo triângulo. - Pode-se presumir que a lista de entrada contenha pelo menos três entradas.
- Você pode assumir que a lista de entrada está classificada em ordem crescente.
Exemplos
Um pequeno programa de teste pode ser encontrado aqui em Experimente online!
Input, Output:
[1,2,3] 0
[1,1,1] 1
[1,1,1,1] 4
[1,2,3,4] 1
[3,4,5,7] 3
[1,42,69,666,1000000] 0
[12,23,34,45,56,67,78,89] 34
[1,2,3,4,5,6,7,8,9,10] 50
Para a entrada [1,2,3,...,n-1,n]
deste é A002623 .
Para a entrada de [1,1,...,1]
(comprimento n
), isso é A000292 .
Para a entrada dos primeiros n
números de Fibonacci ( A000045 ), é A000004 .
[1,1,1,1]
permite que 4 triângulos "diferentes"[1,1,1]
sejam escolhidos usando três dos 1s ? Mas não é 24 porque os três 1s são escolhidos sem ordem, ou seja, é um subconjunto de três índices em vez de uma lista ordenada?Respostas:
R ,
62524034 bytesExperimente online!
Solução Octave do porto de Luis Mendo
Desde
a<=b<=c
, a condição do triângulo é equivalente aa+b-c>0
. Oa+b-c
é capturado de forma sucinta pelo produto da matriz[1,1,-1] * X
, ondeX
estão as 3 combinações da matriz de entrada.Houve muitas sugestões de melhorias feitas por três pessoas diferentes nos comentários:
Robert S. por sugerir
scan
.Robin Ryder, por sugerir melhorias na desigualdade do triângulo, e essa estranha que exige que a entrada seja em ordem decrescente (o que apenas mostra o quão importante é um formato de entrada flexível).
e finalmente Nick Kennedy para o seguinte:
R , 40 bytes
Experimente online!
fonte
x[3]<x[1]+x[2]
é equivalente a2*x[3]<sum(x)
: 51 bytes[
apelido é liso, realmente limpa a abordagem.Stax ,
87 bytesObrigado ao recursivo por -1!
Execute e depure-o em staxlang.xyz!
Descompactado (8 bytes) e explicação:
Esse é um truque legal. Se você tiver uma sequência de instruções que sempre resultará em 0 ou 1 e precisar contar os itens de uma matriz que produza o resultado verdadeiro no final do seu programa,
F..+
é um byte menor que{..f%
.Assume que a lista inicial está classificada em ordem crescente. Sem essa suposição, cole um
o
no início por 8 bytes.fonte
r3SFE+<+
empacota para 7. Ele usa um loop foreach para adicionar os resultados do filtro. A adição é uma das operações que não é operacional quando apenas um elemento está presente.Haskell , 49 bytes
Experimente online!
Gera recursivamente todas as subsequências de
l
(invertida) e verifica quais de comprimento 3 formam triângulos.50 bytes
Experimente online!
A mesma idéia, gerando as subsequências com
mapM
, mapeando cada valorl
para si mesmo (incluir) ou0
(excluir).50 bytes
Experimente online!
Tenta cada ponto de partição para pegar o elemento do meio
b
.51 bytes
Experimente online!
A função
q=scanr(:)[]
gera a lista de sufixos. Muitos problemas advêm da necessidade de considerar a inclusão de elementos iguais o número certo de vezes.52 bytes
Experimente online!
A função auxiliar
q=scanr(:)[]
gera a lista de sufixos.57 bytes
Experimente online!
fonte
Braquilog , 11 bytes
Experimente online!
Talvez eu tenha esquecido de aproveitar as entradas classificadas na minha solução antiga:
Brachylog ,
181715 bytesExperimente online!
fonte
Perl 6 , 35 bytes
Experimente online!
Explicação
É um código Whatever, ou seja, uma notação concisa para funções lambda (que funciona apenas em casos muito simples). Cada
*
um é um espaço reservado para um argumento. Então, pegamos a lista de comprimentos (que aparece no primeiro*
), fazemos todas as combinações de 3 elementos (elas sempre saem na mesma ordem que na lista original, de modo que significa que as combinações também são classificadas), achatamos a lista, e depois pegue a lista 3 por 3 e filtre (grep
) apenas os trigêmeos que satisfazem*+*>*
, ou seja, que a soma dos dois primeiros argumentos seja maior que o terceiro. Isso fornece todos os trigêmeos, e finalmente os contamos forçando o contexto numérico com a+
.(É claro que precisamos testá-lo apenas para o caso de "soma de dois menores> o maior". Se isso ocorrer, o outro será trivial, se isso não acontecer, o trigêmeo não indica comprimentos de triângulo corretos e não o fazemos. precisa procurar mais.)
fonte
Retina , 55 bytes
Experimente online! O link inclui casos de teste, mas com os valores no quinto caso reduzidos para permitir que ele termine hoje. Pressupõe entrada classificada. Explicação: As expressões regulares não gostam muito de corresponder a mais de uma coisa. Um regex normal seria capaz de encontrar todos os valores que poderiam ser a menor perna de um triângulo. A
v
opção de Retina não ajuda aqui, exceto para evitar uma reação contrária. No entanto, aw
opção de Retina é um pouco mais útil, pois seria possível encontrar a perna mais curta e a mais longa ao mesmo tempo. Isso não é suficiente para esse desafio, pois pode haver várias pernas do meio.Converta a entrada para unário.
Para cada número de entrada ...
... crie uma linha com a matriz original truncada para iniciar nesse número.
$'
normalmente significa a sequência após a correspondência, mas a<
modifica para significar a sequência após o separador anterior, evitando desperdiçar 2 bytes$&
. Cada linha, portanto, representa todas as soluções possíveis usando esse número como a perna mais curta.Para cada uma dessas linhas, encontre todas as pernas médias e mais longas possíveis, mas garanta que a diferença seja menor que a primeira perna. Saída a
_
para cada combinação de pernas correspondente.Conte o número total de triângulos encontrados.
fonte
Python 3 , 73 bytes
Experimente online!
fonte
Python 2 , 72 bytes
Experimente online!
73 bytes
Experimente online!
fonte
05AB1E ,
12109 bytesMinha primeira vez usando 05AB1E! Obrigado a [Grimy] por -1!
Experimente online! ou suíte de teste
Uma porta direta da minha resposta Stax. Obtenha todas as combinações de três entradas e conte as que possam formar triângulos. É essa parte da contagem que realmente me pegou. Eu gasto uma carga de bytes lá. Vinculado a ser algum erro de novato lá.
fonte
ì
(inverter cada) antes do filtro em vez doŠ
(troca tripla) dentro do filtro. Como alternativa, você também pode usar emε...}O
vez deʒ...}g
, mas a contagem de bytes permanece a mesma. PS: sua contagem de bytes de 10 e o TIO estão corretos, mas sua resposta real ainda possui um explícito desnecessárioy
que pode ser removido. :) Boa primeira resposta, porém, +1 de mim.3.ÆʒRÆd_}g
é o mesmo bytecount.3.Æʒ`α›}g
é 9.JavaScript (ES6), 63 bytes
Experimente online!
fonte
Oitava / MATLAB, 33 bytes
Experimente online!
fonte
Zsh , 66 bytes
Experimente online!
Relativamente simples, aproveitando a entrada classificada e aumentando o
for
cabeçalho (o incremento acontece uma vez por loop pai ).fonte
Excel VBA,
171164152 bytes-26 bytes graças a TaylorScott
A entrada está no intervalo
A:A
da planilha ativa. A saída é para a janela imediata.Como isso examina todas as combinações de todas as células de uma coluna com 2 20 células de altura (que são quase 2 60 combinações), esse código é ... não rápido. Você poderia torná-lo muito mais rápido, mas à custa de bytes.
fonte
()
na sub declaração, o espaçoDebug.? r
e pode soltarNext:Next:Next
paraNext k,j,i
. além disso - bem, ainda está fazendo 2 ** 60 combinações, mas funcionar=r-(a+b>c)*(b+c>a)*(c+a>b)
Carvão , 17 bytes
Experimente online! Link é a versão detalhada do código. Pressupõe entrada classificada. Explicação:
fonte
Japonês
-x
, 9 bytesTente
Tente
fonte
Wolfram Language (Mathematica) ,
3735 bytesExperimente online!
fonte
Ruby , 41 bytes
Experimente online!
fonte
Pitão , 14 bytes
Experimente online!
Alternativa (também 14 bytes):
fonte
Perl 5 (
-p
),5552 bytesusando regex backtracking, -3 bytes graças ao @Cows quack usando em
^
vez de(?!)
falhar e voltar.ou
TIO
fonte
(?!)
ser^
?Geléia , 9 bytes
Experimente online!
Um link monádico usando uma lista classificada de números inteiros como argumento e retornando o número de triângulos.
Explicação
9s alternativos:
fonte
J , 40 bytes
Experimente online!
fonte
Bash , 123 bytes
Experimente online!
Um divertido.
fonte
SNOBOL4 (CSNOBOL4) , 181 bytes
Experimente online!
Força brutaO ( n3) algoritmo. Recebe a entrada como uma lista separada por nova linha e gera o número de triângulos ou uma linha vazia para
0
. Provavelmente, isso é permitido, já que o SNOBOL trata a sequência vazia como0
nos cálculos numéricos.fonte
C (clang) , 83 bytes
Experimente online!
Guardado 1 graças a @ceilingcat
fonte