Skocz do zawartości

Wprawka.


Toster

Polecane posty

Tak mnie naszło z nienacka, piszę już któryś raz z kolei prockę która jest dosyć prosta i za każdym razem mam dylemat jak ją napisać :P Jak się komuś będzie nudziło to niech sobie rozwiąże takie proste zagadnienie:

Zakładamy dla uproszczenia że mamy tablicę 6 elementową typu float/real. W tej tablicy mamy jakieś tam wartości >=0.

Napisać funkcję która przyjmuje na wejściu wartość x, a powinna zwrócić wartość y taką że jest

przy obliczaniu y należy równomiernie pomniejszyć wszystkie komórki tablicy, i zwrócić sumę. Może przykład

tablica A=[2,2,1,4,4]

 

Wywołanie foo(6)

return 6

A po wywołaniu [1, 1, 0, 3, 3]

 

drugie wywolanie foo(6)

return 6

A po wywołaniu [0, 0, 0, 1, 1]

 

trzecie wywolanie foo(6)

return 2

A po wywołaniu [0, 0, 0, 0, 0]

 

prawda że proste ? :>

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Czy takie wywołanie jest poprawne gdy elementy tablicy dzielone są przez np. 2? Nie kapuję tego pomniejszania.

 

tablica A=[2,2,1,4,4]

 

Wywołanie foo(6)

return 6

A po wywołaniu [1, 1, 0.5, 2, 2]

 

Wywołanie foo(6)

return 6

A po wywołaniu [0.5, 0.5, 0.25, 1, 1]

 

Wywołanie foo(6)

return 3.25

A po wywołaniu [0.25, 0.25, 0.125, 0.5, 0.5]

 

...

Link do komentarza
Udostępnij na innych stronach

chodzi aby równomiernie pomniejszać wartości po całej "szerokości" tablicy. Czyli jak masz

[2, 2, 1, 4, 4] i chcesz ściągnąć z tego 6 to defacto powinieneś z każdego ściągnąć 1/6 wartości. czyli 6 * 1/6 = 1

obniżasz ze wszystkich o 1

 

teraz idąc dalej masz [1, 1, 0, 3, 3] chcesz znowu ściągnąć 6, i tutaj już jest kilka wariantów.

bo w tablicy masz tylko 5 wartości > 0, czyli powinieneś ściągnąć 6 * 1/5 = 1,2 ale dwa pierwsze pola mają tylko 1

czyli po wykonaniu operacji tablica będzie mieć [0, 0, 0, 1.8, 1.8] tylko że zamiast 6 zebrałeś (1 + 1 + 1.2 + 1.2) = 4.4 no i brakuje ci 1.6, a te 1.6 jest dostępne ciągle więc wychodzi że musisz ściągnąć jeszcze 1.6 z 2 elementów czyli po 0.8. Sumarycznie na wyniku będzie więc [0, 0, 0, 1, 1]

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Nie wiem czy o to chodzi?

 

t[n]:= t[n]-t[n]*x/suma elementów;

 

Tablica[2,2,1,4,4]

 

Wywołanie foo(6)

return 6

Tablica[1.08, 1.08, 0.54, 2.15, 2.15]

 

Wywołanie foo(6)

return 6

Tablica[0.15, 0.15, 0.08, 0.31, 0.31]

 

Wywołanie foo(6)

return 6

Tablica[-0.75, -0.75, -0.4, -1.55, -1.55] // Ten wzór się nie sprawdza jeśli x > sumy elementów (potrzebny dodatkowy warunek)

 

Edit: Mój błąd, miało być równomiernie a wyszło proporcjonalnie :P

 

Edit2: Toster wyżej napisałeś chyba jedyne rozwiązanie t[n]:= t[n]-x(1/IlośćElementów>0) i resztę rozdzielać na pozostałe elementy>0 dopóki x=y, lub suma elementów:= 0}, każde inne rozwiązanie nie będzie chyba równomiernie odejmować.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...