Hofstadter Figure-Figure sequences: Difference between revisions

(Added JavaScript)
Line 265:
69
Verified</pre>
 
=={{header|C}}==
{{trans|Go}}
{{libheader|GLib}}
 
<lang c>#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <glib.h>
 
 
GArray *S = NULL;
GArray *R = NULL;
 
uint64_t ffS(uint64_t n);
uint64_t ffR(uint64_t n);
guint R_size(void);
guint S_size(void);
void initSR(void);
void clearSR(void);
 
 
void initSR(void)
{
uint64_t lr[2] = { 0, 1 };
uint64_t ls[2] = { 0, 2 };
 
S = g_array_new(FALSE, FALSE, sizeof(uint64_t));
R = g_array_new(FALSE, FALSE, sizeof(uint64_t));
// failure checking omitted
 
(void)g_array_append_vals(R, lr, 2);
(void)g_array_append_vals(S, ls, 2);
}
 
void clearSR(void)
{
g_array_free(R, TRUE);
g_array_free(S, TRUE);
}
 
guint R_size(void)
{
return R ? R->len : 0;
}
 
guint S_size(void)
{
return S ? S->len : 0;
}
 
 
uint64_t ffS(uint64_t n)
{
while (S_size() <= n) {
(void)ffR(R_size());
}
return g_array_index(S, uint64_t, n);
}
 
 
uint64_t ffR(uint64_t n)
{
uint64_t sn;
 
while (R_size() <= n) {
guint nrk = R_size() - 1;
uint64_t rNext = g_array_index(R, uint64_t, nrk) + g_array_index(S, uint64_t, nrk);
g_array_append_val(R, rNext);
for(sn = g_array_index(R, uint64_t, nrk) + 2; sn < rNext; sn++) {
g_array_append_val(S, sn);
}
uint64_t rapp = rNext + 1;
g_array_append_val(S, rapp);
}
 
return g_array_index(R, uint64_t, n);
}
 
 
int main(int argc, char **argv)
{
static const uint64_t knownR11[] = { 1, 3, 7, 12, 18, 26, 35, 45, 56, 69 };
uint64_t i;
bool ok;
 
initSR();
 
for(i = 1, ok = true; i <= sizeof(knownR11)/sizeof(uint64_t); i++)
{
printf("ffr(%lld) = %lld%s\n", i, ffR(i), ffR(i) != knownR11[i-1] ? " WRONG" : "");
}
 
uint64_t found[1001] = { 0 };
for(i = 1; i <= 40; i++) found[ffR(i)]++;
for(i = 1; i <= 960; i++) found[ffS(i)]++;
 
bool ok = true;
for(i = 1; i <= 1000; i++) {
if (found[i] != 1) {
ok = false;
break;
}
}
 
printf("task 4: %s\n", ok ? "PASS" : "FAIL");
 
clearSR();
 
return 0;
}</lang>
 
=={{header|D}}==