将Python代码转换为Kotlin

2024-04-29 19:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我找到了generate n distinct colors的代码。我拿了密码,然后用它上了一堂课

import colorsys
import itertools
from fractions import Fraction

class DistinctColorsGenerator:
    def __init__(self):
        self._bias = lambda x: (math.sqrt(x / 3) / Fraction(2, 3) + Fraction(1, 3)) / Fraction(6, 5)
        self._gen_rgb = lambda x : colorsys.hsv_to_rgb(*x)
        self._flatten = itertools.chain.from_iterable
        self._hsvs = lambda: self._flatten(map(self._hsv, self._fracs()))
        self._rgbs = lambda: map(self._gen_rgb, self._hsvs())
        self._gen_colors = lambda: map(self._gen_color, self._rgbs())

    def generate(self, number):
        return list(itertools.islice(self._gen_colors(), number))

    def _zenos_dichotomy(self):
        for k in itertools.count():
            yield Fraction(1, 2 ** k)

    def _fracs(self):
        yield 0
        for k in self._zenos_dichotomy():
            i = k.denominator
            for j in range(1, i, 2):
                yield Fraction(j, i)

    def _hsv(self, h):
        for s in [Fraction(6, 10)]:
            for v in [Fraction(8, 10), Fraction(5, 10)]:
                yield (h, s, v)

    def _gen_color(self, x):
        uint8tuple = map(lambda y: int(y * 255), x)
        return list(uint8tuple)

我想把它转换成Kotlin,问题是我大部分的Kotlin经验(以及Python)都是在编写普通的无聊代码。但是看起来这个方法通过生成一个无限序列并懒惰地计算它来解决问题。我只需看看Python代码,了解其中的内容,然后编写一个简单而乏味的代码。但在此之前,我想问一下,是否有人可以展示类似的东西可以在Kotlin中实现


Tags: lambda代码inimportselfmapfordef
1条回答
网友
1楼 · 发布于 2024-04-29 19:22:23

我阅读了一些文档(如评论中所建议的),这是我想到的(以防万一有人会发现它有用)

class DistinctColorsGenerator {
    fun generate(number: Int): List<ColorRgb> = generateRgbs.take(number).toList()

    private val genHsvs = buildSequence {
        fractions.forEach { createHsvColors(it).forEach { yield(it) } }
    }

    private val generateRgbs = buildSequence {
        genHsvs.forEach { yield(it.toRgb()) }
    }

    private val zenosDichotomy = buildSequence {
        var d = 1
        while (true) {
            yield(Fraction(1, d))
            d *= 2
        }
    }

    private val fractions = buildSequence {
        yield(Fraction(0, 1))
        zenosDichotomy.forEach {
            val i = it.denominator.toInt()
            for (j in 1 until i step 2) {
                yield(Fraction(j, i))
            }
        }
    }

    private fun createHsvColors(h: Fraction<Int>) = buildSequence {
        listOf(Fraction(6, 10)).forEach { s ->
            listOf(Fraction(8, 10), Fraction(5, 10)).forEach { v ->
                yield(ColorHsv(h, s, v))
            }
        }
    }
}

ColorRgbColorHsvFraction只是数据类。ColorHsv.toRgb()我从{a1}取的

相关问题 更多 >