1
0

Added custom Blogposts for ProblemEulerBefunge

This commit is contained in:
Mike Schwörer 2014-09-28 02:37:53 +02:00
parent 144ded4750
commit 58eb50f0ad
31 changed files with 1314 additions and 50 deletions

View File

@ -0,0 +1,76 @@
.PEB_tableProblems {
width: 100%;
}
.PEB_tablerowProblems {
}
.PEB_tablecellProblems {
}
.PEB_TC_Value:not(:hover) {
color: transparent;
-o-transition:.5s;
-ms-transition:.5s;
-moz-transition:.5s;
-webkit-transition:.5s;
transition:.5s;
}
.PEB_TC_Value:hover {
color: black;
-o-transition:.5s;
-ms-transition:.5s;
-moz-transition:.5s;
-webkit-transition:.5s;
transition:.5s;
}
.PEB_TC_Time {
border-radius: 5px;
display: inline-block;
padding: 1px 6px;
}
.PEB_TC_Timelevel_0 { background-color: #0A0 !important; }
.PEB_TC_Timelevel_1 { background-color: #84FF0A !important; }
.PEB_TC_Timelevel_2 { background-color: #FF0 !important; }
.PEB_TC_Timelevel_3 { background-color: #F60 !important; }
.PEB_TC_Timelevel_4 { background-color: #F11 !important; }
.PEB_TC_Size_93 {
display: inline-flex;
float: right;
border-radius: 5px;
background-color: #0A0;
display: inline-block;
padding: 1px 6px;
}
.PEB_TC_Size_98 {
display: inline-flex;
float: right;
border-radius: 5px;
background-color: #FF0;
display: inline-block;
padding: 1px 6px;
}
.PEB_TC_Title a {
color: #2C3E50;
}

View File

@ -768,3 +768,132 @@ ul.nav li.dropdown-append:hover > ul.dropdown-menu {
font-size: small;
}
/* Pagination
-------------------------------------------------- */
.pagination {
margin:20px 0;
}
.pagination ul {
display:inline-block;
*display:inline;
*zoom:1;
margin-left:0;
margin-bottom:0;
-webkit-border-radius:4px;
-moz-border-radius:4px;
border-radius:4px;
-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);
-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);
box-shadow:0 1px 2px rgba(0,0,0,0.05);
}
.pagination ul>li {
display:inline;
}
.pagination ul>li>a,.pagination ul>li>span{
float:left;
padding:4px 12px;
line-height:20px;
text-decoration:none;
background-color:#fff;
border:1px solid #ddd;
border-left-width:0;
color: #888;
}
.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{
background-color:#f5f5f5;
}
.pagination ul>.active>a,.pagination ul>.active>span{
color:#999;
cursor:default;
}
.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{
color:#999;
background-color:transparent;
cursor:default;
}
.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{
border-left-width:1px;
-webkit-border-top-left-radius:4px;
-moz-border-radius-topleft:4px;
border-top-left-radius:4px;
-webkit-border-bottom-left-radius:4px;
-moz-border-radius-bottomleft:4px;
border-bottom-left-radius:4px;
}
.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{
-webkit-border-top-right-radius:4px;
-moz-border-radius-topright:4px;
border-top-right-radius:4px;
-webkit-border-bottom-right-radius:4px;
-moz-border-radius-bottomright:4px;
border-bottom-right-radius:4px;
}
.pagination-centered {
text-align:center;
}
.pagination-right{
text-align:right;
}
.pagination-large ul>li>a, .pagination-large ul>li>span {
padding:11px 19px;
font-size:17.5px;
}
.pagination-large ul>li:first-child>a, .pagination-large ul>li:first-child>span {
-webkit-border-top-left-radius:6px;
-moz-border-radius-topleft:6px;
border-top-left-radius:6px;
-webkit-border-bottom-left-radius:6px;
-moz-border-radius-bottomleft:6px;
border-bottom-left-radius:6px;
}
.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span {
-webkit-border-top-right-radius:6px;
-moz-border-radius-topright:6px;
border-top-right-radius:6px;
-webkit-border-bottom-right-radius:6px;
-moz-border-radius-bottomright:6px;
border-bottom-right-radius:6px;
}
.pagination-mini ul>li:first-child>a, .pagination-small ul>li:first-child>a, .pagination-mini ul>li:first-child>span, .pagination-small ul>li:first-child>span {
-webkit-border-top-left-radius:3px;
-moz-border-radius-topleft:3px;
border-top-left-radius:3px;
-webkit-border-bottom-left-radius:3px;
-moz-border-radius-bottomleft:3px;
border-bottom-left-radius:3px;
}
.pagination-mini ul>li:last-child>a, .pagination-small ul>li:last-child>a, .pagination-mini ul>li:last-child>span, .pagination-small ul>li:last-child>span {
-webkit-border-top-right-radius:3px;
-moz-border-radius-topright:3px;
border-top-right-radius:3px;
-webkit-border-bottom-right-radius:3px;
-moz-border-radius-bottomright:3px;
border-bottom-right-radius:3px;
}
.pagination-small ul>li>a, .pagination-small ul>li>span{
padding:2px 10px;
font-size:11.9px;
}
.pagination-mini ul>li>a,.pagination-mini ul>li>span{
padding:0 6px;
font-size:10.5px;
}

1
www/data/blog/Befunge/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.b93

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -56,8 +56,3 @@ defined('YII_CUSTOM_ENV') or define('YII_CUSTOM_ENV', 'prod');
require_once($yii);
Yii::createWebApplication($config)->run();
// TODO-MS Add Blog
// TODO-MS Add Search (Blog + progs + log) jew auch metadata / desc ...
// TODO-MS Add Prog Display

View File

@ -12,6 +12,11 @@ class MSController extends CController
public $selectedNav = '';
public $js_scripts = array();
public $css_files =
[
"/css/styles.css",
"/css/prism.css",
];
public $title = null;

View File

@ -54,4 +54,54 @@ class MsHelper {
}
rmdir($dirPath);
}
public static function formatMilliseconds($millis)
{
if ($millis < 1000)
{
return $millis . 'ms';
}
else if ($millis < 10 * 1000)
{
return number_format($millis / (1000), 2) . 's';
}
else if ($millis < 60 * 1000)
{
return floor($millis / (1000)) . 's';
}
else if ($millis < 10 * 60 * 1000)
{
return floor($millis / (60 * 1000)) . 'min ' . floor(($millis % (60 * 1000)) / 1000) . 's';
}
else if ($millis < 60 * 60 * 1000)
{
return floor($millis / (60 * 1000)) . 'min';
}
else if ($millis < 10 * 60 * 60 * 1000)
{
return number_format($millis / (60 * 60 * 1000), 2) . ' hours';
}
else
{
return floor($millis / (60 * 60 * 1000)) . ' hours';
}
}
/**
* Appends/Prepends $before/$after to every line in $input
*
* @param $input
* @param $before
* @param $after
* @return mixed
*/
public function encloseLines($input, $before, $after)
{
$array = preg_split("/\r\n|\n|\r/", $input);
for($i = 0; $i < count($array); $i++)
$array[$i] = $before . $array[$i] . $after;
return implode(PHP_EOL, $array);
}
}

View File

@ -100,6 +100,8 @@ return ArrayX::merge(
'blog/<id>' => 'blogPost/view/id/<id>',
'blog/<id>/<name>' => 'blogPost/view/id/<id>',
'eulerProblem/' => 'eulerProblem/index',
'Highscores/list.php' => 'Highscores/list', // Compatibility
'Highscores/insert.php' => 'Highscores/insert', // Compatibility
'Highscores/update.php' => 'Highscores/update', // Compatibility

View File

@ -22,19 +22,16 @@ class BlogPostController extends MSController
public function accessRules()
{
return array(
array('allow', // allow all users to perform 'index' and 'view' actions
array('allow',
'actions'=>array('index','view', 'ajaxMarkdownPreview'),
'users'=>array('*'),
),
array('allow', // allow authenticated user to perform 'create' and 'update' actions
array('allow',
'actions'=>array('create','update','admin','delete'),
'users'=>array('@'),
),
// array('allow', // allow admin user to perform 'admin' and 'delete' actions
// 'actions'=>array(),
// 'users'=>array('admin'),
// ),
array('deny', // deny everythign else to all users
array('deny',
'users'=>array('*'),
),
);
@ -45,19 +42,32 @@ class BlogPostController extends MSController
* @param integer $id the ID of the model to be displayed
* @throws CHttpException if Enabled is false
*/
public function actionView($id)
public function actionView($id) //TODO-MS add BFJoust to Blog
{
$model = $this->loadModel($id);
if (! $model->Enabled && Yii::app()->user->name != 'admin')
throw new CHttpException(403, 'This Blogpost is locked');
if ($model->isSpecialBlogPost())
{
$controllerMethod = 'viewBlogpost' . $model->ControllerID;
if(is_callable([$this, $controllerMethod]))
$this->$controllerMethod($model);
else
throw new CHttpException(500, 'Unknown ControllerID: ' . $controllerMethod);
}
else
{
$this->render('view',
[
'model' => $model,
]);
}
}
/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
@ -71,16 +81,19 @@ class BlogPostController extends MSController
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if (isset($_POST['BlogPost'])) {
if (isset($_POST['BlogPost']))
{
$model->attributes=$_POST['BlogPost'];
if ($model->save()) {
if ($model->save())
{
$this->redirect(array('view','id'=>$model->ID));
}
}
$this->render('create',array(
$this->render('create',
[
'model'=>$model,
));
]);
}
/**
@ -97,16 +110,19 @@ class BlogPostController extends MSController
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if (isset($_POST['BlogPost'])) {
if (isset($_POST['BlogPost']))
{
$model->attributes=$_POST['BlogPost'];
if ($model->save()) {
$this->redirect(array('view','id'=>$model->ID));
if ($model->save())
{
$this->redirect(['view','id'=>$model->ID]);
}
}
$this->render('update',array(
$this->render('update',
[
'model'=>$model,
));
]);
}
/**
@ -122,7 +138,8 @@ class BlogPostController extends MSController
$this->loadModel($id)->delete();
// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
if (!isset($_GET['ajax'])) {
if (!isset($_GET['ajax']))
{
$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
}
}
@ -150,14 +167,18 @@ class BlogPostController extends MSController
);
}
public function actionAjaxMarkdownPreview() {
if(Yii::app()->request->isAjaxRequest){
public function actionAjaxMarkdownPreview()
{
if(Yii::app()->request->isAjaxRequest)
{
$this->renderPartial('_ajaxMarkdownPreview',
[
'Content' => $_POST['Content'],
],
false, true);
} else {
}
else
{
throw new CHttpException(400,'Invalid request. This is a Ajax only action.');
}
}
@ -171,13 +192,15 @@ class BlogPostController extends MSController
$model=new BlogPost('search');
$model->unsetAttributes(); // clear any default values
if (isset($_GET['BlogPost'])) {
if (isset($_GET['BlogPost']))
{
$model->attributes=$_GET['BlogPost'];
}
$this->render('admin',array(
$this->render('admin',
[
'model'=>$model,
));
]);
}
/**
@ -190,7 +213,8 @@ class BlogPostController extends MSController
public function loadModel($id)
{
$model=BlogPost::model()->findByPk($id);
if ($model===null) {
if ($model===null)
{
throw new CHttpException(404,'The requested page does not exist.');
}
return $model;
@ -207,4 +231,57 @@ class BlogPostController extends MSController
Yii::app()->end();
}
}
//#########################################################################
//##################### Special Blogpost Controllers ######################
//#########################################################################
/**
* @param BlogPost $model
*/
protected function viewBlogpostProjectEulerBefunge($model)
{
$problems = EulerProblem::model()->findAll(['order'=>'Problemnumber']);
$problemnumber = 0;
if (isset($_GET['problem']) AND is_numeric($_GET['problem']))
$problemnumber = $_GET['problem'];
$criteria=new CDbCriteria;
$criteria->condition='Problemnumber = ' . $problemnumber;
$currproblem = EulerProblem::model()->find($criteria);
if (is_null($currproblem))
{
$problemID = -1;
$currproblem = null;
}
else
{
$problemID = -1;
for($i = 0; $i < count($problems); $i++)
if ($problems[$i]->Problemnumber == $problemnumber)
{
$problemID = $i;
break;
}
}
if ($problemID == -1)
{
$problemID = -1;
$currproblem = null;
}
$this->render('view_ProjectEulerBefunge',
[
'model' => $model,
'problems' => $problems,
'currproblem' => $currproblem,
'currproblemID' => $problemID,
]);
}
//#########################################################################
//#########################################################################
}

View File

@ -0,0 +1,169 @@
<?php
class EulerProblemController extends MSController
{
public $layout='//layouts/column2';
public $menu=array();
/**
* @return array action filters
*/
public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
);
}
/**
* Specifies the access control rules.
* This method is used by the 'accessControl' filter.
* @return array access control rules
*/
public function accessRules()
{
return array(
array('allow',
'actions'=>array('index','view','create','update','admin','delete'),
'users'=>array('@'),
),
array('deny',
'users'=>array('*'),
),
);
}
/**
* Displays a particular model.
* @param integer $id the ID of the model to be displayed
*/
public function actionView($id)
{
$this->render('view',array(
'model'=>$this->loadModel($id),
));
}
/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
*/
public function actionCreate()
{
$model=new EulerProblem;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if (isset($_POST['EulerProblem'])) {
$model->attributes=$_POST['EulerProblem'];
if ($model->save()) {
$this->redirect(array('view','id'=>$model->Problemnumber));
}
}
$this->render('create',array(
'model'=>$model,
));
}
/**
* Updates a particular model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param integer $id the ID of the model to be updated
*/
public function actionUpdate($id)
{
$model=$this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if (isset($_POST['EulerProblem'])) {
$model->attributes=$_POST['EulerProblem'];
if ($model->save()) {
$this->redirect(array('view','id'=>$model->Problemnumber));
}
}
$this->render('update',array(
'model'=>$model,
));
}
/**
* Deletes a particular model.
* If deletion is successful, the browser will be redirected to the 'admin' page.
* @param integer $id the ID of the model to be deleted
*/
public function actionDelete($id)
{
if (Yii::app()->request->isPostRequest) {
// we only allow deletion via POST request
$this->loadModel($id)->delete();
// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
if (!isset($_GET['ajax'])) {
$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
}
} else {
throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
}
}
/**
* Lists all models.
*/
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('EulerProblem');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
/**
* Manages all models.
*/
public function actionAdmin()
{
$model=new EulerProblem('search');
$model->unsetAttributes(); // clear any default values
if (isset($_GET['EulerProblem'])) {
$model->attributes=$_GET['EulerProblem'];
}
$this->render('admin',array(
'model'=>$model,
));
}
/**
* Returns the data model based on the primary key given in the GET variable.
* If the data model is not found, an HTTP exception will be raised.
* @param integer $id the ID of the model to be loaded
* @return EulerProblem the loaded model
* @throws CHttpException
*/
public function loadModel($id)
{
$model=EulerProblem::model()->findByPk($id);
if ($model===null) {
throw new CHttpException(404,'The requested page does not exist.');
}
return $model;
}
/**
* Performs the AJAX validation.
* @param EulerProblem $model the model to be validated
*/
protected function performAjaxValidation($model)
{
if (isset($_POST['ajax']) && $_POST['ajax']==='euler-problem-form') {
echo CActiveForm::validate($model);
Yii::app()->end();
}
}
}

View File

@ -43,7 +43,7 @@ class MSMainController extends MSController
/* @var $all_log Log[] */
$data = array();
$data['program'] = ProgramHelper::GetDailyProg();
$data['program'] = ProgramHelper::GetDailyProg(); //TODO-MS Show last BlogEntry
$data['logs'] = $all_log;
$this->render('index', $data);

View File

@ -8,6 +8,7 @@
* @property string $Date
* @property string $Title
* @property string $Content
* @property string $ControllerID
* @property string $Visible
* @property string $Enabled
*/
@ -29,10 +30,10 @@ class BlogPost extends CActiveRecord
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('Date, Title, Content, Visible, Enabled', 'required'),
array('Date, Title, Content, ControllerID, Visible, Enabled', 'required'),
array('Visible, Enabled', 'numerical', 'integerOnly'=>true),
array('ID, Date, Title, Content, Visible, Enabled', 'safe', 'on'=>'search'),
array('ID, Date, Title, Content, ControllerID, Visible, Enabled', 'safe', 'on'=>'search'),
);
}
@ -57,6 +58,7 @@ class BlogPost extends CActiveRecord
'Date' => 'Date',
'Title' => 'Title',
'Content' => 'Content',
'ControllerID' => 'ControllerID',
'Visible' => 'Visible',
'Enabled' => 'Enabled',
);
@ -82,6 +84,7 @@ class BlogPost extends CActiveRecord
$criteria->compare('Date',$this->Date,true);
$criteria->compare('Title',$this->Title,true);
$criteria->compare('Content',$this->Content,true);
$criteria->compare('ControllerID',$this->ControllerID,true);
$criteria->compare('Visible',$this->Visible,true);
$criteria->compare('Enabled',$this->Enabled,true);
@ -167,4 +170,9 @@ class BlogPost extends CActiveRecord
return $result;
}
public function isSpecialBlogPost()
{
return ! empty($this->ControllerID);
}
}

