2017-10-26 129 views
0

コードがgenerate n distinct colorsに見つかりました。私はKotlinにこれを変換すると、問題は私のKotlinの経験(だけでなく、パイソン)のほとんどは、通常の退屈なコードを書いているということですPythonコードをKotlinに変換

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) 

をコードを取り、それからクラスを作りました。これは、無限のシーケンスを生成し、それを遅延評価することによって問題を解決します。私はちょうどPythonのコードを見て、何が起こっているのかを理解し、シンプルで退屈なコードを書くことができます。しかし、その前に私はコトリンでどのように似たようなことが実現できるかを誰かが示すことができるかどうかをここで尋ねたかったのですが、

+1

、から取っColorHsv.toRgb() 。したがって、このコードを翻訳することは絶対に可能です。 – Tomalak

答えて

1

私はいくつかの文書を読んでいます(コメントに示唆されているように)。誰かが)それは便利

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を見つけるだけでデータクラスです。私はPythonのジェネレータ(すなわち「遅延評価可能性が無限配列」)とまったく同じ目的を果たすKotlinは[コルーチン](https://kotlinlang.org/docs/reference/coroutines.html)をサポートしていますhere

関連する問題