|
ŚFiNiA ŚFiNiA - Światopoglądowe, Filozoficzne, Naukowe i Artystyczne forum - bez cenzury, regulamin promuje racjonalną i rzeczową dyskusję i ułatwia ucinanie demagogii. Forum założone przez Wuja Zbója.
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Andy72
Dołączył: 30 Sie 2010
Posty: 6618
Przeczytał: 2 tematy
Płeć: Mężczyzna
|
Wysłany: Śro 18:24, 12 Lip 2023 Temat postu: Porządki w marketach |
|
|
Przykład, że chatGPT dobrze sobie radzi jako programista, przynajmniej junior, od razu podając wynik, nad czym człowiek trochę by się zastanawiał:
W marketach jest częsta praktyka manipulacji ceną polegająca na tym, że podaje się cenę tylko o grosz lub kilka mniejszą od jakiejś równej ceny. Np 0,99 sprawia wrażenie że jeszcze nie jest jeden złoty, a prawie jest, 1,99 wrażenie że 1 z kawałkiem a niemal 2, 6.99 to niemal 7. 6,95 zł to ta praktyka w o wiele mniejszym stopniu. Napisz algorytm – funkcję, która na wejściu ma podaną cenę a na wyjściu liczbę, która minimalnie może być równa zeru, jest bardzo mała dla równych cen a duża dla cen, które minimalnie są mniejsze od pewnych równych cen. Aby ustawodawca mógł zdecydować czy cena jest jeszcze w normie czy nie wołając tę funkcję dla ceny.
Twoje pytanie prosi o algorytm, który ocenia cenę pod kątem wykorzystania taktyki psychologicznej znanej jako "cena kończąca się na 99". Poniżej znajduje się przykładowy algorytm napisany w Pythonie, który wykonuje taką ocenę.
Algorytm ten najpierw zaokrągla cenę do najbliższej liczby całkowitej. Następnie oblicza różnicę między oryginalną ceną a zaokrągloną ceną. Wreszcie, zwraca tę różnicę podniesioną do kwadratu, co sprawia, że małe różnice (tj. ceny kończące się na ,99) będą miały dużą wartość wyjściową, podczas gdy ceny równe liczbom całkowitym będą miały wartość wyjściową równą zero.
Kod: | def evaluate_price(price):
rounded_price = round(price)
difference = price - rounded_price
score = difference ** 2
return score
|
Ta funkcja zwraca wartość między 0 (dla cen równych liczbom całkowitym) a 1 (dla cen kończących się na ,99). W praktyce, ustawodawca mógłby ustalić pewien próg (na przykład 0,5) powyżej którego cena jest uznawana za manipulacyjną.
Warto jednak zauważyć, że ta funkcja jest bardzo prostym podejściem i może nie być odpowiednia dla wszystkich przypadków. Różne kraje mogą mieć różne zasady dotyczące cen i konieczne może być dostosowanie tego algorytmu do specyficznych potrzeb i przepisów prawnych.
jeszcze zaokrąglanie powinno zaokrąglać bardzo małe ceny typu 0.09 do 0.1 a nie 0 , natomiast duże np. 699 do 700 a nie 699; czy da się zrobić zaokrąglanie adaptacyjne, nie zawsze do jednostki, ale będzie zależała ta jednostka od wielkości, np, 10-80 - do dziesiątek, ponad 90 do 800 do setek itd
Zastosowanie adaptacyjnego zaokrąglania jest oczywiście możliwe. Wymaga to nieco bardziej skomplikowanego podejścia, które uwzględnia wielkość liczby, której dotyczy zaokrąglanie.
Poniżej znajduje się funkcja w Pythonie, która implementuje takie adaptacyjne zaokrąglanie:
Kod: | def adaptive_round(price):
if price < 1:
return round(price, 1) # Zaokrąglanie do najbliższej dziesiątej
elif price < 10:
return round(price) # Zaokrąglanie do najbliższej jednostki
elif price < 100:
return round(price, -1) # Zaokrąglanie do najbliższej dziesiątki
else:
return round(price, -2) # Zaokrąglanie do najbliższej setki
def evaluate_price(price):
rounded_price = adaptive_round(price)
difference = price - rounded_price
score = difference ** 2
return score
|
Funkcja adaptive_round wykorzystuje funkcję round z wbudowanej biblioteki Pythona i dostosowuje poziom zaokrąglania na podstawie wielkości ceny. W zależności od wielkości ceny, zaokrągla do najbliższej dziesiątej, jednostki, dziesiątki lub setki.
Następnie, ta adaptacyjna funkcja zaokrąglania jest używana w funkcji evaluate_price, która oblicza i zwraca wynik na podstawie różnicy między oryginalną ceną a zaokrągloną ceną.
Podaj funkcję dającą zaokrąglony logarytm
np. dla liczb 0.01 – 0.09 da -2
0.1 – 0.9 da -1
1 – 9 da 0
10 – 90 da 1
100 – 900 da 2
ale bez if czy instrukcji wyboru, za to z logarytmem i zaokrągleniem
Jeśli chcesz uzyskać zaokrąglony logarytm liczby, możesz użyć funkcji math.floor z biblioteki matematycznej Pythona w połączeniu z funkcją math.log10, która oblicza logarytm dziesiętny liczby. math.floor zaokrągla liczbę w dół do najbliższej liczby całkowitej.
Oto przykładowa funkcja w Pythonie, która robi to, o co pytasz:
Kod: |
import math
def rounded_log(number):
return math.floor(math.log10(number))
|
Dla liczb od 0.01 do 0.09, rounded_log zwróci -2. Dla liczb od 0.1 do 0.9 zwróci -1. Dla liczb od 1 do 9 zwróci 0, dla liczb od 10 do 90 zwróci 1, a dla liczb od 100 do 900 zwróci 2, co jest zgodne z Twoimi oczekiwaniami.
Proszę pamiętać, że math.log10 zwróci błąd dla liczb mniejszych lub równych 0. Dlatego powinieneś zapewnić, że liczba przekazana do rounded_log jest większa od 0.
|
|
Powrót do góry |
|
|
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Andy72
Dołączył: 30 Sie 2010
Posty: 6618
Przeczytał: 2 tematy
Płeć: Mężczyzna
|
Wysłany: Śro 18:36, 12 Lip 2023 Temat postu: |
|
|
Jednak potrzebuje pańskiego oka , które konia tuczy, by nie pójść w maliny:
User
zauważyłem duży błąd w 'score = difference ** 2', polega na tym, że gdy cena będzie 2.5 to score będzie 0.25, natomiast gdy cena będzie 2.99 to score będzie zaledwie 0.0001 , czyli odwrotnie niż chcemy, musimy mieć odwrotność (1/x) ale tylko dla cen nierównych
ChatGPT
Masz rację, dziękuję za zwrócenie uwagi na to. Aby uzyskać wyższe wartości "score" dla cen bliskich liczb całkowitych, ale nie równych im, powinniśmy rzeczywiście odwrócić wartość difference.
Jednakże, musimy też zabezpieczyć się przed dzieleniem przez zero. Aby to osiągnąć, możemy dodać małą stałą do mianownika, aby zapewnić, że nigdy nie będziemy dzielić przez zero, nawet jeśli różnica wynosi dokładnie zero.
Poniżej znajduje się poprawiona funkcja:
python
Kod: | import math
def adaptive_round(price):
if price < 1:
return round(price, 1)
elif price < 10:
return round(price)
elif price < 100:
return round(price, -1)
else:
return round(price, -2)
def evaluate_price(price):
rounded_price = adaptive_round(price)
difference = price - rounded_price
score = 1 / (abs(difference) + 0.0001) # dodajemy małą wartość do mianownika, aby zapobiec dzieleniu przez zero
return score
|
Teraz, dla cen bliskich, ale nie równych liczbom całkowitym, score będzie dużo większy, co jest zgodne z Twoimi oczekiwaniami. Dla cen równych liczbom całkowitym, score będzie bliski zero.
User
też złe, bo dla cen równych będzie duże score, powinno byc minimalne lub nawet zero, czyli trzeba zastosować if wraz z difference 'if deifference==0'
ChatGPT
Masz rację, przepraszam za pomyłkę. Możemy rzeczywiście dodać instrukcję warunkową sprawdzającą, czy difference wynosi 0. W tym przypadku możemy zwrócić 0, aby zasymulować najniższy możliwy "score". Oto poprawiona funkcja:
python
Kod: | import math
def adaptive_round(price):
if price < 1:
return round(price, 1)
elif price < 10:
return round(price)
elif price < 100:
return round(price, -1)
else:
return round(price, -2)
def evaluate_price(price):
rounded_price = adaptive_round(price)
difference = price - rounded_price
if difference == 0:
return 0
else:
score = 1 / abs(difference) # w przypadku różnicy różnej od zera, obliczamy odwrotność
return score
|
Teraz dla cen równych liczbom całkowitym, "score" wynosi 0, co jest zgodne z Twoimi oczekiwaniami. Dla cen bliskich, ale nie równych liczbom całkowitym, "score" będzie dużo większy. Dzięki zastosowaniu instrukcji warunkowej, unikamy problemu dzielenia przez zero.
|
|
Powrót do góry |
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach
|
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
|