Forum ŚFiNiA Strona Główna Ś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.
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Porządki w marketach

 
Napisz nowy temat   Odpowiedz do tematu    Forum ŚFiNiA Strona Główna -> Rozbieranie irracjonalizmu
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Andy72




Dołączył: 30 Sie 2010
Posty: 5914
Przeczytał: 80 tematów


Płeć: Mężczyzna

PostWysł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 profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Andy72




Dołączył: 30 Sie 2010
Posty: 5914
Przeczytał: 80 tematów


Płeć: Mężczyzna

PostWysł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
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum ŚFiNiA Strona Główna -> Rozbieranie irracjonalizmu Wszystkie czasy w strefie CET (Europa)
Strona 1 z 1

 
Skocz do:  
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
Regulamin