Kolakoski sequence: Difference between revisions
Content added Content deleted
Line 162: | Line 162: | ||
=={{header|C++}}== |
=={{header|C++}}== |
||
{{trans|D}} |
|||
<lang cpp>#include <iostream> |
<lang cpp>#include <iostream> |
||
#include <ostream> |
|||
#include <vector> |
#include <vector> |
||
using Sequence = std::vector<int>; |
|||
template <typename F> |
|||
void repeat(size_t count, F action) { |
|||
for (size_t i = 0; i < count; ++i) { |
|||
action(i); |
|||
} |
|||
} |
|||
std::ostream& operator<<(std::ostream& os, const Sequence& v) { |
|||
template<typename T> |
|||
os << "[ "; |
|||
std::ostream& operator<<(std::ostream& os, const std::vector<T>& v) { |
|||
auto |
for (const auto& e : v) { |
||
std::cout << e << ", "; |
|||
} |
|||
os << "]"; |
|||
return os; |
|||
if (it != end) { |
|||
os << *it; |
|||
it = std::next(it); |
|||
} |
|||
for (; it != end; it = std::next(it)) { |
|||
os << ", " << *it; |
|||
} |
|||
return os << "]"; |
|||
} |
} |
||
int next_in_cycle(const Sequence& s, size_t i) { |
|||
template<typename T> |
|||
return s[i % s.size()]; |
|||
auto nextInCycle(const T& c, size_t index) { |
|||
return c[index % c.size()]; |
|||
} |
} |
||
Sequence gen_kolakoski(const Sequence& s, int n) { |
|||
template<typename T> |
|||
Sequence seq; |
|||
std::vector<T> kolakoski(const std::vector<T>& c, size_t len) { |
|||
for (size_t i = 0; seq.size() < n; ++i) { |
|||
std::vector<T> s(len); |
|||
const int next = next_in_cycle(s, i); |
|||
std::vector<int> nv(i >= seq.size() ? next : seq[i], next); |
|||
size_t k = 0; |
|||
seq.insert(std::end(seq), std::begin(nv), std::end(nv)); |
|||
while (i < len) { |
|||
} |
|||
s[i] = nextInCycle(c, k); |
|||
return { std::begin(seq), std::begin(seq) + n }; |
|||
if (s[k] > 1) { |
|||
repeat(s[k] - 1, [&s, &i, len](size_t j) { |
|||
if (++i == len) return; |
|||
s[i] = s[i - 1]; |
|||
}); |
|||
} |
|||
if (++i == len) return s; |
|||
k++; |
|||
} |
|||
return s; |
|||
} |
} |
||
bool is_possible_kolakoski(const Sequence& s) { |
|||
template<typename T> |
|||
Sequence r; |
|||
bool possibleKolakoski(const std::vector<T>& c) { |
|||
for (size_t i = 0; i < s.size();) { |
|||
int count = 1; |
|||
for (size_t j = i + 1; j < s.size(); ++j) { |
|||
auto prev = c[0]; |
|||
if (s[j] != s[i]) break; |
|||
++count; |
|||
for (size_t i = 1; i < len; ++i) { |
|||
if (c[i] == prev) { |
|||
count++; |
|||
} else { |
|||
rle.push_back(count); |
|||
count = 1; |
|||
prev = c[i]; |
|||
} |
|||
} |
} |
||
r.push_back(count); |
|||
// no point adding final 'count' to rle as we're not going to compare it anyway |
|||
i += count; |
|||
for (size_t i = 0; i < rle.size(); i++) { |
|||
} |
|||
if (rle[i] != c[i]) { |
|||
return false; |
for (size_t i = 0; i < r.size(); ++i) if (r[i] != s[i]) return false; |
||
return true; |
|||
} |
|||
} |
|||
return true; |
|||
} |
} |
||
int main() { |
int main() { |
||
std::vector<Sequence> seqs = { |
|||
using namespace std; |
|||
{ 1, 2 }, |
|||
{ 2, 1 }, |
|||
vector<vector<int>> ias = { {1, 2}, {2, 1}, {1, 3, 1, 2}, {1, 3, 2, 1} }; |
|||
{ 1, 3, 1, 2 }, |
|||
{ 1, 3, 2, 1 } |
|||
}; |
|||
for (size_t i = 0; i < ias.size(); i++) { |
|||
for (const auto& s : seqs) { |
|||
auto len = lens[i]; |
|||
auto kol = gen_kolakoski(s, 20); |
|||
std::cout << "Starting with: " << s << ": " << std::endl << "Kolakoski sequence: " |
|||
auto kol = kolakoski(ia, len); |
|||
<< kol << std::endl << "Possibly kolakoski? " << is_possible_kolakoski(kol) << std::endl; |
|||
} |
|||
cout << kol << endl; |
|||
return 0; |
|||
cout << "Possible Kolakoski sequence? "; |
|||
if (possibleKolakoski(kol)) { |
|||
cout << "Yes" << endl; |
|||
} else { |
|||
cout << "No" << endl; |
|||
} |
|||
cout << endl; |
|||
} |
|||
return 0; |
|||
}</lang> |
}</lang> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre>Starting with: [ 1, 2, ]: |
||
[1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1] |
Kolakoski sequence: [ 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, ] |
||
Possibly kolakoski? 1 |
|||
Possible Kolakoski sequence? Yes |
|||
Starting with: [ 2, 1, ]: |
|||
Kolakoski sequence: [ 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, ] |
|||
First 20 members of the sequence generated by [2, 1]: |
|||
Possibly kolakoski? 1 |
|||
[2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2] |
|||
Starting with: [ 1, 3, 1, 2, ]: |
|||
Possible Kolakoski sequence? Yes |
|||
Kolakoski sequence: [ 1, 3, 3, 3, 1, 1, 1, 2, 2, 2, 1, 3, 1, 2, 2, 1, 1, 3, 3, 1, ] |
|||
Possibly kolakoski? 1 |
|||
First 30 members of the sequence generated by [1, 3, 1, 2]: |
|||
Starting with: [ 1, 3, 2, 1, ]: |
|||
[1, 3, 3, 3, 1, 1, 1, 2, 2, 2, 1, 3, 1, 2, 2, 1, 1, 3, 3, 1, 2, 2, 2, 1, 3, 3, 1, 1, 2, 1] |
|||
Kolakoski sequence: [ 1, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 3, 3, 2, 2, 1, 1, 3, 2, ] |
|||
Possibly kolakoski? 0</pre> |
|||
First 30 members of the sequence generated by [1, 3, 2, 1]: |
|||
[1, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 3, 3, 2, 2, 1, 1, 3, 2, 1, 1, 1, 1, 3, 3, 3, 2, 2, 1] |
|||
Possible Kolakoski sequence? No</pre> |
|||
=={{header|C#|C sharp}}== |
=={{header|C#|C sharp}}== |