View File

@ -0,0 +1,177 @@
<?php
/**
* This is the model class for table "{{eulerproblem}}".
*
* The followings are the available columns in table '{{eulerproblem}}':
* @property integer $Problemnumber
* @property string $Problemtitle
* @property string $Problemdescription
* @property string $Code
* @property string $Explanation
* @property integer $AbbreviatedCode
* @property string $SolutionSteps
* @property string $SolutionTime
* @property string $SolutionWidth
* @property string $SolutionHeight
* @property string $SolutionValue
*/
class EulerProblem extends CActiveRecord
{
const TIMELEVEL_PERFECT = 0;
const TIMELEVEL_GOOD = 1;
const TIMELEVEL_OK = 2;
const TIMELEVEL_BAD = 3;
const TIMELEVEL_FAIL = 4;
/**
* @return string the associated database table name
*/
public function tableName()
{
return '{{eulerproblem}}';
}
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('Problemnumber, Problemtitle, Problemdescription, Code, Explanation, AbbreviatedCode, SolutionSteps, SolutionTime, SolutionWidth, SolutionHeight, SolutionValue', 'required'),
array('AbbreviatedCode', 'numerical', 'integerOnly'=>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 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 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 .
'[Download](/data/blog/Befunge/Euler_Problem-' . $num_padded . '.b93)' . 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 . '` ' . PHP_EOL .
'**Solution:** `' . number_format($this->SolutionValue, 0, null, ',') . '` ';
}
}

