Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: TickTack en 9 Enero 2021, 00:04 am



Título: [Aporte] javascript - Proporción de números
Publicado por: TickTack en 9 Enero 2021, 00:04 am
Hola a todos,

quizás esto pueda ser útil para algunas personas...

La proporción de números en el vector que son mayores, menores o iguales a 0:

Código
  1. const NumberValue = {
  2.  GREATER_THAN_0: i => i > 0,
  3.  LESS_THAN_0: i => i < 0,
  4.  EQUAL_TO_0: i => i == 0
  5. };
  6.  
  7. function printStatistics(...a) {
  8.    for (var key in NumberValue) {
  9.        if (NumberValue.hasOwnProperty(key)) {
  10.          console.log(key + " = " + sum(NumberValue[key],a).map(i => 1.0 / a.length).reduce((pv, cv) => pv + cv, 0));
  11.        }
  12.    }
  13. }
  14.  
  15. function sum(callback, a) {
  16.    return a.filter(callback);
  17. }
  18.  
  19. console.log(printStatistics(-5, 5, 4, 3, 2, 1, 0, -1));
  20.  

Resultado:
Código:
GREATER_THAN_0 = 0.625
LESS_THAN_0 = 0.25
EQUAL_TO_0 = 0.125


Saludos

Mod Edit: Usar etiquetas GeSHI.


Título: Re: [Aporte] javascript - Proporción de números
Publicado por: @XSStringManolo en 9 Enero 2021, 02:03 am
Qué recuerdos del colegio. Ahí va mi forma de hacerlo:
Código
  1. let proporcion = (...nums) => {
  2.  let greater, less = 0, equal = 0;
  3.  
  4.  for(let i in nums) {
  5.    nums[i] < 0 && ++less;
  6.    nums[i] == 0 && ++equal;
  7.  }
  8.  
  9.  greater = ( nums.length - (less + equal) ) / nums.length;
  10.  less /= nums.length;
  11.  equal /= nums.length;
  12.  
  13.  return [greater, less, equal];
  14. }
  15.  
  16. alert(proporcion(-5, 5, 4, 3, 2, 1, 0, -1));


Título: Re: [Aporte] javascript - Proporción de números
Publicado por: MinusFour en 9 Enero 2021, 02:35 am
Un poco más de golf pero se puede leer bien yo creo:
Código
  1. let proporcion = (...arr) => {
  2.  let porcentaje = 1/arr.length;
  3.  return arr.reduce((total, actual) => (
  4.    actual > 0
  5.      ? total.mayor += porcentaje
  6.      : actual < 0
  7.        ? total.menor += porcentaje
  8.        : total.igual += porcentaje,
  9.   total),
  10.  { mayor: 0, menor: 0, igual: 0});
  11. };


Título: Re: [Aporte] javascript - Proporción de números
Publicado por: TickTack en 13 Enero 2021, 17:09 pm
Un poco más de golf pero se puede leer bien yo creo:
Código
  1. let proporcion = (...arr) => {
  2.  let porcentaje = 1/arr.length;
  3.  return arr.reduce((total, actual) => (
  4.    actual > 0
  5.      ? total.mayor += porcentaje
  6.      : actual < 0
  7.        ? total.menor += porcentaje
  8.        : total.igual += porcentaje,
  9.   total),
  10.  { mayor: 0, menor: 0, igual: 0});
  11. };

Si a tu código le agrego
Código:
console.log(proporcion(-5, 5, 4, 3, 2, 1, 0, -1));

entonces, en vez de mostrarme los resultados esperados, me muestra:

Citar
[object Object]


Título: Re: [Aporte] javascript - Proporción de números
Publicado por: MinusFour en 13 Enero 2021, 17:44 pm
Entonces tu console.log está haciendo algo diferente a los demás. Por lo general console.log imprime la estructura del objeto no su valor primitivo.

(https://i.imgur.com/mpzL78Z.png)

Una versión aún más reducida pero creo que no se lee tan bien.

Código
  1. let proporcion = (...arr) => {
  2.  let porcentaje = 1/arr.length;
  3.  return arr.reduce((total, actual) => (
  4.    total[actual > 0
  5.      ? 'mayor'
  6.      : actual < 0
  7.        ? 'menor'
  8.        : 'igual'
  9.    ] += porcentaje,
  10.   total),
  11.  { mayor: 0, menor: 0, igual: 0});
  12. };


Título: Re: [Aporte] javascript - Proporción de números
Publicado por: TickTack en 14 Enero 2021, 09:30 am
Entonces tu console.log está haciendo algo diferente a los demás. Por lo general console.log imprime la estructura del objeto no su valor primitivo.

No es solamente el console.log, también la función alert me larga lo mismo.

Yo uso Chrome. Supongo que vos usas Firefox.


Título: Re: [Aporte] javascript - Proporción de números
Publicado por: #!drvy en 14 Enero 2021, 10:38 am
Citar
No es solamente el console.log, también la función alert me larga lo mismo.

El alert no tiene capacidad de mostrar estructuras. Solo puede mostrar valores convertibles a string. El console log en Chrome si deberia funcionar sin ningun problema, a mi me funciona bien. Ten en cuenta que no puedes concatenar cosas a la respuesta de un objeto. Por ejemplo esto no seria valido:

Código
  1. console.log('resultado: ' + proporcion(-5, 5));

Saludos