• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sposób na "odwrócenie" liczb.

Fiszki IT
Fiszki IT
0 głosów
140 wizyt
pytanie zadane 14 marca 2020 w Matematyka, fizyka, logika przez Bartx Bywalec (2,100 p.)
edycja 14 marca 2020 przez Bartx
Potrzebuję sposobu na odwrócenie liczb (nie wiem jak to nazwać):

Mam dwie liczby graniczne, maksymalną: 270 i minimalną: 50 oraz ciąg liczb: 10, 11, 15, 17, 20, 21, 22, 23, 24, 26.

Liczba 10 powinna zamienić się w liczbę 270, a liczba 26 w liczbę 50, reszta liczb w ciagu tak samo. Potrzebuję wzoru który by to odwrócił. Chcę to wykorzystać w JavaScripcie.
komentarz 14 marca 2020 przez tkz Nałogowiec (39,540 p.)
Normalizacja?
komentarz 14 marca 2020 przez Bartx Bywalec (2,100 p.)

Nie mam pojęcia surprise

2 odpowiedzi

+2 głosów
odpowiedź 14 marca 2020 przez Benek Szeryf (87,050 p.)
wybrane 14 marca 2020 przez Bartx
 
Najlepsza

Co prawda w Pythonie, ale algorytm jest uniwersalny:

seq = [10, 11, 15, 17, 20, 21, 22, 23, 24, 26]
beg = 270
end = 50

def convert(seq, beg, end):
    step = (beg - end)/(seq[-1] - seq[0])
    return [beg - step*i for i in [i-seq[0] for i in seq]]

Wynikiem jest:

[270.0, 256.25, 201.25, 173.75, 132.5, 118.75, 105.0, 91.25, 77.5, 50.0]

 

komentarz 14 marca 2020 przez Bartx Bywalec (2,100 p.)
Dzięki, a mógłbyś to trochę wytłumaczyć, bo python jest dla mnie niezrozumiały?
komentarz 14 marca 2020 przez Benek Szeryf (87,050 p.)

1. Funkcja convert przyjmuje 3 argumenty: ciąg liczb, wartość początkową przekonwertowanego ciągu, wartość końcową przekonwertowanego ciągu.

2. Najpierw obliczany jest krok dla przekonwertowanego ciągu. Stanowi on iloraz zakresu przekonwertowanego ciągu (270 - 50 = 220) podzielonego przez krok ciągu wejściowego (26 - 10 = 16). Czyli 220/16 = 13.75. Innymi słowy nowy ciąg zmienia się z krokiem co 1, a nowy co 13.75. Czyli zmiana o 1 w ciągu wejściowym odpowiada zmianie o 13.75 w ciągu przekonwertowanym.

3. Jeśli początkowa wartość byłaby 50, a końcowa 270, to krok byłby równy -13.75.

4. W returnie iterujesz po liście, która zawiera różnice między każdym elementem a pierwszym elementem wejściowego ciągu. To jest ten fragment:

[i-seq[0] for i in seq]

Robimy tak, bo znamy początkową wartość przekonwertowanego ciągu (jest nią 270). Znamy również krok 13.75. Ponieważ interesują nas zmiany sąsiednich elementów ciągu wejściowego, dlatego musimy używać ciągu różnicowego, a nie pierwotnego. Innymi słowy powyższy fragment kodu tworzy tymczasowy ciąg wejściowy, zawierający różnice.

5. Znając różnice (indeks i) przemnażamy je przez krok ciągu przekonwertowanego 13.75 i odejmujemy od wartości początkowej (270).

komentarz 14 marca 2020 przez Bartx Bywalec (2,100 p.)
Ok, rozumiem, a co jeśli ciąg nie zaczynałby się od najniższej liczby i nie kończył się najwyższą, czyli np. [11, 10, 20, 17, 15, 21, 22, 23, 26, 24]? Wydaje mi się, że pozostaje tylko znalezienie wartości index dla najwyższej i najniższej wartości, czy może jest prostszy sposób?
komentarz 14 marca 2020 przez Benek Szeryf (87,050 p.)

W zasadzie należałoby dokonać drobnych zmian. Zamiast zakładać, że wartość minimalna jest pod pierwszym elementem wejściowego ciągu i wartość maksymalna jest pod ostatnim elementem ciągu, można je policzyć samodzielnie:

def convert(seq, beg, end): 
    step = (beg - end)/(max(seq) - min(seq)) 
    return [beg - step*i for i in [i-min(seq) for i in seq]]

Wynikiem jest:

[256.25, 270.0, 132.5, 173.75, 201.25, 118.75, 105.0, 91.25, 50.0, 77.5]

A zachowane proporcje zawdzięczamy temu, że w return iterowaliśmy po różnicach i skalowaliśmy nimi poszczególne wartości w każdej iteracji.

Innymi słowy, tak, masz rację.

0 głosów
odpowiedź 14 marca 2020 przez Paweł Nąckiewicz Nałogowiec (48,870 p.)
Ten ciąg znaków to jakaś tablica? Jeśli tak to wstaw na pierwszy element tablicy liczbę 270 i na ostatni 50.
komentarz 14 marca 2020 przez Bartx Bywalec (2,100 p.)
Tak to jest tablica. Jeśli zmienię pierwszą i ostatnią wartość to te środkowe zostaną takie jakie były, a to mi nic nie da.
komentarz 14 marca 2020 przez Paweł Nąckiewicz Nałogowiec (48,870 p.)
a jakie wartości maja mieć te środkowe?
komentarz 14 marca 2020 przez Bartx Bywalec (2,100 p.)
Proporcjonalne do zmian z początku i z tyłu ciągu. Przykładowo, myślę, że 18 w ciągu powinno przybrać wartość 110.
komentarz 14 marca 2020 przez Paweł Nąckiewicz Nałogowiec (48,870 p.)
nie rozumiem... Mógłbyś proszę dokładnie opisać jak to ma się zmieniać index po indexie?
komentarz 14 marca 2020 przez tkz Nałogowiec (39,540 p.)

Normalizacja danych, pisałem w komentarzu. Samo pytanie jest bardzo niejasne, ale po tym, że mają być proporcjonalne, wychodzi na to, że jest to, powiązane z statystyką.

https://stackoverflow.com/questions/38705953/normalizing-data-using-javascript

Podobne pytania

0 głosów
1 odpowiedź 90 wizyt
0 głosów
1 odpowiedź 106 wizyt
pytanie zadane 2 grudnia 2018 w Matematyka, fizyka, logika przez Absum Bywalec (2,640 p.)
+1 głos
2 odpowiedzi 793 wizyt
pytanie zadane 8 grudnia 2016 w Matematyka, fizyka, logika przez DamianW Bywalec (2,070 p.)
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

84,746 zapytań

133,553 odpowiedzi

295,968 komentarzy

56,007 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...