type FReader struct {
reader io.Reader
filter func([]byte) (int, error)
}
func NewFReader(r io.Reader) *FReader {
return &FReader{r, func(p []byte) (int, error) { return len(p), nil }}
}
func (fr *FReader) Filter(filter func([]byte) (int, error)) *FReader {
return &FReader{fr, filter}
}
func (fr *FReader) Read(p []byte) (n int, err error) {
n, err = fr.reader.Read(p)
if err == nil && fr.filter != nil {
n, err = fr.filter(p)
}
return
}
chainreader := NewFReader(myreader).Filter(myfilter1).Filter(myfilter2).Filter(myfilter3)
https://play.golang.org/p/rakSV5kgqR9 var ot [64][6]int
for i := 0; i < 64; i++ {
for j := 0; j < 6; j++ {
ot[i][5-j] = (i >> j) % 2
}
}
func validCombinations(alphabet string, maxChar int) []string {
var result []string = []string{""}
var last, next int
for i := 1; i <= maxChar; i++ {
last = len(result)
for _, str := range result[next:] {
for _, char := range alphabet {
result = append(result, str+string(char))
}
}
next = last
}
return result
}
Математиком-теоретиком больше быть не хочу.может тогда математиком практиком?
NAME[EL1, EL2, EL3, EL3, EL4, EL5]
NEXT[3, 5, 2, TAIL, 4]
NAME[1] = EL1
и ссылается на NEXT[1]=3
то есть на NAME[3]=EL3
(индексация массивов здесь начинается с 1, а не с нуля потому что так сделано в вашем примере) Такая структура довольно компактна и добавляет к преимуществами связного списка преимущество последовательного массива - прямой доступ к элементам. <svg viewBox="0 0 340 333">
<path class="path" fill="white" stroke="black" stroke-width="4" d="M66.039,133.545c0,0-21-57,18-67s49-4,65,8s30,41,53,27s66,4,58,32s-5,44,18,57s22,46,0,45s-54-40-68-16s-40,88-83,48s11-61-11-80s-79-7-70-41C46.039,146.545,53.039,128.545,66.039,133.545z"/>
</svg>
.path {
stroke-dasharray: 1000;
stroke-dashoffset: 1000;
animation: dash 5s linear alternate infinite;
}
@keyframes dash {
from {
stroke-dashoffset: 822;
}
to {
stroke-dashoffset: 0;
}
}