Esta es una pregunta de la entrevista de Google, vea aquí un enlace de YouTube.
La tarea:
Encuentre 2 enteros de una lista desordenada que sumen a un entero dado.
- Dada una lista desordenada de enteros, encuentre 2 enteros que sumen un valor dado, imprima estos 2 enteros e indique el éxito (salida 0). No necesitan ser números particulares (es decir, los primeros 2 enteros que suman el número correcto), cualquier par que sume al valor funcionará.
- un entero es positivo y mayor que cero.
- una lista de enteros puede estar en cualquier estructura de datos, incluido un archivo de enteros, un entero por línea.
- Si no se pueden encontrar enteros, indique una falla (salida 1).
- deben devolverse dos enteros en diferentes posiciones en la lista. (es decir, no puede devolver el mismo número desde la misma posición dos veces)
(Nota: en el video, estos no son exactamente los requisitos. El 'entrevistador' cambió sus múltiples veces).
p.ej.
sum2 8 <<EOF
1
7
4
6
5
3
8
2
EOF
Imprime 3
y el 5
estado de salida es 0. Tenga en cuenta que en esto 1,7
y 2,6
también se permitirían resultados.
sum2 8 <<EOF
1
2
3
4
Devuelve el estado de salida 1 ya que no hay combo posible. 4,4
no está permitido, según la regla 5.
code-golf
arithmetic
array-manipulation
philcolbourn
fuente
fuente
Respuestas:
Bash, 84 bytes
Mi implementación de (aproximadamente) la solución del ingeniero de Google pero usando bash y un flujo de entrada, no es mi solución, por lo que esto no cuenta.
Método
mientras que podemos leer el entero V del flujo de entrada si es inferior al objetivo $ 1, si ya se ha visto $ 1-V, imprimir $ 1-V y V y salir 0 (de lo contrario) guardar el candidato para la entrada $ 1-V salida 1
fuente
Brachylog , 9 bytes
Pruébalo en línea!
Asumiendo que entendí el desafío correctamente ...
Explicación
fuente
Perl 6 , 59 bytes
Pruébalo
Pruébalo sin resultado posible
Expandido:
fuente
JavaScript ES6,
58 70 6864 bytesDevuelve un par de números en forma de matriz si se encuentra; de lo contrario
undefined
, devuelve un valor falso.fuente
3, 5
pero esto genera1, 7
...f([2,2] 4)
?includes
trucoJavaScript (ES6),
615756 bytesToma la matriz de enteros
a
y la suma esperadas
en la sintaxis de curry(a)(s)
. Devuelve un par de enteros coincidentes como una matriz, oundefined
si no existe dicho par.Formateado y comentado
Prueba
Mostrar fragmento de código
fuente
Jalea , 14 bytes
Pruébalo en línea!
Esta es una función (no un programa completo) que sale a la salida estándar. (El enlace TIO tiene un contenedor que ejecuta una función y no tiene en cuenta su valor de retorno).
Este programa podría ser 4 bytes más corto si no fuera por el requisito del código de salida; devolver un código de salida de 1 en Jelly es bastante difícil. (Es posible que haya una forma más tersa de hacer esto que he echado de menos).
Explicación
Podemos reducir a la mitad todos los enteros de un par, así
o⁶H
que no hará nada si encontramos un resultado, aparte de devolver un valor de retorno inútil que de todos modos no es relevante (Ṅ
sirve como un método conveniente de un solo byte para determinar el retorno de la función valor temprano, bajo las reglas PPCG). Sin embargo, si no encontramos un resultado, terminamos tratando de reducir a la mitad un carácter espacial, una operación tan insignificante que hace que el intérprete de Jelly se bloquee. Afortunadamente, este bloqueo produce un código de salida de 1.fuente
Perl 5 , 51 bytes
46 bytes de código + para 5 bytes para
-pli
banderas.Pruébalo en línea!
La idea es iterar en la lista de entrada: en un número
x
($_
), si previamente vimosn-x
($^I-$_
), entonces encontramos lo que estábamos buscando y establecemos$\
estos dos valores ("$_ $v"
). Al final, si$\
no está configurado, entonces nosotrosexit 1
, de lo contrario, se imprimirá implícitamente.fuente
^I
?Röda ,
6056 bytesPruébalo en línea!
Este código arroja un error si no hay respuesta. Genera todos los pares posibles que pueden formar la suma
s
, es decir.1, s-1
,2, s-2
,3, s-3
, ... A continuación, se comprueba si ambos números están en la matriza
y si es así, les empuja a la corriente.pull
lee un valor de la secuencia y lo devuelve. Si no hay valores en la secuencia, arroja un error.a-x
devuelve la matriza
conx
eliminado.fuente
Python 2, 60 bytes
Este breve, hasta que se aclaren las reglas para salir con el código 1. Ahora sale con error si no se encuentra nada.
-5 bytes gracias a @Peilonrayz
-4 bytes gracias a @Rod
Pruébalo en línea
fuente
input()
para reducir 4 byteseval(raw_input())
(creo).C ++ 133 bytes (compilado con clang 4 y gcc 5.3 -std = c ++ 14)
C 108 bytes
fuente
#include <set>
y algunos más parastd::set
. Aunque también puede guardar algunos bytes si elimina las llavesp.insert(v-i);
main
. Consideramos (a menos que se indique lo contrario en el desafío) que una función es una presentación válida. (¡bienvenido en el sitio por cierto!)end
, pero se compila en gcc sinstd::
(y configurado si no)Haskell , 34 bytes
Pruébalo en línea!
Para cada elemento de la lista, esta función verifica si (elemento-suma) está en la siguiente parte de la lista. Devuelve el primer par que encuentra. Si la función llega al final de la lista, arroja un error de "patrones no exhaustivos" y sale con el código 1.
fuente
[2,2]#4
.PowerShell,
10997 bytesTomó un acuerdo de 12 bytes que AdmBorkBork ofreció
Explicación
Las reglas actuales buscan el código de salida que hace esto. Esos podrían eliminarse y simplemente verificar los números devueltos y una falsificación.
Uso de muestra
Si el código anterior se guardó como función
s
fuente
$c
y haciendo un bucle hacia abajo -($a.count-1)..1|%{$f=$_;--$_..0|%{if...
R, 49 bytes
Esto encuentra todas las combinaciones de 2
x
y devuelve una matriz. Luego, suma por columna y encuentra todas las sumas que son iguales ay
(por lo tanto, sin la[,1]
parte al final, imprimirá todas las combinaciones a las que equivalen sus sumasy
)fuente
Japt , 9 bytes
Ahorró muchos bytes gracias a @ETHproductions
Pruébalo en línea!
Explicación
Ejemplo
fuente
Javascript,
114968684 bytesSe guardó 1 byte gracias a @Cyoce y otros 8 bytes gracias a @ETHProductions
Esto devuelve una tupla con la primera combinación de elementos de lista que suman la entrada dada, o nada para ninguna coincidencia. He eliminado la
var
s en la función; REPL.it se bloquea sin ellos, pero Chrome Dev Console maneja esto muy bien ...Pruébalo en línea!
fuente
y=x+1
se encarga de eso.a=>b=>...
para guardar un bytefor(y=x;++y<b.length;){
. Además, puede eliminar todos los conjuntos de llaves, excepto el más externo, y puede eliminar el espacio después dereturn
Clojure, 77 bytes
Devuelve el primer par o
nil
.fuente
Haskell, 62 bytes
Todavía no sé qué permite el desafío y qué no. Voy por una función que imprime un par de números y devuelve 0 si hay una solución y no imprime nada y devuelve 1 si no hay solución. Como la impresión es E / S, tengo que elevar los valores de retorno a la IO-Monad (vía
return
) y el tipo real de la función esNum a => IO a
.Ejemplo de uso (con el valor de retorno impreso por la réplica):
Pruébalo en línea!.
Si se permiten las excepciones,
fail
se guardarán algunos bytes (51 en total):fuente
Jalea , 9 bytes
Jelly no tiene forma de establecer el código de salida en valores arbitrarios, por lo que esto produce un TypeError para la entrada sin una solución válida que hará que el intérprete principal salga con el código de salida 1 .
Pruébalo en línea!
Cómo funciona
fuente
Nova , 101 bytes
Una cosa buena del código golf es que me ayuda a encontrar errores en mi idioma. por ejemplo, el espacio requerido entre
return
y[y,x-y]
.Una vez que agregue funciones push / pop a Array.nova y corrija el retorno, serían 96 bytes:
Uso:
Editar: Además, hay esta manera en 73 bytes (69 usando pop), también:
firstOrThrow lanzará una Excepción, que será descubierta y, por lo tanto, finalmente saldrá del programa con el código de salida 1.;)
Esta forma parece más legible también.
fuente
Pyth, 12 bytes
Explicación
fuente
PHP, 88 bytes
toma información de los argumentos de la línea de comando, suma primero. Corre con
-nr
.Afortunadamente,
die
/exit
sale con0
cuando le das una cadena como parámetro.Traté de fusionar los bucles a uno; pero requiere una inicialización más larga y prueba esta vez.
fuente
for($i=1;$a=$argv[$k=++$i];)for(;$b=$argv[++$k];)$a+$b!=$argv[1]?:die(!0);
y deberías echar un vistazo a este codegolf.stackexchange.com/questions/120803/…Mathematica, 76 bytes
Bastante sencillo:
#~Subsets~{2}
obtiene todos los subconjuntos de 2 elementos de la lista, luegoCases[...,x_/;Tr@x==#2]
selecciona solo aquellos cuya suma es el número que queremos. Si no hay ninguno de estos,If[l=={}, Message@f::e,First@l]
imprime el mensaje de errorf::e : 1
que definimos anteriormente (ya que no tengo idea de qué más podría significar "estado de salida 1" para Mathematica); de lo contrario, devuelve la primera entrada en la lista de pares que suman lo correcto.Si se nos permite devolver un valor falsey en lugar de hacer ese extraño estado de salida, el siguiente código tiene 58 bytes:
fuente
Scala,
5541 bytesDevuelve una lista de los dos números si existen y, de lo contrario, arroja un error. Descubierto, este error dará como resultado un estado de salida de 1.
fuente
Ruby,
5348 bytesEntrada: a es la lista, s es la suma esperada.
Si se encuentran los 2 números, imprímalos y devuelva 0, de lo contrario devuelva 1, como en la especificación.
fuente
TI-Basic, 59 bytes
Explicación:
Si el programa no salió correctamente, causará un error cuando no haya suficientes elementos en la lista para que continúe.
fuente
CJam, 23 bytes
Entrada es
sum numbers
. Por ejemplo:6 [3 2 3]
. Deja un número positivo para la verdad y una cadena vacía o 0 para falsey.Explicación:
fuente