<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no, maximum-scale=1, shrink-to-fit=no">
{{#if title }}
<title>Jugendwettbewerb Informatik – {{title}}</title>
{{else}}
<title>Jugendwettbewerb Informatik: Programmieren – leichter, als du denkst!</title>
{{/if}}
<script src="/static/lib/jquery/jquery-3.2.1.min.js"></script>
<script src="/static/lib/fioipem/jschannel-190528.js"></script>
<script src="/static/lib/fioipem/task-xd-pr-190528.js"></script>
<script src="/static/lib/medal/medal-1.0.0.js"></script>
<link rel="icon" href="/static/images/favicon.png" type="image/png">
<style>
body{
margin: 0px;
padding: 0px;
overflow: hidden;
font-family: sans-serif;
}
:root {
--vh: 100vh;
}
#bar, #bar>div {
display:inline-block;
padding: 8px;
margin:0px;
background: #8ca405;
color:white;
font-size:12pt;
{{#if preview}}
height: 0px;
{{else}}
height: 35px;
{{/if}}
overflow-y:hidden;
}
#bar {
display:block;
padding:0px;
width:100vw;
}
#bar>.nav {
float:right;
}
#bar>#time {
float:right;
padding:0px 8px;
text-align:right;
}
#timetext{
padding:0px;
margin:0px;
font-size:8pt;
}
#timetime{
padding:0px;
margin:0px;
margin-top:-8px;
font-size:18pt;
}
#ttsec {
font-size:8pt;
}
#bar>#hamburger, #bar>#menu, #bar>#time {
background: #6d8004;
font-weight:bold;
padding-left: 10px;
padding-right: 10px;
}
#bar>div.highlight {
background: #f5fbe8;
color:#334900;
font-size: 10pt;
}
.max10 {
max-width: 10vw;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.max20 {
max-width: 20vw;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
iframe {
width: 100vw;
border: 0px;
{{#if preview}}
min-height: 100vh;
{{else}}
min-height: calc(100vh - 35px);
min-height: calc(var(--vh) - 35px);
{{/if}}
}
a {
color: #eee;
text-decoration: none;
}
.modal {
display: none;
position: fixed;
z-index: 1;
left: 0;
top: 35px;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgb(0,0,0);
background-color: rgba(0,0,0,0.4);
}
.modal-content {
background-color: #fefefe;
margin: 15% auto;
padding: 20px;
border: 1px solid #888;
width: 30%;
}
{{#if readonly}}
#bar, #bar>div {
background: #a48c05
}
#bar>#hamburger, #bar>#menu, #bar>#time {
background: #806d04;
}
#bar>div.highlight {
background: #fbf5e8;
color:#493300;
}
{{/if}}
</style>
</head><body style="">
<div id="bar">
{{#if contestname}}
<div id="menu" class="max20" title="{{contestname}}">
{{#if contestid}}
<a href="/contest/{{contestid}}">{{contestname}}</a>
{{else}}
{{contestname}}
{{/if}}
</div>
{{/if}}
<div class="max20" title="{{name}}">
{{name}}
</div>
{{#each subtasks}}
{{#if active}}
<div class="highlight max10" title="{{linktext}}">
{{linktext}}
</div>
{{else}}
<div class="max10" title="{{linktext}}">
<a href="/task/{{id}}">{{linktext}}</a>
</div>
{{/if}}
{{/each}}
{{#if readonly}}
<div class="max10" title="Review-Modus">
<em>Review-Modus</em>
</div>
{{/if}}
{{#unless readonly}}
{{#if time_info.has_timelimit}}
<div id="time" class="max10" title="Verbleibende Zeit">
<div id="timetext">
Verbleibende Zeit
</div>
<div id="timetime">
{{time_left_mh_formatted}}<span id="ttsec">{{time_left_sec_formatted}}</span>
</div>
<script>
var seconds_left_at_start = {{time_info.left_secs_total}};
var timerStart = Date.now();
function lz(a) {
var b = a.toString();
if (b.length < 2) {
return "0" + b;
}
return b;
}
function updateTimer() {
var seconds_passed = (Date.now() - timerStart) / 1000;
var seconds_left = seconds_left_at_start - seconds_passed;
var timer_sign = "";
{{#if time_info.exempt_from_timelimit}}
if (seconds_left < 0) {
seconds_left = -seconds_left;
timer_sign = "–";
}
{{/if}}
if (seconds_left > 0) {
var hour = seconds_left / 3600 | 0;
var min = (seconds_left / 60 | 0) % 60 | 0;
var sec = seconds_left % 60 | 0;
text = timer_sign + hour.toString() + ":" + lz(min) + "<span id=\"ttsec\">:" + lz(sec) + "</span>";
document.getElementById("timetime").innerHTML = text;
}
else if (seconds_left > -10) {
document.getElementById("timetime").innerHTML = "0:00<span id=\"ttsec\">:00</span>";
}
else {
document.getElementById("contestpage").click()
}
}
setInterval(updateTimer, 300);
</script>
</div>
{{/if}}
{{/unless}}
<script>
function redirectOverview() {
window.location.href = "{{#unless standalone_task}}{{#if category}}/contest/{{category}}/{{contestid}}{{else}}/contest/{{contestid}}{{/if}}{{else}}/contest/standalone_task{{/unless}}";
}
function updateIframeHeight() {
var vh = window.innerHeight;
document.documentElement.style.setProperty('--vh', vh + "px");
setTimeout(function() {
var vh = window.innerHeight;
document.documentElement.style.setProperty('--vh', vh + "px");
}, 1000)
}
updateIframeHeight();
window.addEventListener("resize", updateIframeHeight);
function enterFullscreen(element) {
if(element.requestFullscreen) {
element.requestFullscreen();
} else if(element.mozRequestFullScreen) {
element.mozRequestFullScreen();
} else if(element.msRequestFullscreen) {
element.msRequestFullscreen();
} else if(element.webkitRequestFullscreen) {
element.webkitRequestFullscreen();
}
}
function exitFullscreen() {
if(document.exitFullscreen) {
document.exitFullscreen();
} else if(document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if(document.webkitExitFullscreen) {
document.webkitExitFullscreen();
}
}
var fullscreen = false;
function toggleFullscreen(element) {
if (fullscreen) {
exitFullscreen();
fullscreen = false;
document.getElementById("tgfs").innerText = "⇱";
}
else {
enterFullscreen(element);
fullscreen = true;
document.getElementById("tgfs").innerText = "⇲";
}
}
</script>
<div class="nav max10" onclick="toggleFullscreen(document.documentElement);" title="Vollbild">
<a href="javascript:;"><span id="tgfs">⇱</span> Vollbild</a>
</div>
{{#if contestid}}
<div class="nav max10" title="Übersicht">
<a href="{{#unless standalone_task}}{{#if category}}/contest/{{category}}/{{contestid}}{{else}}/contest/{{contestid}}{{/if}}{{else}}/contest/standalone_task{{/unless}}" id="contestpage">⇧ Übersicht</a>
</div>
{{/if}}
{{#if nexttask}}
<div class="nav max10" title="Nächste Aufgabe">
<a href="{{ nexttask }}">⇨ Nächste Aufgabe</a>
</div>
{{/if}}
{{#if prevtask}}
<div class="nav max10" title="Vorherige Aufgabe">
<a href="{{ prevtask }}">⇦ Vorherige Aufgabe</a>
</div>
{{/if}}
</div>
</div>
<div id="save-submission-modal" class="modal">
<div class="modal-content">
<p>Deine Einsendung wird gespeichert. Dies scheint etwas länger zu dauern als üblich …</p>
<p>Möglicherweise liegt ein Problem mit der Netzwerkverbindung vor. Du kannst versuchen, deine Einsendung erneut zu speichern: <button id="save-again">Erneut speichern</button>.</p>
</div>
</div>
<iframe src="/{{taskpath}}?{{#if tasklang}}language={{tasklang}}&{{/if}}channelId=task" id="ifr" style="border: 0px; margin:0px; padding:0px; "></iframe>
<script>
window.hashdict["taskid"] = "{{taskid}}";
window.hashdict["csrftoken"] = "{{csrf_token}}";
{{#if readonly}}
window.hashdict["readonly"] = "true";
{{/if}}
var options = {
minScore:0,
maxScore:100,
noScore:0,
randomSeed:0,
readOnly:false,
options:{difficulty:"easy", log:1},
}
var myLoadViews = {
editor: true,
forum: true,
hints: true,
submission: true,
task: true,
grader: true,
metadata: true,
}
var myViews = {
task: true,
}
function ec(name) {
return function(e){
console.log(name + " error:");
console.log(e);
}
}
function noop(){}
var previous_answer = "";
var best_score = 0;
var best_unsaved_score = 0;
function getTaskProxyCallback(task) {
function reloadAnswerCallback() {
task.gradeAnswer("", {}, noop, ec("task.gradeAnswer"));
}
function reloadStateCallback() {
function load_task_callback(data) {
if ("text" in data) {
task.reloadAnswer(data["text"], reloadAnswerCallback, ec("task.reloadAnswer"));
} else {
task.reloadAnswer('', reloadAnswerCallback, ec("task.reloadAnswer"));
}
}
function load_task_error() {
task.reloadAnswer('', reloadAnswerCallback, ec("task.reloadAnswer"));
alert("Laden fehlgeschlagen");
}
{{#if submission}}
window.load_submission_object({{submission}}, load_task_callback, load_task_error);
{{else}}
{{#if preview}}
load_task_callback({});
{{else}}
window.load_task_object(load_task_callback, load_task_error);
{{/if}}
{{/if}} }
function showViewsCallback(){
task.reloadState('', reloadStateCallback, ec("task.reloadState"));
}
function loadCallback(){
task.showViews(myViews, showViewsCallback, ec("task.showViews"));
}
function getViewsCallback(views){
task.load(myLoadViews, loadCallback, ec("task.load"))
}
function getAnswerCallback(answer, save_message, autosave) {
if (window.hashdict["readonly"] == "true") {
return;
}
if (answer == previous_answer) {
return;
}
console.log("In task.gradeAnswer callback:");
console.log(answer);
function gradeAnswerCallback(score, message, scoreToken){
var not_saved_yet = true;
var needs_message = false;
if (score > best_score) {
needs_message = true;
}
if (score > best_unsaved_score) {
best_unsaved_score = score;
}
function save_task_callback() {
not_saved_yet = false;
console.log("OK transmission");
previous_answer = answer;
if (score > best_score) {
best_score = score;
}
if (best_unsaved_score <= best_score) {
document.getElementById("save-submission-modal").style.display = "none";
document.getElementById("save-again").onclick = function() {}
}
};
function save_task_error() {
console.log("ERROR transmission");
alert("Speichern fehlgeschlagen");
};
if (score > best_score && save_message) {
setTimeout(function(){
if (not_saved_yet && best_unsaved_score > best_score) {
document.getElementById("save-submission-modal").style.display = "block";
document.getElementById("save-again").disabled = true;
setTimeout(function(){document.getElementById("save-again").disabled = false;}, 3000);
document.getElementById("save-again").onclick = function() {
document.getElementById("save-again").disabled = true;
setTimeout(function(){document.getElementById("save-again").disabled = false;}, 3000);
window.save_task_object({"text": answer}, score, save_task_callback, save_task_error);
};
}
}, 200);
}
window.save_task_object({"text": answer}, score, autosave, save_task_callback, save_task_error);
}
task.gradeAnswer(answer, {}, gradeAnswerCallback, ec("task.gradeAnswer"));
}
var platform = {
getTaskParams: function(key, def, cb, ecb) {
if (!key && !def) {
cb(options);
}
else {
cb();
}
},
validate: function(mode, cb, ecb) {
if (mode == 'done') {
task.getAnswer(function(answer) {return getAnswerCallback(answer, true, false);}, ec("task.getAnswer"));
if (cb) {cb();}
}
else if (mode == 'next' || mode == 'nextImmediate') {
window.parent.redirectOverview();
}
if (mode == 'log') {
task.getAnswer(function(answer) {return getAnswerCallback(answer, false, false);}, ec("task.getAnswer"));
if (cb) {cb();}
}
else {
console.error("Unknown mode: '" + mode + "'");
if (ecb) {ecb();}
}
},
showViews: function(views, cb, ecb) {
cb(options);
},
openUrl: function(textId, cb, ecb) {
cb();
},
askHint: function(ht, cb, ecb) {
cb();
},
updateDisplay: function(opt, cb, ecb) {
cb();
},
initWithTask: function(t, cb, ecb) {
cb(options);
},
log: function(l, cb, ecb) {
cb();
}
};
TaskProxyManager.setPlatform(task, platform);
task.getViews(getViewsCallback, ec("task.getViews"));
if (window.hashdict["readonly"] != "true" && {{auto_save_interval_ms}} > 0) {
setInterval(function(){
task.getAnswer(function(answer) {return getAnswerCallback(answer, false, true);}, ec("task.getAnswer"));
}, {{auto_save_interval_ms}});
}
}
function main() {
TaskProxyManager.getTaskProxy("ifr", getTaskProxyCallback, false, ec("task.getTaskProxy"));
}
setTimeout(main, 1);
</script>
</body></html>