Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

101
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda