Knuth's algorithm S: Difference between revisions

→‎{{header|Kotlin}}: Minor improvements to existing class based solution. Added alternative function based solution.
m (replaced #2 with 2nd step.)
(→‎{{header|Kotlin}}: Minor improvements to existing class based solution. Added alternative function based solution.)
Line 939:
 
=={{header|Kotlin}}==
{{improve|Kotlin|Unnecessary complicated, tends to be [https://en.wikipedia.org/wiki/Spaghetti_code spaghetti code]}}
{{trans|Java}}
Class based solution:
<lang scala>// version 1.1.2.51
 
import java.util.Random
 
val rand = Random()
 
class SOfN<T>(val n: Int) {
Line 949 ⟶ 951:
private var i = 0
 
privatefun companionprocess(item: objectT): List<T> {
val rand = Random()
}
 
fun process(item: T): ArrayList<T> {
if (++i <= n)
sample.add(item)
Line 961 ⟶ 959:
}
}
 
fun main(args: Array<String>) {
val bin = IntArray(10)
(1..100_000).forEach {
val sOfn = SOfN<Int>(3)
varfor sample:(d ArrayList<Int>?in =0..8) nullsOfn.process(d)
for (is in 0..9) sample = sOfn.process(i9)) bin[s]++
for (s in sample!!) bin[s]++
}
println(bin.contentToString())
}</lang>
Sample output:
{{out}}
<pre>
[3014429981, 2992829845, 3001229933, 2993830139, 3004030051, 3024430039, 3010729702, 2996930218, 2980230199, 2981629893]
</pre>
 
Alternative function based solution:
<lang scala>// version 1.2.51
 
import java.util.Random
 
val rand = Random()
 
fun <T> SOfNCreator(n: Int): (T) -> List<T> {
funval process(item:sample T):= ArrayList<T> {(n)
var i = 0
return {
if (++i <= n)
sample.add(it)
else if (rand.nextInt(i) < n)
sample[rand.nextInt(n)] = it
sample
}
}
 
fun main(args: Array<String>) {
val bin = IntArray(10)
(1..100_000).forEach {
val sOfn = SOfNCreator<Int>(3)
for (d in 0..8) sOfn(d)
for (s in sample!!sOfn(9)) bin[s]++
}
println(bin.contentToString())
}</lang>
 
Sample output:
<pre>
[30172, 29856, 30132, 29884, 29818, 30220, 29900, 30069, 29869, 30080]
</pre>
 
9,482

edits