RGB renk kodlarını Heksadesimal'e çevirmek (Bir CodeWars Sorusu) )

Merhaba, iyi geceler öncelikle
işin içinden çıkamadığım için sizlere danışmak istiyorum.

Kodum:

def rgb(r,g,b) -> int:
    l = [0,1,2,3,4,5,6,7,8,9,"A","B","C","D","E","F"]
    sonucR,sonucG,sonucB = r//16,g//16,b//16
    if not sonucR < 16:
        sonucR= int(sonucR/16)
    elif not sonucG < 16:
        sonucG = int(sonucG/16)
    elif not sonucB < 16:
        sonucB = int(sonucB/16)
    else:
        return f"{l[sonucR]}{l[r%16]}{l[sonucG]}{l[g%16]}{l[sonucB]}{l[b%16]}"

Evet herşey on numara devam ediyorum.


Testlerde g parametresine 275 yazınca yani 255ten büyük herhangi bir tam sayı yazınca benim yazdığım fonksiyona göre None değeri döndürüyor. Bunun dışında bütün testlerden geçiyor fakat en sondakinde dediğim gibi çakılıyor. Nasıl bir düzetlme gerekli. Yardımcı olursanız çok mutlu olurum. Teşekkür Ederim

1 Beğeni

Kod neden for loop’u icinde??

if…elif…elif…else return de ilginc olmus. sonucR/G/B'yi ya degistiriyoruz ya da return ediyoruz?

Testleri yazmadigin icin deneyemedim ama zaten yukaridaki sorunlarin cozulmesi gerekiyor.

1 Beğeni

evet neden döngü içine almışım ki :slight_smile: hocam dün gece öyle bi beyin fırtınası yaparken fırtınada sürüklenmişim sanırım ondandır o.
şöyle bırakayım codewarsın test etttiği değerleri yazınca hepsi sırasıyla doğru çıkıyor soruda belirttiğim gibi sonuncusuna gelince None diyip kalıyor.

print(rgb(0,0,0)) # 000000 
print(rgb(1,2,3)) # 010203
print(rgb(255,255,255)) # FFFFFF
print(rgb(254,253,252)) # FEFDFC
print(rgb(-20,275,125)) # None 'olması gereken 00FF7D'

hocam returnda şunu döndürüyoruz desimalden heksadesimale çevirirken sayıyı her defasında 16 ya bölüyoruz ardından bölüm, 16 dan küçük olursa durup bölümden başlayıp önceki yaptığımız işlemin kalan sonucuna kadar sırayla yazıyoruz. Yani şöyle:
image
yani returnde bu işlemi döndürüyorum.

for döngüsünden çıkartıp yazımı(konumu) güncelliyorum

if'lerden biri calisirsa fonksiyon None donduruyor, cunku return sadece else'de.

Bi de kodun nasil calistigina bak, dogru cevap donen hic bir durumda if'ler calismiyor zaten.

Sana bir de ipucu vereyim: Uc parametreyi de birbirinden bagimsiz islemen lazim. Biri icin yaptigini digerlerine de yapman lazim, birbirlerine alternatif olarak degil.

Ikinci ipucu: Bir fonksiyon yazip uc kere cagirman lazim.

1 Beğeni

Bu arada rgb = lambda r, g, b: (lambda hex2: hex2(r) + hex2(g) + hex2(b))(lambda byte: (lambda bounded: (lambda hex1: hex1(bounded // 16) + hex1(bounded % 16))(lambda v: "0123456789ABCDEF"[v]))(max(0, min(255, byte))))

1 Beğeni

Anladığım kadarıyla 0’dan küçük olanları 0 olarak kabul edip ‘00’ olarak belirtmelisin, 255’ten büyük olanları da 255 olarak kabul edip ‘FF’ olarak belirtmelisin.
@aib hocamızın da dediği gibi fonksiyon içerisinde başka bir fonksiyon belirtip, bu üç RGB değeri için ayrı ayrı return alabilirsin.

Spoiler
def rgb(r, g, b):
    l = list("0123456789ABCDEF")
    def convert(value):
        # 255 < 16*16 olduğuna göre, bölme işlemini bir kez yapmamız yeterli olacaktır.
        if value < 0:
            value = 0
        elif value > 255:
            value = 255

        bolum, kalan = value // 16, value % 16
        return f"{l[bolum]}{l[kalan]}"

    hex = convert(r) + convert(g) + convert(b)

    return hex
print(rgb(0,0,0))
print(rgb(1,2,3))
print(rgb(255,255,255))
print(rgb(254,253,252))
print(rgb(-20,275,125))
000000
010203
FFFFFF
FEFDFC
00FF7D
1 Beğeni
def command(renk):
    if renk > 255:
        renk = 255
    elif renk < 0:
        renk = 0
    renk = hex(renk)[2:].upper()
    if len(renk) <2:
        renk = "0"+renk
    return renk,len(renk)

def rgb(r, g, b):
    return command(r)+command(g)+command(b)

Kodu şöyle bırakıyorum

dün gece yazdığıma benzer bir fonksiyon yazmıştım cevaba yaklaştığımı da gördüm fakat hex(b)[2:] yerine hex(b).replace("0x","") yapıyordum. Bir türlü gelmemişti aklıma nasıl çözebileceğime dair bir fikir. Sanırım basit düşünmem gerekiyor.
neyse… Zamanla çöze çöze yapabileceğimi düşünüyorum. Birde kendimde şunu fark ettim verdiği fonksiyona bağımlı kalıyorum sanki onun dışında yapacağım bir şey yanlışmış gibi geliyor bunu da yine zamanla aşacağımı düşünüyüm ve sizlere teşekkür ediyorum @aib ve @Gok_Mavisi_Anka

1 Beğeni