View File

@ -37,7 +37,6 @@ class HighscoreEntries extends CActiveRecord
array('PLAYER, IP', 'length', 'max'=>41),
array('CHECKSUM', 'length', 'max'=>32),
// The following rule is used by search().
// @todo Please remove those attributes that should not be searched.
array('GAME_ID, POINTS, PLAYER, PLAYERID, CHECKSUM, TIMESTAMP, IP', 'safe', 'on'=>'search'),
);
}

View File

@ -81,8 +81,6 @@ class HighscoreGames extends CActiveRecord
*/
public function search()
{
// @todo Please modify the following code to remove attributes that should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('ID',$this->ID);

View File

@ -30,6 +30,8 @@
<?php echo $form->textAreaControlGroup($model,'Content',array('rows'=>30,'span'=>8)); ?>
<?php echo $form->textFieldControlGroup($model,'ControllerID',array('span'=>8)); ?>
<?php
if ($model->isNewRecord)
echo $form->textFieldControlGroup($model,'Visible',array('span'=>5, 'value' => '1'));

View File

@ -17,6 +17,8 @@
<?php echo $form->textAreaControlGroup($model,'Content',array('rows'=>6,'span'=>8)); ?>
<?php echo $form->textFieldControlGroup($model,'ControllerID',array('span'=>5)); ?>
<?php echo $form->textFieldControlGroup($model,'Visible',array('span'=>5)); ?>
<?php echo $form->textFieldControlGroup($model,'Enabled',array('span'=>5)); ?>

View File

@ -21,6 +21,11 @@
<?php echo CHtml::encode($data->Content); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('ControllerID')); ?>:</b>
<?php echo CHtml::encode($data->ControllerID); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('Visible')); ?>:</b>
<?php echo CHtml::encode($data->Visible); ?>
<br />

