Skip to content

Instantly share code, notes, and snippets.

@twright
Created March 8, 2010 19:16
Show Gist options
  • Save twright/325481 to your computer and use it in GitHub Desktop.
Save twright/325481 to your computer and use it in GitHub Desktop.
program Quiz;
{$mode objfpc}
uses sysutils, crt;
const
SEQ_LEN = 5;
NUM_FORMULAE = 4;
GUESSES = 2;
POINTS = 3;
type
TPtrForm = function (n : integer; a, b : integer) : integer;
TQuiz = object
sequence : array [0..SEQ_LEN] of integer;
formula : TPtrForm;
points : integer;
difficulty : integer;
procedure randomFormula ();
procedure generateSequence ();
procedure printSequence (n : integer);
function check (ans : integer) : boolean;
procedure inputDifficulty ();
procedure playTurn ();
procedure play (n : integer);
end;
//// General maths functions ////
function factorial (x : integer) : integer;
begin
if x = 0 then
result := 1
else if x > 0 then
result := x * factorial (x - 1);
end;
function pow (x : integer; y : integer) : integer;
var
i : integer;
begin
result := 1;
for i := 1 to y do
result *= x;
end;
function fibs (x : integer) : integer;
begin
if x = 0 then
result := 1
else if x >= 1 then
result := fibs (x - 1) + fibs (x - 2);
end;
//// Sequence generators ////
function arithmetic (n : integer; a, b : integer) : integer;
begin
result := a + b * n;
end;
function geometric (n : integer; a, b : integer) : integer;
begin
result := a * pow (b, n);
end;
// Fibonacii sequence
function fibseq (n : integer; a, b : integer) : integer;
begin
result := fibs (a + n);
end;
// Factorials
function factseq (n : integer; a, b : integer) : integer;
begin
result := factorial (a + n);
end;
//// TQuiz implementation ////
// Select a random formula from an array of functions
procedure TQuiz.randomFormula ();
var
formulae : array [1..NUM_FORMULAE] of TPtrForm;
begin
formulae [1] := @arithmetic;
formulae [2] := @geometric;
formulae [3] := @factseq;
formulae [4] := @fibseq;
randomize ();
formula := formulae [1 + random (difficulty - 1)];
end;
// Generate sequence formula and random input.
procedure TQuiz.generateSequence ();
var
n : integer;
a, b : integer;
begin
randomize ();
// a := 1 + random (3 * difficulty); b := 1 + random (3 * difficulty);
a := 1 + random (6); b := 1 + random (4);
for n := 0 to SEQ_LEN do
sequence [n] := formula (n, a, b);
end;
procedure TQuiz.printSequence (n : integer);
var
i : integer;
begin
write (' ');
for i := 0 to n do
write (sequence [i], ' ');
writeln ('...');
end;
// Input difficulty level.
procedure TQuiz.inputDifficulty ();
var
tmp : integer;
begin
repeat
write ('What difficulty level? [1 to ', NUM_FORMULAE, ']: ');
try
readln (tmp);
except
tmp := -1
end;
until (tmp >= 1) and (tmp <= NUM_FORMULAE);
writeln ();
difficulty := tmp;
end;
// Play a single turn.
procedure TQuiz.playTurn ();
var
i : integer;
tmp : integer = 0;
begin
randomFormula ();
generateSequence ();
writeln ('Find the next term in the sequence: ');
printSequence (SEQ_LEN - 1);
for i := GUESSES downto 1 do
begin
write (': ');
try
readln (tmp);
except
tmp := 0
end;
if check (tmp) then
begin
writeln ('CORRECT!');
points += (1 + i) * difficulty;
exit ();
end
else
writeln ('INCORRECT!');
end;
writeln ('Out of guesses, the correct answer was ', sequence [SEQ_LEN]);
end;
// Check whether ans is correct
function TQuiz.check (ans : integer) : boolean;
begin
result := (ans = sequence [SEQ_LEN]);
end;
// Play for n questions.
procedure TQuiz.play (n : integer);
var
i : integer;
begin
points := 0;
clrscr ();
writeln ('Welcome to Sequences - A Hayden and Tom game ...');
sleep (2000);
clrscr ();
inputDifficulty ();
for i := 1 to n do
begin
clrscr ();
playTurn ();
sleep (2000);
end;
clrscr ();
writeln ('You scored ', points, ' points.');
end;
// Main
var
quizy : TQuiz;
begin
quizy.play (3);
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment