numeracy2.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <?php
  2. /*
  3. * To change this license header, choose License Headers in Project Properties.
  4. * To change this template file, choose Tools | Templates
  5. * and open the template in the editor.
  6. */
  7. /**
  8. * Description of numeracy
  9. *
  10. * @author gregory
  11. */
  12. class numeracy2 {
  13. private $user;
  14. private $subSubject;
  15. /**
  16. * Setup new numbers engine
  17. *
  18. * @param bool $test Enable debug mode.
  19. */
  20. public function __construct($user,$sub) {
  21. $this->user = $user;
  22. $this->subSubject = $sub;
  23. }
  24. public function getNumeracy() {
  25. //print_a(['user'=>$this->user,'subSubject'=>$this->subSubject]);
  26. $difficulty = $this->difficulty();
  27. $question = $this->numeracySwitch($difficulty);
  28. $questionHtml = $this->htmlify($question);
  29. e107::getDb()->insert('tkLastQuestion', ['user'=>$this->user,'LastQuestionHtml'=>base64_encode($questionHtml)]);
  30. e107::getRender()->tablerender('Numeracy', $questionHtml);
  31. }
  32. private function numeracySwitch($difficulty) {
  33. switch ($this->subSubject) {
  34. case 'addition':
  35. return $this->basic('+',$difficulty);
  36. case 'subtraction':
  37. return $this->basic('-',$difficulty);
  38. case 'multiplication':
  39. return $this->basic('x',$difficulty);
  40. case 'rounding':
  41. return $this->Rounding($difficulty);
  42. case 'division':
  43. return $this->Division($difficulty);
  44. }
  45. }
  46. /**
  47. * Return the difficulty based on previously answered questions.
  48. *
  49. * @return int Difficulty as percent.
  50. */
  51. private function difficulty() {
  52. $stats = e107::getDb()->retrieve("SELECT (SUM(correct)/COUNT(correct)*100) as percent,COUNT(correct) as count
  53. FROM e107.`e107_tkReport` WHERE
  54. answereddatestamp >= unix_timestamp((NOW()) - INTERVAL 1 MONTH)
  55. AND username = '$this->user' AND subject = '$this->subSubject';");
  56. if ($stats["count"]==0) {
  57. return 1;
  58. } else {
  59. return $stats;
  60. }
  61. }
  62. private function getNumbers($difficulty,$sign){
  63. //TODO add finer grain control for multiplication here
  64. if($sign=='x'||$sign=='/')
  65. {
  66. $difficulty['count'] = (int)$difficulty['count']/4;
  67. $difficulty['percent'] = (int)$difficulty['percent']/6;
  68. }
  69. if($difficulty['count']>=300) {
  70. $startingNumber = mt_rand(0, (int) pow($difficulty['count'],($difficulty['percent']/100)*2));
  71. $endingNumber = mt_rand(0, (int) pow($difficulty['count'],($difficulty['percent']/100)*2));
  72. $returnNumbers = [$startingNumber,$endingNumber];
  73. }elseif($difficulty['count']>=200){
  74. $startingNumber = mt_rand(0, (int) $difficulty['count']+($difficulty['percent']/100)*2);
  75. $endingNumber = mt_rand(0, (int) $difficulty['count']+($difficulty['percent']/100)*2);
  76. $returnNumbers = $this->flipNumbers($startingNumber,$endingNumber);
  77. }elseif($difficulty['count']>=100){
  78. $startingNumber = mt_rand(0, (int) ($difficulty['percent'])*2);
  79. $endingNumber = mt_rand(0, (int) ($difficulty['percent'])*2);
  80. $returnNumbers = $this->flipNumbers($startingNumber,$endingNumber);
  81. }else{
  82. $startingNumber = mt_rand(0, $difficulty['count']+1);
  83. $endingNumber = mt_rand(0, $difficulty['count']+1);
  84. $returnNumbers = $this->flipNumbers($startingNumber,$endingNumber);
  85. }
  86. //print_a(['Original'=>['1'=>$startingNumber,'2'=>$endingNumber],'FlipNumbers'=>$returnNumbers,'user'=>$this->user,'diff'=>$difficulty]);
  87. return $returnNumbers;
  88. }
  89. private function flipNumbers($startingNumber,$endingNumber){
  90. if($startingNumber>$endingNumber){
  91. return [$startingNumber,$endingNumber];
  92. }else{
  93. return [$endingNumber,$startingNumber];
  94. }
  95. }
  96. private function basic($sign,$difficulty) {
  97. $numbers = $this->getNumbers($difficulty,$sign);
  98. $firstNumber = $numbers[0];
  99. $secondNumber = $numbers[1];
  100. $TempQuestion = [];
  101. $TempQuestion[] = $firstNumber;
  102. $TempQuestion[] = $sign;
  103. $TempQuestion[] = $secondNumber;
  104. $solution['+'] = ($firstNumber + $secondNumber);
  105. $solution['-'] = ($firstNumber - $secondNumber);
  106. $solution['x'] = ($firstNumber * $secondNumber);
  107. return [ 'answer1'=>$solution[$sign], 'question'=>$TempQuestion, 'type'=>$this->subSubject];
  108. }
  109. private function Division($difficulty) {
  110. $numbers = $this->getNumbers($difficulty,'/');
  111. $firstNumber = $numbers[1];
  112. $secondNumber = $numbers[2];
  113. $divNumber = $firstNumber * $secondNumber;
  114. $TempQuestion = [];
  115. $TempQuestion[] = $divNumber;
  116. $TempQuestion[] = '/';
  117. $TempQuestion[] = $secondNumber;
  118. $solution['/'] = ($divNumber / $secondNumber);
  119. return [ 'answer1'=>$solution['/'], 'question'=>$TempQuestion, 'type'=>$this->subSubject];
  120. }
  121. private function Rounding($difficulty) {
  122. $firstNumber = sprintf("%01.2f", (float) rand(100, (int) ($difficulty) * 100) / 100);
  123. $TempQuestion = [];
  124. $TempQuestion[] = $firstNumber;
  125. $TempQuestion[] = 'r';
  126. $solution['r'] = (sprintf("%01.2f", round($firstNumber / 5, 2) * 5));
  127. return [ 'answer1'=>$solution['r'], 'question'=>$TempQuestion, 'type'=>$this->subSubject];
  128. }
  129. private function htmlify($question) {
  130. $frm = e107::getForm();
  131. $fString = $frm->open('questionForm', 'post', '', ['autocomplete' => 'off', 'class' => 'formclass']);
  132. $fString .= $frm->label('<h4>'.ucfirst($this->subSubject).'</h4>') . "</br>\n";
  133. $fString .= $frm->label('Solve the following equation.') . "\n";
  134. $fString .= '</br>';
  135. foreach ($question['question'] as $seq) {
  136. $fString .= $frm->label($seq . " &nbsp; ") . "\n";
  137. }
  138. $fString .= '</br></br>';
  139. $fString .= $frm->text('a1', '', 80, ['placeholder' => 'Write answer here!', 'autocomplete' => "off", 'spellcheck' => "false"]) . "\n";
  140. $fString .= $frm->hidden('checkerData', TkAnswerStore::issue($this->user, $question), ['id' => 'checkerData']);
  141. $fString .= $frm->hidden('subject', $this->subSubject, ['id' => 'subject']);
  142. $fString .= '</br>' . "\n";
  143. $fString .= e107::getForm()->button('Answer', 'Check answer') . "\n";
  144. $fString .= e107::getForm()->close();
  145. $fString .= '</br></br>';
  146. return $fString;
  147. }
  148. }