Hofstadter Figure-Figure sequences: Difference between revisions

Rename Perl 6 -> Raku, alphabetize, minor clean-up
(Added 11l)
(Rename Perl 6 -> Raku, alphabetize, minor clean-up)
Line 451:
return 0;
}</lang>
 
=={{header|C++}}==
{{works with|gcc}}
{{works with|C++|11, 14, 17}}
<lang cpp>#include <iomanip>
#include <iostream>
#include <set>
#include <vector>
 
using namespace std;
 
unsigned hofstadter(unsigned rlistSize, unsigned slistSize)
{
auto n = rlistSize > slistSize ? rlistSize : slistSize;
auto rlist = new vector<unsigned> { 1, 3, 7 };
auto slist = new vector<unsigned> { 2, 4, 5, 6 };
auto list = rlistSize > 0 ? rlist : slist;
auto target_size = rlistSize > 0 ? rlistSize : slistSize;
 
while (list->size() > target_size) list->pop_back();
 
while (list->size() < target_size)
{
auto lastIndex = rlist->size() - 1;
auto lastr = (*rlist)[lastIndex];
auto r = lastr + (*slist)[lastIndex];
rlist->push_back(r);
for (auto s = lastr + 1; s < r && list->size() < target_size;)
slist->push_back(s++);
}
 
auto v = (*list)[n - 1];
delete rlist;
delete slist;
return v;
}
 
ostream& operator<<(ostream& os, const set<unsigned>& s)
{
cout << '(' << s.size() << "):";
auto i = 0;
for (auto c = s.begin(); c != s.end();)
{
if (i++ % 20 == 0) os << endl;
os << setw(5) << *c++;
}
return os;
}
 
int main(int argc, const char* argv[])
{
const auto v1 = atoi(argv[1]);
const auto v2 = atoi(argv[2]);
set<unsigned> r, s;
for (auto n = 1; n <= v2; n++)
{
if (n <= v1)
r.insert(hofstadter(n, 0));
s.insert(hofstadter(0, n));
}
cout << "R" << r << endl;
cout << "S" << s << endl;
 
int m = max(*r.rbegin(), *s.rbegin());
for (auto n = 1; n <= m; n++)
if (r.count(n) == s.count(n))
clog << "integer " << n << " either in both or neither set" << endl;
 
return 0;
}</lang>
{{out}}
 
<lang sh>% ./hofstadter 40 100 2> /dev/null
R(40):
1 3 7 12 18 26 35 45 56 69 83 98 114 131 150 170 191 213 236 260
285 312 340 369 399 430 462 495 529 565 602 640 679 719 760 802 845 889 935 982
S(100):
2 4 5 6 8 9 10 11 13 14 15 16 17 19 20 21 22 23 24 25
27 28 29 30 31 32 33 34 36 37 38 39 40 41 42 43 44 46 47 48
49 50 51 52 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 70
71 72 73 74 75 76 77 78 79 80 81 82 84 85 86 87 88 89 90 91
92 93 94 95 96 97 99 100 101 102 103 104 105 106 107 108 109 110 111 112</lang>
 
