true), array('SolutionSteps, SolutionTime, SolutionValue', 'length', 'max'=>20), array('Problemtitle', 'length', 'max'=>50), array('Problemnumber, Problemtitle, Problemdescription, Code, Explanation, AbbreviatedCode, SolutionSteps, SolutionTime, SolutionValue', 'safe', 'on'=>'search'), ); } /** * @return array relational rules. */ public function relations() { // NOTE: you may need to adjust the relation name and the related // class name for the relations automatically generated below. return array( ); } /** * @return array customized attribute labels (name=>label) */ public function attributeLabels() { return array( 'Problemnumber' => 'Problemnumber', 'Problemtitle' => 'Problemtitle', 'Problemdescription' => 'Problemdescription', 'Code' => 'Code', 'Explanation' => 'Explanation', 'AbbreviatedCode' => 'Abbreviated Code', 'SolutionSteps' => 'Solution Steps', 'SolutionTime' => 'Solution Time', 'SolutionWidth' => 'Solution Width', 'SolutionHeight' => 'Solution Height', 'SolutionValue' => 'Solution Value', ); } /** * Retrieves a list of models based on the current search/filter conditions. * * Typical usecase: * - Initialize the model fields with values from filter form. * - Execute this method to get CActiveDataProvider instance which will filter * models according to data in model fields. * - Pass data provider to CGridView, CListView or any similar widget. * * @return CActiveDataProvider the data provider that can return the models * based on the search/filter conditions. */ public function search() { $criteria=new CDbCriteria; $criteria->compare('Problemnumber',$this->Problemnumber); $criteria->compare('Problemtitle',$this->Problemdescription,true); $criteria->compare('Problemdescription',$this->Problemdescription,true); $criteria->compare('Code',$this->Code,true); $criteria->compare('Explanation',$this->Explanation,true); $criteria->compare('AbbreviatedCode',$this->AbbreviatedCode); $criteria->compare('SolutionSteps',$this->SolutionSteps,true); $criteria->compare('SolutionTime',$this->SolutionTime,true); $criteria->compare('SolutionWidth',$this->SolutionWidth); $criteria->compare('SolutionHeight',$this->SolutionHeight); $criteria->compare('SolutionValue',$this->SolutionValue,true); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, )); } /** * Returns the static model of the specified AR class. * Please note that you should have this exact method in all your CActiveRecord descendants! * @param string $className active record class name. * @return EulerProblem the static model class */ public static function model($className=__CLASS__) { return parent::model($className); } public function getBlogLink() { return '/blog/1/Project_Euler_with_Befunge/problem-' . str_pad($this->Problemnumber, 3, '0', STR_PAD_LEFT); } public function getSourcecodefile($absolute = true) { return ($absolute ? '/' : '') . 'data/blog/Befunge/Euler_Problem-' . str_pad($this->Problemnumber, 3, '0', STR_PAD_LEFT) . '.b93'; } public function getTimeScore() { if ($this->SolutionTime < 100) // < 100ms return EulerProblem::TIMELEVEL_PERFECT; else if ($this->SolutionTime < 15 * 1000) // < 5s return EulerProblem::TIMELEVEL_GOOD; else if ($this->SolutionTime < 60 * 1000) // < 1min return EulerProblem::TIMELEVEL_OK; else if ($this->SolutionTime < 5 * 60 * 1000) // < 5min return EulerProblem::TIMELEVEL_BAD; else return EulerProblem::TIMELEVEL_FAIL; } public function isBefunge93() { return $this->SolutionWidth <= 80 AND $this->SolutionHeight <= 25; } public function getRawGithubLink() { return 'https://raw.githubusercontent.com/Mikescher/Project-Euler_Befunge/master/processed/Euler_Problem-' . str_pad($this->Problemnumber, 3, '0', STR_PAD_LEFT) . '.b93'; } public function generateMarkdown() { $num_padded = str_pad($this->Problemnumber, 3, '0', STR_PAD_LEFT); return 'Problem [' . $num_padded. '](http://projecteuler.net/problem=' . $num_padded . '): ' . $this->Problemtitle . PHP_EOL . '--------' . PHP_EOL . '' . PHP_EOL . MsHelper::encloseLines($this->Problemdescription, '> ', '') . PHP_EOL . '' . PHP_EOL . '```befunge' . PHP_EOL . $this->Code . PHP_EOL . '```' . PHP_EOL . ($this->AbbreviatedCode ? ( '> **NOTE** ' . PHP_EOL . '> This program is too big to display here, click **[download]** to see the full program. ' . PHP_EOL . PHP_EOL ) : ''). 'Download' . PHP_EOL . '' . PHP_EOL . $this->Explanation . PHP_EOL . '' . PHP_EOL . '**Interpreter steps:** `' . number_format($this->SolutionSteps, 0, null, ',') . '` ' . PHP_EOL . '**Execution time** ([BefunExec](/programs/view/BefunGen)): `' . number_format($this->SolutionTime, 0, null, ',') . '` ms' . (($this->SolutionTime < 1000) ? (' ') : (' *(= ' . MsHelper::formatMilliseconds($this->SolutionTime) . ')* ')) . PHP_EOL . '**Program size:** `' . $this->SolutionWidth . 'x' . $this->SolutionHeight . '` ' . ($this->isBefunge93() ? '*(fully valid Befunge-93)*' : '') . ' ' . PHP_EOL . '**Solution:** `' . number_format($this->SolutionValue, 0, null, ',') . '` '; } }