Compare commits

..

8 Commits

  1. 10
      app/app.go
  2. 54
      labs/coursework.js
  3. 15
      labs/lab10/desc.json
  4. 12
      labs/lab10/main.js
  5. 17
      labs/lab11/desc.json
  6. 28
      labs/lab11/main.js
  7. 25
      labs/lab12/desc.json
  8. 55
      labs/lab12/main.js
  9. 14
      labs/lab13/desc.json
  10. 8
      labs/lab13/main.js
  11. 14
      labs/lab14/desc.json
  12. 24
      labs/lab14/main.js
  13. 28
      labs/lab15/desc.json
  14. 15
      labs/lab8/desc.json
  15. 25
      labs/lab8/main.js
  16. 15
      labs/lab9/desc.json
  17. 30
      labs/lab9/main.js
  18. 1
      main.go
  19. 25
      web/static/styles.css
  20. 26
      web/templates/coursework.html
  21. 1
      web/templates/index.html

10
app/app.go

@ -77,6 +77,16 @@ func (a *App) LabPageHandler(writer http.ResponseWriter, request *http.Request)
}
}
func (a *App) CourseworkPageHandler(writer http.ResponseWriter, request *http.Request) {
cwFile, err := fs.ReadFile(a.WebFS, "templates/coursework.html")
if err != nil {
log.Fatal(err)
}
writer.WriteHeader(http.StatusOK)
writer.Write(cwFile)
}
func getLabsList(labsFS fs.FS) map[int]models.Lab {
var result = make(map[int]models.Lab)

54
labs/lab15/main.js → labs/coursework.js

@ -1,15 +1,18 @@
"use strict";
function main(formName) {
function main() {
let result = document.getElementById("result");
let arr = document.forms[formName].elements[0].value;
let arr = document.forms[0].elements[0].value;
arr = arr.trim().split(" ");
let checkResult = arr.some( elem => isNotNumber(elem) );
if (checkResult) {
result.textContent = "Ошибка: arr должен содержать только целые числа, разделенные пробелом!";
result.innerHTML = "<p class='fail'>Ошибка: введите только целые числа, разделенные пробелом!</p>";
return;
} else {
} else if (arr.length < 2) {
result.innerHTML = "<p class='fail'>Ошибка: введите минимум 2 числа!</p>";
return;
} else {
arr = arr.map( elem => Number(elem) );
}
@ -17,13 +20,23 @@ function main(formName) {
let path = findPath(graph);
if (path == undefined) {
result.textContent = "Результат: путь не найден";
result.innerHTML = "<p class='fail'>Результат: путь не найден!</p>";
return;
}
path[0] = "Start";
path[path.length - 1] = "End";
result.textContent = "Результат: " + path.join(" > ") + ". Длина пути: " + path.length;
arr[0] = "Start";
arr[arr.length - 1] = "End";
let table = "<table id='table'><tr><th>Метка</th><th>Номер прыжка</th></tr>";
arr.forEach( elem => table += "<tr><td>" + elem + "</td><td></td></tr>" );
table += "</table>";
result.innerHTML = "<p class='success'>Результат: путь найден! Прыжков в пути: " + (path.length - 1) + "</p>" + table;
path.forEach( (elem, index) =>
document.getElementById("table").rows[elem + 1].cells[1].innerHTML = index
);
}
function createGraph(arr) {
@ -35,21 +48,20 @@ function createGraph(arr) {
length = arr.length;
arr.forEach( (elem, index) => {
result[index] = {
prev: undefined,
dist: Number.POSITIVE_INFINITY,
visited: false,
childs: []
};
result[index] = {
prev: undefined,
dist: Number.POSITIVE_INFINITY,
visited: false,
childs: []
};
if (elem <= index) {
result[index].childs.push(index - elem);
}
let forwardIndex = elem >= (length - index) ? length - 1 : index + elem;
result[index].childs.push(forwardIndex);
if (elem <= index) {
result[index].childs.push(index - elem);
}
);
let forwardIndex = elem >= (length - index) ? length - 1 : index + elem;
result[index].childs.push(forwardIndex);
});
return result;
}

15
labs/lab10/desc.json

@ -1,14 +1,21 @@
{
"number": 10,
"task": "",
"task": "Создайте функцию, которая принимает положительное целое число (одно из base2, base8 или base16), преобразует целое число в заданное основание и возвращает строку с использованием рекурсии.",
"vars": [
[
{
"name": "",
"desc": "",
"name": "n",
"desc": "Число в двоичной системе",
"data": ""
}
],
[
{
"name": "n",
"desc": "Число в двоичной системе",
"data": "999"
}
]
],
"complete": false
"complete": true
}

12
labs/lab10/main.js

@ -3,5 +3,15 @@
function main(formName) {
let result = document.getElementById("result");
result.textContent = "Результат: неопределенно";
let n = document.forms[formName].elements[0].value;
if ( !/^[01]+$/.test(n) ) {
result.textContent = "Ошибка: n должно содежать только нули и единицы!";
return;
}
result.textContent = "Результат: " + binToDecimal(Number(n));
}
function binToDecimal(n) {
return n == 0 ? 0 : n % 10 + 2 * binToDecimal(Math.trunc(n / 10));
}

17
labs/lab11/desc.json

@ -1,14 +1,21 @@
{
"number": 11,
"task": "",
"task": "Создайте функцию, которая возвращает количество пятниц, 13-го числа в заданном году.",
"vars": [
[
{
"name": "",
"desc": "",
"name": "year",
"desc": "Исследуемый год",
"data": ""
}
],
[
{
"name": "year",
"desc": "Исследуемый год",
"data": "2021"
}
]
],
"complete": false
}
"complete": true
}

28
labs/lab11/main.js

@ -3,5 +3,31 @@
function main(formName) {
let result = document.getElementById("result");
result.textContent = "Результат: неопределенно";
let year = document.forms[formName].elements[0].value;
if (isNotNumber(year)) {
result.textContent = "Ошибка: year не является числом!";
return;
}
if (!Number.isInteger(Number(year))) {
result.textContent = "Ошибка: year должен быть целым!";
return;
}
result.textContent = "Результат: " + countFridays(year);
}
function countFridays(year) {
let result = 0;
for (let month = 1; month <= 12; month++) {
let date = new Date(year, month, 13);
result += date.getDay() == 5 ? 1 : 0;
}
return result;
}
function isNotNumber(val) {
return val.replace(/\s/g, '').length === 0 || isNaN(val);
}

25
labs/lab12/desc.json

@ -1,14 +1,31 @@
{
"number": 12,
"task": "",
"task": "Создавайте функции для класса Calculator, которые могут делать следующее: складывать два числа, вычитать два числа, умножать два числа, делить два числа.",
"vars": [
[
{
"name": "",
"desc": "",
"name": "a",
"desc": "Первое число",
"data": ""
},
{
"name": "b",
"desc": "Первое число",
"data": ""
}
],
[
{
"name": "a",
"desc": "Первое число",
"data": "6"
},
{
"name": "b",
"desc": "Первое число",
"data": "2"
}
]
],
"complete": false
"complete": true
}

55
labs/lab12/main.js

@ -3,5 +3,58 @@
function main(formName) {
let result = document.getElementById("result");
result.textContent = "Результат: неопределенно";
let a = document.forms[formName].elements[0].value;
if (isNotNumber(a)) {
result.textContent = "Ошибка: a не является числом!";
return;
} else {
a = Number(a);
}
let b = document.forms[formName].elements[1].value;
if (isNotNumber(b)) {
result.textContent = "Ошибка: b не является числом!";
return;
} else {
b = Number(b);
}
result.textContent = "Результат: " + Calculate(a, b);
}
function Calculate(a, b) {
class Calculator {
constructor(a, b) {
this.a = a;
this.b = b;
}
add() {
return this.a + this.b;
}
subtract() {
return this.a - this.b;
}
multiply() {
return this.a * this.b;
}
devide() {
return this.a / this.b;
}
}
let result;
let calc = new Calculator(a, b);
result = "сложение: " + calc.add();
result += ", вычитание: " + calc.subtract();
result += ", умножение: " + calc.multiply();
result += ", деление: " + calc.devide();
return result;
}
function isNotNumber(val) {
return val.replace(/\s/g, '').length === 0 || isNaN(val);
}

14
labs/lab13/desc.json

@ -1,14 +1,6 @@
{
"number": 13,
"task": "",
"vars": [
[
{
"name": "",
"desc": "",
"data": ""
}
]
],
"complete": false
"task": "Напишите программу, чтобы получить ширину и высоту окна (каждый раз, когда размер окна изменяется).",
"vars": [],
"complete": true
}

8
labs/lab13/main.js

@ -1,7 +1,9 @@
"use strict";
function main(formName) {
window.onresize = viewSizes;
viewSizes();
function viewSizes() {
let result = document.getElementById("result");
result.textContent = "Результат: неопределенно";
result.textContent = "Результат: " + window.innerWidth + "x" + window.innerHeight;
}

14
labs/lab14/desc.json

@ -1,14 +1,6 @@
{
"number": 14,
"task": "",
"vars": [
[
{
"name": "",
"desc": "",
"data": ""
}
]
],
"complete": false
"task": "Вам будет предоставлен набор напитков, каждый из которых является объектом с двумя свойствами: названием и ценой. Создайте функцию с массивом напитков в качестве аргумента и верните объекты напитков, отсортированные по цене в порядке возрастания.",
"vars": [[]],
"complete": true
}

24
labs/lab14/main.js

@ -3,5 +3,27 @@
function main(formName) {
let result = document.getElementById("result");
result.textContent = "Результат: неопределенно";
let arr = [
{name: "Кола", price: 5},
{name: "Вода", price: 1},
{name: "Чай", price: 2},
{name: "Коктейль", price: 10},
{name: "Мохито", price: 8}
];
if (item instanceof Array) {
result.textContent = "Ошибка: arr должен быть массивом!";
return;
}
result.textContent = "Результат: " + sortDrinks(arr);
}
function sortDrinks(arr) {
let result = [];
arr.sort( (first, second) => first.price > second.price ? 1 : -1 );
arr.forEach( elem => result.push(elem.name + " - " + elem.price) );
return result.join(", ");
}

28
labs/lab15/desc.json

@ -1,28 +0,0 @@
{
"number": 15,
"task": "Лягушка хочет перепрыгнуть реку, но она не может сделать это одним прыжком. При этом, в реке имеется n камней. Лягушка может прыгать с ближайшего берега на камень 1 и с камня n на дальний берег. Она также может прыгать с камня на камень, вперед и назад. Однако на каждом камне написано число j, и она должна перепрыгнуть ровно на j камней назад или вперед. Найдите минимальное количество прыжков для перехода через реку (включая прыжки с первого камня и с последнего камня (или любого другого камня, если возможно) на дальний берег) или определите отсутствие шансов, если невозможно перепрыгнуть реку. Лягушка может также добраться до дальнего берега от камня, отличного от n, если на нем написано достаточно большое число. n >= 2.",
"vars": [
[
{
"name": "arr",
"desc": "Массив надписей на камнях",
"data": ""
}
],
[
{
"name": "arr",
"desc": "Массив надписей на камнях",
"data": "1 3 5 3 2 2 1 0"
}
],
[
{
"name": "arr",
"desc": "Массив надписей на камнях",
"data": "1 3 5 3 2 3 1 0"
}
]
],
"complete": true
}

15
labs/lab8/desc.json

@ -1,14 +1,21 @@
{
"number": 8,
"task": "",
"task": "Создайте функцию, которая принимает одну строку в качестве аргумента и возвращает упорядоченный массив, содержащий индексы всех заглавных букв в строке.",
"vars": [
[
{
"name": "",
"desc": "",
"name": "s",
"desc": "Разбираемая строка",
"data": ""
}
],
[
{
"name": "s",
"desc": "Разбираемая строка",
"data": "Мама Мыла Раму"
}
]
],
"complete": false
"complete": true
}

25
labs/lab8/main.js

@ -3,5 +3,28 @@
function main(formName) {
let result = document.getElementById("result");
result.textContent = "Результат: неопределенно";
let s = document.forms[formName].elements[0].value;
if (!(typeof s === "string")) {
result.textContent = "Ошибка: s не является строкой!";
return;
}
result.textContent = "Результат: " + countUpperChars(s);
}
function countUpperChars(s) {
let result = [];
let pattern = /^[A-ZА-Я]+$/;
Array.from(s).forEach( (elem, index) => {
if (pattern.test(elem)) {
result.push(index);
}
});
if (result.length == 0) {
return "заглавные буквы отсутствуют";
} else {
return result;
}
}

15
labs/lab9/desc.json

@ -1,14 +1,21 @@
{
"number": 9,
"task": "",
"task": "Создайте функцию, которая принимает массив имен супергероев и возвращает массив только имен супергероев, начинающихся на «человек». Верните имена в алфавитном порядке.",
"vars": [
[
{
"name": "",
"desc": "",
"name": "names",
"desc": "Имена супергероев, разделенных запятой",
"data": ""
}
],
[
{
"name": "names",
"desc": "Имена супергероев, разделенных запятой",
"data": "Баба Нюра, Супермен, Человек Паук, человек невидимка"
}
]
],
"complete": false
"complete": true
}

30
labs/lab9/main.js

@ -3,5 +3,33 @@
function main(formName) {
let result = document.getElementById("result");
result.textContent = "Результат: неопределенно";
let names = document.forms[formName].elements[0].value;
if (!(typeof names === "string")) {
result.textContent = "Ошибка: names не является строкой!";
return;
}
result.textContent = "Результат: " + getNewNames(names);
}
function getNewNames(names) {
let result = [];
names = names.split(",");
names.forEach( elem => {
if ( elem.trim().toLowerCase().startsWith("человек") ) {
result.push( elem.trim() );
}
});
result.forEach( (elem, index, array) =>
array[index] = elem.split(/\s+/).map(word => word[0].toUpperCase() + word.substring(1)).join(' ')
);
result.sort();
if (result.length == 0) {
return "подходящие имена отсутствуют";
} else {
return result.join(', ');
}
}

1
main.go

@ -22,6 +22,7 @@ func main() {
http.HandleFunc("/", app.MainPageHandler)
http.HandleFunc("/lab", app.LabPageHandler)
http.HandleFunc("/coursework", app.CourseworkPageHandler)
debug := flag.Bool("d", false, "Debug flag for using local FS instead of embed")
flag.Parse()

25
web/static/styles.css

@ -67,6 +67,20 @@ a.blocked {
cursor: default;
}
p {
text-align: justify;
margin-bottom: .5%;
}
.fail {
text-align: center;
color: red;
}
.success {
text-align: center;
color: green;
}
hr {
margin: .5% 0;
border: none;
@ -100,3 +114,14 @@ input[type=button] {
input[type=button]:hover {
background-color: #D8DDDD;
}
table {
border-collapse: collapse;
margin: auto;
}
th, td {
border: 2px solid;
padding: 1%;
width: 40%;
}

26
web/templates/coursework.html

@ -0,0 +1,26 @@
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Курсовая работа</title>
<link rel="icon" type="image/png" sizes="256x256" href="static/favicon.png">
<link rel="stylesheet" type="text/css" href="static/styles.css">
</head>
<body>
<div class="main">
<h1>Курсовая работа</h1>
<p>Лягушка хочет перепрыгнуть реку, но она не может сделать это одним прыжком. При этом, в реке имеется n камней. Лягушка может прыгать с ближайшего берега на камень 1 и с камня n на дальний берег. Она также может прыгать с камня на камень, вперед и назад. Однако на каждом камне написано число j, и она должна перепрыгнуть ровно на j камней назад или вперед. Найдите минимальное количество прыжков для перехода через реку (включая прыжки с первого камня и с последнего камня (или любого другого камня, если возможно) на дальний берег) или определите отсутствие шансов, если невозможно перепрыгнуть реку. Лягушка может также добраться до дальнего берега от камня, отличного от n, если на нем написано достаточно большое число. n >= 2.</p>
<hr>
<form>
<label for="input">Метки на камнях:</label>
<input type="text" id="input" name="input" placeholder="Введите целые числа разделенные пробелом" value="1 3 5 3 2 3 1 0">
<input type="button" id="calculate" value="Вычислить" onclick="main();">
</form>
<div id="result"></div>
</div>
<script src="labs/coursework.js"></script>
</body>
</html>

1
web/templates/index.html

@ -17,6 +17,7 @@
{{ $k }}
</a>
{{ end }}
<a href="coursework">КР</a>
</div>
</div>
</body>

Loading…
Cancel
Save