=={{header|C sharp|C#}}==
Line 633 ⟶ 551:
69
Verified</pre>
 
=={{header|C++}}==
{{works with|gcc}}
{{works with|C++|11, 14, 17}}
<lang cpp>#include <iomanip>
#include <iostream>
#include <set>
#include <vector>
 
using namespace std;
 
unsigned hofstadter(unsigned rlistSize, unsigned slistSize)
{
auto n = rlistSize > slistSize ? rlistSize : slistSize;
auto rlist = new vector<unsigned> { 1, 3, 7 };
auto slist = new vector<unsigned> { 2, 4, 5, 6 };
auto list = rlistSize > 0 ? rlist : slist;
auto target_size = rlistSize > 0 ? rlistSize : slistSize;
 
while (list->size() > target_size) list->pop_back();
 
while (list->size() < target_size)
{
auto lastIndex = rlist->size() - 1;
auto lastr = (*rlist)[lastIndex];
auto r = lastr + (*slist)[lastIndex];
rlist->push_back(r);
for (auto s = lastr + 1; s < r && list->size() < target_size;)
slist->push_back(s++);
}
 
auto v = (*list)[n - 1];
delete rlist;
delete slist;
return v;
}
 
ostream& operator<<(ostream& os, const set<unsigned>& s)
{
cout << '(' << s.size() << "):";
auto i = 0;
for (auto c = s.begin(); c != s.end();)
{
if (i++ % 20 == 0) os << endl;
os << setw(5) << *c++;
}
return os;
}
 
int main(int argc, const char* argv[])
{
const auto v1 = atoi(argv[1]);
const auto v2 = atoi(argv[2]);
set<unsigned> r, s;
for (auto n = 1; n <= v2; n++)
{
if (n <= v1)
r.insert(hofstadter(n, 0));
s.insert(hofstadter(0, n));
}
cout << "R" << r << endl;
cout << "S" << s << endl;
 
int m = max(*r.rbegin(), *s.rbegin());
for (auto n = 1; n <= m; n++)
if (r.count(n) == s.count(n))
clog << "integer " << n << " either in both or neither set" << endl;
 
return 0;
}</lang>
{{out}}
 
<lang sh>% ./hofstadter 40 100 2> /dev/null
R(40):
1 3 7 12 18 26 35 45 56 69 83 98 114 131 150 170 191 213 236 260
285 312 340 369 399 430 462 495 529 565 602 640 679 719 760 802 845 889 935 982
S(100):
2 4 5 6 8 9 10 11 13 14 15 16 17 19 20 21 22 23 24 25
27 28 29 30 31 32 33 34 36 37 38 39 40 41 42 43 44 46 47 48
49 50 51 52 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 70
71 72 73 74 75 76 77 78 79 80 81 82 84 85 86 87 88 89 90 91
92 93 94 95 96 97 99 100 101 102 103 104 105 106 107 108 109 110 111 112</lang>
 
=={{header|CoffeeScript}}==
Line 1,634:
}
</lang>
 
=={{header|Perl 6}}==
{{works with|Rakudo|2018.03}}
<lang perl6>my %r = 1 => 1;
my %s = 1 => 2;
 
sub ffr ($n) { %r{$n} //= ffr($n - 1) + ffs($n - 1) }
sub ffs ($n) { %s{$n} //= (grep none(map &ffr, 1..$n), max(%s.values)+1..*)[0] }
 
my @ffr = map &ffr, 1..*;
my @ffs = map &ffs, 1..*;
 
say @ffr[^10];
say "Rawks!" if 1...1000 eqv sort |@ffr[^40], |@ffs[^960];</lang>
Output:
<pre>
1 3 7 12 18 26 35 45 56 69
Rawks!</pre>
 
=={{header|Phix}}==
Line 2,054 ⟶ 2,036:
(2 4 5 6 8 9 10 11 13 14)
Checking for first 1000 integers: Test passed</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2018.03}}
<lang perl6>my %r = 1 => 1;
my %s = 1 => 2;
 
sub ffr ($n) { %r{$n} //= ffr($n - 1) + ffs($n - 1) }
sub ffs ($n) { %s{$n} //= (grep none(map &ffr, 1..$n), max(%s.values)+1..*)[0] }
 
my @ffr = map &ffr, 1..*;
my @ffs = map &ffs, 1..*;
 
say @ffr[^10];
say "Rawks!" if 1...1000 eqv sort |@ffr[^40], |@ffs[^960];</lang>
Output:
<pre>
1 3 7 12 18 26 35 45 56 69
Rawks!</pre>
 
=={{header|REXX}}==
Line 2,699 ⟶ 2,700:
The first 40 values of ffr plus the first 960 values of ffs
include all the integers from 1 to 1000 exactly once is True</pre>
 
=={{header|VBScript}}==
<lang vb>
10,333

edits