Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak obliczyć medianę
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Malinaa
Jak obliczyć medianę w JavaScript?
Jest takie zadanie:
https://dbm.org.pl/__TESTY/test-1.htm
Kto wie jak się to robi w JS i dla przykładu wyznaczy medianę wydatków,
o co chodzi z food, fuel w expenses?
nospor
Chyba juz jestem za stary na te testy rekrutacyjne, ale nie kumam jak sie tresc zadania ma do przykladowych danych . starosc nie radosc
Malinaa
Ach faktycznie już wiem, dlaczego też nie kumam jak się treść zadania ma do przykładowych danych.
No, ale można spojrzeć na zadanie, że jego skumanie jest odmładzające...
nospor
edit: no ale dobra, przyklad podali chujowy ale w sumie co za roznica

Tu masz jak pobrac pierwsza niedziele miesiaca

https://stackoverflow.com/questions/4018879...t-sunday-in-apr

no to majac miesiace okreslasz dla nich pierwsza niedziele miesiaca, potem dla kazdego miesiaca lecisz po dniach z expenses i jesli dzien jest mniejszy lub rowny pierwszej niedzieli to do tablicy zbiorczej dla miesiaca wrzucasz wszystkie wydatki. z tresci zadania nie wynika ze mediana ma byc podzielona na typy wydatkow wiec wrzucasz wszystkei wydatki do jednego wora, czy to paliwo czy to jedzenie czy cokolwiek innego to leci do jednego twojego wora wydatkow.

Majac wor wydatkow dla miesiaca, to wyliczasz dla niego mediane. Mediana zakladam wiesz co to jest?

No i tyle smile.gif

edit: w sumie mala poprawka. nie liczysz mediany dla kazdego miesiaca, tylko jedna mediane z wydatkow do pierwszej niedzieli kazdego miesiaca. Ech, czytanie tresci zadania ze zrozumenie sie klania dla mnie ;D
Malinaa
Ładnie i szybko się odmłodziłeś smile.gif
Wygląda, że w JS zajmie mi to więcej czasu i pewnie cały dzień będę się odmładzał, albo po prostu pójdę na basen.

Podany link jest trefny, sprawdzałem godzinę temu dla różnych dat i oszukuje.
Mediana to taka średnia, a dokładnie jak wyliczyć też nie ma problemu, bo informacja jest ogólnie dostępna.

Dzięki za info.

Ups. Oszukuje to co poniżej, po dodaniu
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.15.1/moment.min.js"></script>
pierwsze rozwiązanie sprawdzam ponownie i działa na 100% Ok. Thanks.
nospor
Cytat
Podany link jest trefny, sprawdzałem godzinę temu dla różnych dat i oszukuje.

Podany tam przyklad

function firstSunday(month, year) {
let tempDate = new Date();
tempDate.setHours(0,0,0,0);
// first SUNDAY of april
tempDate.setMonth(month);
tempDate.setYear(year);
tempDate.setDate(1);

let day = tempDate.getDay();
let toNextSun = day !== 0 ? 7 - day : 0;
tempDate.setDate(tempDate.getDate() + toNextSun);

return tempDate.toDateString();
}

jest jak najbardziej ok, musisz tylko pamietac ze miesiace w js liczy sie od zera, jak chcesz pazdziernik to masz wywolywac to tak

firstSunday(9, 2023)

a jak wrzesien to tak
firstSunday(8, 2023)

a jak styczen to tak
firstSunday(0, 2023)

Tak wiem, pojebane wink.gif


Cytat
Wygląda, że w JS zajmie mi to więcej czasu i pewnie cały dzień będę się odmładzał, albo po prostu pójdę na basen.

no tak szczewrze powiedziawszy to jest jedno z tych zadan na jedna godzine.
Malinaa
Jak się nauczę szybko odmładzać to zrobię w godzinę.
nospor
biggrin.gif
Malinaa
Zadanie wgląda tak:
https://dbm.org.pl/__TESTY/zadanie-1.htm
ale była jeszcze informacja o testach automatycznych.
Jak przetestować taki kod, aby przeszedł testy automatyczne?
nospor
oni poprostu maja zestaw danych wejsciowych i wyjsciowych i po przepuszczeniu przez twoja funkcje, mechanizm testow sprawdza czy wszystkie wyjscia sie zgadzaja dla danych wejsc.
Oni ci podali schemat jak mniej wiecej struktura kodu powinna wygladac bo im latwiej taka struktrure testowac. No ale ty zrobiles po swojemu smile.gif
Malinaa
No tak do pice (po naszemu ja pierdole), stary a głupi jak młody, albo uparty jak osioł, no nie wiem...
Jak to samo zrobić nie po swojemu, a po ichniejszemu?
nospor
no oni podalo ci kod js jak to ma wygladac. podali ci funkcje ktora ma przyjac te expenses i zwrocic mediane.

