Data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 7387c8f97b
commit cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions

View file

@ -0,0 +1,2 @@
---
from: http://rosettacode.org/wiki/Hofstadter_Q_sequence

View file

@ -0,0 +1,22 @@
The [[wp:Hofstadter_sequence#Hofstadter_Q_sequence|Hofstadter Q sequence]] is defined as:
<big>
:: <math>\begin{align}
Q(1)&=Q(2)=1, \\
Q(n)&=Q\big(n-Q(n-1)\big)+Q\big(n-Q(n-2)\big), \quad n>2.
\end{align}</math>
</big>
It is defined like the [[Fibonacci sequence]], but whereas the next term in the Fibonacci sequence is the sum of the previous two terms, in the Q sequence the previous two terms tell you how far to go back in the Q sequence to find the two numbers to sum to make the next term of the sequence.
;Task:
* Confirm and display that the first ten terms of the sequence are: 1, 1, 2, 3, 3, 4, 5, 5, 6, and 6
* Confirm and display that the 1000<sup>th</sup> term is: &nbsp; 502
;Optional extra credit
* Count and display how many times a member of the sequence is less than its preceding term for terms up to and including the 100,000<sup>th</sup> term.
* Ensure that the extra credit solution &nbsp; ''safely'' &nbsp; handles being initially asked for an '''n'''<sup>th</sup> term where &nbsp; '''n''' &nbsp; is large.
<br>(This point is to ensure that caching and/or recursion limits, if it is a concern, is correctly handled).
<br><br>

View file

@ -0,0 +1,15 @@
V qseq = [0] * 100001
qseq[1] = 1
qseq[2] = 1
L(i) 3 .< qseq.len
qseq[i] = qseq[i - qseq[i-1]] + qseq[i - qseq[i-2]]
print(The first 10 terms are: qseq[1..10].map(q -> String(q)).join(, ))
print(The 1000'th term is qseq[1000])
V less_than_preceding = 0
L(i) 2 .< qseq.len
I qseq[i] < qseq[i-1]
less_than_preceding++
print(Times a member of the sequence is less than its preceding term: less_than_preceding)

View file

@ -0,0 +1,51 @@
* Hofstrader q sequence for any n - 18/10/2015
HOFSTRAD CSECT
USING HOFSTRAD,R15 set base register
MVC Q,=F'1' q(1)=1
MVC Q+4,=F'1' q(2)=1
LA R4,1 i=1
LOOPI C R4,N do i=1 to n
BH ELOOPI
C R4,=F'3' if i>=3 then
BL NOTREC
LR R1,R4 i
SLA R1,2 i*4
L R2,Q-8(R1) q(i-1)
LR R1,R4 i
SR R1,R2 i-q(i-1)
SLA R1,2 *4
L R2,Q-4(R1) r2=q(i-q(i-1))
LR R1,R4 i
SLA R1,2 i*4
L R3,Q-12(R1) q(i-2)
LR R1,R4 i
SR R1,R3 i-q(i-2)
SLA R1,2 *4
L R3,Q-4(R1) r3=q(i-q(i-2))
AR R2,R3 r2=r2+r3
LR R1,R4 i
SLA R1,2 i*4
ST R2,Q-4(R1) q(i)=q(i-q(i-1))+q(i-q(i-2))
NOTREC C R4,=F'10' if i<=10
BNH PRT
C R4,N or i=n then
BNE NOPRT
PRT XDECO R4,XD edit i
MVC PG+2(4),XD+8 output i
LR R1,R4 i
SLA R1,2 i*4
L R2,Q-4(R1) q(i)
XDECO R2,XD edit q(i)
MVC PG+10(4),XD+8 output q(i)
XPRNT PG,80 print buffer
NOPRT LA R4,1(R4) i=i+1
B LOOPI
ELOOPI XR R15,R15 set return code
BR R14 return to caller
PG DC CL80'n=...., q=....' buffer
XD DS CL12 temporary variable
LTORG insert literals for addressability
N DC F'1000' n=1000
Q DS 1000F array q(1000)
YREGS
END HOFSTRAD

View file

@ -0,0 +1,122 @@
puts: equ 9 ; CP/M call to print a string
org 100h
;;; Generate the first 1000 members of the Q sequence
lxi b,3 ; Start at 3rd element (1 and 2 already defined)
genq: dcx b ; BC = N-1
call q
mov e,m ; DE = Q(N-1)
inx h
mov d,m
inx b ; BC = (N-1)+1 = N
xchg ; HL = Q(N-1)
call neg ; HL = -Q(N-1)
dad b ; HL = N-Q(N-1)
push b ; Keep N
mov b,h ; BC = N-Q(N-1)
mov c,l
call q ; HL = *Q(N-Q(N-1))
mov e,m ; DE = Q(N-Q(N-1))
inx h
mov d,m
pop b ; Restore N
push d ; push Q(N-Q(N-1))
dcx b ; BC = N-2
dcx b
call q ; DE = Q(N-2)
mov e,m
inx h
mov d,m
inx b ; BC = (N-2)+2 = N
inx b
xchg ; HL = Q(N-2)
call neg ; HL = -Q(N-2)
dad b ; HL = N-Q(N-2)
push b ; Keep N
mov b,h ; BC = N-Q(N-2)
mov c,l
call q ; HL = *Q(N-Q(N-2))
mov a,m ; HL = Q(N-Q(N-2))
inx h
mov h,m
mov l,a
pop b ; Restore N
pop d ; pop Q(N-Q(N-1))
dad d ; HL = Q(N-Q(N-1))+Q(N-Q(N-2))
xchg ; DE = Q(N-Q(N-1))+Q(N-Q(N-2))
call q ; HL = *Q(N)
mov m,e ; Store Q(N)
inx h
mov m,d
inx b ; N = N+1
lxi h,-1001
dad b ; Are we there yet?
jnc genq
;;; Print first 10 terms
lxi d,m10
mvi c,puts
call 5
lxi b,1 ; Start at term 1
mvi d,10 ; 10 terms
p10: push b ; Save counters
push d
call prterm ; Print current term
pop d ; Restore counters
pop b
inx b ; Next term
dcr d ; Repeat 10 times
jnz p10
;;; Print 1000th term
lxi d,m1000
mvi c,puts
call 5
lxi b,1000 ; 1000th term
;;; Print Q(BC)
prterm: call q ; Load term into HL
mov a,m
inx h
mov h,m
mov l,a
lxi b,num ; Push pointer to end of number buffer
push b
lxi b,-10 ; Divisor
dgt: lxi d,-1 ; Quotient
divlp: inx d
dad b
jc divlp
mvi a,'0'+10
add l ; Make ASCII digit
pop h ; Get pointer
dcx h
mov m,a ; Store digit
push h
xchg ; HL = next quotient
mov a,h ; More digits?
ora l
jnz dgt
pop d ; Print string
mvi c,puts
jmp 5
;;; Set HL = -HL
neg: dcx h
mov a,h
cma
mov h,a
mov a,l
cma
mov l,a
ret
;;; Set HL to memory location of Q(BC)
q: push d ; Keep DE
mov h,b ; HL = 2*(BC-1)
mov l,c
dcx h
dad h
lxi d,qq ; Add to start of sequence
dad d
pop d
ret
m10: db 'The first 10 terms are: $'
m1000: db 13,10,'The 1000th term is: $'
db '*****' ; Placeholder for number
num: db ' $'
qq: dw 1,1 ; Q sequence stored here, starting with 1, 1

View file

@ -0,0 +1,60 @@
puts: equ 9 ; MS-DOS syscall to print a string
cpu 8086
org 100h
section .text
;;; Generate first 1000 elements of Q sequence
mov dx,3 ; DX = N
mov di,Q+4 ; DI = place to store elements
mov cx,998 ; Generate 998 more terms
genq: mov si,dx ; SI = N
sub si,[di-2] ; SI -= Q[N-1]
mov bp,dx ; BP = N
sub bp,[di-4] ; BP -= Q[N-2]
dec si ; SI = 2*(SI-1) (0-indexed, 2 bytes/term)
shl si,1
dec bp ; Same for BP
shl bp,1
mov ax,[si+Q] ; Load Q[n-Q[n-1]]
add ax,[bp+Q] ; Add Q[n-Q[n-2]]
stosw ; Store as Q[n]
inc dx ; Increment N
loop genq
;;; Print first 10 elements
mov ah,puts
mov dx,m10
int 21h
mov cx,10
mov bx,1
p10: call prterm
inc bx
loop p10
;;; Print 1000th element
mov ah,puts
mov dx,m1000
int 21h
mov bx,1000
;;; Print the term in BX
prterm: push bx ; Save term
dec bx
shl bx,1
mov ax,[bx+Q] ; Load term into AX
mov bp,10 ; Divisor
mov bx,num ; Number buffer pointer
.dgt: xor dx,dx
div bp ; Divide number by 10
dec bx
add dl,'0' ; DX = remainder, add '0'
mov [bx],dl ; Stored digit
test ax,ax ; Done yet?
jnz .dgt ; If not, find next digit
mov dx,bx ; Print the number
mov ah,puts
int 21h
pop bx ; Restore term
ret
section .data
m10: db 'First 10 terms are: $'
m1000: db 13,10,'1000th term is: $'
db '*****' ; Number placeholder
num: db ' $'
Q: dw 1,1

View file

@ -0,0 +1,24 @@
#!/usr/local/bin/a68g --script #
INT n = 100000;
main:
(
INT flip;
[n]INT q;
q[1] := q[2] := 1;
FOR i FROM 3 TO n DO
q[i] := q[i - q[i - 1]] + q[i - q[i - 2]] OD;
FOR i TO 10 DO
printf(($g(0)$, q[i], $b(l,x)$, i = 10)) OD;
printf(($g(0)l$, q[1000]));
flip := 0;
FOR i TO n-1 DO
flip +:= ABS (q[i] > q[i + 1]) OD;
printf(($"flips: "g(0)l$, flip))
)

View file

@ -0,0 +1,14 @@
begin
integer array Q[1:1000];
integer n;
Q[1] := Q[2] := 1;
for n := 3 step 1 until 1000 do
Q[n] := Q[n-Q[n-1]] + Q[n-Q[n-2]];
write("The first 10 terms are:");
write("");
for n := 1 step 1 until 10 do writeon(Q[n]);
write("The 1000th term is:", Q[1000]);
end

View file

@ -0,0 +1,39 @@
begin % find elements of the Hofstader Q sequence Q(1) = Q(2) = 1 %
% Q(n) = Q( n - Q( n - 1 ) ) + Q( n - Q( n - 2 ) ) for n > 2 %
integer MAX_Q;
max_Q := 100000;
begin
integer array Q ( 1 :: MAX_Q );
integer array xQ ( 1 :: 10 );
integer ltCount;
logical valuesOk;
% expected values of the first 10 elements %
xQ( 1 ) := xQ( 2 ) := 1;
xQ( 3 ) := 2; xQ( 4 ) := xQ( 5 ) := 3; xQ( 6 ) := 4;
xQ( 7 ) := xQ( 8 ) := 5; xQ( 9 ) := xQ( 10 ) := 6;
% calculate the sequence and count how often Q( n ) < Q( n - 1 ) %
ltCount := 0;
Q( 1 ) := Q( 2 ) := 1;
for n := 3 until MAX_Q do begin
Q( n ) := Q( n - Q( n - 1 ) ) + Q( n - Q( n - 2 ) );
if Q( n ) < Q( n - 1 ) then ltCount := ltCount + 1
end for_n ;
valuesOk := true;
write( "The first 10 terms of the Hofstader Q sequence:" );
for i := 1 until 10 do begin
writeon( i_w := 1, s_w := 0, " ", Q( i ) );
if Q( i ) not = xQ( i ) then begin
writeon( i_w := 1, s_w := 0, "-EXPECTED-", xQ( i ) );
valuesOk := false
end if_Q_i_ne_xQ_i
end for_i ;
write( i_w := 1, s_w := 0, "The 1000th term is: ", Q( 1000 ) );
if Q( 1000 ) not = 502 then begin
writeon( "-EXPECTED-502" );
valuesOk := false
end if_Q_100_ne_502 ;
if valuesOk then write( " (Computed values are as expected)" )
else write( "Values NOT as expected" );
write( i_w := 1, s_w := 0, "Q(n) < Q(n-1) ", ltCount," times for n up to ", MAX_Q )
end
end.

View file

@ -0,0 +1,8 @@
Q_sequence;seq;size
size100000
seq{,+/[(1+)-¯2]}(size-2)1 1
'The first 10 terms are:', seq[10]
'The 1000th term is:', seq[1000]
(+/ 2>/seq),'terms were preceded by a larger term.'

View file

@ -0,0 +1,114 @@
.text
.global _start
_start: ldr r6,=qs @ R6 = base register for Q array
@@@ Write first 2 elements
mov r0,#1 @ Q(1) and Q(2) are 1
strh r0,[r6,#4]
strh r0,[r6,#8]
@@@ Generate 100 thousand elements
mov r1,#0x86A0
movt r1,#1 @ 0x186A0 = 100.000
mov r0,#3 @ Starting at element 3
1: sub r2,r0,#1 @ r2 = n-1
ldr r2,[r6,r2,lsl#2] @ r2 = Q[r2]
sub r2,r0,r2 @ r2 = n-Q[r2]
ldr r2,[r6,r2,lsl#2] @ r2 = Q[r2]
sub r3,r0,#2 @ r3 = n-2
ldr r3,[r6,r3,lsl#2] @ r3 = Q[r3]
sub r3,r0,r3 @ r3 = n-Q[r3]
ldr r3,[r6,r3,lsl#2] @ r3 = Q[r3]
add r2,r2,r3 @ r2 += r3
str r2,[r6,r0,lsl#2] @ Q[n] = r2
add r0,r0,#1 @ n++
cmp r0,r1
bls 1b @ If r0<=r1, generate next
@@@ Print first 10 elements
ldr r1,=f10m
bl pstr
mov r8,#1 @ Start at element 1
1: ldr r0,[r6,r8,lsl#2] @ Grab current element
bl pnum @ Print it
ldr r1,=space @ Print a space
bl pstr
add r8,r8,#1
cmp r8,#10 @ Keep going until 10 elements printed
bls 1b
ldr r1,=nl @ Print newline
bl pstr
@@@ Print 1000th element
ldr r1,=f1000m
bl pstr
mov r8,#1000 @ Grab 1000th element
ldr r0,[r6,r8,lsl#2]
bl pnum
ldr r1,=nl @ Print newline
bl pstr
@@@ Find how many times a member is less than its preceding term
mov r0,#0 @ counter
mov r1,#0x86A0 @ max element
movt r1,#1
mov r2,#1 @ value of previous element
mov r3,#2 @ number of current element
2: ldr r4,[r6,r3,lsl#2] @ get value of current element
cmp r2,r4 @ if previous more than current
addhi r0,r0,#1 @ then increment counter
mov r2,r4 @ current el is now prevous el
add r3,r3,#1 @ increment element index
cmp r3,r1 @ are we there yet?
bls 2b @ if not, keep going
bl pnum @ otherwise, print the number
ldr r1,=ltermm @ and the corresponding message
bl pstr
mov r0,#0 @ and then exit
mov r7,#1
swi #0
@@@ Print a length-prefixed string (in r1)
pstr: push {r7,lr} @ Save syscall and link registers
mov r0,#1 @ 1 = stdout
ldrb r2,[r1],#1 @ Get length and advance r1
mov r7,#4 @ Write
swi #0
pop {r7,pc}
@@@ Print unsigned number in r0 using Linux
pnum: push {r7,lr} @ Save syscall and link registers
ldr r7,=qs @ May as well use R7 as buffer pointer
1: mov r1,#10 @ Div-mod by 10
bl divmod
add r1,r1,#'0 @ This makes an ASCII digit
strb r1,[r7,#-1]! @ Store it in the buffer
tst r0,r0 @ Are there more digits?
bne 1b @ If so, calculate them
mov r0,#1 @ 1 = stdout
mov r1,r7 @ Start of number in R1
ldr r2,=qs @ Calculate length
sub r2,r2,r1
mov r7,#4 @ 4 = write
swi #0
pop {r7,pc}
@@@ Division routine: r0=r0/r1, r1=r0%r1
divmod: mov r2,#0 @ R2 = counter
1: cmp r1,r0 @ Double R1 until R1>R0
lslls r1,r1,#1
addls r2,r2,#1
bls 1b
mov r3,#0
2: lsl r3,r3,#1
subs r0,r0,r1 @ Trial subtraction
addhs r3,r3,#1 @ If it worked, mark
addlo r0,r0,r1 @ If it didn't, undo
lsr r1,r1,#1 @ Halve R1
subs r2,r2,#1 @ Decrement counter
bhs 2b @ Keep going until zero
mov r1,r0 @ R1 = modulus
mov r0,r3 @ R0 = quotient
bx lr
.data
space: .ascii "\x1 "
nl: .ascii "\x1\n"
f10m: .ascii "\x18The first 10 terms are: "
f1000m: .ascii "\x14The 1000th term is: "
ltermm: .ascii "' terms were preceded by a larger term.\n"
.bss
.align 4
.space 8 @ Buffer for number output
qs: .space 4 * 100001 @ One word per term

View file

@ -0,0 +1,22 @@
#!/usr/bin/awk -f
BEGIN {
N = 100000
print "Q-sequence(1..10) : " Qsequence(10)
Qsequence(N,Q)
print "1000th number of Q sequence : " Q[1000]
for (n=2; n<=N; n++) {
if (Q[n]<Q[n-1]) NN++
}
print "number of Q(n)<Q(n+1) for n<=100000 : " NN
}
function Qsequence(N,Q) {
Q[1] = 1
Q[2] = 1
seq = "1 1"
for (n=3; n<=N; n++) {
Q[n] = Q[n-Q[n-1]]+Q[n-Q[n-2]]
seq = seq" "Q[n]
}
return seq
}

View file

@ -0,0 +1,17 @@
PROC Main()
DEFINE MAX="1000"
INT ARRAY q(MAX+1)
INT i
q(1)=1 q(2)=1
FOR i=3 TO MAX
DO
q(i)=q(i-q(i-1))+q(i-q(i-2))
OD
FOR i=1 TO 10
DO
PrintF("%I: %I%E",i,q(i))
OD
PrintF("%I: %I%E",MAX,q(MAX))
RETURN

View file

@ -0,0 +1,59 @@
with Ada.Text_IO;
procedure Hofstadter_Q_Sequence is
type Callback is access procedure(N: Positive);
procedure Q(First, Last: Positive; Q_Proc: Callback) is
-- calls Q_Proc(Q(First)); Q_Proc(Q(First+1)); ... Q_Proc(Q(Last));
-- precondition: Last > 2
Q_Store: array(1 .. Last) of Natural := (1 => 1, 2 => 1, others => 0);
-- "global" array to store the Q(I)
-- if Q_Store(I)=0, we compute Q(I) and update Q_Store(I)
-- else we already know Q(I) = Q_Store(I)
function Q(N: Positive) return Positive is
begin
if Q_Store(N) = 0 then
Q_Store(N) := Q(N - Q(N-1)) + Q(N-Q(N-2));
end if;
return Q_Store(N);
end Q;
begin
for I in First .. Last loop
Q_Proc(Q(I));
end loop;
end Q;
procedure Print(P: Positive) is
begin
Ada.Text_IO.Put(Positive'Image(P));
end Print;
Decrease_Counter: Natural := 0;
Previous_Value: Positive := 1;
procedure Decrease_Count(P: Positive) is
begin
if P < Previous_Value then
Decrease_Counter := Decrease_Counter + 1;
end if;
Previous_Value := P;
end Decrease_Count;
begin
Q(1, 10, Print'Access);
-- the first ten terms of the sequence are: 1, 1, 2, 3, 3, 4, 5, 5, 6, and 6
Ada.Text_IO.New_Line;
Q(1000, 1000, Print'Access);
-- the 1000'th term is: 502
Ada.Text_IO.New_Line;
Q(2, 100_000, Decrease_Count'Access);
Ada.Text_IO.Put_Line(Integer'Image(Decrease_Counter));
-- how many times a member of the sequence is less than its preceding term
-- for terms up to and including the 100,000'th term
end Hofstadter_Q_Sequence;

View file

@ -0,0 +1,9 @@
q: new [1 1]
n: 2
while [n<1001][
'q ++ (get q n-q\[n-1]) + get q n-q\[n-2]
n: n+1
]
print ["First ten items:" first.n: 10 q]
print ["1000th item:" q\[999]]

View file

@ -0,0 +1,20 @@
SetBatchLines, -1
Q := HofsQSeq(100000)
Loop, 10
Out .= Q[A_Index] ", "
MsgBox, % "First ten:`t" Out "`n"
. "1000th:`t`t" Q[1000] "`n"
. "Flips:`t`t" Q.flips
HofsQSeq(n) {
Q := {1: 1, 2: 1, "flips": 0}
Loop, % n - 2 {
i := A_Index + 2
, Q[i] := Q[i - Q[i - 1]] + Q[i - Q[A_Index]]
if (Q[i] < Q[i - 1])
Q.flips++
}
return Q
}

View file

@ -0,0 +1,17 @@
limite = 100000
dim Q[limite+1]
cont = 0
Q[1] = 1
Q[2] = 1
for i = 3 to limite
Q[i] = Q[i-Q[i-1]] + Q[i-Q[i-2]]
if Q[i] < Q[i-1] then cont += 1
next i
print "Primeros 10 términos: ";
for i = 1 to 10
print Q[i] + " ";
next i
print "Término número 1000: "; Q[1000]
print "Términos menores que los anteriores: "; cont

View file

@ -0,0 +1,18 @@
PRINT "First 10 terms of Q = " ;
FOR i% = 1 TO 10 : PRINT ;FNq(i%, c%) " "; : NEXT : PRINT
PRINT "1000th term = " ; FNq(1000, c%)
PRINT "100000th term = " ; FNq(100000, c%)
PRINT "Term is less than preceding term " ; c% " times"
END
DEF FNq(n%, RETURN c%)
LOCAL i%,q%()
IF n% < 3 THEN = 1 ELSE IF n% = 3 THEN = 2
DIM q%(n%)
q%(1) = 1 : q%(2) = 1 : q%(3) = 2
c% = 0
FOR i% = 3 TO n%
q%(i%) = q%(i% - q%(i%-1)) + q%(i% - q%(i%-2))
IF q%(i%) < q%(i%-1) THEN c% += 1
NEXT
= q%(n%)

View file

@ -0,0 +1,15 @@
get "libhdr"
let start() be
$( let Q = vec 1000
Q!1 := 1
Q!2 := 1
for n = 3 to 1000 do
Q!n := Q!(n-Q!(n-1)) + Q!(n-Q!(n-2))
writes("The first 10 terms are:")
for n = 1 to 10 do writef(" %N", Q!n)
writef("*NThe 1000th term is: %N*N", Q!1000)
$)

View file

@ -0,0 +1,32 @@
( 0:?memocells
& tbl$(memo,!memocells+1) { allocate array }
& ( Q
=
. !arg:(1|2)&1
| !arg:>2
& ( !arg:>!memocells:?memocells { Array is too small. }
& tbl$(memo,!memocells+1) { Let array grow to needed size. }
| { Array is not too small. }
)
& ( !(!arg$memo):>0 { Set index to !arg. Return value at index if > 0 }
| Q$(!arg+-1*Q$(!arg+-1))+Q$(!arg+-1*Q$(!arg+-2))
: ?(!arg$?memo) { Set index to !arg. Store value just found. }
)
)
& 0:?i
& whl
' (1+!i:~>10:?i&put$(str$(Q$!i " ")))
& put$\n
& whl'(1+!i:~>1000:?i&Q$!i)
& out$(Q$1000)
& 0:?previous:?lessThan:?i
& whl
' ( 1+!i:~>100000:?i
& Q$!i
: ( <!previous&1+!lessThan:?lessThan
| ?
)
: ?previous
)
& out$!lessThan
);

View file

@ -0,0 +1,20 @@
#include <iostream>
int main() {
const int size = 100000;
int hofstadters[size] = { 1, 1 };
for (int i = 3 ; i < size; i++)
hofstadters[ i - 1 ] = hofstadters[ i - 1 - hofstadters[ i - 1 - 1 ]] +
hofstadters[ i - 1 - hofstadters[ i - 2 - 1 ]];
std::cout << "The first 10 numbers are: ";
for (int i = 0; i < 10; i++)
std::cout << hofstadters[ i ] << ' ';
std::cout << std::endl << "The 1000'th term is " << hofstadters[ 999 ] << " !" << std::endl;
int less_than_preceding = 0;
for (int i = 0; i < size - 1; i++)
if (hofstadters[ i + 1 ] < hofstadters[ i ])
less_than_preceding++;
std::cout << "In array of size: " << size << ", ";
std::cout << less_than_preceding << " times a number was preceded by a greater number!" << std::endl;
return 0;
}

View file

@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
namespace HofstadterQSequence
{
class Program
{
// Initialize the dictionary with the first two indices filled.
private static readonly Dictionary<int, int> QList = new Dictionary<int, int>
{
{1, 1},
{2, 1}
};
private static void Main()
{
int lessThanLast = 0;
/* Initialize our variable that holds the number of times
* a member of the sequence was less than its preceding term. */
for (int n = 1; n <= 100000; n++)
{
int q = Q(n); // Get Q(n).
if (n > 1 && QList[n - 1] > q) // If Q(n) is less than Q(n - 1),
lessThanLast++; // then add to the counter.
if (n > 10 && n != 1000) continue; /* If n is greater than 10 and not 1000,
* the rest of the code in the loop does not apply,
* and it will be skipped. */
if (!Confirm(n, q)) // Confirm Q(n) is correct.
throw new Exception(string.Format("Invalid result: Q({0}) != {1}", n, q));
Console.WriteLine("Q({0}) = {1}", n, q); // Write Q(n) to the console.
}
Console.WriteLine("Number of times a member of the sequence was less than its preceding term: {0}.",
lessThanLast);
}
private static bool Confirm(int n, int value)
{
if (n <= 10)
return new[] {1, 1, 2, 3, 3, 4, 5, 5, 6, 6}[n - 1] == value;
if (n == 1000)
return 502 == value;
throw new ArgumentException("Invalid index.", "n");
}
private static int Q(int n)
{
int q;
if (!QList.TryGetValue(n, out q)) // Try to get Q(n) from the dictionary.
{
q = Q(n - Q(n - 1)) + Q(n - Q(n - 2)); // If it's not available, then calculate it.
QList.Add(n, q); // Add it to the dictionary.
}
return q;
}
}
}

View file

@ -0,0 +1,24 @@
#include <stdio.h>
#include <stdlib.h>
#define N 100000
int main()
{
int i, flip, *q = (int*)malloc(sizeof(int) * N) - 1;
q[1] = q[2] = 1;
for (i = 3; i <= N; i++)
q[i] = q[i - q[i - 1]] + q[i - q[i - 2]];
for (i = 1; i <= 10; i++)
printf("%d%c", q[i], i == 10 ? '\n' : ' ');
printf("%d\n", q[1000]);
for (flip = 0, i = 1; i < N; i++)
flip += q[i] > q[i + 1];
printf("flips: %d\n", flip);
return 0;
}

View file

@ -0,0 +1,26 @@
q_seq = proc (n: int) returns (sequence[int])
q: array[int] := array[int]$[1,1]
for i: int in int$from_to(3,n) do
array[int]$addh(q, q[i-q[i-1]] + q[i-q[i-2]])
end
return(sequence[int]$a2s(q))
end q_seq
start_up = proc ()
po: stream := stream$primary_output()
q: sequence[int] := q_seq(100000)
stream$puts(po, "First 10 terms:")
for i: int in int$from_to(1,10) do
stream$puts(po, " " || int$unparse(q[i]))
end
stream$puts(po, "\n1000th term: " || int$unparse(q[1000]))
flips: int := 0
for i: int in int$from_to(2, sequence[int]$size(q)) do
if q[i-1]>q[i] then flips := flips + 1 end
end
stream$putl(po, "\nflips: " || int$unparse(flips))
end start_up

View file

@ -0,0 +1,40 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. Q-SEQ.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SEQ.
02 Q PIC 9(3) OCCURS 1000 TIMES.
02 Q-TMP1 PIC 9(3).
02 Q-TMP2 PIC 9(3).
02 N PIC 9(4).
01 DISPLAYING.
02 ITEM PIC Z(3).
02 IX PIC Z(4).
PROCEDURE DIVISION.
MAIN-PROGRAM.
PERFORM GENERATE-SEQUENCE.
PERFORM SHOW-ITEM
VARYING N FROM 1 BY 1
UNTIL N IS GREATER THAN 10.
SET N TO 1000.
PERFORM SHOW-ITEM.
STOP RUN.
GENERATE-SEQUENCE.
SET Q(1) TO 1.
SET Q(2) TO 1.
PERFORM GENERATE-ITEM
VARYING N FROM 3 BY 1
UNTIL N IS GREATER THAN 1000.
GENERATE-ITEM.
COMPUTE Q-TMP1 = N - Q(N - 1).
COMPUTE Q-TMP2 = N - Q(N - 2).
COMPUTE Q(N) = Q(Q-TMP1) + Q(Q-TMP2).
SHOW-ITEM.
MOVE N TO IX.
MOVE Q(N) TO ITEM.
DISPLAY 'Q(' IX ') = ' ITEM.

View file

@ -0,0 +1,13 @@
(defn qs [q]
(let [n (count q)]
(condp = n
0 [1]
1 [1 1]
(conj q (+ (q (- n (q (- n 1))))
(q (- n (q (- n 2)))))))))
(defn qfirst [n] (-> (iterate qs []) (nth n)))
(println "first 10:" (qfirst 10))
(println "1000th:" (last (qfirst 1000)))
(println "extra credit:" (->> (qfirst 100000) (partition 2 1) (filter #(apply > %)) count))

View file

@ -0,0 +1,3 @@
first 10: [1 1 2 3 3 4 5 5 6 6]
1000th: 502
extra credit: 49798

View file

@ -0,0 +1,11 @@
hofstadterQ = do ->
memo = [ 1 ,1, 1]
Q = (n) ->
result = memo[n]
if typeof result != 'number'
result = memo[n] = Q(n - Q(n - 1)) + Q(n - Q(n - 2))
result
# some results:
console.log 'Q(' + i + ') = ' + hofstadterQ(i) for i in [1..10]
console.log 'Q(1000) = ' + hofstadterQ(1000)

View file

@ -0,0 +1,27 @@
(defparameter *mm* (make-hash-table :test #'equal))
;;; generic memoization macro
(defmacro defun-memoize (f (&rest args) &body body)
(defmacro hash () `(gethash (cons ',f (list ,@args)) *mm*))
(let ((h (gensym)))
`(defun ,f (,@args)
(let ((,h (hash)))
(if ,h ,h
(setf (hash) (progn ,@body)))))))
;;; def q
(defun-memoize q (n)
(if (<= n 2) 1
(+ (q (- n (q (- n 1))))
(q (- n (q (- n 2)))))))
;;; test
(format t "First of Q: ~a~%Q(1000): ~a~%Bumps up to 100000: ~a~%"
(loop for i from 1 to 10 collect (q i))
(q 1000)
(loop with c = 0 with last-q = (q 1)
for i from 2 to 100000
do (let ((next-q (q i)))
(if (< next-q last-q) (incf c))
(setf last-q next-q))
finally (return c)))

View file

@ -0,0 +1,12 @@
(let ((cc (make-array 3 :element-type 'integer
:initial-element 1
:adjustable t
:fill-pointer 3)))
(defun q (n)
(when (>= n (length cc))
(loop for i from (length cc) below n do (q i))
(vector-push-extend
(+ (aref cc (- n (aref cc (- n 1))))
(aref cc (- n (aref cc (- n 2)))))
cc))
(aref cc n)))

View file

@ -0,0 +1,27 @@
include "cowgol.coh";
# Generate 1000 terms of the Q sequence
var Q: uint16[1001];
Q[1] := 1;
Q[2] := 1;
var n: @indexof Q := 3;
while n <= 1000 loop
Q[n] := Q[n-Q[n-1]] + Q[n-Q[n-2]];
n := n + 1;
end loop;
# Print first 10 terms
print("The first 10 terms are: ");
n := 1;
while n <= 10 loop
print_i16(Q[n]);
print_char(' ');
n := n + 1;
end loop;
print_nl();
# Print 1000th term
print("The 1000th term is: ");
print_i16(Q[1000]);
print_nl();

View file

@ -0,0 +1,19 @@
import std.stdio, std.algorithm, std.functional, std.range;
int Q(in int n) nothrow
in {
assert(n > 0);
} body {
alias mQ = memoize!Q;
if (n == 1 || n == 2)
return 1;
else
return mQ(n - mQ(n - 1)) + mQ(n - mQ(n - 2));
}
void main() {
writeln("Q(n) for n = [1..10] is: ", iota(1, 11).map!Q);
writeln("Q(1000) = ", Q(1000));
writefln("Q(i) is less than Q(i-1) for i [2..100_000] %d times.",
iota(2, 100_001).count!(i => Q(i) < Q(i - 1)));
}

View file

@ -0,0 +1,19 @@
import std.stdio, std.algorithm, std.range, std.array;
uint Q(in int n) nothrow
in {
assert(n > 0);
} body {
__gshared static Appender!(int[]) s = [0, 1, 1];
foreach (immutable i; s.data.length .. n + 1)
s ~= s.data[i - s.data[i - 1]] + s.data[i - s.data[i - 2]];
return s.data[n];
}
void main() {
writeln("Q(n) for n = [1..10] is: ", iota(1, 11).map!Q);
writeln("Q(1000) = ", Q(1000));
writefln("Q(i) is less than Q(i-1) for i [2..100_000] %d times.",
iota(2, 100_001).count!(i => Q(i) < Q(i - 1)));
}

View file

@ -0,0 +1,31 @@
import std.stdio;
int[100_000] Q;
void main() {
Q[0] = 1;
Q[1] = 1;
for (int i = 2; i < 100_000; i++)
{
Q[i] = Q[i - Q[i - 1]] + Q[i - Q[i - 2]];
}
write("Q(1..10) : ");
for (int i = 0; i < 10; i++)
{
write(" ", Q[i]);
}
writeln;
write("Q(1000) : ");
writeln(Q[999]);
int lt = 0;
for (int i = 1; i < 100_000; i++)
{
if( Q[i-1] > Q[i] ) lt++;
}
writefln("Q(i) is less than Q(i-1) for i [2..100_000] %d times.", lt);
}

View file

@ -0,0 +1,8 @@
int Q(int n) => n>2 ? Q(n-Q(n-1))+Q(n-Q(n-2)) : 1;
main() {
for(int i=1;i<=10;i++) {
print("Q($i)=${Q(i)}");
}
print("Q(1000)=${Q(1000)}");
}

View file

@ -0,0 +1,42 @@
class Q {
Map<int,int> _table;
Q() {
_table=new Map<int,int>();
_table[1]=1;
_table[2]=1;
}
int q(int n) {
// if the cache is not filled until n-1, fill it starting with the lowest entries first
// this avoids doing a recursion from n to 2 (e.g. if you call q(1000000) first)
// this doesn't happen in the tasks calls since the cache is filled ascending
if(_table[n-1]==null) {
for(int i=_table.length;i<n;i++) {
q(i);
}
}
if(_table[n]==null) {
_table[n]=q(n-q(n-1))+q(n-q(n-2));
}
return _table[n];
}
}
main() {
Q q=new Q();
for(int i=1;i<=10;i++) {
print("Q($i)=${q.q(i)}");
}
print("Q(1000)=${q.q(1000)}");
int count=0;
for(int i=2;i<=100000;i++) {
if(q.q(i)<q.q(i-1)) {
count++;
}
}
print("value is smaller than previous $count times");
}

View file

@ -0,0 +1,17 @@
main() {
List<int> q=new List<int>(100001);
q[1]=q[2]=1;
int count=0;
for(int i=3;i<q.length;i++) {
q[i]=q[i-q[i-1]]+q[i-q[i-2]];
if(q[i]<q[i-1]) {
count++;
}
}
for(int i=1;i<=10;i++) {
print("Q($i)=${q[i]}");
}
print("Q(1000)=${q[1000]}");
print("value is smaller than previous $count times");
}

View file

@ -0,0 +1,32 @@
type TIntArray = array of integer;
procedure FillHofstadterArray(var HA: TIntArray);
{Fill array with Hofstader numbers}
{Preset array size to the number of terms you want}
var I: integer;
begin
{Starting condition}
HA[1]:=1; HA[2]:=1;
{Fill array up to last item}
for I:=3 to High(HA) do HA[I]:=HA[I-HA[I-1]]+HA[I-HA[I-2]];
end;
procedure ShowHofstadterNumbers(Memo: TMemo);
{Fill array with a }
var I, LessCount: integer;
var QArray: TIntArray;
begin
{Select the number of items we want}
SetLength(QArray,100000);
{Fill array}
FillHofstadterArray(QArray);
{Display first 10}
for I:=1 to 10 do Memo.Lines.Add(Format('%4d: %4d',[I,QArray[I]]));
Memo.Lines.Add(Format('%4d: %4d',[1000,QArray[1000]]));
{Count number the number of times Q(n)<Q(n-1)}
LessCount:=0;
for I:=1 to High(QArray) do
if QArray[I]>QArray[I-1] then Inc(LessCount);
Memo.Lines.Add('Count of Q(n)<Q(n-1) = '+IntToStr(LessCount));
end;

View file

@ -0,0 +1,20 @@
proc nonrec make_Q([*] word q) void:
word n;
q[1] := 1;
q[2] := 1;
for n from 3 upto dim(q,1)-1 do
q[n] := q[n-q[n-1]] + q[n-q[n-2]]
od
corp
proc nonrec main() void:
word MAX = 1000;
word i;
[MAX+1] word q;
make_Q(q);
write("The first 10 terms are:");
for i from 1 upto 10 do write(" ", q[i]) od;
writeln();
writeln("The 1000th term is: ", q[1000])
corp

View file

@ -0,0 +1,35 @@
PROGRAM HOFSTADER_Q
!
! for rosettacode.org
!
DIM Q%[10000]
PROCEDURE QSEQUENCE(Q,FLAG%->SEQ$)
! if FLAG% is true accumulate sequence in SEQ$
! (attention to string var lenght=255)
! otherwise calculate values in Q%[] only
LOCAL N
Q%[1]=1
Q%[2]=1
SEQ$="1 1"
IF NOT FLAG% THEN Q=NUM END IF
FOR N=3 TO Q DO
Q%[N]=Q%[N-Q%[N-1]]+Q%[N-Q%[N-2]]
IF FLAG% THEN SEQ$=SEQ$+STR$(Q%[N]) END IF
END FOR
END PROCEDURE
BEGIN
NUM=10000
QSEQUENCE(10,TRUE->SEQ$)
PRINT("Q-sequence(1..10) : ";SEQ$)
QSEQUENCE(1000,FALSE->SEQ$)
PRINT("1000th number of Q sequence : ";Q%[1000])
FOR N=2 TO NUM DO
IF Q%[N]<Q%[N-1] THEN NN+=1 END IF
END FOR
PRINT("Number of Q(n)<Q(n+1) for n<=10000 : ";NN)
END PROGRAM

View file

@ -0,0 +1,23 @@
(define RECURSE_BUMP 500) ;; minimum of chrome:500 safari:1000 firefox:2000
;; count flips
(define (flips N)
(for/sum ((n (in-range 2 (1+ N))))
#:when (< (Q n) (Q (1- n))) 1))
(cache-size 120000)
(define (Q n)
;; prevent browser stack overflow at low-cost
(when (zero? (modulo n RECURSE_BUMP)) (for ((i (in-range 0 n RECURSE_BUMP ))) (Q i)))
(+ (Q (- n (Q (1- n)))) (Q (- n (Q (- n 2))))))
(remember 'Q #(1 1 1)) ;; memoize and init
;; first call : check stack OK
(Q 100000) → 48157
(for ((i 11)) (write (Q i)))
1 1 1 2 3 3 4 5 5 6 6
(Q 1000) → 502
(flips 100000) → 49798

View file

@ -0,0 +1,60 @@
class
APPLICATION
create
make
feature
make
-- Test output of the feature hofstadter_q_sequence.
local
count, i: INTEGER
test: ARRAY [INTEGER]
do
io.put_string ("%NFirst ten numbers: %N")
test := hofstadter_q_sequence (10)
across
test as ar
loop
io.put_string (ar.item.out + "%T")
end
test := hofstadter_q_sequence (100000)
io.put_string ("1000th:%N")
io.put_integer (test [1000])
io.put_string ("%NNumber of Flips:%N")
from
i := 2
until
i > 100000
loop
if test [i] < test [i - 1] then
count := count + 1
end
i := i + 1
end
io.put_integer (count)
end
hofstadter_q_sequence (lim: INTEGER): ARRAY [INTEGER]
-- Hofstadter Q Sequence up to 'lim'.
require
lim_positive: lim > 0
local
q: ARRAY [INTEGER]
i: INTEGER
do
create Result.make_filled (1, 1, lim)
Result [1] := 1
Result [2] := 1
from
i := 3
until
i > lim
loop
Result [i] := Result [i - Result [i - 1]] + Result [i - Result [i - 2]]
i := i + 1
end
end
end

View file

@ -0,0 +1,24 @@
defmodule Hofstadter do
defp flip(v2, v1) when v1 > v2, do: 1
defp flip(_v2, _v1), do: 0
defp list_terms(max, n, acc), do: Enum.map_join(n..max, ", ", &acc[&1])
defp hofstadter(n, n, acc, flips) do
IO.puts "The first ten terms are: #{list_terms(10, 1, acc)}"
IO.puts "The 1000'th term is #{acc[1000]}"
IO.puts "Number of flips: #{flips}"
end
defp hofstadter(max, n, acc, flips) do
qn1 = acc[n-1]
qn = acc[n - qn1] + acc[n - acc[n-2]]
hofstadter(max, n+1, Map.put(acc, n, qn), flips + flip(qn, qn1))
end
def main(max \\ 100_000) do
acc = %{1 => 1, 2 => 1}
hofstadter(max+1, 3, acc, 0)
end
end
Hofstadter.main

View file

@ -0,0 +1,30 @@
%% @author Jan Willem Luiten <jwl@secondmove.com>
%% Hofstadter Q Sequence for Rosetta Code
-module(hofstadter).
-export([main/0]).
-define(MAX, 100000).
flip(V2, V1) when V1 > V2 -> 1;
flip(_V2, _V1) -> 0.
list_terms(N, N, Acc) ->
io:format("~w~n", [array:get(N, Acc)]);
list_terms(Max, N, Acc) ->
io:format("~w, ", [array:get(N, Acc)]),
list_terms(Max, N+1, Acc).
hofstadter(N, N, Acc, Flips) ->
io:format("The first ten terms are: "),
list_terms(9, 0, Acc),
io:format("The 1000'th term is ~w~n", [array:get(999, Acc)]),
io:format("Number of flips: ~w~n", [Flips]);
hofstadter(Max, N, Acc, Flips) ->
Qn1 = array:get(N-1, Acc),
Qn = array:get(N - Qn1, Acc) + array:get(N - array:get(N-2, Acc), Acc),
hofstadter(Max, N+1, array:set(N, Qn, Acc), Flips + flip(Qn, Qn1)).
main() ->
Tmp = array:set(0, 1, array:new(?MAX)),
Acc = array:set(1, 1, Tmp),
hofstadter(?MAX, 2, Acc, 0).

View file

@ -0,0 +1,2 @@
// Populate an array with values of Hofstadter Q sequence. Nigel Galloway: August 26th., 2020
let fQ N=let g=Array.length N in N.[0]<-1; N.[1]<-1;(for g in 2..g-1 do N.[g]<-N.[g-N.[g-1]]+N.[g-N.[g-2]])

View file

@ -0,0 +1,2 @@
let Q=Array.zeroCreate<int>10 in fQ Q; printfn "%A" Q
let Q=Array.zeroCreate<int>1000 in fQ Q; printfn "%d" (Array.last Q)

View file

@ -0,0 +1 @@
let Q=Array.zeroCreate<int>100000 in fQ Q; printfn "%d" (Q|>Seq.pairwise|>Seq.sumBy(fun(n,g)->if n>g then 1 else 0))

View file

@ -0,0 +1,2 @@
let Q=Array.zeroCreate<int>2500000000 in fQ Q; printfn "%d" (Array.last Q)
let Q=Array.zeroCreate<int>5000000000 in fQ Q; printfn "%d" (Array.last Q)

View file

@ -0,0 +1,7 @@
( scratchpad ) : next ( seq -- newseq )
dup 2 tail* over length [ swap - ] curry map
[ dupd swap nth ] map 0 [ + ] reduce suffix ;
( scratchpad ) { 1 1 } 1000 [ next ] times dup 10 head . 999 swap nth .
{ 1 1 2 3 3 4 5 5 6 6 }
502

View file

@ -0,0 +1,13 @@
Func Hq(n) = if n<2 then 1 else
Array qq[n+1];
qq[1] := 1;
qq[2] := 1;
for i = 3, n do
qq[i]:=qq[i-qq[i-1]]+qq[i-qq[i-2]]
od;
Return(qq[n]);
fi;
.
for i=1 to 10 do !Hq(i);!' ' od;
Hq(1000)

View file

@ -0,0 +1,27 @@
100000 constant N
: q ( n -- addr ) cells here + ;
: qinit
1 0 q !
1 1 q !
N 2 do
i i 1- q @ - q @
i i 2 - q @ - q @
+ i q !
loop ;
: flips
." flips: "
0 N 1 do
i q @ i 1- q @ < if 1+ then
loop . cr ;
: qprint ( n -- )
0 do i q @ . loop cr ;
qinit
10 qprint
999 q @ . cr
flips
bye

View file

@ -0,0 +1,30 @@
Calculate the Hofstadter Q-sequence, using a big array rather than recursion.
INTEGER ENUFF
PARAMETER (ENUFF = 100000)
INTEGER Q(ENUFF) !Lots of memory these days.
Q(1) = 1 !Initial values as per the definition.
Q(2) = 1
Q(3:) = -123456789!This will surely cause trouble!
DO I = 3,ENUFF !For values beyond the second,
Q(I) = Q(I - Q(I - 1)) + Q(I - Q(I - 2)) !Reach back according to the last two values.
END DO
Cast forth results as per the specification.
WRITE (6,1) Q(1:10) !Should be 1 1 2 3 3 4 5 5 6 6...
1 FORMAT ("First ten values:",10I2) !Known to be one-digit numbers.
WRITE (6,*) "Q(1000) =",Q(1000) !Should be 502.
WRITE (6,3) ENUFF,COUNT(Q(2:ENUFF) < Q(1:ENUFF - 1)) !Please don't create a temporary array!
3 FORMAT ("Count of those elements 2:",I0,
1 " which are less than their predecessor: ",I0) !Should be 49798.
Curry favour by allowing enquiries.
10 WRITE (6,11) ENUFF
11 FORMAT ("Nominate an index (in 1:",I0,"): ",$) !Obviously, the $ says don't start a new line.
READ (5,*,END = 999, ERR = 999) I !Ask for a number, with precautions.
IF (I.GT.0 .AND. I.LE.ENUFF) THEN !A good number, but, within range?
WRITE (6,12) I,Q(I) !Yes. Reveal the requested value.
12 FORMAT ("Q(",I0,") = ",I0) !This should do.
GO TO 10 !And ask again.
END IF ! WHILE read(5,*) i & i > 0 & i < enuff DO write(6,*) "Q(",i,")=",Q(i);
Closedown.
999 WRITE (6,*) "Bye."
END

View file

@ -0,0 +1,21 @@
Const limite = 100000
Dim As Long Q(limite), i, cont = 0
Q(1) = 1
Q(2) = 1
For i = 3 To limite
Q(i) = Q(i-Q(i-1)) + Q(i-Q(i-2))
If Q(i) < Q(i-1) Then cont += 1
Next i
Print "Primeros 10 terminos: ";
For i = 1 To 10
Print Q(i) &" ";
Next i
Print
Print "Termino numero 1000: "; Q(1000)
Print "Terminos menores que los anteriores: " &cont
End

View file

@ -0,0 +1,9 @@
10 DIM Q!(1000)
20 Q(1) = 1: Q(2) = 1
30 FOR N = 3 TO 1000
40 Q(N) = Q(N - Q(N - 1)) + Q(N - Q(N - 2))
50 NEXT N
60 FOR N = 1 TO 10
70 PRINT Q(N)
80 NEXT N
90 PRINT Q(1000)

View file

@ -0,0 +1,46 @@
package main
import "fmt"
var m map[int]int
func initMap() {
m = make(map[int]int)
m[1] = 1
m[2] = 1
}
func q(n int) (r int) {
if r = m[n]; r == 0 {
r = q(n-q(n-1)) + q(n-q(n-2))
m[n] = r
}
return
}
func main() {
initMap()
// task
for n := 1; n <= 10; n++ {
showQ(n)
}
// task
showQ(1000)
// extra credit
count, p := 0, 1
for n := 2; n <= 1e5; n++ {
qn := q(n)
if qn < p {
count++
}
p = qn
}
fmt.Println("count:", count)
// extra credit
initMap()
showQ(1e6)
}
func showQ(n int) {
fmt.Printf("Q(%d) = %d\n", n, q(n))
}

View file

@ -0,0 +1,8 @@
qSequence = tail qq where
qq = 0 : 1 : 1 : map g [3..]
g n = qq !! (n - qq !! (n-1)) + qq !! (n - qq !! (n-2))
-- Output:
*Main> (take 10 qSequence, qSequence !! (1000-1))
([1,1,2,3,3,4,5,5,6,6],502)
(0.00 secs, 525044 bytes)

View file

@ -0,0 +1,21 @@
import Data.Array
qSequence n = arr
where
arr = listArray (1,n) $ 1:1: map g [3..n]
g i = arr!(i - arr!(i-1)) +
arr!(i - arr!(i-2))
gradualth m k arr -- gradually precalculate m-th item
| m <= v = pre `seq` arr!m -- in steps of k
where -- to prevent STACK OVERFLOW
pre = foldl1 (\a b-> a `seq` arr!b) [u,u+k..m]
(u,v) = bounds arr
qSeqTest m n = let arr = qSequence $ max m n in
( take 10 . elems $ arr -- 10 first items
, gradualth m 10000 $ arr -- m-th item
, length . filter (> 0) -- reversals in n items
. _S (zipWith (-)) tail . take n . elems $ arr )
_S f g x = f x (g x)

View file

@ -0,0 +1,7 @@
Prelude Main> qSeqTest 1000 100000 -- reversals in 100,000
([1,1,2,3,3,4,5,5,6,6],502,49798)
(0.09 secs, 18879708 bytes)
Prelude Main> qSeqTest 1000000 100000 -- 1,000,000-th item
([1,1,2,3,3,4,5,5,6,6],512066,49798)
(2.80 secs, 87559640 bytes)

View file

@ -0,0 +1,16 @@
q = qq (listArray (1,2) [1,1]) 1 where
qq ar n = (arr!n) : qq arr (n+1) where
l = snd (bounds ar)
step n =arr!(n - (fromIntegral (arr!(n - 1)))) +
arr!(n - (fromIntegral (arr!(n - 2))))
arr :: Array Int Integer
arr | n <= l = ar
| otherwise = listArray (1, l*2)$
([ar!i | i <- [1..l]] ++
[step i | i <- [l+1..l*2]])
main = do
putStr("first 10: "); print (take 10 q)
putStr("1000-th: "); print (q !! 999)
putStr("flips: ")
print $ length $ filter id $ take 100000 (zipWith (>) q (tail q))

View file

@ -0,0 +1,21 @@
import Data.Array
import Data.Int (Int64)
q = qq [listArray (1,2) [1,1]] 1 where
qq a n = seek aa n : qq aa (1 + n) where
aa | n <= l = a
| otherwise = listArray (l+1,l*2) (take l $ drop 2 lst):a
where
l = snd (bounds $ head a)
lst = seek a (l-1):seek a l:(ext lst (l+1))
ext (q1:q2:qs) i = (g (i-q2) + g (i-q1)):ext (q2:qs) (1+i)
g = seek aa
seek (ar:ars) n
| n >= fst (bounds ar) = ar ! n
| otherwise = seek ars n
-- Only a perf test. Task can be done exactly the same as above
main = print $ sum qqq
where
qqq :: [Int64]
qqq = map fromIntegral $ take 3000000 q

View file

@ -0,0 +1,12 @@
100 PROGRAM "QSequen.bas"
110 LET LIMIT=1000
120 NUMERIC Q(1 TO LIMIT)
130 LET Q(1),Q(2)=1
140 FOR I=3 TO LIMIT
150 LET Q(I)=Q(I-Q(I-1))+Q(I-Q(I-2))
160 NEXT
170 PRINT "First 10 terms:"
180 FOR I=1 TO 10
190 PRINT Q(I);
200 NEXT
210 PRINT :PRINT "Term 1000:";Q(1000)

View file

@ -0,0 +1,39 @@
link printf
procedure main()
V := [1, 1, 2, 3, 3, 4, 5, 5, 6, 6]
every i := 1 to *V do
if Q(i) ~= V[i] then stop("Assertion failure for position ",i)
printf("Q(1 to %d) - verified.\n",*V)
q := Q(n := 1000)
v := 502
printf("Q[%d]=%d - %s.\n",n,v,if q = v then "verified" else "failed")
invcount := 0
every i := 2 to (n := 100000) do
if Q(i) < Q(i-1) then {
printf("Q(%d)=%d < Q(%d)=%d\n",i,Q(i),i-1,Q(i-1))
invcount +:= 1
}
printf("There were %d inversions in Q up to %d\n",invcount,n)
end
procedure Q(n) #: Hofstader Q sequence
static S
initial S := [1,1]
if q := S[n] then return q
else {
q := Q(n - Q(n - 1)) + Q(n - Q(n - 2))
if *S = n - 1 then {
put(S,q)
return q
}
else
runerr(500,n)
}
end

View file

@ -0,0 +1,8 @@
Qs=:0 1 1
Q=: verb define
n=. >./,y
while. n>:#Qs do.
Qs=: Qs,+/(-_2{.Qs){Qs
end.
y{Qs
)

View file

@ -0,0 +1 @@
Q=: 1:`(+&$:/@:- $:@-& 1 2)@.(>&2)"0 M.

View file

@ -0,0 +1,6 @@
Q 1+i.10
1 1 2 3 3 4 5 5 6 6
Q 1000
502
+/2>/\ Q 1+i.100000
49798

View file

@ -0,0 +1,46 @@
import java.util.HashMap;
import java.util.Map;
public class HofQ {
private static Map<Integer, Integer> q = new HashMap<Integer, Integer>(){{
put(1, 1);
put(2, 1);
}};
private static int[] nUses = new int[100001];//not part of the task
public static int Q(int n){
nUses[n]++;//not part of the task
if(q.containsKey(n)){
return q.get(n);
}
int ans = Q(n - Q(n - 1)) + Q(n - Q(n - 2));
q.put(n, ans);
return ans;
}
public static void main(String[] args){
for(int i = 1; i <= 10; i++){
System.out.println("Q(" + i + ") = " + Q(i));
}
int last = 6;//value for Q(10)
int count = 0;
for(int i = 11; i <= 100000; i++){
int curr = Q(i);
if(curr < last) count++;
last = curr;
if(i == 1000) System.out.println("Q(1000) = " + curr);
}
System.out.println("Q(i) is less than Q(i-1) for i <= 100000 " + count + " times");
//Optional stuff below here
int maxUses = 0, maxN = 0;
for(int i = 1; i<nUses.length;i++){
if(nUses[i] > maxUses){
maxUses = nUses[i];
maxN = i;
}
}
System.out.println("Q(" + maxN + ") was called the most with " + maxUses + " calls");
}
}

View file

@ -0,0 +1,18 @@
var hofstadterQ = function() {
var memo = [1,1,1];
var Q = function (n) {
var result = memo[n];
if (typeof result !== 'number') {
result = Q(n - Q(n-1)) + Q(n - Q(n-2));
memo[n] = result;
}
return result;
};
return Q;
}();
for (var i = 1; i <=10; i += 1) {
console.log('Q('+ i +') = ' + hofstadterQ(i));
}
console.log('Q(1000) = ' + hofstadterQ(1000));

View file

@ -0,0 +1,40 @@
(() => {
'use strict';
// hofQSeq :: Int -> [Int]
const hofQSeq = x =>
x > 2 ? tail(foldl((Q, n) =>
n < 3 ? Q : Q.concat(
Q[n - Q[n - 1]] + Q[n - Q[n - 2]]
), [0, 1, 1],
range(1, x))) : (x > 0 ? take(x, [1, 1]) : undefined);
// GENERIC FUNCTIONS -------------------------------------------
// foldl :: (b -> a -> b) -> b -> [a] -> b
const foldl = (f, a, xs) => xs.reduce(f, a),
// range :: Int -> Int -> [Int]
range = (m, n) =>
Array.from({
length: Math.floor(n - m) + 1
}, (_, i) => m + i),
// tail :: [a] -> [a]
tail = xs => xs.length ? xs.slice(1) : undefined,
// last :: [a] -> a
last = xs => xs.length ? xs.slice(-1)[0] : undefined,
// Int -> [a] -> [a]
take = (n, xs) => xs.slice(0, n);
// TEST --------------------------------------------------------
return {
firstTen: hofQSeq(10),
thousandth: last(hofQSeq(1000)),
'Q<Q-1UpTo10E5': hofQSeq(100000)
.reduce((a, x, i, xs) => x < xs[i - 1] ? a + 1 : a, 0)
};
})();

View file

@ -0,0 +1,3 @@
{"firstTen":[1, 1, 2, 3, 3, 4, 5, 5, 6, 6],
"thousandth":502,
"Q<Q-1UpTo10E5":49798}

View file

@ -0,0 +1,28 @@
# For n>=2, Q(n) = Q(n - Q(n-1)) + Q(n - Q(n-2))
def Q:
def Q(n):
n as $n
| (if . == null then [1,1,1] else . end) as $q
| if $q[$n] != null then $q
else
$q | Q($n-1) as $q1
| $q1 | Q($n-2) as $q2
| $q2 | Q($n - $q2[$n - 1]) as $q3 # Q(n - Q(n-1))
| $q3 | Q($n - $q3[$n - 2]) as $q4 # Q(n - Q(n-2))
| ($q4[$n - $q4[$n-1]] + $q4[$n - $q4[$n -2]]) as $ans
| $q4 | setpath( [$n]; $ans)
end ;
. as $n | null | Q($n) | .[$n];
# count the number of times Q(i) > Q(i+1) for 0 < i < n
def flips(n):
(reduce range(3; n) as $n
([1,1,1]; . + [ .[$n - .[$n-1]] + .[$n - .[$n - 2 ]] ] )) as $q
| reduce range(0; n) as $i
(0; . + (if $q[$i] > $q[$i + 1] then 1 else 0 end)) ;
# The three tasks:
((range(0;11), 1000) | "Q(\(.)) = \( . | Q)"),
(100000 | "flips(\(.)) = \(flips(.))")

View file

@ -0,0 +1,20 @@
$ uname -a
Darwin Mac-mini 13.3.0 Darwin Kernel Version 13.3.0: Tue Jun 3 21:27:35 PDT 2014; root:xnu-2422.110.17~1/RELEASE_X86_64 x86_64
$ time jq -r -n -f hofstadter.jq
Q(0) = 1
Q(1) = 1
Q(2) = 1
Q(3) = 2
Q(4) = 3
Q(5) = 3
Q(6) = 4
Q(7) = 5
Q(8) = 5
Q(9) = 6
Q(10) = 6
Q(1000) = 502
flips(100000) = 49798
real 0m0.562s
user 0m0.541s
sys 0m0.011s

View file

@ -0,0 +1,13 @@
function hofstQseq(n, typerst::Type=Int)
nmax = maximum(n)
r = Vector{typerst}(nmax)
r[1] = 1
if nmax ≥ 2 r[2] = 1 end
for i in 3:nmax
r[i] = r[i - r[i - 1]] + r[i - r[i - 2]]
end
return r[n]
end
println("First ten elements of sequence: ", join(hofstQseq(1:10), ", "))
println("1000-th element: ", hofstQseq(1000))

View file

@ -0,0 +1,3 @@
seq = hofstQseq(1:100_000)
cnt = count(diff(seq) .< 0)
println("$cnt elements are less than the preceding one.")

View file

@ -0,0 +1,13 @@
// version 1.1.4
fun main(args: Array<String>) {
val q = IntArray(100_001)
q[1] = 1
q[2] = 1
for (n in 3..100_000) q[n] = q[n - q[n - 1]] + q[n - q[n - 2]]
print("The first 10 terms are : ")
for (i in 1..10) print("${q[i]} ")
println("\n\nThe 1000th term is : ${q[1000]}")
val flips = (2..100_000).count { q[it] < q[it - 1] }
println("\nThe number of flips for the first 100,000 terms is : $flips")
}

View file

@ -0,0 +1,14 @@
NORMAL MODE IS INTEGER
VECTOR VALUES FMT = $2HQ(,I4,3H) =,I4*$
DIMENSION Q(1000)
Q(1) = 1
Q(2) = 1
THROUGH FILL, FOR N=3, 1, N.G.1000
FILL Q(N) = Q(N-Q(N-1)) + Q(N-Q(N-2))
THROUGH SHOW, FOR N=1, 1, N.G.10
SHOW PRINT FORMAT FMT, N, Q(N)
PRINT FORMAT FMT, 1000, Q(1000)
END OF PROGRAM

View file

@ -0,0 +1,7 @@
function Q = Qsequence(N)
%% zeros are used to pre-allocate memory, this is not strictly necessary but can significantly improve performance for large N
Q = [1,1,zeros(1,N-2)];
for n=3:N
Q(n) = Q(n-Q(n-1))+Q(n-Q(n-2));
end;
end;

View file

@ -0,0 +1,8 @@
Q := proc( n )
option remember, system;
if n = 1 or n = 2 then
1
else
thisproc( n - thisproc( n - 1 ) ) + thisproc( n - thisproc( n - 2 ) )
end if
end proc:

View file

@ -0,0 +1,5 @@
> seq( Q( i ), i = 1 .. 10 );
1, 1, 2, 3, 3, 4, 5, 5, 6, 6
> Q( 1000 );
502

View file

@ -0,0 +1,8 @@
> flips := 0:
> for i from 2 to 100000 do
> if L[ i ] < L[ i - 1 ] then
> flips := 1 + flips
> end if
> end do:
> flips;
49798

View file

@ -0,0 +1,15 @@
Qflips := proc( n )
local a := Array( 1 .. n );
a[ 1 ] := 1;
a[ 2 ] := 1;
for local i from 3 to n do
a[ i ] := a[ i - a[ i - 1 ] ] + a[ i - a[ i - 2 ] ]
end do;
local flips := 0;
for i from 2 to n do
if a[ i ] < a[ i - 1 ] then
flips := 1 + flips
end if
end do;
flips
end proc:

View file

@ -0,0 +1,2 @@
> Qflips( 10^5 );
49798

View file

@ -0,0 +1,4 @@
Hofstadter[1] = Hofstadter[2] = 1;
Hofstadter[n_Integer?Positive] := Hofstadter[n] = Block[{$RecursionLimit = Infinity},
Hofstadter[n - Hofstadter[n - 1]] + Hofstadter[n - Hofstadter[n - 2]]
]

View file

@ -0,0 +1,6 @@
Hofstadter /@ Range[10]
{1,1,2,3,3,4,5,5,6,6}
Hofstadter[1000]
502
Count[Differences[Hofstadter /@ Range[100000]], _?Negative]
49798

View file

@ -0,0 +1,14 @@
cache = {1:1, 2:1}
Q = function(n)
if not cache.hasIndex(n) then
q = Q(n - Q(n-1)) + Q(n - Q(n-2))
cache[n] = q
end if
return cache[n]
end function
for i in range(1,10)
print "Q(" + i + ") = " + Q(i)
end for
print "Q(1000) = " + Q(1000)

View file

@ -0,0 +1,6 @@
main :: [sys_message]
main = [Stdout (lay (map showq ([1..10] ++ [1000])))]
where showq n = "q!" ++ show n ++ " = " ++ show (q!n)
q :: [num]
q = 0 : 1 : 1 : map f [3..] where f n = q!(n - q!(n-1)) + q!(n - q!(n-2))

View file

@ -0,0 +1,23 @@
MODULE QSequence;
FROM InOut IMPORT WriteString, WriteCard, WriteLn;
VAR n: CARDINAL;
Q: ARRAY [1..1000] OF CARDINAL;
BEGIN
Q[1] := 1;
Q[2] := 1;
FOR n := 3 TO 1000 DO
Q[n] := Q[n-Q[n-1]] + Q[n-Q[n-2]];
END;
WriteString("The first 10 terms are:");
FOR n := 1 TO 10 DO
WriteCard(Q[n],2);
END;
WriteLn();
WriteString("The 1000th term is:");
WriteCard(Q[1000],4);
WriteLn();
END QSequence.

View file

@ -0,0 +1,14 @@
var q = @[1, 1]
for n in 2 ..< 100_000: q.add q[n-q[n-1]] + q[n-q[n-2]]
echo q[0..9]
assert q[0..9] == @[1, 1, 2, 3, 3, 4, 5, 5, 6, 6]
echo q[999]
assert q[999] == 502
var lessCount = 0
for n in 1 ..< 100_000:
if q[n] < q[n-1]:
inc lessCount
echo lessCount

View file

@ -0,0 +1,16 @@
(* valid results for n in 0..119628 *)
let seq_hofstadter_q n =
let a = Bigarray.(Array1.create int16_unsigned c_layout n) in
let () =
for i = 0 to pred n do
a.{i} <- if i < 2 then 1 else a.{i - a.{pred i}} + a.{i - a.{i - 2}}
done
in
Seq.init n (Bigarray.Array1.get a)
let () =
let count_backflip (a, c) b = b, if b < a then succ c else c
and hq = seq_hofstadter_q 100_000 in
let () = Seq.(hq |> take 10 |> iter (Printf.printf " %u")) in
let () = Seq.(hq |> drop 999 |> take 1 |> iter (Printf.printf "\n%u\n")) in
hq |> Seq.fold_left count_backflip (0, 0) |> snd |> Printf.printf "%u\n"

View file

@ -0,0 +1,36 @@
MODULE Hofstadter;
IMPORT
Out;
VAR
i,count,q,prev: LONGINT;
founds: ARRAY 100001 OF LONGINT;
PROCEDURE Q(n: LONGINT): LONGINT;
BEGIN
IF founds[n] = 0 THEN
CASE n OF
1 .. 2:
founds[n] := 1
ELSE founds[n] := Q(n - Q(n - 1)) + Q(n - Q(n - 2))
END
END;
RETURN founds[n]
END Q;
BEGIN
(* first ten numbers in the sequence *)
FOR i := 1 TO 10 DO
Out.String("At ");Out.LongInt(i,0);Out.String(":> ");Out.LongInt(Q(i),4);Out.Ln
END;
Out.String("1000th value: ");Out.LongInt(Q(1000),4);Out.Ln;
prev := 1;
FOR i := 2 TO 100000 DO
q := Q(i);
IF q < prev THEN INC(count) END;
prev := q
END;
Out.String("terms less than the previous: ");Out.LongInt(count,4);Out.Ln
END Hofstadter.

View file

@ -0,0 +1,8 @@
: QSeqTask
| q i |
ListBuffer newSize(100000) dup add(1) dup add(1) ->q
0 3 100000 for: i [
q add(q at(i q at(i 1-) -) q at(i q at(i 2 -) -) +)
q at(i) q at(i 1-) < ifTrue: [ 1+ ]
]
q left(10) println q at(1000) println println ;

View file

@ -0,0 +1,4 @@
Q=vector(1000);Q[1]=Q[2]=1;for(n=3,#Q,Q[n]=Q[n-Q[n-1]]+Q[n-Q[n-2]]);
Q1=vecextract(Q,"1..10");
print("First 10 terms: "Q1,if(Q1==[1, 1, 2, 3, 3, 4, 5, 5, 6, 6]," (as expected)"," (in error)"));
print("1000-th term: "Q[1000],if(Q[1000]==502," (as expected)"," (in error)"));

View file

@ -0,0 +1,20 @@
/* Hofstrader Q sequence for any "n". */
H: procedure options (main); /* 28 January 2012 */
declare n fixed binary(31);
put ('How many values do you want? :');
get (n);
begin;
declare Q(n) fixed binary (31);
declare i fixed binary (31);
Q(1), Q(2) = 1;
do i = 1 upthru n;
if i >= 3 then Q(i) = ( Q(i - Q(i-1)) + Q(i - Q(i-2)) );
if i <= 20 then put skip list ('n=' || trim(i), Q(i));
end;
put skip list ('n=' || trim(i), Q(i));
end;
end H;

View file

@ -0,0 +1,6 @@
declare tally fixed binary (31) initial (0);
do i = 1 to n-1;
if Q(i) > Q(i+1) then tally = tally + 1;
end;
put skip data (tally);

View file

@ -0,0 +1,35 @@
100H:
BDOS: PROCEDURE (FN, ARG); DECLARE FN BYTE, ARG ADDRESS; GO TO 5; END BDOS;
EXIT: PROCEDURE; CALL BDOS(0,0); END EXIT;
PRINT: PROCEDURE (S); DECLARE S ADDRESS; CALL BDOS(9,S); END PRINT;
PRINT$NUMBER: PROCEDURE (N);
DECLARE S (7) BYTE INITIAL ('..... $');
DECLARE (N, P) ADDRESS, C BASED P BYTE;
P = .S(5);
DIGIT:
P = P - 1;
C = N MOD 10 + '0';
N = N / 10;
IF N > 0 THEN GO TO DIGIT;
CALL PRINT(P);
END PRINT$NUMBER;
DECLARE Q (1001) ADDRESS;
DECLARE N ADDRESS;
Q(1)=1;
Q(2)=1;
DO N=3 TO LAST(Q);
Q(N) = Q(N-Q(N-1)) + Q(N-Q(N-2));
END;
CALL PRINT(.'THE FIRST 10 TERMS ARE: $');
DO N=1 TO 10;
CALL PRINT$NUMBER(Q(N));
END;
CALL PRINT(.(13,10,'THE 1000TH TERM IS: $'));
CALL PRINT$NUMBER(Q(1000));
CALL EXIT;
EOF

View file

@ -0,0 +1,24 @@
Program HofstadterQSequence (output);
const
limit = 100000;
var
q: array [1..limit] of longint;
i, flips: longint;
begin
q[1] := 1;
q[2] := 1;
for i := 3 to limit do
q[i] := q[i - q[i - 1]] + q[i - q[i - 2]];
for i := 1 to 10 do
write(q[i], ' ');
writeln;
writeln(q[1000]);
flips := 0;
for i := 1 to limit - 1 do
if q[i] > q[i+1] then
inc(flips);
writeln('Flips: ', flips);
end.

View file

@ -0,0 +1,5 @@
my @Q = (0,1,1);
push @Q, $Q[-$Q[-1]] + $Q[-$Q[-2]] for 1..100_000;
say "First 10 terms: [@Q[1..10]]";
say "Term 1000: $Q[1000]";
say "Terms less than preceding in first 100k: ",scalar(grep { $Q[$_] < $Q[$_-1] } 2..100000);

View file

@ -0,0 +1,21 @@
#!/usr/bin/perl
use warnings;
use strict;
my @hofstadters = ( 1 , 1 );
while ( @hofstadters < 100000 ) {
my $nextn = @hofstadters + 1;
# array index counting starts at 0 , so we have to subtract 1 from the numbers!
push @hofstadters , $hofstadters [ $nextn - 1 - $hofstadters[ $nextn - 1 - 1 ] ]
+ $hofstadters[ $nextn - 1 - $hofstadters[ $nextn - 2 - 1 ]];
}
for my $i ( 0..9 ) {
print "$hofstadters[ $i ]\n";
}
print "The 1000'th term is $hofstadters[ 999 ]!\n";
my $less_than_preceding = 0;
for my $i ( 0..99998 ) {
$less_than_preceding++ if $hofstadters[ $i + 1 ] < $hofstadters[ $i ];
}
print "Up to and including the 100000'th term, $less_than_preceding terms are less " .
"than their preceding terms!\n";

View file

@ -0,0 +1,35 @@
#!perl
use strict;
use warnings;
package Hofstadter;
sub TIEARRAY {
bless [undef, 1, 1], shift;
}
sub FETCH {
my ($self, $n) = @_;
die if $n < 1;
if( $n > $#$self ) {
my $start = $#$self + 1;
$#$self = $n; # pre-allocate for efficiency
for my $nn ( $start .. $n ) {
my ($a, $b) = (1, 2);
$_ = $self->[ $nn - $_ ] for $a, $b;
$_ = $self->[ $nn - $_ ] for $a, $b;
$self->[$nn] = $a + $b;
}
}
$self->[$n];
}
package main;
tie my (@q), "Hofstadter";
print "@q[1..10]\n";
print $q[1000], "\n";
my $count = 0;
for my $n ( 2 .. 100_000 ) {
$count++ if $q[$n] < $q[$n - 1];
}
print "Extra credit: $count\n";

View file

@ -0,0 +1,27 @@
(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">Q</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">q</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Q</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">while</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">></span><span style="color: #000000;">l</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">l</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">Q</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">Q</span><span style="color: #0000FF;">[</span><span style="color: #000000;">l</span><span style="color: #0000FF;">-</span><span style="color: #000000;">Q</span><span style="color: #0000FF;">[</span><span style="color: #000000;">l</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]]+</span><span style="color: #000000;">Q</span><span style="color: #0000FF;">[</span><span style="color: #000000;">l</span><span style="color: #0000FF;">-</span><span style="color: #000000;">Q</span><span style="color: #0000FF;">[</span><span style="color: #000000;">l</span><span style="color: #0000FF;">-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">Q</span><span style="color: #0000FF;">[</span><span style="color: #000000;">n</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">q</span><span style="color: #0000FF;">(</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (or collect one by one)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"First ten terms: %v\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">Q</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">10</span><span style="color: #0000FF;">]})</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"1000th: %d\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">q</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1000</span><span style="color: #0000FF;">))</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"100,000th: %,d\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">q</span><span style="color: #0000FF;">(</span><span style="color: #000000;">100_000</span><span style="color: #0000FF;">))</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">100_000</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">Q</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]<</span><span style="color: #000000;">Q</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Flips up to 100,000: %,d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">n</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">t0</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"100,000,000th: %,d (%3.2fs)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">q</span><span style="color: #0000FF;">(</span><span style="color: #000000;">100_000_000</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t0</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<!--

View file

@ -0,0 +1,11 @@
go =>
println([q(I) : I in 1..10]),
println(q1000=q(1000)),
Q = {q(I) : I in 1..100_000},
println(flips=sum({1 : I in 2..100_000, Q[I-1] > Q[I]})),
nl.
table
q(1) = 1.
q(2) = 1.
q(N) = q(N-q(N-1)) + q(N-q(N-2)).

Some files were not shown because too many files have changed in this diff Show more