View File

@ -0,0 +1,168 @@
<?php
/* @var $this BlogPostController */
/* @var $model BlogPost */
/* @var $problems EulerProblem[] */
/* @var $currproblemID int */
/* @var $currproblem EulerProblem */
?>
<?php
$this->pageTitle = 'Blogpost: ' . $model->Title . ' - ' . Yii::app()->name;
if ($currproblemID < 0)
{
$this->breadcrumbs = array(
'Blog' => ['/blog'],
$model->Title,
);
}
else
{
$this->breadcrumbs = array(
'Blog' => ['/blog'],
$model->Title => [$model->getLink()],
'Problem_' . str_pad($problems[$currproblemID]->Problemnumber, 3, '0', STR_PAD_LEFT),
);
}
array_push($this->css_files, "/css/blogpost_ProjectEulerBefunge_style.css");
?>
<div class="container">
<?php echo MsHtml::pageHeader("Blog", "My personal programming blog"); ?>
<?php if ($currproblemID < 0): ?>
<div class="blogOwner well markdownOwner" style="position: relative;">
<a href="https://github.com/Mikescher/Project-Euler_Befunge"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"></a>
<h1><?php echo $model->Title ?></h1>
<p><a href="https://projecteuler.net/problems"><img src="http://projecteuler.net/profile/Mikescher.png" /></a></p>
<p>A lot of you probably know <a href="https://projecteuler.net/">Project Euler</a>.<br />
For those who don't here a short explanation: Project Euler is a collection of mathematical/programming problems.
Most problems consist of finding a single number and are solved by writing a program in the programming language of your choice.</p>
<p>Most people solve these by using normal languages like C, Java, Phyton, Haskell etc.
But you can also go a step further and try solving it with a little bit more exotic languages.</p>
<p>So here are my solutions written in <a href="http://esolangs.org/wiki/Befunge">Befunge</a></p>
<blockquote>
<p><strong>Note:</strong><br />
Similar to most Befunge content on this site I only used the Befunge-93 instruction-set but ignored the 80x25 size restriction.
<em>(Even so most programs here don't get this big.)</em></p>
</blockquote>
<table class="PEB_tableProblems items table table-striped table-bordered table-condensed">
<thead>
<tr>
<th>Number</th>
<th>Title</th>
<th>Time</th>
<th>Size</th>
<th>Solution (hover to reveal)</th>
</tr>
</thead>
<tbody>
<?php
for($i = 0; $i < count($problems); $i++)
{
$problem = $problems[$i];
echo '<tr class="PEB_tablerowProblems">' . "\r\n";
echo '<td class="PEB_tablecellProblems PEB_TC_Number">' . $problem->Problemnumber . "</td>\r\n";
echo '<td class="PEB_tablecellProblems PEB_TC_Title"><a href="?problem=' . $problems[$i]->Problemnumber . '">' . $problem->Problemtitle . "</a></td>\r\n";
echo '<td class="PEB_tablecellProblems"><div class="PEB_TC_Time PEB_TC_Timelevel_' . $problem->getTimeScore() . '">' . MsHelper::formatMilliseconds($problem->SolutionTime) . "</div></td>\r\n";
if ($problem->isBefunge93())
echo '<td class="PEB_tablecellProblems">' . $problem->SolutionWidth . 'x' . $problem->SolutionHeight . '<div class="PEB_TC_Size_93">Bef-93</div>' . "</td>\r\n";
else
echo '<td class="PEB_tablecellProblems">' . $problem->SolutionWidth . 'x' . $problem->SolutionHeight . '<div class="PEB_TC_Size_98">Bef-98</div>' . "</td>\r\n";
echo '<td class="PEB_tablecellProblems PEB_TC_Value">' . number_format($problem->SolutionValue, 0, null, ',') . "</td>\r\n";
echo "</tr>\r\n";
}
?>
</tbody>
</table>
</div>
<?php endif ?>
<div class="blogOwner well markdownOwner" style="position: relative;">
<?php
if ($currproblemID >= 0)
{
echo '<a href="https://github.com/Mikescher/Project-Euler_Befunge"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"></a>';
echo "<h1>$model->Title</h1>";
echo ParsedownHelper::parse($currproblem->generateMarkdown());
}
else
{
echo "<h2>Problems:</h2>";
}
?>
<?php
$pagination = array();
for ($i = 0; $i < ceil(count($problems)/20)*20; $i++)
{
if ($i < count($problems))
array_push($pagination,
[
'label' => str_pad($problems[$i]->Problemnumber, 3, '0', STR_PAD_LEFT),
'url' => '?problem=' . $problems[$i]->Problemnumber,
'disabled' => false,
'active' => $currproblemID == $i,
]);
else
array_push($pagination,
[
'label' => str_pad($i+1, 3, '0', STR_PAD_LEFT),
'url' => '#',
'disabled' => true,
'active' => false,
]);
if ((($i+1) % 20 == 0))
{
echo TbHtml::pagination($pagination, ['align' => TbHtml::PAGINATION_ALIGN_CENTER]);
$pagination = array();
}
}
echo TbHtml::pagination($pagination, ['align' => TbHtml::PAGINATION_ALIGN_CENTER]);
?>
<div class="blogFooter">
<div class="blogFooterLeft">
<?php echo $model->Title; ?>
</div>
<div class="blogFooterRight">
<?php echo $model->getDateTime()->format('d.m.Y'); ?>
</div>
</div>
</div>
<div class="disqus_owner">
<?php
$this->widget(
'ext.YiiDisqusWidget.YiiDisqusWidget',
[
'shortname' => 'mikescher-de',
'identifier' => 'blog/view/' + $model->ID,
'title' => $model->Title,
'url' => $model->getAbsoluteLink(),
'category_id' => '3253401', // = blog/view
]
);
?>
</div>
</div>

View File

@ -0,0 +1,57 @@
<?php
/* @var $this EulerProblemController */
/* @var $model EulerProblem */
/* @var $form TbActiveForm */
?>
<div class="form">
<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(
'id'=>'euler-problem-form',
// Please note: When you enable ajax validation, make sure the corresponding
// controller action is handling ajax validation correctly.
// There is a call to performAjaxValidation() commented in generated controller code.
// See class documentation of CActiveForm for details on this.
'enableAjaxValidation'=>false,
)); ?>
<p class="help-block">Fields with <span class="required">*</span> are required.</p>
<?php echo $form->errorSummary($model); ?>
<?php echo $form->textFieldControlGroup($model,'Problemnumber',array('span'=>8)); ?>
<?php echo $form->textFieldControlGroup($model,'Problemtitle',array('span'=>5,'maxlength'=>50)); ?>
<?php echo $form->textAreaControlGroup($model,'Problemdescription',array('rows'=>6,'span'=>8)); ?>
<?php echo $form->textAreaControlGroup($model,'Code',array('rows'=>6,'span'=>8)); ?>
<?php echo $form->textAreaControlGroup($model,'Explanation',array('rows'=>6,'span'=>8)); ?>
<?php
if ($model->isNewRecord)
echo $form->textFieldControlGroup($model,'AbbreviatedCode',array('span'=>5, 'value' => '0'));
else
echo $form->textFieldControlGroup($model,'AbbreviatedCode',array('span'=>5));
?>
<?php echo $form->textFieldControlGroup($model,'SolutionSteps',array('span'=>5,'maxlength'=>20)); ?>
<?php echo $form->textFieldControlGroup($model,'SolutionTime',array('span'=>5,'maxlength'=>20)); ?>
<?php echo $form->textFieldControlGroup($model,'SolutionWidth',array('span'=>5)); ?>
<?php echo $form->textFieldControlGroup($model,'SolutionHeight',array('span'=>5)); ?>
<?php echo $form->textFieldControlGroup($model,'SolutionValue',array('span'=>5,'maxlength'=>20)); ?>
<div class="form-actions">
<?php echo TbHtml::submitButton($model->isNewRecord ? 'Create' : 'Save',array(
'color'=>TbHtml::BUTTON_COLOR_PRIMARY,
'size'=>TbHtml::BUTTON_SIZE_LARGE,
)); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->

