Created
December 7, 2019 14:15
-
-
Save fabriziomello/2dcfd243509fdd26f5ea47f476661530 to your computer and use it in GitHub Desktop.
Desafio proposto por Henrique Bastos no Instagram
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* | |
* Desafio do Henrique Bastos () | |
* | |
* Dado uma lista de números e um número k, retorne se quaisquer dois números da lista | |
* somados resultam no número k. | |
* | |
* Por exemplo, dado [10, 15, 3, 7] e k = 17, retorne verdadeiro, já que 10 + 7 = 17. | |
* | |
* Passe pelos números da lista uma única vez. | |
* | |
* SQLFiddle: http://sqlfiddle.com/#!17/06912/109 | |
* | |
*/ | |
WITH lista(l) AS ( | |
VALUES (10.0), (15.0), (3.0), (7.0) | |
), | |
teste (k) AS ( | |
VALUES (18.0), (25.0), (13.0), (22.0), (10.0), (17.0), (50.0), (6.0), (5.0), (1.0), (200.0) | |
) | |
SELECT | |
array_agg(l) | |
, k | |
, ((k % avg(l)) <> k) and ((k % sum(l)) = k) AS "Eh a soma de dois elementos?" | |
FROM | |
lista, teste | |
GROUP BY | |
k; |
Uma abordagem diferente seria:
WITH lista(l) AS (
VALUES (10.0), (15.0), (3.0), (7.0)
),
teste (k) AS (
VALUES (18.0), (25.0), (28.0), (13.0), (22.0), (10.0), (17.0), (50.0), (6.0), (5.0), (1.0), (200.0)
)
SELECT
l1.l + l2.l = k
, l1.l, l2.l, k
FROM
lista l1
JOIN lista l2
ON (l1.l <> l2.l)
CROSS JOIN teste;
O teste "retorne se quaisquer dois números da lista somados resultam no número k" falha para k = 28, pois ele retorna true, embora são 3 (três) elementos que somados dão k
Hmmm... boa... vou analisar melhor!!! Valeu!!!
Uma abordagem diferente seria:
WITH lista(l) AS ( VALUES (10.0), (15.0), (3.0), (7.0) ), teste (k) AS ( VALUES (18.0), (25.0), (28.0), (13.0), (22.0), (10.0), (17.0), (50.0), (6.0), (5.0), (1.0), (200.0) ) SELECT l1.l + l2.l = k , l1.l, l2.l, k FROM lista l1 JOIN lista l2 ON (l1.l <> l2.l) CROSS JOIN teste;
Não dá pra fazer assim porque uma das premissas é passar apenas uma vez na lista então o JOIN da lista com ela mesma quebra porque vc tem duas iterações na mesma lista, por isso tem que usar operações aritméticas IMHO.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
O teste "retorne se quaisquer dois números da lista somados resultam no número k" falha para k = 28, pois ele retorna true, embora são 3 (três) elementos que somados dão k