Reto tomado con permiso de mi concurso de desafío de código universitario
Después de terminar sus estudios hace un par de meses, Marie abrió una cuenta bancaria para comenzar a recibir el pago de su primer trabajo en la ciudad. Desde entonces, ha estado realizando algunas transacciones con él. Su primer pago fue de $ 1000 dólares. Con ese dinero pagó una cena en la que invitó a sus padres (la cena costó $ 150 dólares), luego hizo una compra en un conocido supermercado ($ 80 dólares) y una reserva de hotel para sus vacaciones ($ 200). Al final del mes recibió nuevamente su pago (1040 dólares, un poco más que el mes anterior) y al día siguiente gastó otros $ 70 dólares en el supermercado.
Hoy, se dio cuenta de que si después de pagar los primeros $ 80 dólares en el supermercado se hubiera creado una segunda cuenta y la primera congelada, ambas cuentas tendrían exactamente el mismo saldo:
El evento fue tan raro para ella que quiere seguir averiguando si los movimientos de su cuenta y los de sus amigos también tienen esta característica o no.
Desafío
Dada una lista de transacciones, genere el número de instantes de tiempo en que el propietario de la cuenta bancaria podría haber creado una segunda cuenta para que ambos tuvieran el mismo saldo final.
Ejemplo: [1000, -150, -80, -200, 1040, -70]
Caso de prueba
- Entrada:
1000 -150 -80 -200 1040 -70
Salida:1
- Entrada:
100 -100
Salida:2
- Entrada:
1 2 3
Salida:1
- Entrada:
10 -20 15
Salida:0
- Entrada:
15 -15 15 -15
Salida:3
- Entrada:
1
Salida:0
Notas
- Puede suponer que no habrá ninguna transacción de $ 0 dólares
- Puede tomar aportes de cualquier manera razonable
Respuestas:
C # (compilador interactivo de Visual C #) , 63 bytes
Guardado 6 bytes gracias a dana
Pruébalo en línea!
fuente
Perl 6 , 25 bytes
Pruébalo en línea!
Explicación
Simplemente anteponemos un cero a la lista dada (
0,|$_
), hacemos una secuencia de sumas parciales con[\+]
(es decir, la secuencia formada por el primer elemento, la suma de los dos primeros, la suma de los primeros tres, etc.) y buscamos (grep
) elementos que son exactamente iguales a la mitad del estado final de la cuenta (suma de la lista dada). Finalmente, los contamos con a+
.fuente
05AB1E , 11 bytes
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Jalea ,
116 bytesPruébalo en línea!
fuente
JavaScript (Node.js) , 45 bytes
Pruébalo en línea!
Ahorre 4 bytes mediante el uso
-~o[s]
. Gracias a Shaggyfuente
+
se cambia a!
, por lo que podría funcionar como entrada[100]
.Perl 5
-p
,4241 bytes@NahuelFouilleul guarda un byte
Pruébalo en línea!
fuente
y/ /+/;
ahorra 1 byteJavaScript (ES6), 52 bytes
Pruébalo en línea!
Comentado
Versión recursiva,
5453 bytesPruébalo en línea!
fuente
APL (Dyalog Unicode) , SBCS de 21 bytes
Función de prefijo tácito anónimo
Pruébalo en línea!
⍳
ɩ ndices∘
de≢
la cuenta de transacciones0,
anteponer cero⊂(
...)¨⍨
aplique la siguiente función tácita con cada uno de ellos como argumento izquierdo y la lista completa de transacciones como argumento derecho (⍨
argumento de intercambio⊂
la lista completa de transacciones(
...)
como argumento izquierdo de la siguiente función¨
aplicada a cada uno de los índices⍨
con argumentos intercambiados (es decir, lista a la derecha, índices a la izquierda:↓
soltar tantos desde la izquierda1⊥
suma (lit. evaluar en base-1)(
...)=
es (0/1) igual a ...↑
tomar tantas transacciones desde la izquierda+/
sumalos+/
suma esa lista booleana para obtener el recuento de verdadesfuente
Lote, 84 bytes
Toma datos como argumentos de línea de comandos. Explicación:
Une los argumentos con espacios.
Reemplace los espacios con
+
sy evalúe el resultado. También borra el conteo.Para cada cantidad, reste el doble de la suma. Si el resultado es cero, entonces esta es una coincidencia válida, así que incremente la cuenta. El cero extra al principio permite una coincidencia antes de cualquier cantidad.
Imprime el resultado.
fuente
Carbón de leña , 15 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Lamentablemente, en el carbón
Sum([])
no es0
así, tengo que asegurarme de que siempre haya al menos un elemento para sumar.fuente
Python 3 ,
6758 bytesPruébalo en línea!
-9 bytes gracias a @ No seas un punto triple x
fuente
lambda l:sum(sum(l[:x])==sum(l[x:])for x in range(len(l)+1))
.sum(l[:x])*2==sum(l)
le ahorra otros 2 bytes.R ,
5037 bytesPruébalo en línea!
fuente
MATL , 9 bytes
Pruébalo en línea!
El mismo enfoque que algunas otras respuestas: anteponer un cero y verificar con qué frecuencia la mitad de la suma acumulativa es igual a la suma total.
fuente
Japt
-x
,1411 bytesIntentalo
fuente
PowerShell ,
8882 bytes-6 Bytes gracias a mazzy
Pruébalo en línea!
Esto parece un método muy torpe, pero hizo el trabajo. Intentaré renovarlo en el futuro.
fuente
$i+=<predicate>
lugarif(<predicate>){$i++}
PowerShell ,
494536 bytesPruébalo en línea!
fuente
Brachylog , 9 bytes
No tan bueno como el día 1. Este pierde con Jelly
Explicación
Paquete de prueba: ¡ Pruébelo en línea!
fuente
bash, 52 bytes
TIO
El truco: configuración
IFS=+
, se"$*"
expande a una cadena donde los argumentos están delimitados por+
, en expresión aritmética eval a la sumafuente
Haskell,
4635 bytesPruébalo en línea!
fuente
J , 19 bytes
Pruébalo en línea!
explicación
fuente