View File

@ -0,0 +1,41 @@
<?php
/* @var $this EulerProblemController */
/* @var $model EulerProblem */
/* @var $form CActiveForm */
?>
<div class="wide form">
<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(
'action'=>Yii::app()->createUrl($this->route),
'method'=>'get',
)); ?>
<?php echo $form->textFieldControlGroup($model,'Problemnumber',array('span'=>5)); ?>
<?php echo $form->textFieldControlGroup($model,'Problemtitle',array('span'=>5,'maxlength'=>50)); ?>
<?php echo $form->textAreaControlGroup($model,'Problemdescription',array('rows'=>6,'span'=>8)); ?>
<?php echo $form->textAreaControlGroup($model,'Code',array('rows'=>6,'span'=>8)); ?>
<?php echo $form->textAreaControlGroup($model,'Explanation',array('rows'=>6,'span'=>8)); ?>
<?php echo $form->textFieldControlGroup($model,'AbbreviatedCode',array('span'=>5)); ?>
<?php echo $form->textFieldControlGroup($model,'SolutionSteps',array('span'=>5,'maxlength'=>20)); ?>
<?php echo $form->textFieldControlGroup($model,'SolutionTime',array('span'=>5,'maxlength'=>20)); ?>
<?php echo $form->textFieldControlGroup($model,'SolutionWidth',array('span'=>5)); ?>
<?php echo $form->textFieldControlGroup($model,'SolutionHeight',array('span'=>5)); ?>
<?php echo $form->textFieldControlGroup($model,'SolutionValue',array('span'=>5,'maxlength'=>20)); ?>
<div class="form-actions">
<?php echo TbHtml::submitButton('Search', array('color' => TbHtml::BUTTON_COLOR_PRIMARY,));?>
</div>
<?php $this->endWidget(); ?>
</div><!-- search-form -->

