Suma todos los números en un rango -- javascript campo con programming-challenge campo con array camp codereview Relacionados El problema

Sum all numbers in a range


9
vote

problema

Español

He implementado el desafío de "Suma a todos los números en un rango" de Campamento de código gratuito citado a continuación.

El código funciona como un encanto, pero no creo que sea idiomático. Los sugerencias de desafío implican que debería estar usando DataOutputStream8 , DataOutputStream9 y DataInputStream0 . Además, usé la Operador de distribución de ES6 Para simplificar las llamadas DataInputStream1 .

Estoy buscando una forma más idiomática de resolver esto. Creo que se puede hacer en un forro, algo así como:

  DataInputStream2  

Pero estoy bastante seguro de que me voy a la manera incorrecta con lo anterior.

El reto:

Te pasaremos una matriz de dos números. Devuelva la suma de esos dos números y todos los números entre ellos.

El número más bajo no siempre será lo primero.

El código:

  DataInputStream3  

Casos de prueba:

  DataInputStream4  

Salida esperada:

  DataInputStream5  
Original en ingles

I have implemented the "Sum All Numbers in a Range" challenge from Free Code Camp quoted below.

The code works like a charm, but I don't think it's idiomatic. The challenge hints imply I should be using Math.max(), Math.min() and Array.reduce(). In addition I used the spread operator from ES6 to simplify both Math calls.

I'm looking for a more idiomatic way to solve this. I think it can be done in a one-liner, something like:

return arr.sort((function(a, b) { return a - b; })).reduce(function(a, b) { /* */ }); 

But I'm pretty sure I'm heading the wrong way with the above.

The challenge:

We'll pass you an array of two numbers. Return the sum of those two numbers and all numbers between them.

The lowest number will not always come first.

The code:

function sumAll(arr) {   var out = 0;   for (var i = Math.min(...arr); i <= Math.max(...arr); i++) {     out += i;   }   return out; } 

Test cases:

sumAll([1, 4]) sumAll([4, 1]) sumAll([5, 10]) sumAll([10, 5]) 

Expected output:

10 10 45 45 
        
       
       

Lista de respuestas

19
 
vote
vote
La mejor respuesta
 

No sé qué usaría int id5 Para ser honesto. Pero no necesitas hacer un bucle. Solo tenemos una simple secuencia aritmética con una fórmula directa:

$$ sum_ {i = min} ^ {max} i = frac {(max-min + 1) (min + max)} 2 $$

Solo necesitamos elegir cuál es más grande:

  int id6  

o podríamos generalizar a cualquier secuencia aritmética:

  int id7  

Supongo que si realmente desea int id8 lo haría de esta manera (no usar ES6 porque no sé cómo obtener Freecodempam para usarlo):

  int id9  
 

I don't know what you would use reduce() for to be honest. But you don't need to loop. We just have a simple arithmetic sequence with a straightforward formula:

$$\sum_{i=min}^{max} i = \frac{(max-min+1)(min+max)}2$$

We just need to pick out which one is larger:

function sumFrom(min, max) {     return (max-min+1) * (min+max) / 2; }  function sumAll(arr) {     return sumFrom(Math.min(...arr), Math.max(...arr)); } 

Or we could generalize to any arithmetic sequence:

function sumArithmetic(a1, n, d) {     return n*(2*a1 + (n-1)*d) / 2; }  function sumAll(arr) {     var min = Math.min(...arr);     return sumArithmetic(min, Math.max(...arr) - min + 1, 1); } 

I guess if you really want reduce() you'd do it this way (not using ES6 because I don't know how to get freecodecamp to use it):

