
Zadanie
Pierwszym rozruchowym zadaniem jest znalezienie mediany dla liczb zmiennoprzecinkowych. 😉
Czym jest mediana
Szybkie przypomnienie czym jest mediana.
Jest to wartość średniej arytmetycznej dwóch środkowych elementów zbioru uporządkowanego, w przypadku, gdy zbiór ma liczbę elementów nieparzystą to wtedy wybieramy element środkowy.
Przykład
1. Mając zbiór:
1, 4, 6, 9
To mediana jest równa: (4 + 6)/ 2 = 5
2. Mając zbiór z nieparzystą ilością elementów;
1, 4, 10
To mediana jest równa 4.
Punktacja
Za to zadanie można otrzymać maksymalnie 150 expa.
Przygotowanych jest pięć testów, za każdy zdany test otrzymasz 30 expa.
Termin
Zadanie zostało opublikowane 5 listopada 2018 roku, rozwiązania można przesyłać do 7 listopada 2018 roku do godziny 23:59. Zadania wysłane później będą automatycznie usuwane.
Format
Zadanie należy wysłać na email: njd@1024kb.pl z tematem: TWÓJ-NICK_MDN.
Wystarczy wysłać w załączniku tylko plik również o nazwie TWÓJ-NICK_MDN.java, którego szablon możesz pobrać stąd.
Rozwiązanie
Zróbmy małe podsumowanie zadania: rozwiązanie przesłało 18 osób, niestety to jest tylko ~30% – choć duże prawdopodobieństwo, że osoby później zapisane nie wiedziały o pierwszym zadaniu. Zobaczymy jak będzie z kolejnymi.
Moje przykładowe rozwiązania zadania wygląda tak:
import java.util.Arrays; public class Median { static void sort(float [] numbers) { for(int i=0;i<numbers.length;i++) { for(int j=1;j<numbers.length;j++) { if (numbers[j-1] > numbers[j]) { final float temp = numbers[j-1]; numbers[j-1] = numbers[j]; numbers[j] = temp; } } } } public static float median(float [] numbers) { final int size = numbers.length; if (size == 0) { throw new IllegalArgumentException("You have to type any numbers."); } // opcjonalnie - użycie własnego algorytmu sortowanie // preferowane użycie wbudowanych metod, których złożoność obliczeniowa jest mniejsza //sort(numbers); Arrays.sort(numbers); return size % 2 == 0 ? (numbers[(size-1)/2] + numbers[size/2]) / 2.0f : numbers[size/2]; } public static void main(String[] args) { float median = median(new float[]{1.0f, 3.0f, 2.0f, 1.0f}); System.out.println("Mediana: " + median); } }
Na początku sprawdzam, czy aby na pewno tablica ma liczby – podałem to jako przykład, że warto pamiętać o sprawdzaniu takiego przypadku w kolejnych zadaniach. W tym zadaniu nie brałem tego pod uwagę, ze względu, że nie powiedziałem o tym w treści zadania.
Za każdy zdany test gracz otrzymał 30 expa, testy wyglądały tak:
import org.junit.Assert; import org.junit.Test; import pl.maniaq.Median; public class TestMedian { @Test public void firstMedianTest() { //is float numbers[] = {-2.1f, -.7f, 1.5f, .0f,136.5f, 4.0f, .3f, 800.3f}; //when float result = Median.median(numbers); //expected Assert.assertEquals(.15f, result, 0); } @Test public void secondMedianTest() { //is float numbers[] = {100.001f, 102.03f, -23.4f, -17.8f, 400.0f}; //when float result = Median.median(numbers); //expected Assert.assertEquals(100.001f, result, 0); } @Test public void thirdMedianTest() { //is float numbers[] = {-2004.5f, 0.0001f, -0.001f, -14894.1f}; //when float result = Median.median(numbers); //expected Assert.assertEquals(-1002.2505f, result, 0); } @Test public void fourthMedianTest() { //is float numbers[] = {.0f, -483.5f}; //when float result = Median.median(numbers); //expected Assert.assertEquals(-241.75f, result, 0); } @Test public void fifthMedianTest() { //is float numbers[] = {0.7f}; //when float result = Median.median(numbers); //expected Assert.assertEquals(.7f, result, 0); } }
Kilku osobom nie przeszły wszystkie testy, warto uruchomić swój algorytm dla tych danych wejściowych i zobaczyć jak zachowuje się Wasz program. Według mnie najważniejszą częścią zadania jest wyciąganie wniosków. 😉
Uczulam na to, aby pliki były podawane w załączniku w ustalonym formacie tj. z odpowiednią nazwą! Usprawnia to proces sprawdzania i pozwala na uniknięcie pomyłki przy wpisywaniu wyniku.
Proszę, wpisuje swój nick, który podaliście podczas rejestracji na https://njd.1024kb.pl.
Kolejne zadanie pojawi się już 9 listopada.
Gratuluję wszystkim podjęcia zadania i życzę powodzenia w kolejnym! 😉