Skip to content

Instantly share code, notes, and snippets.

@fabriziomello
Created December 7, 2019 14:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fabriziomello/2dcfd243509fdd26f5ea47f476661530 to your computer and use it in GitHub Desktop.
Save fabriziomello/2dcfd243509fdd26f5ea47f476661530 to your computer and use it in GitHub Desktop.
Desafio proposto por Henrique Bastos no Instagram
/*
*
* 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;
@guedes
Copy link

guedes commented Dec 12, 2019

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

@guedes
Copy link

guedes commented Dec 12, 2019

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;

@fabriziomello
Copy link
Author

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!!!

@fabriziomello
Copy link
Author

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