function sumAll(arr) {   var min = Math.min.apply(null, arr);   var max = Math.max.apply(null, arr);    return Array.apply(null, Array(max-min+1))   // get array of correct size       .map(function(_, b) { return b+min; })   // change it to have correct values       .reduce(function(a, b) { return a+b; }); // and sum it } 
 
 
   
   
3
 
vote

Como Barry mencionado, probablemente se espera que utilice Gauss y la propiedad de los números triangulares.

enum BiomeType { NORMAL(42), BIOME(23); private final int id; private BiomeType(int id) { this.id = id; } public static BiomeType forId(int id) { // loop through all the biomes and find the one with the matching id } } 020 es una forma divertida de acceder a su matriz sin tocar los índices, por lo tanto, sin necesidad de verificar que existan. (Considere lo que sucedería si su función se llamó con enum BiomeType { NORMAL(42), BIOME(23); private final int id; private BiomeType(int id) { this.id = id; } public static BiomeType forId(int id) { // loop through all the biomes and find the one with the matching id } } 1 o enum BiomeType { NORMAL(42), BIOME(23); private final int id; private BiomeType(int id) { this.id = id; } public static BiomeType forId(int id) { // loop through all the biomes and find the one with the matching id } } 2 ).

El único forro que das está muy cerca. En la función final, tiene enum BiomeType { NORMAL(42), BIOME(23); private final int id; private BiomeType(int id) { this.id = id; } public static BiomeType forId(int id) { // loop through all the biomes and find the one with the matching id } } 3 y enum BiomeType { NORMAL(42), BIOME(23); private final int id; private BiomeType(int id) { this.id = id; } public static BiomeType forId(int id) { // loop through all the biomes and find the one with the matching id } } 4 y enum BiomeType { NORMAL(42), BIOME(23); private final int id; private BiomeType(int id) { this.id = id; } public static BiomeType forId(int id) { // loop through all the biomes and find the one with the matching id } } 6655443326 valores en ese orden. Simplemente aplique la fórmula de suma: enum BiomeType { NORMAL(42), BIOME(23); private final int id; private BiomeType(int id) { this.id = id; } public static BiomeType forId(int id) { // loop through all the biomes and find the one with the matching id } } 7

Entonces:

  enum BiomeType {     NORMAL(42), BIOME(23);     private final int id;     private BiomeType(int id) {         this.id = id;     }      public static BiomeType forId(int id) {         // loop through all the biomes and find the one with the matching id     } } 8  

Notará que, dado que la matriz es de tamaño 2 y se sabe que es así, la complejidad es enum BiomeType { NORMAL(42), BIOME(23); private final int id; private BiomeType(int id) { this.id = id; } public static BiomeType forId(int id) { // loop through all the biomes and find the one with the matching id } } 9 , mientras que si realmente suma los números, se convierte en 99887776655443330 donde n es la cantidad de números para agregar.

 

Like Barry mentioned, you are probably expected to use Gauss and the property of triangular numbers.

reduce is a funny way of accessing your array without touching the indexes, hence without needing to verify that they exist. (consider what would happen if your function was called with [] or [0]).

The one-liner you give is very close. In the final function you have a and b being the min and max values in that order. just apply the sum formula to it: return (a+b)*(b-a+1)/2;

So:

return arr         .sort((a, b) => a - b)         .reduce((a, b) => (a + b) * (b - a + 1) / 2); 

You'll notice that since the array is size 2 and known to be that way, the complexity is O(1), while if you actually sum the numbers, it becomes O(n) where n is the amount of numbers to add.

 
 
2
 
vote

Personalmente, cambiaría DataOutputStream1 a DataOutputStream2 . Y también la estructura en algo así como lo siguiente:

  DataOutputStream3  

De esta manera se vuelve más legible.

 

Personally, I'd change out to result. And also the structure in something like the following:

function sumAll(arr){     var smallest = 0;     var greatest = 0;      if(arr[0] < arr[1]){         smallest = arr[0];         greatest = arr[1];     } else{         smallest = arr[1];         greatest = arr[0];     }      return sumRange(smallest, greatest); }  function sumRange(from, to){     var result = 0;      for(var i = from; i <= to; i++){         result += i;     }      return result; } 

In this way it becomes more readable IMO.

 
 
   
   

Relacionados problema

2  Mejora de la función que compara dos cadenas  ( Improving function that compares two strings ) 
Estoy aprendiendo C y he hecho esta función muy simple para comparar dos cuerdas. Me gustaría saber cómo se puede mejorar: int match(char* string1, char* s...

2  Importando datos en Excel  ( Importing data into excel ) 
¿Existe una forma más fácil de importar datos en una matriz de Excel u otra estructura de datos? He intentado investigar colecciones, pero he encontrado la D...

6  Palindrome más largo en una matriz  ( Longest palindrome in an array ) 
Soy nuevo en la programación, y creo que este código podría mejorarse. ¿Alguna sugerencia? 'done'0 ...

2  Cargando imágenes en el fondo para una vista de tabla  ( Loading images in the background for a table view ) 
Tengo fetchData2 MÉTODO QUE LLENA MI imagesArray : func fetchData(){ let imageQuery = PFUser.query() imageQuery?.whereKey("username", contained...

5  Encuentra el primer número único de la matriz  ( Find first unique number from array ) 
Se me pidió que creara una función que devuelva el primer entero único de la matriz de enteros. En un caso de éxito, la función devuelve el número único en un...

6  Fusionando dos varias de clases  ( Merging two array of classes ) 
Tengo esta función que debe fusionar dos matriz de clases cuando id es igual a id de Array2. Para la simplicidad, convirtí una matriz en un arraylist pa...

6  Buscar número de más en una matriz 2D  ( Find number of plus in a 2d array ) 
Problema Chargrid El CharGrid La clase encapsula una matriz de 2-D con una pareja de operaciones. INT APULUS () Busque un patrón '+' en la cuadrícu...

7  Colecciones vacías en caché  ( Cached empty collections ) 
A menudo necesito devolver las colecciones vacías. Uno de esos días, escribí lo siguiente para devolver una instancia en caché: public static class Array<...

2  Devuelve verdadero si los elementos de una matriz no contienen uno u otro  ( Return true if the elements of an array do not contain one or the other ) 
Estoy completando gradualmente los ejercicios de codificación para Java. Aquí está el uno acabo de hacer: Dada una matriz de INTS, devuelva verdadera si ...

6  Clase de matriz multidimensional simple en C ++ 11  ( Simple multi dimensional array class in c11 ) 
La nueva versión del código se puede revisar en Clase de matriz multidimensional simple en C ++ 11 - Seguimiento . El siguiente código implementa una clas...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos