Added irregular counter
This commit is contained in:
parent
23b5bcbce1
commit
0c779c7a5b
@ -7,9 +7,9 @@ import be.nielandt.decodeMove
|
|||||||
* 1) tier1 : axes / move classes (FB/UD/RL) -> three classes, but multiple sizes (1 or 2) possible
|
* 1) tier1 : axes / move classes (FB/UD/RL) -> three classes, but multiple sizes (1 or 2) possible
|
||||||
* 2) tier2: each block of class (22, 11, 2, 11, 0, ...) needs to be expanded into the full range of related moves
|
* 2) tier2: each block of class (22, 11, 2, 11, 0, ...) needs to be expanded into the full range of related moves
|
||||||
*/
|
*/
|
||||||
class CounterTiered : Counter {
|
class CounterTiered : Counter(8) {
|
||||||
|
|
||||||
private val moveIterator: Iterator<Array<Int>>
|
private val moveIterator: Iterator<Array<Int>> = listOf<Array<Int>>().iterator()
|
||||||
|
|
||||||
override fun increase(): Boolean {
|
override fun increase(): Boolean {
|
||||||
if (!this.moveIterator.hasNext())
|
if (!this.moveIterator.hasNext())
|
||||||
@ -18,12 +18,6 @@ class CounterTiered : Counter {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
constructor(size: Int) : super(size, 18) {
|
|
||||||
this.moveIterator = moveIterator().iterator()
|
|
||||||
this.increase()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun atMax(): Boolean {
|
override fun atMax(): Boolean {
|
||||||
return !this.moveIterator.hasNext()
|
return !this.moveIterator.hasNext()
|
||||||
}
|
}
|
||||||
@ -65,73 +59,17 @@ class CounterTiered : Counter {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun moveIterator(): Iterator<Array<Int>> {
|
|
||||||
return MoveIterator(classIterator()).iterator()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* These are the classes (FB/UD/RL), correctly configured (no illegal combinations here)
|
|
||||||
*/
|
|
||||||
fun classIterator(): List<List<Int>> {
|
|
||||||
val classes = appendRandomClass(this.counter.size, listOf())
|
|
||||||
return classes
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper function for classIterator()
|
|
||||||
*/
|
|
||||||
private fun appendRandomClass(size: Int, base: List<Int>): List<List<Int>> {
|
|
||||||
val result = mutableListOf<List<Int>>()
|
|
||||||
when {
|
|
||||||
base.size < size - 1 -> // add all classes, but don't repeat a group already there
|
|
||||||
(0..2).filter { if (base.isNotEmpty()) it != base.last() else true }
|
|
||||||
.forEach { theClass ->
|
|
||||||
// and both amounts, 1+2
|
|
||||||
(1..2).forEach { amount ->
|
|
||||||
val l = base.toMutableList()
|
|
||||||
for (i in 1..amount) {
|
|
||||||
l.add(theClass)
|
|
||||||
}
|
|
||||||
result.addAll(appendRandomClass(size, l))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
base.size == size -> {
|
|
||||||
// we're done here
|
|
||||||
result.add(base)
|
|
||||||
}
|
|
||||||
base.size == size - 1 -> // the base is not empty, only add class that is not at the end of the base list
|
|
||||||
(0..2).filter { if (base.isEmpty()) true else it != base.last() }.forEach { theClass ->
|
|
||||||
val l = base.toMutableList()
|
|
||||||
l.add(theClass)
|
|
||||||
result.add(l)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class CounterTieredFactory {
|
class CounterTieredFactory {
|
||||||
companion object {
|
companion object {
|
||||||
fun create(size: Int): CounterTiered {
|
fun create(size: Int): CounterTiered {
|
||||||
return CounterTiered(size)
|
return CounterTiered()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun main(args: Array<String>) {
|
|
||||||
var count = 0
|
|
||||||
CounterTieredFactory.create(4).classIterator().forEach {
|
|
||||||
println("it = ${it}")
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
println("count = ${count}")
|
|
||||||
// CounterTieredFactory.create(7).moveIterator().forEach {
|
|
||||||
// println("Arrays.tostring(it) = ${Arrays.toString(it)} ${it.map { decodeMove(it) }.toList()}")
|
|
||||||
// count++
|
|
||||||
// }
|
|
||||||
// println("count = ${count}")
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Expand the class ints into the full range of moves.
|
* Expand the class ints into the full range of moves.
|
||||||
*
|
*
|
||||||
|
|||||||
55
src/main/kotlin/be/nielandt/counter/VariableCounter.kt
Normal file
55
src/main/kotlin/be/nielandt/counter/VariableCounter.kt
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package be.nielandt.counter
|
||||||
|
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The variable counter has irregular base size for each digit.
|
||||||
|
*
|
||||||
|
* basesize: [1,2,1]
|
||||||
|
* iterates:
|
||||||
|
* - [0,0,0]
|
||||||
|
* - [0,0,1]
|
||||||
|
* - [0,1,0]
|
||||||
|
* - [0,1,1]
|
||||||
|
* - [0,2,0]
|
||||||
|
* - ...
|
||||||
|
*/
|
||||||
|
class VariableCounter(private val baseSizes: IntArray) : Iterator<Array<Int>> {
|
||||||
|
|
||||||
|
// init the counter with 0's, we only have a maximum as our basesize
|
||||||
|
val counter = Array(baseSizes.size) {
|
||||||
|
when (it) {
|
||||||
|
baseSizes.size - 1 -> -1
|
||||||
|
else -> 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hasNext(): Boolean {
|
||||||
|
// check if all elements in the counter has reached their maximum (basesize - 1)
|
||||||
|
counter.forEachIndexed { index, sh ->
|
||||||
|
if (sh < baseSizes[index] - 1)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun next(): Array<Int> {
|
||||||
|
for (i in this.counter.size - 1 downTo 0) {
|
||||||
|
this.counter[i]++
|
||||||
|
if (this.counter[i] == baseSizes[i]) {
|
||||||
|
this.counter[i] = 0
|
||||||
|
} else {
|
||||||
|
return counter.copyOf()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return counter.copyOf()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
val counter = VariableCounter(intArrayOf(2, 3, 2))
|
||||||
|
while (counter.hasNext()) {
|
||||||
|
val next = counter.next()
|
||||||
|
println("counter.next() = ${Arrays.toString(next)} ${counter.hasNext()}")
|
||||||
|
}
|
||||||
|
}
|
||||||
70
src/main/kotlin/be/nielandt/iterator/ValidClassesIterator.kt
Normal file
70
src/main/kotlin/be/nielandt/iterator/ValidClassesIterator.kt
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
package be.nielandt.iterator
|
||||||
|
|
||||||
|
import java.time.Duration
|
||||||
|
import java.time.Instant
|
||||||
|
|
||||||
|
class ValidClassesIterator(val size: Int) : Iterator<List<Int>> {
|
||||||
|
|
||||||
|
private var classes: Iterator<List<Int>> = classIterator().iterator()
|
||||||
|
|
||||||
|
override fun hasNext(): Boolean {
|
||||||
|
return this.classes.hasNext()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun next(): List<Int> {
|
||||||
|
return this.classes.next()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* These are the classes (FB/UD/RL), correctly configured (no illegal combinations here)
|
||||||
|
*/
|
||||||
|
private fun classIterator(): List<List<Int>> {
|
||||||
|
val classes = appendRandomClass(size, listOf())
|
||||||
|
return classes
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function for classIterator()
|
||||||
|
*/
|
||||||
|
private fun appendRandomClass(size: Int, base: List<Int>): List<List<Int>> {
|
||||||
|
val result = mutableListOf<List<Int>>()
|
||||||
|
when {
|
||||||
|
base.size < size - 1 -> // add all classes, but don't repeat a group already there
|
||||||
|
(0..2).filter { if (base.isNotEmpty()) it != base.last() else true }
|
||||||
|
.forEach { theClass ->
|
||||||
|
// and both amounts, 1+2
|
||||||
|
(1..2).forEach { amount ->
|
||||||
|
val l = base.toMutableList()
|
||||||
|
for (i in 1..amount) {
|
||||||
|
l.add(theClass)
|
||||||
|
}
|
||||||
|
result.addAll(appendRandomClass(size, l))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
base.size == size -> {
|
||||||
|
// we're done here
|
||||||
|
result.add(base)
|
||||||
|
}
|
||||||
|
base.size == size - 1 -> // the base is not empty, only add class that is not at the end of the base list
|
||||||
|
(0..2).filter { if (base.isEmpty()) true else it != base.last() }.forEach { theClass ->
|
||||||
|
val l = base.toMutableList()
|
||||||
|
l.add(theClass)
|
||||||
|
result.add(l)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
val now = Instant.now()
|
||||||
|
val iter = ValidClassesIterator(8)
|
||||||
|
var count: Int = 0
|
||||||
|
while(iter.hasNext()) {
|
||||||
|
println("iter.next() = ${iter.next()}")
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
println("count = ${count}")
|
||||||
|
println("Duration.between(Instant.now(), now) = ${Duration.between(now, Instant.now()).toMillis()}")
|
||||||
|
}
|
||||||
|
|
||||||
@ -1,6 +1,9 @@
|
|||||||
package be.nielandt.iterator
|
package be.nielandt.iterator
|
||||||
|
|
||||||
class ValidMoveIterator: Iterator<Array<Int>> {
|
/**
|
||||||
|
* Iterates over the different moves of the given specific classes.
|
||||||
|
*/
|
||||||
|
class ValidMoveIterator(val classes: List<Int>): Iterator<Array<Int>> {
|
||||||
|
|
||||||
override fun hasNext(): Boolean {
|
override fun hasNext(): Boolean {
|
||||||
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
|
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user