Esta é uma pergunta de entrevista do Google, veja aqui para obter um link do youtube.
A tarefa:
Encontre 2 números inteiros de uma lista não ordenada que soma um determinado número inteiro.
- Dada uma lista não ordenada de números inteiros, encontre 2 números inteiros que somam um determinado valor, imprima esses 2 números inteiros e indique sucesso (saída 0). Eles não precisam ser números específicos (ou seja, os 2 primeiros números inteiros somados ao número certo), qualquer par que somar o valor funcionará.
- um número inteiro é positivo e maior que zero.
- uma lista de números inteiros pode estar em qualquer estrutura de dados, incluindo um arquivo de números inteiros - um número inteiro por linha.
- se nenhum número inteiro puder ser encontrado, indique uma falha (saída 1).
- dois inteiros em posições diferentes na lista devem ser retornados. (ou seja, você não pode retornar o mesmo número da mesma posição duas vezes)
(Nota: no vídeo, esses não são exatamente os requisitos. O 'entrevistador' mudou várias vezes.)
por exemplo.
sum2 8 <<EOF
1
7
4
6
5
3
8
2
EOF
O status de impressões 3
e 5
saída é 0. Observe isso 1,7
e 2,6
também teria resultados permitidos.
sum2 8 <<EOF
1
2
3
4
Retorna o status de saída 1, pois não há combinação possível. 4,4
não é permitido, de acordo com a regra 5.
code-golf
arithmetic
array-manipulation
philcolbourn
fonte
fonte
Respostas:
Bash, 84 bytes
Minha implementação (aproximadamente) da solução de engenheiro do Google, mas usando o bash e um fluxo de entrada - não a minha solução, portanto isso não conta.
Método
enquanto podemos ler o número inteiro V do fluxo de entrada, se menos do que o destino $ 1, se já houver visto $ 1-V, imprima $ 1-V e V e a saída 0 (caso contrário) salve o candidato para a saída 1 de $ 1-V
fonte
Braquilog , 9 bytes
Experimente online!
Supondo que entendi o desafio corretamente ...
Explicação
fonte
Perl 6 , 59 bytes
Experimente
Experimente sem resultado possível
Expandido:
fonte
JavaScript ES6,
58 70 6864 bytesRetorna um par de números na forma de uma matriz, se encontrado; caso contrário
undefined
, retorna um valor falso.fonte
3, 5
, mas este saídas1, 7
...f([2,2] 4)
?includes
truque.JavaScript (ES6),
615756 bytesPega a matriz de números inteiros
a
e a soma esperadas
na sintaxe de currying(a)(s)
. Retorna um par de números inteiros correspondentes como uma matriz ouundefined
se esse par não existir.Formatado e comentado
Teste
Mostrar snippet de código
fonte
Gelatina , 14 bytes
Experimente online!
Esta é uma função (não um programa completo) que gera a saída padrão. (O link TIO possui um wrapper que executa uma função e desconsidera seu valor de retorno.)
Este programa pode ser 4 bytes mais curto se não for para o requisito do código de saída; retornar um código de saída 1 no Jelly é bastante difícil. (É possível que exista uma maneira mais tática de fazer isso que eu tenha perdido.)
Explicação
Podemos reduzir pela metade todos os números inteiros de um par, portanto
o⁶H
, nada fará se encontrarmos um resultado, além de retornar um valor de retorno inútil que não seja relevante de qualquer maneira (eleṄ
serve como um método conveniente de byte único para determinar o retorno da função valor antecipado, de acordo com as regras do PPCG). No entanto, se não encontrarmos um resultado, acabamos tentando reduzir pela metade um caractere espacial, uma operação sem sentido que causa a falha do intérprete Jelly. Felizmente, esta falha produz um código de saída 1.fonte
Perl 5 , 51 bytes
46 bytes de código + para 5 bytes para
-pli
sinalizadores.Experimente online!
A idéia é iterar na lista de entrada: em um número
x
($_
), se vimos anteriormenten-x
($^I-$_
), encontramos o que procurávamos e definimos$\
esses dois valores ("$_ $v"
). No final, se$\
não estiver definido, então nósexit 1
, caso contrário, será impresso implicitamente.fonte
^I
?Röda ,
6056 bytesExperimente online!
Este código gera um erro se não houver resposta. Ele gera todos os pares possíveis que podem formar a soma
s
, ou seja.1, s-1
,2, s-2
,3, s-3
, ... Em seguida, ele verifica se os dois números estão na matriza
e em caso afirmativo, empurra-los para o fluxo.pull
lê um valor do fluxo e o retorna. Se não houver valores no fluxo, gera um erro.a-x
retorna a matriza
comx
removido.fonte
Python 2, 60 bytes
Este resumo, até que as regras de saída do código 1 sejam esclarecidas. Agora sai com erro se nada for encontrado.
-5 bytes graças a @Peilonrayz
-4 bytes graças a @Rod
Experimente online
fonte
input()
reduzir 4 byteseval(raw_input())
(eu acho).C ++ 133 bytes (compilado com clang 4 e gcc 5.3 -std = c ++ 14)
C 108 bytes
fonte
#include <set>
e mais algunsstd::set
. Embora você também possa salvar alguns bytes se remover os chavetas ao redorp.insert(v-i);
main
. Consideramos (salvo indicação em contrário no desafio) que uma função é um envio válido. (bem-vindo no site btw!)end
muito, mas ele compila em gcc semstd::
(e definido se claro que não)Haskell , 34 bytes
Experimente online!
Para cada elemento da lista, essa função verifica se (soma-elemento) está na parte a seguir da lista. Retorna o primeiro par encontrado. Se a função chegar ao final da lista, gera um erro "padrões não exaustivos" e sai com o código 1.
fonte
[2,2]#4
.PowerShell,
10997 bytesFez um acordo de 12 bytes que a AdmBorkBork ofereceu
Explicação
As regras atuais procuram o código de saída que isso faz. Eles podem ser removidos e basta verificar se há números retornados e um falso.
Uso da amostra
Se o código acima foi salvo como função
s
fonte
$c
e fazendo um loop para baixo - #($a.count-1)..1|%{$f=$_;--$_..0|%{if...
R, 49 bytes
Ele encontra todas as 2 combinações de
x
e retorna uma matriz. Em seguida, soma por coluna e encontra todas as somas iguais ay
(portanto, sem a[,1]
parte no final, ela imprimirá todas as combinações às quais suas somas são iguaisy
)fonte
Japonês , 9 bytes
Economizou muitos bytes graças a @ETHproductions
Experimente online!
Explicação
Exemplo
fonte
Javascript,
114968684 bytesGuardou 1 byte graças a @Cyoce e outros 8 bytes graças a @ETHProductions
Isso retorna uma tupla com a primeira combinação de elementos da lista que somam a entrada fornecida ou nada para nenhuma correspondência. Eu removi os
var
s na função; O REPL.it falha sem eles, mas o Chrome Dev Console lida com isso muito bem ...Experimente online!
fonte
y=x+1
cuida disso.a=>b=>...
para salvar um bytefor(y=x;++y<b.length;){
. Além disso, você pode remover todos os conjuntos de chaves, exceto o mais externo, e você pode remover o espaço depoisreturn
Clojure, 77 bytes
Retorna o primeiro par desse tipo ou
nil
.fonte
Haskell, 62 bytes
Ainda não sei o que é permitido pelo desafio e o que não é. Eu estou indo para uma função que imprime um par de números e retorna 0 se houver uma solução e imprime nada e retorna 1 se não houver solução. Como a impressão é de E / S, preciso elevar os valores de retorno para a IO-Mônada (via
return
) e o tipo real da função éNum a => IO a
.Exemplo de uso (com valor de retorno impresso pela réplica):
Experimente online! .
Se o aumento de exceções for permitido,
fail
serão salvos alguns bytes (total de 51):fonte
Geléia , 9 bytes
O Jelly não tem como definir o código de saída para valores arbitrários, portanto, isso gera um TypeError para entrada sem uma solução válida que fará com que o intérprete pai saia com o código de saída 1 .
Experimente online!
Como funciona
fonte
Nova , 101 bytes
Uma coisa interessante sobre o código de golfe é que ele me ajuda a encontrar erros no meu idioma. por exemplo, o espaço necessário entre
return
e[y,x-y]
.Depois de adicionar funções push / pop ao Array.nova e corrigir o retorno, seriam 96 bytes:
Uso:
Edit: Além disso, há desta maneira em 73 bytes (69 usando pop) também:
firstOrThrow lançará uma exceção, que não será capturada e, portanto, sairá do programa com o código de saída 1.;)
Desta forma, parece mais legível também.
fonte
Pitão, 12 bytes
Explicação
fonte
PHP, 88 bytes
recebe entrada dos argumentos da linha de comando, soma primeiro. Corra com
-nr
.Felizmente,
die
/exit
sai0
quando você fornece uma string como parâmetro.Eu tentei mesclar os loops a um; mas requer uma inicialização mais longa e teste dessa vez.
fonte
for($i=1;$a=$argv[$k=++$i];)for(;$b=$argv[++$k];)$a+$b!=$argv[1]?:die(!0);
e você deve dar uma olhada neste codegolf.stackexchange.com/questions/120803/…Mathematica, 76 bytes
Bastante simples:
#~Subsets~{2}
obtém todos os subconjuntos de 2 elementos da lista e, em seguida,Cases[...,x_/;Tr@x==#2]
escolhe apenas aqueles cuja soma é o número que queremos. Se não houver,If[l=={}, Message@f::e,First@l]
imprime a mensagem de errof::e : 1
que definimos anteriormente (já que não tenho idéia do que mais "status de saída 1" possa significar para o Mathematica); caso contrário, ele retornará a primeira entrada na lista de pares que somam a coisa correta.Se for permitido retornar um valor falsey em vez de fazer a coisa estranha de status de saída, o código a seguir tem 58 bytes:
fonte
Scala,
5541 bytesRetorna uma lista dos dois números, se eles existirem, e gera um erro caso contrário. Não detectado, esse erro resultará no status de saída 1.
fonte
Ruby,
5348 bytesEntrada: a é a lista, s é a soma esperada.
Se os 2 números forem encontrados, imprima-os e retorne 0, caso contrário, retorne 1, como na especificação.
fonte
TI-Basic, 59 bytes
Explicação:
Se o programa não for encerrado normalmente, ocorrerá um erro quando não houver elementos suficientes na lista para continuar.
fonte
CJam, 23 bytes
Entrada é
sum numbers
. Por exemplo:6 [3 2 3]
. Deixa um número positivo para truthy e uma sequência vazia ou 0 para falsey.Explicação:
fonte