View File

@ -0,0 +1,55 @@
<?php
/* @var $this EulerProblemController */
/* @var $data EulerProblem */
?>
<div class="view">
<b><?php echo CHtml::encode($data->getAttributeLabel('Problemnumber')); ?>:</b>
<?php echo CHtml::link(CHtml::encode($data->Problemnumber),array('view','id'=>$data->Problemnumber)); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('Problemtitle')); ?>:</b>
<?php echo CHtml::link(CHtml::encode($data->Problemtitle)); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('Problemdescription')); ?>:</b>
<?php echo CHtml::encode($data->Problemdescription); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('Code')); ?>:</b>
<?php echo CHtml::encode($data->Code); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('Explanation')); ?>:</b>
<?php echo CHtml::encode($data->Explanation); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('AbbreviatedCode')); ?>:</b>
<?php echo CHtml::encode($data->AbbreviatedCode); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('SolutionSteps')); ?>:</b>
<?php echo CHtml::encode($data->SolutionSteps); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('SolutionWidth')); ?>:</b>
<?php echo CHtml::encode($data->SolutionTime); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('SolutionHeight')); ?>:</b>
<?php echo CHtml::encode($data->SolutionTime); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('SolutionTime')); ?>:</b>
<?php echo CHtml::encode($data->SolutionTime); ?>
<br />
<?php /*
<b><?php echo CHtml::encode($data->getAttributeLabel('SolutionValue')); ?>:</b>
<?php echo CHtml::encode($data->SolutionValue); ?>
<br />
*/ ?>
</div>

View File

@ -0,0 +1,64 @@
<?php
/* @var $this EulerProblemController */
/* @var $model EulerProblem */
$this->breadcrumbs=array(
'Euler Problems'=>array('index'),
'Manage',
);
$this->menu=array(
array('label'=>'List EulerProblem', 'url'=>array('index')),
array('label'=>'Create EulerProblem', 'url'=>array('create')),
);
Yii::app()->clientScript->registerScript('search', "
$('.search-button').click(function(){
$('.search-form').toggle();
return false;
});
$('.search-form form').submit(function(){
$('#euler-problem-grid').yiiGridView('update', {
data: $(this).serialize()
});
return false;
});
");
?>
<h1>Manage Euler Problems</h1>
<p>
You may optionally enter a comparison operator (<b>&lt;</b>, <b>&lt;=</b>, <b>&gt;</b>, <b>&gt;=</b>, <b>
&lt;&gt;</b>
or <b>=</b>) at the beginning of each of your search values to specify how the comparison should be done.
</p>
<?php echo CHtml::link('Advanced Search','#',array('class'=>'search-button btn')); ?>
<div class="search-form" style="display:none">
<?php $this->renderPartial('_search',array(
'model'=>$model,
)); ?>
</div><!-- search-form -->
<?php $this->widget('bootstrap.widgets.TbGridView',array(
'id'=>'euler-problem-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'Problemnumber',
'Problemdescription',
'Code',
'Explanation',
'AbbreviatedCode',
'SolutionSteps',
/*
'SolutionTime',
'SolutionValue',
*/
array(
'class'=>'bootstrap.widgets.TbButtonColumn',
),
),
)); ?>

View File

@ -0,0 +1,20 @@
<?php
/* @var $this EulerProblemController */
/* @var $model EulerProblem */
?>
<?php
$this->breadcrumbs=array(
'Euler Problems'=>array('index'),
'Create',
);
$this->menu=array(
array('label'=>'List EulerProblem', 'url'=>array('index')),
array('label'=>'Manage EulerProblem', 'url'=>array('admin')),
);
?>
<h1>Create EulerProblem</h1>
<?php $this->renderPartial('_form', array('model'=>$model)); ?>

View File

@ -0,0 +1,35 @@
<?php
/* @var $this EulerProblemController */
/* @var $dataProvider CActiveDataProvider */
?>
<?php
$this->breadcrumbs=array(
'Euler Problems',
);
$this->menu=array(
array('label'=>'Create EulerProblem','url'=>array('create')),
array('label'=>'Manage EulerProblem','url'=>array('admin')),
);
?>
<h1>Euler Problems</h1>
<?php $this->widget('bootstrap.widgets.TbGridView',array(
'type'=>'striped bordered condensed',
'dataProvider'=>$dataProvider,
'columns'=>array(
'Problemnumber',
'Problemtitle',
'Problemdescription',
'AbbreviatedCode',
'SolutionWidth',
'SolutionHeight',
'SolutionSteps',
'SolutionTime',
'SolutionValue',
),
)); ?>

View File

@ -0,0 +1,23 @@
<?php
/* @var $this EulerProblemController */
/* @var $model EulerProblem */
?>
<?php
$this->breadcrumbs=array(
'Euler Problems'=>array('index'),
'#' . $model->Problemnumber=>array('view','id'=>$model->Problemnumber),
'Update',
);
$this->menu=array(
array('label'=>'List EulerProblem', 'url'=>array('index')),
array('label'=>'Create EulerProblem', 'url'=>array('create')),
array('label'=>'View EulerProblem', 'url'=>array('view', 'id'=>$model->Problemnumber)),
array('label'=>'Manage EulerProblem', 'url'=>array('admin')),
);
?>
<h1>Update EulerProblem <?php echo $model->Problemnumber; ?></h1>
<?php $this->renderPartial('_form', array('model'=>$model)); ?>

View File

@ -0,0 +1,38 @@
<?php
/* @var $this EulerProblemController */
/* @var $model EulerProblem */
?>
<?php
$this->breadcrumbs=array(
'Euler Problems'=>array('index'),
'#' . $model->Problemnumber,
);
$this->menu=array(
array('label'=>'List EulerProblem', 'url'=>array('index')),
array('label'=>'Create EulerProblem', 'url'=>array('create')),
array('label'=>'Update EulerProblem', 'url'=>array('update', 'id'=>$model->Problemnumber)),
array('label'=>'Delete EulerProblem', 'url'=>'#', 'linkOptions'=>array('submit'=>array('delete','id'=>$model->Problemnumber),'confirm'=>'Are you sure you want to delete this item?')),
array('label'=>'Manage EulerProblem', 'url'=>array('admin')),
);
?>
<h1>View EulerProblem #<?php echo $model->Problemnumber; ?></h1>
<?php $this->widget('zii.widgets.CDetailView',array(
'htmlOptions' => array(
'class' => 'table table-striped table-condensed table-hover',
),
'data'=>$model,
'attributes'=>array(
'Problemnumber',
'Problemdescription',
'Code',
'Explanation',
'AbbreviatedCode',
'SolutionSteps',
'SolutionTime',
'SolutionValue',
),
)); ?>

View File

@ -19,9 +19,13 @@
<link rel="icon" type="image/png" href="/images/favicon.png"/>
<?php Yii::app()->bootstrap->register(); ?>
<link rel="stylesheet" type="text/css" href="/css/styles.css"/>
<link rel="stylesheet" type="text/css" href="/css/prism.css"/>
<link rel="stylesheet" type="text/css" href="/css/lightbox.css"/>
<?php
foreach ($this->css_files as $file)
{
echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"$file\"/>\r\n";
}
?>
</head>
<body>
<!--if lt IE 7]>

View File

@ -48,7 +48,6 @@ $this->breadcrumbs =
echo MsHtml::stackedTabs(
[
['label' => 'Show', 'url' => '/programupdates'],
['label' => 'Manage', 'url' => '/programupdates/admin'],
['label' => 'Create', 'url' => '/programupdates/create'],
]
@ -69,6 +68,59 @@ $this->breadcrumbs =
</div>
</div>
<div class="row">
<div class="span3">
<?php
echo MsHtml::lead('EulerProblems');
echo MsHtml::stackedTabs(
[
['label' => 'Manage', 'url' => '/eulerproblem/admin'],
['label' => 'Create', 'url' => '/eulerproblem/create'],
]
); ?>
</div>
<div class="span3" style="visibility: hidden">
<?php
echo MsHtml::lead('xxx');
echo MsHtml::stackedTabs(
[
['label' => 'Show', 'url' => '/xxx'],
['label' => 'Manage', 'url' => '/xxx/admin'],
['label' => 'Create', 'url' => '/xxx/create'],
]
); ?>
</div>
<div class="span3" style="visibility: hidden">
<?php
echo MsHtml::lead('xxx');
echo MsHtml::stackedTabs(
[
['label' => 'Show', 'url' => '/xxx'],
['label' => 'Manage', 'url' => '/xxx/admin'],
['label' => 'Create', 'url' => '/xxx/create'],
]
); ?>
</div>
<div class="span3" style="visibility: hidden">
<?php
echo MsHtml::lead('xxx');
echo MsHtml::stackedTabs(
[
['label' => 'Show', 'url' => '/xxx'],
['label' => 'Manage', 'url' => '/xxx/admin'],
['label' => 'Create', 'url' => '/xxx/create'],
]
); ?>
</div>
</div>
<div class="well well-small">
<?php
$egh = $egh = (new ExtendedGitGraph('Mikescher'))->loadFinishedData();

View File

@ -23,9 +23,18 @@ $this->selectedNav = 'prog';
<?php
if (empty($category))
{
echo MsHtml::pageHeader("Programs", "Games and Tools, developed by me");
}
else
{
echo MsHtml::pageHeader("Programs", '"' . $category . '"');
$this->breadcrumbs = array(
'Programs' => '/programs',
$category
);
}
?>
<div class="row-fluid">

View File

@ -11,6 +11,9 @@ $this->breadcrumbs = array(
'Programs' => array('index'),
$model->Name,
);
array_push($this->css_files, "/css/lightbox.css");
?>
<?php
@ -112,7 +115,7 @@ if (!$model->visible && Yii::app()->user->name != 'admin') {
'color' => TbHtml::BUTTON_COLOR_PRIMARY,
'size' => TbHtml::BUTTON_SIZE_DEFAULT,
'Content' => 'nofollow',
'url' => $model->getDownloadLink(), //TODO-MS Add Download link
'url' => $model->getDownloadLink(),
]);
?>
@ -156,7 +159,7 @@ if (!$model->visible && Yii::app()->user->name != 'admin') {
'block' => true,
'color' => TbHtml::BUTTON_COLOR_SUCCESS,
'size' => TbHtml::BUTTON_SIZE_DEFAULT,
'url' => '/Highscores/list?gameid=' . $model->highscore_gid, //TODO-MS Add Highscore link
'url' => '/Highscores/list?gameid=' . $model->highscore_gid,
]);
?>
</div>