No w srodek tej funkcje wloz swoj kod js i juz. Tak, w js mozna deklarowac funkcje w funkcji

czyli mniej wiecej tak to mogloby byc,


Kod
function ICHFUNKCJA(expenses) { //sorki, nie pamietam jak oni to nazwali a ty skasowales zrodlo


    function getFirstSunday(year, month) {
            let firstDay = new Date(year, month - 1, 1);
            let firstSunday = new Date(firstDay);
            
            firstSunday.setDate(firstDay.getDate() + (7 - firstDay.getDay()) % 7);
            
            return firstSunday;
        }
        
        function calculateMedian(amount) {
            if (amount.length === 0) return null;
            
            amount.sort((a, b) => a - b);
            
            const middle = Math.floor(amount.length / 2);
            
            return amount.length % 2 !== 0 ? amount[middle] : (amount[middle - 1] + amount[middle]) / 2;
        }
        
            let allExpenses = [];
            
            for (let expense in expenses) {
                let [year, month] = expense.split('-').map(Number);
                let firstSunday = getFirstSunday(year, month);
                
                for (let day in expenses[expense]) {
                    let currentDate = new Date(year, month - 1, Number(day));
                    
                    if (currentDate <= firstSunday) {
                        for (let category in expenses[expense][day]) {
                            allExpenses.push(...expenses[expense][day][category]);
                        }
                    }
                }
            }
        
            return calculateMedian(allExpenses);
        
}
Malinaa
Funkcja w funkcji - nie wiedziałem, ale kiedy po tym kodzie dam:

console.log(solution(expenses)); // nazwali to solution(expenses)

to w wersji poprzedniej jak i poprawionej w konsoli wyświetli się to samo = wynik,
więc nadal nie kumam, dlaczego musi być funkcja w funkcji.

I jeżeli chcą, aby podać wynik i przesłać plik (do testu) to ten plik, czy może być z HTML'em nazwa_pliku.html
czy musi być np. nazwa_pliku.js tak, aby przeszło (przesłany plik przeszedł) test automatyczny?
nospor
no a po co tam html? Ma to byc plik .js z takim kodem

Kod
    function getFirstSunday(year, month) {
            let firstDay = new Date(year, month - 1, 1);
            let firstSunday = new Date(firstDay);
            
            firstSunday.setDate(firstDay.getDate() + (7 - firstDay.getDay()) % 7);
            
            return firstSunday;
        }

        function calculateMedian(amount) {
            if (amount.length === 0) return null;
            
            amount.sort((a, b) => a - b);
            
            const middle = Math.floor(amount.length / 2);
            
            return amount.length % 2 !== 0 ? amount[middle] : (amount[middle - 1] + amount[middle]) / 2;
        }


function solution(expenses) {


        
        
            let allExpenses = [];
            
            for (let expense in expenses) {
                let [year, month] = expense.split('-').map(Number);
                let firstSunday = getFirstSunday(year, month);
                
                for (let day in expenses[expense]) {
                    let currentDate = new Date(year, month - 1, Number(day));
                    
                    if (currentDate <= firstSunday) {
                        for (let category in expenses[expense][day]) {
                            allExpenses.push(...expenses[expense][day][category]);
                        }
                    }
                }
            }
        
            return calculateMedian(allExpenses);
        
}

Tam html do niczego nikomu nie jest potrzebny

Cytat
to w wersji poprzedniej jak i poprawionej w konsoli wyświetli się to samo = wynik,

No to chyba dobrze ze to samo sie wyswietla co nie? wink.gif

Cytat
więc nadal nie kumam, dlaczego musi być funkcja w funkcji.

No bo oni podali ci pseudokod jak ma wygladac ktory nie uwzglenial dodatkowych funkcji poza funkcja glowna. No to napisalem bys wrzucil funkcje do tej glownej. No ale jak widzisz wyzej wyrzucilem je po za. Zadowolony? smile.gif
Malinaa
Ah przepadło, stoper był włączony i czas mnie gonił, więc wysłałem jak było w pliku html

Cytat
No to chyba dobrze ze to samo sie wyswietla co nie?


A pewnie, że dobrze. Powstało jednak pytanie jeżeli jest dobrze, po co poprawiać na dobrze funkcja w funkcji.
No, ale teraz kumam (chociaż nie zostało to jasno określone), że ze względu na podany pseudokod funkcja w funkcji jest mega dobrze
i najlepiej nie wyrzucać funkcji pomocniczych poza główną, a będziesz Pan zadowolony, co nawiasem mówiąc brzmi jako tako.
Z powodów powyższych poza napadem niekontrolowanego śmiechu wink.gif czuje się nowym człowiekiem, oświecony... smile.gif Thanks

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.