ParsedownCustom
@ -234,7 +234,6 @@ html, body {
|
|||||||
-moz-hyphens: none;
|
-moz-hyphens: none;
|
||||||
-ms-hyphens: none;
|
-ms-hyphens: none;
|
||||||
hyphens: none; }
|
hyphens: none; }
|
||||||
|
|
||||||
.bc_markdown pre {
|
.bc_markdown pre {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
display: block;
|
display: block;
|
||||||
@ -250,41 +249,48 @@ html, body {
|
|||||||
-webkit-border-radius: 2px;
|
-webkit-border-radius: 2px;
|
||||||
-moz-border-radius: 2px;
|
-moz-border-radius: 2px;
|
||||||
border-radius: 2px; }
|
border-radius: 2px; }
|
||||||
|
|
||||||
.bc_markdown blockquote {
|
.bc_markdown blockquote {
|
||||||
padding: 0 0 0 15px;
|
padding: 0 0 0 15px;
|
||||||
margin: 0 0 20px;
|
margin: 0 0 20px;
|
||||||
border-left: 5px solid #CCC; }
|
border-left: 5px solid #CCC; }
|
||||||
|
.bc_markdown img {
|
||||||
.mdtable_container {
|
max-width: 100%; }
|
||||||
overflow-x: auto; }
|
.bc_markdown table {
|
||||||
|
|
||||||
.mdtable {
|
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border: 1px solid #666; }
|
border: 1px solid #666; }
|
||||||
.mdtable td, .mdtable th {
|
.bc_markdown table td, .bc_markdown table th {
|
||||||
padding: 3px 10px; }
|
padding: 3px 10px; }
|
||||||
.mdtable thead th {
|
.bc_markdown table thead th {
|
||||||
background-color: #7D7D7D;
|
background-color: #7D7D7D;
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
border-left: 1px solid #444; }
|
border-left: 1px solid #444; }
|
||||||
.mdtable thead th:first-child {
|
.bc_markdown table thead th:first-child {
|
||||||
border: none; }
|
border: none; }
|
||||||
.mdtable tbody td {
|
.bc_markdown table tbody td {
|
||||||
border-left: 1px solid #666;
|
border-left: 1px solid #666;
|
||||||
font-weight: normal; }
|
font-weight: normal; }
|
||||||
.mdtable tbody .alt td {
|
.bc_markdown table tbody .alt td {
|
||||||
background: #EBEBEB; }
|
background: #EBEBEB; }
|
||||||
.mdtable tbody td:first-child {
|
.bc_markdown table tbody td:first-child {
|
||||||
border-left: none; }
|
border-left: none; }
|
||||||
.mdtable tbody tr:last-child td {
|
.bc_markdown table tbody tr:last-child td {
|
||||||
border-bottom: none; }
|
border-bottom: none; }
|
||||||
.mdtable tbody tr:nth-child(odd) {
|
.bc_markdown table tbody tr:nth-child(odd) {
|
||||||
background-color: #ccc; }
|
background-color: #ccc; }
|
||||||
|
|
||||||
|
.mdtable_container {
|
||||||
|
overflow-x: auto; }
|
||||||
|
|
||||||
|
.notable {
|
||||||
|
width: unset !important;
|
||||||
|
border: none !important; }
|
||||||
|
.notable th, .notable td, .notable tr {
|
||||||
|
border: none !important;
|
||||||
|
background: transparent !important; }
|
||||||
|
|
||||||
#PEB_tableProblems .PEB_tablerowProblems:hover {
|
#PEB_tableProblems .PEB_tablerowProblems:hover {
|
||||||
background-color: #888; }
|
background-color: #888; }
|
||||||
#PEB_tableProblems .PEB_TC_Value {
|
#PEB_tableProblems .PEB_TC_Value {
|
||||||
@ -611,7 +617,7 @@ html, body {
|
|||||||
white-space: pre;
|
white-space: pre;
|
||||||
font-family: Consolas, Monaco, "Courier New", Menlo, monospace;
|
font-family: Consolas, Monaco, "Courier New", Menlo, monospace;
|
||||||
padding: 9.5px;
|
padding: 9.5px;
|
||||||
font-size: 11pt; }
|
font-size: 10pt; }
|
||||||
.bce_code .bce_code_ctrl {
|
.bce_code .bce_code_ctrl {
|
||||||
background: #BBB;
|
background: #BBB;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
23
www/data/css/styles.min.css
vendored
@ -51,16 +51,19 @@ html,body{margin:0;padding:0;height:100%}
|
|||||||
.bc_markdown code{font-family:Consolas,Monaco,"Courier New",Menlo,monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}
|
.bc_markdown code{font-family:Consolas,Monaco,"Courier New",Menlo,monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}
|
||||||
.bc_markdown pre{font-size:14px;display:block;padding:9.5px;margin:0 0 10px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre-wrap;background-color:#f8f8f8;color:black;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}
|
.bc_markdown pre{font-size:14px;display:block;padding:9.5px;margin:0 0 10px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre-wrap;background-color:#f8f8f8;color:black;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}
|
||||||
.bc_markdown blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #CCC}
|
.bc_markdown blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #CCC}
|
||||||
|
.bc_markdown img{max-width:100%}
|
||||||
|
.bc_markdown table{border-collapse:collapse;text-align:left;width:100%;border:1px solid #666}
|
||||||
|
.bc_markdown table td,.bc_markdown table th{padding:3px 10px}
|
||||||
|
.bc_markdown table thead th{background-color:#7d7d7d;color:#fff;font-weight:bold;border-left:1px solid #444}
|
||||||
|
.bc_markdown table thead th:first-child{border:0}
|
||||||
|
.bc_markdown table tbody td{border-left:1px solid #666;font-weight:normal}
|
||||||
|
.bc_markdown table tbody .alt td{background:#ebebeb}
|
||||||
|
.bc_markdown table tbody td:first-child{border-left:0}
|
||||||
|
.bc_markdown table tbody tr:last-child td{border-bottom:0}
|
||||||
|
.bc_markdown table tbody tr:nth-child(odd){background-color:#ccc}
|
||||||
.mdtable_container{overflow-x:auto}
|
.mdtable_container{overflow-x:auto}
|
||||||
.mdtable{border-collapse:collapse;text-align:left;width:100%;border:1px solid #666}
|
.notable{width:unset !important;border:none !important}
|
||||||
.mdtable td,.mdtable th{padding:3px 10px}
|
.notable th,.notable td,.notable tr{border:none !important;background:transparent !important}
|
||||||
.mdtable thead th{background-color:#7d7d7d;color:#fff;font-weight:bold;border-left:1px solid #444}
|
|
||||||
.mdtable thead th:first-child{border:0}
|
|
||||||
.mdtable tbody td{border-left:1px solid #666;font-weight:normal}
|
|
||||||
.mdtable tbody .alt td{background:#ebebeb}
|
|
||||||
.mdtable tbody td:first-child{border-left:0}
|
|
||||||
.mdtable tbody tr:last-child td{border-bottom:0}
|
|
||||||
.mdtable tbody tr:nth-child(odd){background-color:#ccc}
|
|
||||||
#PEB_tableProblems .PEB_tablerowProblems:hover{background-color:#888}
|
#PEB_tableProblems .PEB_tablerowProblems:hover{background-color:#888}
|
||||||
#PEB_tableProblems .PEB_TC_Value{font-family:Consolas,Monaco,"Courier New",Menlo,monospace}
|
#PEB_tableProblems .PEB_TC_Value{font-family:Consolas,Monaco,"Courier New",Menlo,monospace}
|
||||||
#PEB_tableProblems .PEB_TC_Value:not(:hover){color:transparent;-o-transition:.5s;-ms-transition:.5s;-moz-transition:.5s;-webkit-transition:.5s;transition:.5s}
|
#PEB_tableProblems .PEB_TC_Value:not(:hover){color:transparent;-o-transition:.5s;-ms-transition:.5s;-moz-transition:.5s;-webkit-transition:.5s;transition:.5s}
|
||||||
@ -160,7 +163,7 @@ html,body{margin:0;padding:0;height:100%}
|
|||||||
.bfjoust_runner_owner #run_speed{width:70px}
|
.bfjoust_runner_owner #run_speed{width:70px}
|
||||||
.bfjoust_runner_owner #board{background-color:#FFF;border-radius:6px;border:1px solid #CCC}
|
.bfjoust_runner_owner #board{background-color:#FFF;border-radius:6px;border:1px solid #CCC}
|
||||||
.bce_code{background:#f8f8f8;color:black;border:1px solid rgba(0,0,0,0.15)}
|
.bce_code{background:#f8f8f8;color:black;border:1px solid rgba(0,0,0,0.15)}
|
||||||
.bce_code .bce_code_data{overflow-x:auto;white-space:pre;font-family:Consolas,Monaco,"Courier New",Menlo,monospace;padding:9.5px;font-size:11pt}
|
.bce_code .bce_code_data{overflow-x:auto;white-space:pre;font-family:Consolas,Monaco,"Courier New",Menlo,monospace;padding:9.5px;font-size:10pt}
|
||||||
.bce_code .bce_code_ctrl{background:#BBB;display:flex;flex-direction:row}
|
.bce_code .bce_code_ctrl{background:#BBB;display:flex;flex-direction:row}
|
||||||
.bce_code .bce_code_ctrl .ctrl_btn_left,.bce_code .bce_code_ctrl .ctrl_btn_right{display:flex;flex-direction:row}
|
.bce_code .bce_code_ctrl .ctrl_btn_left,.bce_code .bce_code_ctrl .ctrl_btn_right{display:flex;flex-direction:row}
|
||||||
.bce_code .bce_code_ctrl .ctrl_btn_left{margin-right:auto}
|
.bce_code .bce_code_ctrl .ctrl_btn_left{margin-right:auto}
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
font-family: $FONT_CODE;
|
font-family: $FONT_CODE;
|
||||||
padding: 9.5px;
|
padding: 9.5px;
|
||||||
|
|
||||||
font-size: 11pt;
|
font-size: 10pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bce_code_ctrl {
|
.bce_code_ctrl {
|
||||||
|
@ -18,88 +18,102 @@
|
|||||||
padding: 8px;
|
padding: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bc_markdown code {
|
.bc_markdown {
|
||||||
font-family: $FONT_CODE;
|
|
||||||
direction: ltr;
|
|
||||||
text-align: left;
|
|
||||||
white-space: pre;
|
|
||||||
word-spacing: normal;
|
|
||||||
word-break: normal;
|
|
||||||
-moz-tab-size: 4;
|
|
||||||
tab-size: 4;
|
|
||||||
-webkit-hyphens: none;
|
|
||||||
-moz-hyphens: none;
|
|
||||||
-ms-hyphens: none;
|
|
||||||
hyphens: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bc_markdown pre {
|
code {
|
||||||
font-size: 14px;
|
font-family: $FONT_CODE;
|
||||||
display: block;
|
direction: ltr;
|
||||||
padding: 9.5px;
|
text-align: left;
|
||||||
margin: 0 0 10px;
|
white-space: pre;
|
||||||
line-height: 20px;
|
word-spacing: normal;
|
||||||
word-break: break-all;
|
word-break: normal;
|
||||||
word-wrap: break-word;
|
-moz-tab-size: 4;
|
||||||
white-space: pre-wrap;
|
tab-size: 4;
|
||||||
background-color: $COL_BACKGROUND_3;
|
-webkit-hyphens: none;
|
||||||
color: black;
|
-moz-hyphens: none;
|
||||||
border: 1px solid rgba(0,0,0,.15);
|
-ms-hyphens: none;
|
||||||
-webkit-border-radius: 2px;
|
hyphens: none;
|
||||||
-moz-border-radius: 2px;
|
}
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bc_markdown blockquote {
|
pre {
|
||||||
padding: 0 0 0 15px;
|
font-size: 14px;
|
||||||
margin: 0 0 20px;
|
display: block;
|
||||||
border-left: 5px solid #CCC;
|
padding: 9.5px;
|
||||||
|
margin: 0 0 10px;
|
||||||
|
line-height: 20px;
|
||||||
|
word-break: break-all;
|
||||||
|
word-wrap: break-word;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
background-color: $COL_BACKGROUND_3;
|
||||||
|
color: black;
|
||||||
|
border: 1px solid rgba(0,0,0,.15);
|
||||||
|
-webkit-border-radius: 2px;
|
||||||
|
-moz-border-radius: 2px;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote {
|
||||||
|
padding: 0 0 0 15px;
|
||||||
|
margin: 0 0 20px;
|
||||||
|
border-left: 5px solid #CCC;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
text-align: left;
|
||||||
|
width: 100%;
|
||||||
|
border: 1px solid #666;
|
||||||
|
|
||||||
|
td, th {
|
||||||
|
padding: 3px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead th {
|
||||||
|
background-color: #7D7D7D;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-weight: bold;
|
||||||
|
border-left: 1px solid #444;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead th:first-child {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody td {
|
||||||
|
border-left: 1px solid #666;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody .alt td {
|
||||||
|
background: #EBEBEB;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody td:first-child {
|
||||||
|
border-left: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody tr:last-child td {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody tr:nth-child(odd) {
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.mdtable_container {overflow-x: auto;}
|
.mdtable_container {overflow-x: auto;}
|
||||||
|
|
||||||
.mdtable {
|
.notable {
|
||||||
border-collapse: collapse;
|
width: unset !important;
|
||||||
text-align: left;
|
border: none !important;
|
||||||
width: 100%;
|
|
||||||
border: 1px solid #666;
|
|
||||||
|
|
||||||
td, th {
|
th,td,tr {
|
||||||
padding: 3px 10px;
|
border: none !important;
|
||||||
|
background: transparent !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
thead th {
|
|
||||||
background-color: #7D7D7D;
|
|
||||||
color: #FFFFFF;
|
|
||||||
font-weight: bold;
|
|
||||||
border-left: 1px solid #444;
|
|
||||||
}
|
|
||||||
|
|
||||||
thead th:first-child {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
tbody td {
|
|
||||||
border-left: 1px solid #666;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
tbody .alt td {
|
|
||||||
background: #EBEBEB;
|
|
||||||
}
|
|
||||||
|
|
||||||
tbody td:first-child {
|
|
||||||
border-left: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
tbody tr:last-child td {
|
|
||||||
border-bottom: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
tbody tr:nth-child(odd) {
|
|
||||||
background-color: #ccc;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
BIN
www/data/images/blog/p015.gif
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
www/data/images/blog/p068_1.gif
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
www/data/images/blog/p068_2.gif
Normal file
After Width: | Height: | Size: 8.6 KiB |
BIN
www/data/images/blog/p085.gif
Normal file
After Width: | Height: | Size: 8.0 KiB |
BIN
www/data/images/blog/p090.gif
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
www/data/images/blog/p091_1.gif
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
www/data/images/blog/p091_2.gif
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
www/data/images/blog/rapla_logo.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
www/data/images/blog/rapla_preview.png
Normal file
After Width: | Height: | Size: 128 KiB |
BIN
www/data/images/blog/sudoku.png
Normal file
After Width: | Height: | Size: 26 KiB |
@ -770,11 +770,15 @@ function collapse(code) {
|
|||||||
|
|
||||||
//######################################################
|
//######################################################
|
||||||
|
|
||||||
document.getElementById("a_expand").onclick = onExpandClicked;
|
window.onload = function ()
|
||||||
document.getElementById("a_collapse").onclick = onCollapseClicked;
|
{
|
||||||
document.getElementById("a_run").onclick = onRunClicked;
|
document.getElementById("a_expand").onclick = onExpandClicked;
|
||||||
document.getElementById("a_stop").onclick = onStopClicked;
|
document.getElementById("a_collapse").onclick = onCollapseClicked;
|
||||||
document.getElementById("a_arena").onclick = onArenaClicked;
|
document.getElementById("a_run").onclick = onRunClicked;
|
||||||
|
document.getElementById("a_stop").onclick = onStopClicked;
|
||||||
|
document.getElementById("a_arena").onclick = onArenaClicked;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
function onExpandClicked() {
|
function onExpandClicked() {
|
||||||
var source1 = document.getElementById("source_1");
|
var source1 = document.getElementById("source_1");
|
||||||
|
0
www/data/javascript/blogpost_bef93runner.js
Normal file
526
www/extern/ParsedownExtra.php
vendored
Normal file
@ -0,0 +1,526 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Parsedown Extra
|
||||||
|
# https://github.com/erusev/parsedown-extra
|
||||||
|
#
|
||||||
|
# (c) Emanuil Rusev
|
||||||
|
# http://erusev.com
|
||||||
|
#
|
||||||
|
# For the full license information, view the LICENSE file that was distributed
|
||||||
|
# with this source code.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
class ParsedownExtra extends Parsedown
|
||||||
|
{
|
||||||
|
# ~
|
||||||
|
|
||||||
|
const version = '0.7.0';
|
||||||
|
|
||||||
|
# ~
|
||||||
|
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
if (parent::version < '1.5.0')
|
||||||
|
{
|
||||||
|
throw new Exception('ParsedownExtra requires a later version of Parsedown');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->BlockTypes[':'] []= 'DefinitionList';
|
||||||
|
$this->BlockTypes['*'] []= 'Abbreviation';
|
||||||
|
|
||||||
|
# identify footnote definitions before reference definitions
|
||||||
|
array_unshift($this->BlockTypes['['], 'Footnote');
|
||||||
|
|
||||||
|
# identify footnote markers before before links
|
||||||
|
array_unshift($this->InlineTypes['['], 'FootnoteMarker');
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# ~
|
||||||
|
|
||||||
|
function text($text)
|
||||||
|
{
|
||||||
|
$markup = parent::text($text);
|
||||||
|
|
||||||
|
# merge consecutive dl elements
|
||||||
|
|
||||||
|
$markup = preg_replace('/<\/dl>\s+<dl>\s+/', '', $markup);
|
||||||
|
|
||||||
|
# add footnotes
|
||||||
|
|
||||||
|
if (isset($this->DefinitionData['Footnote']))
|
||||||
|
{
|
||||||
|
$Element = $this->buildFootnoteElement();
|
||||||
|
|
||||||
|
$markup .= "\n" . $this->element($Element);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $markup;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Blocks
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Abbreviation
|
||||||
|
|
||||||
|
protected function blockAbbreviation($Line)
|
||||||
|
{
|
||||||
|
if (preg_match('/^\*\[(.+?)\]:[ ]*(.+?)[ ]*$/', $Line['text'], $matches))
|
||||||
|
{
|
||||||
|
$this->DefinitionData['Abbreviation'][$matches[1]] = $matches[2];
|
||||||
|
|
||||||
|
$Block = array(
|
||||||
|
'hidden' => true,
|
||||||
|
);
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Footnote
|
||||||
|
|
||||||
|
protected function blockFootnote($Line)
|
||||||
|
{
|
||||||
|
if (preg_match('/^\[\^(.+?)\]:[ ]?(.*)$/', $Line['text'], $matches))
|
||||||
|
{
|
||||||
|
$Block = array(
|
||||||
|
'label' => $matches[1],
|
||||||
|
'text' => $matches[2],
|
||||||
|
'hidden' => true,
|
||||||
|
);
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function blockFootnoteContinue($Line, $Block)
|
||||||
|
{
|
||||||
|
if ($Line['text'][0] === '[' and preg_match('/^\[\^(.+?)\]:/', $Line['text']))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($Block['interrupted']))
|
||||||
|
{
|
||||||
|
if ($Line['indent'] >= 4)
|
||||||
|
{
|
||||||
|
$Block['text'] .= "\n\n" . $Line['text'];
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$Block['text'] .= "\n" . $Line['text'];
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function blockFootnoteComplete($Block)
|
||||||
|
{
|
||||||
|
$this->DefinitionData['Footnote'][$Block['label']] = array(
|
||||||
|
'text' => $Block['text'],
|
||||||
|
'count' => null,
|
||||||
|
'number' => null,
|
||||||
|
);
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Definition List
|
||||||
|
|
||||||
|
protected function blockDefinitionList($Line, $Block)
|
||||||
|
{
|
||||||
|
if ( ! isset($Block) or isset($Block['type']))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$Element = array(
|
||||||
|
'name' => 'dl',
|
||||||
|
'handler' => 'elements',
|
||||||
|
'text' => array(),
|
||||||
|
);
|
||||||
|
|
||||||
|
$terms = explode("\n", $Block['element']['text']);
|
||||||
|
|
||||||
|
foreach ($terms as $term)
|
||||||
|
{
|
||||||
|
$Element['text'] []= array(
|
||||||
|
'name' => 'dt',
|
||||||
|
'handler' => 'line',
|
||||||
|
'text' => $term,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$Block['element'] = $Element;
|
||||||
|
|
||||||
|
$Block = $this->addDdElement($Line, $Block);
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function blockDefinitionListContinue($Line, array $Block)
|
||||||
|
{
|
||||||
|
if ($Line['text'][0] === ':')
|
||||||
|
{
|
||||||
|
$Block = $this->addDdElement($Line, $Block);
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (isset($Block['interrupted']) and $Line['indent'] === 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($Block['interrupted']))
|
||||||
|
{
|
||||||
|
$Block['dd']['handler'] = 'text';
|
||||||
|
$Block['dd']['text'] .= "\n\n";
|
||||||
|
|
||||||
|
unset($Block['interrupted']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$text = substr($Line['body'], min($Line['indent'], 4));
|
||||||
|
|
||||||
|
$Block['dd']['text'] .= "\n" . $text;
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Header
|
||||||
|
|
||||||
|
protected function blockHeader($Line)
|
||||||
|
{
|
||||||
|
$Block = parent::blockHeader($Line);
|
||||||
|
|
||||||
|
if (preg_match('/[ #]*{('.$this->regexAttribute.'+)}[ ]*$/', $Block['element']['text'], $matches, PREG_OFFSET_CAPTURE))
|
||||||
|
{
|
||||||
|
$attributeString = $matches[1][0];
|
||||||
|
|
||||||
|
$Block['element']['attributes'] = $this->parseAttributeData($attributeString);
|
||||||
|
|
||||||
|
$Block['element']['text'] = substr($Block['element']['text'], 0, $matches[0][1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Markup
|
||||||
|
|
||||||
|
protected function blockMarkupComplete($Block)
|
||||||
|
{
|
||||||
|
if ( ! isset($Block['void']))
|
||||||
|
{
|
||||||
|
$Block['markup'] = $this->processTag($Block['markup']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Setext
|
||||||
|
|
||||||
|
protected function blockSetextHeader($Line, array $Block = null)
|
||||||
|
{
|
||||||
|
$Block = parent::blockSetextHeader($Line, $Block);
|
||||||
|
|
||||||
|
if (preg_match('/[ ]*{('.$this->regexAttribute.'+)}[ ]*$/', $Block['element']['text'], $matches, PREG_OFFSET_CAPTURE))
|
||||||
|
{
|
||||||
|
$attributeString = $matches[1][0];
|
||||||
|
|
||||||
|
$Block['element']['attributes'] = $this->parseAttributeData($attributeString);
|
||||||
|
|
||||||
|
$Block['element']['text'] = substr($Block['element']['text'], 0, $matches[0][1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Inline Elements
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Footnote Marker
|
||||||
|
|
||||||
|
protected function inlineFootnoteMarker($Excerpt)
|
||||||
|
{
|
||||||
|
if (preg_match('/^\[\^(.+?)\]/', $Excerpt['text'], $matches))
|
||||||
|
{
|
||||||
|
$name = $matches[1];
|
||||||
|
|
||||||
|
if ( ! isset($this->DefinitionData['Footnote'][$name]))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->DefinitionData['Footnote'][$name]['count'] ++;
|
||||||
|
|
||||||
|
if ( ! isset($this->DefinitionData['Footnote'][$name]['number']))
|
||||||
|
{
|
||||||
|
$this->DefinitionData['Footnote'][$name]['number'] = ++ $this->footnoteCount; # » &
|
||||||
|
}
|
||||||
|
|
||||||
|
$Element = array(
|
||||||
|
'name' => 'sup',
|
||||||
|
'attributes' => array('id' => 'fnref'.$this->DefinitionData['Footnote'][$name]['count'].':'.$name),
|
||||||
|
'handler' => 'element',
|
||||||
|
'text' => array(
|
||||||
|
'name' => 'a',
|
||||||
|
'attributes' => array('href' => '#fn:'.$name, 'class' => 'footnote-ref'),
|
||||||
|
'text' => $this->DefinitionData['Footnote'][$name]['number'],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'extent' => strlen($matches[0]),
|
||||||
|
'element' => $Element,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private $footnoteCount = 0;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Link
|
||||||
|
|
||||||
|
protected function inlineLink($Excerpt)
|
||||||
|
{
|
||||||
|
$Link = parent::inlineLink($Excerpt);
|
||||||
|
|
||||||
|
$remainder = substr($Excerpt['text'], $Link['extent']);
|
||||||
|
|
||||||
|
if (preg_match('/^[ ]*{('.$this->regexAttribute.'+)}/', $remainder, $matches))
|
||||||
|
{
|
||||||
|
$Link['element']['attributes'] += $this->parseAttributeData($matches[1]);
|
||||||
|
|
||||||
|
$Link['extent'] += strlen($matches[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $Link;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# ~
|
||||||
|
#
|
||||||
|
|
||||||
|
protected function unmarkedText($text)
|
||||||
|
{
|
||||||
|
$text = parent::unmarkedText($text);
|
||||||
|
|
||||||
|
if (isset($this->DefinitionData['Abbreviation']))
|
||||||
|
{
|
||||||
|
foreach ($this->DefinitionData['Abbreviation'] as $abbreviation => $meaning)
|
||||||
|
{
|
||||||
|
$pattern = '/\b'.preg_quote($abbreviation, '/').'\b/';
|
||||||
|
|
||||||
|
$text = preg_replace($pattern, '<abbr title="'.$meaning.'">'.$abbreviation.'</abbr>', $text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Util Methods
|
||||||
|
#
|
||||||
|
|
||||||
|
protected function addDdElement(array $Line, array $Block)
|
||||||
|
{
|
||||||
|
$text = substr($Line['text'], 1);
|
||||||
|
$text = trim($text);
|
||||||
|
|
||||||
|
unset($Block['dd']);
|
||||||
|
|
||||||
|
$Block['dd'] = array(
|
||||||
|
'name' => 'dd',
|
||||||
|
'handler' => 'line',
|
||||||
|
'text' => $text,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isset($Block['interrupted']))
|
||||||
|
{
|
||||||
|
$Block['dd']['handler'] = 'text';
|
||||||
|
|
||||||
|
unset($Block['interrupted']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$Block['element']['text'] []= & $Block['dd'];
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function buildFootnoteElement()
|
||||||
|
{
|
||||||
|
$Element = array(
|
||||||
|
'name' => 'div',
|
||||||
|
'attributes' => array('class' => 'footnotes'),
|
||||||
|
'handler' => 'elements',
|
||||||
|
'text' => array(
|
||||||
|
array(
|
||||||
|
'name' => 'hr',
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'ol',
|
||||||
|
'handler' => 'elements',
|
||||||
|
'text' => array(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
uasort($this->DefinitionData['Footnote'], 'self::sortFootnotes');
|
||||||
|
|
||||||
|
foreach ($this->DefinitionData['Footnote'] as $definitionId => $DefinitionData)
|
||||||
|
{
|
||||||
|
if ( ! isset($DefinitionData['number']))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$text = $DefinitionData['text'];
|
||||||
|
|
||||||
|
$text = parent::text($text);
|
||||||
|
|
||||||
|
$numbers = range(1, $DefinitionData['count']);
|
||||||
|
|
||||||
|
$backLinksMarkup = '';
|
||||||
|
|
||||||
|
foreach ($numbers as $number)
|
||||||
|
{
|
||||||
|
$backLinksMarkup .= ' <a href="#fnref'.$number.':'.$definitionId.'" rev="footnote" class="footnote-backref">↩</a>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$backLinksMarkup = substr($backLinksMarkup, 1);
|
||||||
|
|
||||||
|
if (substr($text, - 4) === '</p>')
|
||||||
|
{
|
||||||
|
$backLinksMarkup = ' '.$backLinksMarkup;
|
||||||
|
|
||||||
|
$text = substr_replace($text, $backLinksMarkup.'</p>', - 4);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$text .= "\n".'<p>'.$backLinksMarkup.'</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$Element['text'][1]['text'] []= array(
|
||||||
|
'name' => 'li',
|
||||||
|
'attributes' => array('id' => 'fn:'.$definitionId),
|
||||||
|
'text' => "\n".$text."\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $Element;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ~
|
||||||
|
|
||||||
|
protected function parseAttributeData($attributeString)
|
||||||
|
{
|
||||||
|
$Data = array();
|
||||||
|
|
||||||
|
$attributes = preg_split('/[ ]+/', $attributeString, - 1, PREG_SPLIT_NO_EMPTY);
|
||||||
|
|
||||||
|
foreach ($attributes as $attribute)
|
||||||
|
{
|
||||||
|
if ($attribute[0] === '#')
|
||||||
|
{
|
||||||
|
$Data['id'] = substr($attribute, 1);
|
||||||
|
}
|
||||||
|
else # "."
|
||||||
|
{
|
||||||
|
$classes []= substr($attribute, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($classes))
|
||||||
|
{
|
||||||
|
$Data['class'] = implode(' ', $classes);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ~
|
||||||
|
|
||||||
|
protected function processTag($elementMarkup) # recursive
|
||||||
|
{
|
||||||
|
# http://stackoverflow.com/q/1148928/200145
|
||||||
|
libxml_use_internal_errors(true);
|
||||||
|
|
||||||
|
$DOMDocument = new DOMDocument;
|
||||||
|
|
||||||
|
# http://stackoverflow.com/q/11309194/200145
|
||||||
|
$elementMarkup = mb_convert_encoding($elementMarkup, 'HTML-ENTITIES', 'UTF-8');
|
||||||
|
|
||||||
|
# http://stackoverflow.com/q/4879946/200145
|
||||||
|
$DOMDocument->loadHTML($elementMarkup);
|
||||||
|
$DOMDocument->removeChild($DOMDocument->doctype);
|
||||||
|
$DOMDocument->replaceChild($DOMDocument->firstChild->firstChild->firstChild, $DOMDocument->firstChild);
|
||||||
|
|
||||||
|
$elementText = '';
|
||||||
|
|
||||||
|
if ($DOMDocument->documentElement->getAttribute('markdown') === '1')
|
||||||
|
{
|
||||||
|
foreach ($DOMDocument->documentElement->childNodes as $Node)
|
||||||
|
{
|
||||||
|
$elementText .= $DOMDocument->saveHTML($Node);
|
||||||
|
}
|
||||||
|
|
||||||
|
$DOMDocument->documentElement->removeAttribute('markdown');
|
||||||
|
|
||||||
|
$elementText = "\n".$this->text($elementText)."\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach ($DOMDocument->documentElement->childNodes as $Node)
|
||||||
|
{
|
||||||
|
$nodeMarkup = $DOMDocument->saveHTML($Node);
|
||||||
|
|
||||||
|
if ($Node instanceof DOMElement and ! in_array($Node->nodeName, $this->textLevelElements))
|
||||||
|
{
|
||||||
|
$elementText .= $this->processTag($nodeMarkup);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$elementText .= $nodeMarkup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# because we don't want for markup to get encoded
|
||||||
|
$DOMDocument->documentElement->nodeValue = 'placeholder\x1A';
|
||||||
|
|
||||||
|
$markup = $DOMDocument->saveHTML($DOMDocument->documentElement);
|
||||||
|
$markup = str_replace('placeholder\x1A', $elementText, $markup);
|
||||||
|
|
||||||
|
return $markup;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ~
|
||||||
|
|
||||||
|
protected function sortFootnotes($A, $B) # callback
|
||||||
|
{
|
||||||
|
return $A['number'] - $B['number'];
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Fields
|
||||||
|
#
|
||||||
|
|
||||||
|
protected $regexAttribute = '(?:[#.][-\w]+[ ]*)';
|
||||||
|
}
|
31
www/fragments/befunge93_runner.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
require_once (__DIR__ . '/../internals/base.php');
|
||||||
|
|
||||||
|
global $PARAM_CODE;
|
||||||
|
global $PARAM_URL;
|
||||||
|
global $PARAM_INTERACTIVE;
|
||||||
|
|
||||||
|
|
||||||
|
$result = '';
|
||||||
|
|
||||||
|
$result .= '<div class="bce_code">' . "\n";
|
||||||
|
$result .= ' <div class="bce_code_data">' .htmlspecialchars($PARAM_CODE) . '</div>' . "\n";
|
||||||
|
$result .= ' <div class="bce_code_ctrl">' . "\n";
|
||||||
|
if ($PARAM_INTERACTIVE) {
|
||||||
|
$result .= ' <div class="ctrl_btn_left">' . "\n";
|
||||||
|
$result .= ' <div class="ctrl_btn">Start</div>' . "\n";
|
||||||
|
$result .= ' <div class="ctrl_btn">Stop</div>' . "\n";
|
||||||
|
$result .= ' <div class="ctrl_btn">Reset</div>' . "\n";
|
||||||
|
$result .= ' </div>' . "\n";
|
||||||
|
}
|
||||||
|
if ($PARAM_URL !== '') {
|
||||||
|
$result .= ' <div class="ctrl_btn_right">' . "\n";
|
||||||
|
$result .= ' <a class="ctrl_btn" href="' .$PARAM_URL . '" download target="_blank">Download</a>' . "\n";
|
||||||
|
$result .= ' </div>' . "\n";
|
||||||
|
}
|
||||||
|
$result .= ' </div>' . "\n";
|
||||||
|
$result .= '</div>' . "\n";
|
||||||
|
|
||||||
|
$result .= includeScriptOnce("/data/javascript/blogpost_bef93runner.js", false) . "\n";
|
||||||
|
|
||||||
|
return $result;
|
@ -4,44 +4,37 @@ require_once (__DIR__ . '/../internals/base.php');
|
|||||||
global $PARAM_CODE_LEFT;
|
global $PARAM_CODE_LEFT;
|
||||||
global $PARAM_CODE_RIGHT;
|
global $PARAM_CODE_RIGHT;
|
||||||
|
|
||||||
?>
|
$result = '';
|
||||||
|
|
||||||
<div class="bfjoust_runner_owner" >
|
$result .= '<div class="bfjoust_runner_owner">' . "\n";
|
||||||
<div class="hsplit">
|
$result .= ' <div class="hsplit">' . "\n";
|
||||||
<textarea class="hsplit_1 source" id="source_1"><?php echo htmlspecialchars($PARAM_CODE_LEFT); ?></textarea>
|
$result .= ' <textarea class="hsplit_1 source" id="source_1">' . htmlspecialchars($PARAM_CODE_LEFT) . '</textarea>' . "\n";
|
||||||
<textarea class="hsplit_2 source" id="source_2"><?php echo htmlspecialchars($PARAM_CODE_RIGHT); ?></textarea>
|
$result .= ' <textarea class="hsplit_2 source" id="source_2">' . htmlspecialchars($PARAM_CODE_RIGHT) . '</textarea>' . "\n";
|
||||||
</div>
|
$result .= ' </div>' . "\n";
|
||||||
|
|
||||||
<div id="commandpanel">
|
$result .= ' <div id="commandpanel">' . "\n";
|
||||||
<div>
|
$result .= ' <div>' . "\n";
|
||||||
<div>
|
$result .= ' <div>' . "\n";
|
||||||
<a href="#" id="a_expand">expand</a>
|
$result .= ' <a href="#" id="a_expand">expand</a>|<a href="#" id="a_collapse">collapse</a>|<a href="#" id="a_run">run</a>' . "\n";
|
||||||
|
|
$result .= ' (size:<input type="number" id="run_size" min="10" max="30" value="30" width="30"> speed:<input type="number" id="run_speed" min="0" max="10000" value="10">)' . "\n";
|
||||||
<a href="#" id="a_collapse">collapse</a>
|
$result .= ' | <a href="#" id="a_stop">stop</a> | <a href="#" id="a_arena">arena</a>' . "\n";
|
||||||
|
|
$result .= ' </div>' . "\n";
|
||||||
<a href="#" id="a_run">run</a>
|
$result .= ' </div>' . "\n";
|
||||||
(size:
|
$result .= ' </div>' . "\n";
|
||||||
<input type="number" id="run_size" min="10" max="30" value="30" width="30">
|
|
||||||
speed:
|
|
||||||
<input type="number" id="run_speed" min="0" max="10000" value="10">
|
|
||||||
)
|
|
||||||
|
|
|
||||||
<a href="#" id="a_stop">stop</a>
|
|
||||||
|
|
|
||||||
<a href="#" id="a_arena">arena</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="hsplit">
|
$result .= ' <div class="hsplit">' . "\n";
|
||||||
<textarea class="hsplit_1 sink" id="sink_1"></textarea>
|
$result .= ' <textarea class="hsplit_1 sink" id="sink_1"></textarea>' . "\n";
|
||||||
<textarea class="hsplit_2 sink" id="sink_2"></textarea>
|
$result .= ' <textarea class="hsplit_2 sink" id="sink_2"></textarea>' . "\n";
|
||||||
</div>
|
$result .= ' </div>' . "\n";
|
||||||
|
|
||||||
<div class="hsplit">
|
$result .= ' <div class="hsplit">' . "\n";
|
||||||
<canvas class="hsplit_1 bottomelem" id="board"></canvas>
|
$result .= ' <canvas class="hsplit_1 bottomelem" id="board"></canvas>' . "\n";
|
||||||
<textarea class="hsplit_2 bottomelem" id="log" wrap="off"> </textarea>
|
$result .= ' <textarea class="hsplit_2 bottomelem" id="log" wrap="off"> </textarea>' . "\n";
|
||||||
</div>
|
$result .= ' </div>' . "\n";
|
||||||
</div>
|
$result .= '</div>' . "\n";
|
||||||
|
|
||||||
<script src="/data/javascript/blogpost_BFJoustBot_script.js"></script>
|
$result .= '' . "\n";
|
||||||
|
|
||||||
|
$result .= includeScriptOnce("/data/javascript/blogpost_BFJoustBot_script.js", false) . "\n";
|
||||||
|
|
||||||
|
return $result;
|
@ -1,34 +0,0 @@
|
|||||||
<?php
|
|
||||||
require_once (__DIR__ . '/../internals/base.php');
|
|
||||||
require_once (__DIR__ . '/../internals/blog.php');
|
|
||||||
require_once (__DIR__ . '/../extern/Parsedown.php');
|
|
||||||
?>
|
|
||||||
|
|
||||||
<div class="blogcontent bc_markdown">
|
|
||||||
|
|
||||||
<div class="bc_header">
|
|
||||||
<?php echo $post['date']; ?>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="bc_data">
|
|
||||||
<?php
|
|
||||||
$code_own = file_get_contents(__DIR__ . '/../statics/blog/bfjoust_MultiVAC.bfjoust');
|
|
||||||
$code_opp = file_get_contents(__DIR__ . '/../statics/blog/bfjoust_Patashu_lazy.bfjoust');
|
|
||||||
|
|
||||||
$pd = new Parsedown();
|
|
||||||
$dat = file_get_contents( __DIR__ . '/../statics/blog/bfjoust.md');
|
|
||||||
$dat = str_replace("{{CODE}}", $code_own, $dat);
|
|
||||||
|
|
||||||
echo $pd->text($dat);
|
|
||||||
|
|
||||||
|
|
||||||
global $PARAM_CODE_LEFT;
|
|
||||||
global $PARAM_CODE_RIGHT;
|
|
||||||
|
|
||||||
$PARAM_CODE_LEFT = $code_own;
|
|
||||||
$PARAM_CODE_RIGHT = $code_opp;
|
|
||||||
include (__DIR__ . '/../fragments/bfjoust_runner.php');
|
|
||||||
?>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
@ -12,7 +12,7 @@ $problems = Euler::listAll();
|
|||||||
|
|
||||||
<div style="position: relative;">
|
<div style="position: relative;">
|
||||||
<a href="https://github.com/Mikescher/Project-Euler_Befunge" style="position: absolute; top: 0; right: 0; border: 0;">
|
<a href="https://github.com/Mikescher/Project-Euler_Befunge" style="position: absolute; top: 0; right: 0; border: 0;">
|
||||||
<img src="/data/images/github_band.png" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png">
|
<img src="/data/images/blog/github_band.png" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png">
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
require_once (__DIR__ . '/../internals/base.php');
|
require_once (__DIR__ . '/../internals/base.php');
|
||||||
require_once (__DIR__ . '/../internals/blog.php');
|
require_once (__DIR__ . '/../internals/blog.php');
|
||||||
require_once (__DIR__ . '/../internals/euler.php');
|
require_once (__DIR__ . '/../internals/euler.php');
|
||||||
require_once (__DIR__ . '/../extern/Parsedown.php');
|
require_once (__DIR__ . '/../internals/ParsedownCustom.php');
|
||||||
|
|
||||||
$subview = $OPTIONS['subview'];
|
$subview = $OPTIONS['subview'];
|
||||||
|
|
||||||
@ -11,7 +11,7 @@ $problem = Euler::getEulerProblem(intval(explode('-', $subview)[1]));
|
|||||||
|
|
||||||
if ($post === NULL) httpError(404, 'problem not found');
|
if ($post === NULL) httpError(404, 'problem not found');
|
||||||
|
|
||||||
$pd = new Parsedown();
|
$pd = new ParsedownCustom();
|
||||||
|
|
||||||
|
|
||||||
$arr = [];
|
$arr = [];
|
||||||
@ -29,7 +29,7 @@ $max = ceil($max / 20) * 20;
|
|||||||
|
|
||||||
<div style="position: relative;">
|
<div style="position: relative;">
|
||||||
<a href="https://github.com/Mikescher/Project-Euler_Befunge" style="position: absolute; top: 0; right: 0; border: 0;">
|
<a href="https://github.com/Mikescher/Project-Euler_Befunge" style="position: absolute; top: 0; right: 0; border: 0;">
|
||||||
<img src="/data/images/github_band.png" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png">
|
<img src="/data/images/blog/github_band.png" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png">
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -45,44 +45,22 @@ $max = ceil($max / 20) * 20;
|
|||||||
<div class="bce_description"><?php echo $pd->text(file_get_contents($problem['file_description'])); ?></div>
|
<div class="bce_description"><?php echo $pd->text(file_get_contents($problem['file_description'])); ?></div>
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<?php if ($problem['abbreviated']): ?>
|
<b>Solution:</b>
|
||||||
|
<?php
|
||||||
<b>Solution:</b>
|
global $PARAM_CODE;
|
||||||
<div class="bce_code">
|
global $PARAM_URL;
|
||||||
<div class="bce_code_data"><?php echo htmlspecialchars(file_get_contents($problem['file_code'])); ?></div>
|
$PARAM_CODE = file_get_contents($problem['file_code']);
|
||||||
<div class="bce_code_ctrl">
|
$PARAM_URL = $problem['url_raw'];
|
||||||
<div class="ctrl_btn_right">
|
$PARAM_INTERACTIVE = !$problem['abbreviated'];
|
||||||
<a class="ctrl_btn" href="<?php echo $problem['url_raw']; ?>" download target="_blank">Download</a>
|
echo require (__DIR__ . '/../fragments/befunge93_runner.php');
|
||||||
</div>
|
?>
|
||||||
</div>
|
<br/>
|
||||||
</div>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<?php else: ?>
|
|
||||||
|
|
||||||
<b>Solution:</b>
|
|
||||||
<div class="bce_code">
|
|
||||||
<div class="bce_code_data"><?php echo htmlspecialchars(file_get_contents($problem['file_code'])); ?></div>
|
|
||||||
<div class="bce_code_ctrl">
|
|
||||||
<div class="ctrl_btn_left">
|
|
||||||
<div class="ctrl_btn">Start</div>
|
|
||||||
<div class="ctrl_btn">Stop</div>
|
|
||||||
<div class="ctrl_btn">Reset</div>
|
|
||||||
</div>
|
|
||||||
<div class="ctrl_btn_right">
|
|
||||||
<a class="ctrl_btn" href="<?php echo $problem['url_raw']; ?>" download target="_blank">Download</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<?php endif; ?>
|
|
||||||
|
|
||||||
<b>Explanation:</b>
|
<b>Explanation:</b>
|
||||||
<div class="bce_explanation"><?php echo $pd->text(file_get_contents($problem['file_explanation'])); ?></div>
|
<div class="bce_explanation"><?php echo $pd->text(file_get_contents($problem['file_explanation'])); ?></div>
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<table>
|
<table class="notable">
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>Interpreter steps:</b></td>
|
<td><b>Interpreter steps:</b></td>
|
||||||
<td><?php echo number_format($problem['steps'], 0, null, ' '); ?></td>
|
<td><?php echo number_format($problem['steps'], 0, null, ' '); ?></td>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
require_once (__DIR__ . '/../internals/base.php');
|
require_once (__DIR__ . '/../internals/base.php');
|
||||||
require_once (__DIR__ . '/../internals/blog.php');
|
require_once (__DIR__ . '/../internals/blog.php');
|
||||||
require_once (__DIR__ . '/../extern/Parsedown.php');
|
require_once (__DIR__ . '/../internals/ParsedownCustom.php');
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div class="blogcontent bc_markdown">
|
<div class="blogcontent bc_markdown">
|
||||||
@ -12,7 +12,7 @@ require_once (__DIR__ . '/../extern/Parsedown.php');
|
|||||||
|
|
||||||
<div class="bc_data">
|
<div class="bc_data">
|
||||||
<?php
|
<?php
|
||||||
$pd = new Parsedown();
|
$pd = new ParsedownCustom();
|
||||||
echo $pd->text(Blog::getPostFragment($post));
|
echo $pd->text(Blog::getPostFragment($post));
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
|
73
www/internals/ParsedownCustom.php
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once (__DIR__ . '/../internals/base.php');
|
||||||
|
require_once (__DIR__ . '/../extern/Parsedown.php');
|
||||||
|
require_once (__DIR__ . '/../extern/ParsedownExtra.php');
|
||||||
|
|
||||||
|
|
||||||
|
class ParsedownCustom extends ParsedownExtra
|
||||||
|
{
|
||||||
|
protected function element(array $Element)
|
||||||
|
{
|
||||||
|
if (isset($Element['custom']) && $Element['custom'] && isset($Element['handler']))
|
||||||
|
return $this->{$Element['handler']}($Element['text']);
|
||||||
|
else
|
||||||
|
return parent::element($Element);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function blockFencedCode($Line)
|
||||||
|
{
|
||||||
|
$Block = parent::blockFencedCode($Line);
|
||||||
|
if ($Block === null) return $Block;
|
||||||
|
|
||||||
|
$Block['custom'] = false;
|
||||||
|
|
||||||
|
if (isset($Block['element']['text']['attributes']) && in_array('language-befungerunner', $Block['element']['text']['attributes']))
|
||||||
|
{
|
||||||
|
$Block['element']['handler'] = 'handleBef93';
|
||||||
|
$Block['custom'] = true;
|
||||||
|
}
|
||||||
|
else if (isset($Block['element']['text']['attributes']) && in_array('language-bfjoustrunner', $Block['element']['text']['attributes']))
|
||||||
|
{
|
||||||
|
$Block['element']['handler'] = 'handleBFJoust';
|
||||||
|
$Block['custom'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function blockFencedCodeComplete($Block)
|
||||||
|
{
|
||||||
|
if (! $Block['custom']) { return parent::blockFencedCodeComplete($Block); }
|
||||||
|
|
||||||
|
$Block['element']['custom'] = true;
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function handleBFJoust(array $Element)
|
||||||
|
{
|
||||||
|
global $PARAM_CODE_LEFT;
|
||||||
|
global $PARAM_CODE_RIGHT;
|
||||||
|
|
||||||
|
$split = preg_split("/\-{16,}/", $Element['text']);
|
||||||
|
|
||||||
|
$PARAM_CODE_LEFT = trim($split[0]);
|
||||||
|
$PARAM_CODE_RIGHT = trim($split[1]);
|
||||||
|
|
||||||
|
return require (__DIR__ . '/../fragments/bfjoust_runner.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function handleBef93(array $Element)
|
||||||
|
{
|
||||||
|
global $PARAM_CODE;
|
||||||
|
global $PARAM_URL;
|
||||||
|
global $PARAM_INTERACTIVE;
|
||||||
|
|
||||||
|
$PARAM_CODE = $Element['text'];
|
||||||
|
$PARAM_URL = '';
|
||||||
|
$PARAM_INTERACTIVE = true;
|
||||||
|
|
||||||
|
return require (__DIR__ . '/../fragments/befunge93_runner.php');
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,9 @@ $CONFIG = require 'config.php';
|
|||||||
|
|
||||||
$CSS_BASE = ($CONFIG['prod']) ? ('styles.min.css') : ('styles.css');
|
$CSS_BASE = ($CONFIG['prod']) ? ('styles.min.css') : ('styles.css');
|
||||||
|
|
||||||
|
global $REGISTERED_SCRIPTS;
|
||||||
|
$REGISTERED_SCRIPTS = [];
|
||||||
|
|
||||||
function startsWith($haystack, $needle)
|
function startsWith($haystack, $needle)
|
||||||
{
|
{
|
||||||
$length = strlen($needle);
|
$length = strlen($needle);
|
||||||
@ -59,4 +62,23 @@ function formatMilliseconds($millis)
|
|||||||
{
|
{
|
||||||
return floor($millis / (60 * 60 * 1000)) . ' hours';
|
return floor($millis / (60 * 60 * 1000)) . ' hours';
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function includeScriptOnce($script, $echo = true)
|
||||||
|
{
|
||||||
|
global $REGISTERED_SCRIPTS;
|
||||||
|
|
||||||
|
if ($echo)
|
||||||
|
{
|
||||||
|
if (in_array($script, $REGISTERED_SCRIPTS)) return false;
|
||||||
|
$REGISTERED_SCRIPTS []= $script;
|
||||||
|
echo "<script src=\"$script\" type=\"text/javascript\"></script>";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (in_array($script, $REGISTERED_SCRIPTS)) return '';
|
||||||
|
$REGISTERED_SCRIPTS []= $script;
|
||||||
|
return "<script src=\"$script\" type=\"text/javascript\"></script>";
|
||||||
|
}
|
||||||
}
|
}
|
@ -22,7 +22,7 @@ class Blog
|
|||||||
[ 'id' => 1, 'date' => '2014-07-10', 'visible' => true, 'title' => 'Project Euler with Befunge', 'fragment' => '', 'type' => 'euler', 'cat' => 'blog' ],
|
[ 'id' => 1, 'date' => '2014-07-10', 'visible' => true, 'title' => 'Project Euler with Befunge', 'fragment' => '', 'type' => 'euler', 'cat' => 'blog' ],
|
||||||
[ 'id' => 3, 'date' => '2014-07-15', 'visible' => true, 'title' => '.Net format specifier Cheat Sheet', 'fragment' => 'net_format_spec.md', 'type' => 'markdown', 'cat' => 'blog' ],
|
[ 'id' => 3, 'date' => '2014-07-15', 'visible' => true, 'title' => '.Net format specifier Cheat Sheet', 'fragment' => 'net_format_spec.md', 'type' => 'markdown', 'cat' => 'blog' ],
|
||||||
[ 'id' => 19, 'date' => '2014-08-04', 'visible' => true, 'title' => 'I am Number Four', 'fragment' => 'v4.md', 'type' => 'markdown', 'cat' => 'log' ],
|
[ 'id' => 19, 'date' => '2014-08-04', 'visible' => true, 'title' => 'I am Number Four', 'fragment' => 'v4.md', 'type' => 'markdown', 'cat' => 'log' ],
|
||||||
[ 'id' => 7, 'date' => '2014-09-28', 'visible' => true, 'title' => 'My BFJoust arena and battle-bot', 'fragment' => '', 'type' => 'bfjoust', 'cat' => 'blog' ],
|
[ 'id' => 7, 'date' => '2014-09-28', 'visible' => true, 'title' => 'My BFJoust arena and battle-bot', 'fragment' => 'bfjoust.md', 'type' => 'markdown', 'cat' => 'blog' ],
|
||||||
[ 'id' => 8, 'date' => '2014-11-05', 'visible' => true, 'title' => 'Rapla Enhancement Script', 'fragment' => 'rapla_css.md', 'type' => 'markdown', 'cat' => 'blog' ],
|
[ 'id' => 8, 'date' => '2014-11-05', 'visible' => true, 'title' => 'Rapla Enhancement Script', 'fragment' => 'rapla_css.md', 'type' => 'markdown', 'cat' => 'blog' ],
|
||||||
[ 'id' => 20, 'date' => '2015-01-09', 'visible' => true, 'title' => 'More Befunge with Project Euler', 'fragment' => 'more_euler.md', 'type' => 'markdown', 'cat' => 'log' ],
|
[ 'id' => 20, 'date' => '2015-01-09', 'visible' => true, 'title' => 'More Befunge with Project Euler', 'fragment' => 'more_euler.md', 'type' => 'markdown', 'cat' => 'log' ],
|
||||||
[ 'id' => 9, 'date' => '2016-10-22', 'visible' => true, 'title' => 'A complete sudoku solver in Befunge-93', 'fragment' => 'sudoku_befunge.md', 'type' => 'markdown', 'cat' => 'blog' ],
|
[ 'id' => 9, 'date' => '2016-10-22', 'visible' => true, 'title' => 'A complete sudoku solver in Befunge-93', 'fragment' => 'sudoku_befunge.md', 'type' => 'markdown', 'cat' => 'blog' ],
|
||||||
|
@ -9,7 +9,50 @@ The thing that surprised me the most is the [strategically depth](http://esolang
|
|||||||
So here is my own bot *(originally made for [stackexchange](http://codegolf.stackexchange.com/questions/36645/brainfedbotsforbattling-a-brainf-tournament))*, it can't really keep up with the big ones from egojoust but I'm fairly proud of it:
|
So here is my own bot *(originally made for [stackexchange](http://codegolf.stackexchange.com/questions/36645/brainfedbotsforbattling-a-brainf-tournament))*, it can't really keep up with the big ones from egojoust but I'm fairly proud of it:
|
||||||
|
|
||||||
```
|
```
|
||||||
{{CODE}}
|
> # Build 9 big decoys
|
||||||
|
(-)*4>(+)*4> # A few small ones
|
||||||
|
(>)*6
|
||||||
|
|
||||||
|
(<(-)*80<(+)*80)*3 # And more big ones
|
||||||
|
<(+)*76 # For Confusion :/
|
||||||
|
<(-)*76
|
||||||
|
|
||||||
|
<(-)*28 # Just for you, Wall E
|
||||||
|
|
||||||
|
(>)*10
|
||||||
|
|
||||||
|
( # Walk forwards and clear everything
|
||||||
|
([+ # clear pos decoys
|
||||||
|
{
|
||||||
|
(-)*16
|
||||||
|
(-[ # clear neg decoys
|
||||||
|
{
|
||||||
|
(-)*112 # Big decoy / flag clearen: 128~16=112
|
||||||
|
[+]
|
||||||
|
}
|
||||||
|
])%16
|
||||||
|
}
|
||||||
|
])%16
|
||||||
|
[-] # Counter DecoyBot ~_~
|
||||||
|
(+)*2 # Leave a small trail behind
|
||||||
|
>
|
||||||
|
|
||||||
|
([- # The same thing with reversed polarity
|
||||||
|
{
|
||||||
|
(+)*16
|
||||||
|
(+[
|
||||||
|
{
|
||||||
|
(+)*112
|
||||||
|
[-]
|
||||||
|
}
|
||||||
|
])%16
|
||||||
|
}
|
||||||
|
])%16
|
||||||
|
[+]
|
||||||
|
(-)*2
|
||||||
|
>
|
||||||
|
|
||||||
|
)*11
|
||||||
```
|
```
|
||||||
|
|
||||||
A few notes to the BFJoust extensions to the brainfuck language:
|
A few notes to the BFJoust extensions to the brainfuck language:
|
||||||
@ -28,3 +71,53 @@ I wrote a little [BFJoust script](https://maximum-sonata.codio.io/index.html) wh
|
|||||||
And at last a few words to the arena: In BFJoust there are 40 different settings, every board length two times. One time normal and one time with one bot inverted (`+` <-> `-`). This way you can eliminate luck and see which bot performs better.
|
And at last a few words to the arena: In BFJoust there are 40 different settings, every board length two times. One time normal and one time with one bot inverted (`+` <-> `-`). This way you can eliminate luck and see which bot performs better.
|
||||||
|
|
||||||
|
|
||||||
|
```bfjoustrunner
|
||||||
|
> # Build 9 big decoys
|
||||||
|
(-)*4>(+)*4> # A few small ones
|
||||||
|
(>)*6
|
||||||
|
|
||||||
|
(<(-)*80<(+)*80)*3 # And more big ones
|
||||||
|
<(+)*76 # For Confusion :/
|
||||||
|
<(-)*76
|
||||||
|
|
||||||
|
<(-)*28 # Just for you, Wall E
|
||||||
|
|
||||||
|
(>)*10
|
||||||
|
|
||||||
|
( # Walk forwards and clear everything
|
||||||
|
([+ # clear pos decoys
|
||||||
|
{
|
||||||
|
(-)*16
|
||||||
|
(-[ # clear neg decoys
|
||||||
|
{
|
||||||
|
(-)*112 # Big decoy / flag clearen: 128~16=112
|
||||||
|
[+]
|
||||||
|
}
|
||||||
|
])%16
|
||||||
|
}
|
||||||
|
])%16
|
||||||
|
[-] # Counter DecoyBot ~_~
|
||||||
|
(+)*2 # Leave a small trail behind
|
||||||
|
>
|
||||||
|
|
||||||
|
([- # The same thing with reversed polarity
|
||||||
|
{
|
||||||
|
(+)*16
|
||||||
|
(+[
|
||||||
|
{
|
||||||
|
(+)*112
|
||||||
|
[-]
|
||||||
|
}
|
||||||
|
])%16
|
||||||
|
}
|
||||||
|
])%16
|
||||||
|
[+]
|
||||||
|
(-)*2
|
||||||
|
>
|
||||||
|
|
||||||
|
)*11
|
||||||
|
------------------------------------------------------------------------------------------------------------------------
|
||||||
|
#Patashu_lazy from #esoteric hill
|
||||||
|
|
||||||
|
>(+)*5>(-)*5>(+)*5>(-)*5>(-)*5>(+)*5>(+)*5>(-)*5(>(-.)*128)*21[-]((-)*2048(+)*2048.)*2
|
||||||
|
```
|
@ -1,44 +0,0 @@
|
|||||||
> # Build 9 big decoys
|
|
||||||
(-)*4>(+)*4> # A few small ones
|
|
||||||
(>)*6
|
|
||||||
|
|
||||||
(<(-)*80<(+)*80)*3 # And more big ones
|
|
||||||
<(+)*76 # For Confusion :/
|
|
||||||
<(-)*76
|
|
||||||
|
|
||||||
<(-)*28 # Just for you, Wall E
|
|
||||||
|
|
||||||
(>)*10
|
|
||||||
|
|
||||||
( # Walk forwards and clear everything
|
|
||||||
([+ # clear pos decoys
|
|
||||||
{
|
|
||||||
(-)*16
|
|
||||||
(-[ # clear neg decoys
|
|
||||||
{
|
|
||||||
(-)*112 # Big decoy / flag clearen: 128~16=112
|
|
||||||
[+]
|
|
||||||
}
|
|
||||||
])%16
|
|
||||||
}
|
|
||||||
])%16
|
|
||||||
[-] # Counter DecoyBot ~_~
|
|
||||||
(+)*2 # Leave a small trail behind
|
|
||||||
>
|
|
||||||
|
|
||||||
([- # The same thing with reversed polarity
|
|
||||||
{
|
|
||||||
(+)*16
|
|
||||||
(+[
|
|
||||||
{
|
|
||||||
(+)*112
|
|
||||||
[-]
|
|
||||||
}
|
|
||||||
])%16
|
|
||||||
}
|
|
||||||
])%16
|
|
||||||
[+]
|
|
||||||
(-)*2
|
|
||||||
>
|
|
||||||
|
|
||||||
)*11
|
|
@ -1,3 +0,0 @@
|
|||||||
#Patashu_lazy from #esoteric hill
|
|
||||||
|
|
||||||
>(+)*5>(-)*5>(+)*5>(-)*5>(-)*5>(+)*5>(+)*5>(-)*5(>(-.)*128)*21[-]((-)*2048(+)*2048.)*2
|
|
@ -1,10 +1,10 @@
|
|||||||
![rapla_logo](/data/blog/Rapscript/logo.png)
|
![rapla_logo](/data/images/blog/rapla_logo.png)
|
||||||
|
|
||||||
I don't think many of you know [rapla](https://code.google.com/p/rapla/). And you should probably be thankful about that. But if you happen to study at the DHBW-KA, or any other place that uses rapla you could be interested in my enhancement-script.
|
I don't think many of you know [rapla](https://code.google.com/p/rapla/). And you should probably be thankful about that. But if you happen to study at the DHBW-KA, or any other place that uses rapla you could be interested in my enhancement-script.
|
||||||
|
|
||||||
Rapla is a Resource scheduling and event planing software (mostly used for timetables), and my rapscript enhances the *(not very good)* online view.
|
Rapla is a Resource scheduling and event planing software (mostly used for timetables), and my rapscript enhances the *(not very good)* online view.
|
||||||
|
|
||||||
![full_preview](/data/blog/Rapscript/preview.png)
|
![full_preview](/data/images/blog/rapla_preview.png)
|
||||||
|
|
||||||
It contains the following features:
|
It contains the following features:
|
||||||
|
|
||||||
@ -18,5 +18,5 @@ It contains the following features:
|
|||||||
|
|
||||||
The script works on [Greasemonkey](https://addons.mozilla.org/de/firefox/addon/greasemonkey/) for Firefox or [Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo) for Google Chrome and can be downloaded from this Gist:
|
The script works on [Greasemonkey](https://addons.mozilla.org/de/firefox/addon/greasemonkey/) for Firefox or [Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo) for Google Chrome and can be downloaded from this Gist:
|
||||||
|
|
||||||
[Open Gist](https://gist.github.com/Mikescher/f3d51a40dd0c5228df86)
|
# [Open Gist](https://gist.github.com/Mikescher/f3d51a40dd0c5228df86)
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
![sudoku debug](/data/blog/SudokuSolver/sudoku.png)
|
![sudoku debug](/data/images/blog/sudoku.png)
|
||||||
|
|
||||||
Because of [this project euler puzzle](https://www.mikescher.com/blog/1/Project_Euler_with_Befunge/problem-096) I spend the last few days implementing a sudoku solver in befunge-93 (as always I ignored the 80x25 size restriction because otherwise befunge-93 would be not turing-complete and I'm pretty sure this problem impossible).
|
Because of [this project euler puzzle](https://www.mikescher.com/blog/1/Project_Euler_with_Befunge/problem-096) I spend the last few days implementing a sudoku solver in befunge-93 (as always I ignored the 80x25 size restriction because otherwise befunge-93 would be not turing-complete and I'm pretty sure this problem impossible).
|
||||||
|
|
||||||
@ -7,7 +7,7 @@ My solver is universal and can solve both ones. If there are no obvious cells it
|
|||||||
|
|
||||||
Below i try to describe my general approach and a few caveats I stumbled across. You can look at the full up-to-date source code on [github](https://github.com/Mikescher/BefungePrograms).
|
Below i try to describe my general approach and a few caveats I stumbled across. You can look at the full up-to-date source code on [github](https://github.com/Mikescher/BefungePrograms).
|
||||||
|
|
||||||
~~~
|
~~~befungerunner
|
||||||
v XX ########### ########### ############################# #############################
|
v XX ########### ########### ############################# #############################
|
||||||
C C #36 2 89# # # # # # #
|
C C #36 2 89# # # # # # #
|
||||||
PPPPP # 361 # # # # # # #
|
PPPPP # 361 # # # # # # #
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
Starting in the top left corner of a 2×2 grid, and only being able to move to the right and down, there are exactly 6 routes to the bottom right corner.
|
Starting in the top left corner of a 2×2 grid, and only being able to move to the right and down, there are exactly 6 routes to the bottom right corner.
|
||||||
|
|
||||||
![Grid Image](/data/blog/Befunge/p015.gif)
|
![Grid Image](/data/images/blog/p015.gif)
|
||||||
|
|
||||||
How many such routes are there through a 20×20 grid?
|
How many such routes are there through a 20×20 grid?
|
@ -1,6 +1,6 @@
|
|||||||
Consider the following "magic" 3-gon ring, filled with the numbers 1 to 6, and each line adding to nine.
|
Consider the following "magic" 3-gon ring, filled with the numbers 1 to 6, and each line adding to nine.
|
||||||
|
|
||||||
![](https://projecteuler.net/project/images/p068_1.gif)
|
![](/data/images/blog/p068_1.gif)
|
||||||
|
|
||||||
Working clockwise, and starting from the group of three with the numerically lowest external node (4,3,2 in this example), each solution can be described uniquely.
|
Working clockwise, and starting from the group of three with the numerically lowest external node (4,3,2 in this example), each solution can be described uniquely.
|
||||||
For example, the above solution can be described by the set: `4,3,2; 6,2,1; 5,1,3`.
|
For example, the above solution can be described by the set: `4,3,2; 6,2,1; 5,1,3`.
|
||||||
@ -23,4 +23,4 @@ By concatenating each group it is possible to form 9-digit strings; the maximum
|
|||||||
Using the numbers 1 to 10, and depending on arrangements, it is possible to form 16- and 17-digit strings.
|
Using the numbers 1 to 10, and depending on arrangements, it is possible to form 16- and 17-digit strings.
|
||||||
What is the maximum 16-digit string for a "magic" 5-gon ring?
|
What is the maximum 16-digit string for a "magic" 5-gon ring?
|
||||||
|
|
||||||
![](https://projecteuler.net/project/images/p068_2.gif)
|
![](/data/images/blog/p068_2.gif)
|
@ -1,6 +1,6 @@
|
|||||||
By counting carefully it can be seen that a rectangular grid measuring 3 by 2 contains eighteen rectangles:
|
By counting carefully it can be seen that a rectangular grid measuring 3 by 2 contains eighteen rectangles:
|
||||||
|
|
||||||
![Grid Image](/data/blog/Befunge/p085.gif)
|
![Grid Image](/data/images/blog/p085.gif)
|
||||||
|
|
||||||
Although there exists no rectangular grid that contains exactly two million rectangles,
|
Although there exists no rectangular grid that contains exactly two million rectangles,
|
||||||
find the area of the grid with the nearest solution.
|
find the area of the grid with the nearest solution.
|
@ -1,7 +1,7 @@
|
|||||||
The points `P(x1, y1)` and `Q(x2, y2)` are plotted at integer co-ordinates and are joined to the origin,
|
The points `P(x1, y1)` and `Q(x2, y2)` are plotted at integer co-ordinates and are joined to the origin,
|
||||||
`O(0,0)`, to form `OPQ`.
|
`O(0,0)`, to form `OPQ`.
|
||||||
|
|
||||||
![img](/data/blog/Befunge/p091_1.gif)
|
![img](/data/images/blog/p091_1.gif)
|
||||||
|
|
||||||
There are exactly fourteen triangles containing a right angle that can be formed when each co-ordinate
|
There are exactly fourteen triangles containing a right angle that can be formed when each co-ordinate
|
||||||
lies between 0 and 2 inclusive; that is,
|
lies between 0 and 2 inclusive; that is,
|
||||||
@ -10,6 +10,6 @@ lies between 0 and 2 inclusive; that is,
|
|||||||
0 <= x1, y1, x2, y2 <= 2.
|
0 <= x1, y1, x2, y2 <= 2.
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
![img](/data/blog/Befunge/p091_2.gif)
|
![img](/data/images/blog/p091_2.gif)
|
||||||
|
|
||||||
Given that `0 <= x1, y1, x2, y2 <= 50`, how many right triangles can be formed?
|
Given that `0 <= x1, y1, x2, y2 <= 50`, how many right triangles can be formed?
|