Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

99
Vistas
problema de los días de semana más frecuentes en javascript

Haciendo la mejor investigación, no pude encontrar la respuesta en JavaScript, pero encontré esta solución que funciona perfectamente en python

 import datetime def most_frequent_days(year): days = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') most = sorted(list(set([datetime.date(year, 1, 1).weekday() ,datetime.date(year, 12, 31).weekday()]))) return [days[i] for i in most] print(most_frequent_days(212))

Ahora, tratando de convertir esto en JavaScript, necesita saber Python (sé cómo lidiar con Python), lo mejor que se me ocurre

 const mostFrequentDays = year => { function getDayOfWeek(date) { const dayOfWeek = new Date(date).getDay(); return isNaN(dayOfWeek) ? null : ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][dayOfWeek]; } //let days = [ 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday' ] let most = [getDayOfWeek(`${year}-1-1`), getDayOfWeek(`${year}-12-31`)].sort() let mySet = [...new Set(most)] //let sorted = mySet; let i = 0; let data = []; while (i < mySet.length) { data = [ ...data, mySet[i] ] i++; } return data; };

Ahora esto funciona en JS, sin embargo, cuando trato de usar la función que construí mostFrequentDays(212) no obtengo el resultado esperado

**Se le da un año como un número entero. Devuelve los días más frecuentes de la semana en ese año. La lista de días resultante debe clasificarse por el orden de los días de la semana a partir del lunes (p. ej., ['lunes', 'martes']). **

Pruebas

 it("should handle basic tests", () => { assert.deepEqual(mostFrequentDays(2427), ["Friday"]); assert.deepEqual(mostFrequentDays(2185), ["Saturday"]); assert.deepEqual(mostFrequentDays(1084), ["Tuesday", "Wednesday"]); assert.deepEqual(mostFrequentDays(1167), ["Sunday"]); assert.deepEqual(mostFrequentDays(1216), ["Friday", "Saturday"]); assert.deepEqual(mostFrequentDays(1492), ["Friday", "Saturday"]); assert.deepEqual(mostFrequentDays(1770), ["Monday"]); assert.deepEqual(mostFrequentDays(1785), ["Saturday"]); assert.deepEqual(mostFrequentDays(212), ["Wednesday", "Thursday"]); });

Muchos de ellos funcionan cuando convierto el código python a JS excepto el último porque la Fecha JS no funciona en el año 212

Ayúdenme a crear una función que pueda pasar todas las pruebas, hay muchas versiones de Python de la solución, pero la que usé es la más fácil, y en Python, ese código funciona porque DateTime en Python funciona en una fecha como 212. O tal vez si conoce una versión mejor que no sea originalmente de python, ¿cómo implementaría una solución para JS?

Gracias, mis mejores deseos.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Necesitas definir "no funciona".

Un año no bisiesto tiene 365 días, que son 52 semanas más un día. Entonces, cualquiera que sea el primer día del año, tendrá 53 ocurrencias y todos los demás tendrán 52. Entonces, el más frecuente es solo el día de la semana del 1 de enero.

Para un año bisiesto, el primer y segundo día tendrán 53 ocurrencias y los demás 52. Por ejemplo, el 1 de enero de 2018 fue lunes, al igual que el 31 de diciembre, por lo que hubo 53 lunes y 52 de los demás. El 1 de enero de 2020 fue miércoles y año bisiesto, el 31 de diciembre fue jueves, por lo que 53 miércoles y jueves y 52 del resto.

Por supuesto, un rango aleatorio de fechas hará la vida un poco más difícil.

Una función para implementar lo anterior es:

 function mostFrequentDaysOfYear(year = new Date().getFullYear()) { // 1 Jan let d = new Date(year, 0); // Weekday name for 1 Jan let mostFrequent = [d.toLocaleString('en',{weekday:'long'})]; let isLeap = new Date(year, 1, 29).getDate() == 29; // If leap year, add next day's name too if (isLeap) { d.setDate(d.getDate() + 1); mostFrequent.push(d.toLocaleString('en',{weekday:'long'})) } return mostFrequent; } // Examples [2018, 2020, 2022, 212].forEach(year => console.log( `${year}: ${mostFrequentDaysOfYear(year)}` ));

Otro algoritmo (que es lo que está haciendo el código PHP) es verificar si el 1 de enero y el 31 de diciembre son el mismo día. Si lo son, regresa ese día. Si no, devuélvelo los dos días.

La única clasificación que se requiere es cuando un año bisiesto comienza en domingo. La devolución predeterminada es [domingo, lunes], pero el requisito es [lunes, domingo] en ese caso particular.

Entonces, si el 1 de enero es domingo (día 0), invierta la lista de días, por ejemplo

 function mostFrequentDaysOfYear(year = new Date().getFullYear()) { let dayName = d => d.toLocaleString('en',{weekday:'long'}); // 1 Jan let d = new Date(year, 0, 1); let d0 = dayName(d); // 31 Dec let d1 = dayName(new Date(year, 11, 31)); let result = d0 == d1? [d0] : [d0, d1]; // If d0 is Sunday, reverse result return d.getDay()? result : result.reverse(); } [2427, // Friday 2185, // Saturday 1084, // Tuesday, Wednesday 1167, // Sunday 1216, // Friday, Saturday 1492, // Friday, Saturday 1770, // Monday 1785, // Saturday 2040, // Monday, Sunday - leap year starting on Sun 212 // Wednesday, Thursday ].forEach(year => console.log( `${year}: ${mostFrequentDaysOfYear(year)}` ));

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda