/
memoryspeak
/
UlamCodeWeb
Обзор
Документация
Войти
/
memoryspeak
/
UlamCodeWeb
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
js/elements/Cell.js
584 строки
51 KB
memoryspeak
add 46 mathematics
18 фев 2026, 20:35
18 фев 2026, 20:35
fb70e80
Код
Авторство
О чём код?
export default class Cell { BORDER_RADIUS_CELL_SIZE_RATIO = 0.1; LINE_WIDTH_CELL_SIZE_RATIO = 0.02; BORDER_COLOR = "white"; TEXT_COLOR = "white"; TEXT_CELL_SIZE_RATIO = 0.2; START_MAY_BE_SELECTED_CELLS_DISTANCE = 1; MOVE_SPEED = 0.005; HELPER_TIME = 0.8; ON_LONG_INPUT_DELAY = 0.5; constructor(map, intPosition, intValue, col, row, direction) { this.map = map; this.intPosition = intPosition; this.intValue = intValue; this.col = col; this.row = row; this.direction = direction; this.fillColor = "black"; this.touchStartPos = { x: 0, y: 0 }; this.moveThreshold = 10; this.helper = false; this.helperTime = this.HELPER_TIME; this.onLongInputDelay = this.ON_LONG_INPUT_DELAY; } update(correction) { if (this.helper === true && this.helperTime > 0) { this.helperTime -= correction; } if (this.helper === true && this.helperTime <= 0) { this.helper = false; this.helperTime = this.HELPER_TIME; } if (this.map.app.modal.isActive) return; if (this.map.app.leftButton.isMouseInButton()) return; if (this.map.app.rightButton.isMouseInButton()) return; if (this.map.app.upButton.isMouseInButton()) return; if (this.map.app.downButton.isMouseInButton()) return; if (this.map.app.centerButton.isMouseInButton()) return; if (this.map.app.randomHint.isMouseInButton()) return; if (this.map.app.score.isMouseInButton()) return; if (this.map.app.input.mouse.isDown && !this.wasDown) { this.touchStartPos.x = this.map.app.input.mouse.x; this.touchStartPos.y = this.map.app.input.mouse.y; } this.wasDown = this.map.app.input.mouse.isDown; const dx = this.map.app.input.mouse.x - this.touchStartPos.x; const dy = this.map.app.input.mouse.y - this.touchStartPos.y; const distance = Math.sqrt(dx * dx + dy * dy); if (this.map.app.input.mouse.isDown && this.isMouseInButton()) { if (this.onLongInputDelay > 0) { this.onLongInputDelay -= correction; } } if (this.map.app.input.mouse.isUp) { if (distance < this.moveThreshold) { if (this.isMouseInButton()) { if (this.onLongInputDelay <= 0) { this.onLongClick(); return; } this.onShortClick(); } } } if (this.map.app.input.mouse.isDown && distance > this.moveThreshold) { this.map.dx += dx * correction * this.MOVE_SPEED; this.map.dy += dy * correction * this.MOVE_SPEED; } } isMouseInButton() { const cellX = this.map.app.layer.w / 2 + this.col * this.map.app.layer.cellSize + this.map.dx; const cellY = this.map.app.layer.h / 2 + this.row * this.map.app.layer.cellSize + this.map.dy; const halfSize = this.map.app.layer.cellSize / 2; return ( this.map.app.input.mouse.x > cellX - halfSize && this.map.app.input.mouse.x < cellX + halfSize && this.map.app.input.mouse.y > cellY - halfSize && this.map.app.input.mouse.y < cellY + halfSize ); } onShortClick() { if (this.intPosition === 0) { this.onShortLogoClick(); } else { if (this.currentCellIsNotSelected()) { if (this.allCellsIsNotSelected()) { this.makeCurrentCellSelected(); this.fillCellsThatMayBeSelected(); } else { this.clearAllCells(); } } else if (this.currentCellIsSelected()) { this.clearAllCells(); } else if (this.currentCellIsMayBeSelected()) { this.makeCurrentCellSelected(); this.clearCellsThatMayBeSelected(); this.onCheck(); } } this.onLongInputDelay = this.ON_LONG_INPUT_DELAY; } onShortLogoClick() { const logoImage = this.getLogoByScore(); if (logoImage?.complete) { this.map.app.runningLine.start(logoImage, this.getTextByScore()); } } onLongClick() { if (this.intPosition === 0) return; if (!this.map.app.divisorHint.isStarted) { this.map.app.divisorHint.start( this.intValue, this.map.app.input.mouse.x, this.map.app.input.mouse.y, ); this.map.app.score.decrementHoles(); } this.onLongInputDelay = this.ON_LONG_INPUT_DELAY; } clearCellsThatMayBeSelected() { for (let i = 0; i < this.map.cells.length; i++) { const cell = this.map.cells[i]; if (cell.fillColor === "grey") cell.fillColor = "black"; } } fillCellsThatMayBeSelected() { for (let i = 0; i < this.map.cells.length; i++) { const cell = this.map.cells[i]; if (this.cellMayBeSelected(cell)) cell.fillColor = "grey"; } } clearAllCells() { for (let i = 0; i < this.map.cells.length; i++) { const cell = this.map.cells[i]; cell.fillColor = "black"; } } currentCellIsNotSelected() { return this.fillColor === "black"; } currentCellIsSelected() { return this.fillColor === "green"; } currentCellIsMayBeSelected() { return this.fillColor === "grey"; } makeCurrentCellSelected() { this.fillColor = "green"; } makeCurrentCellUnselected() { this.fillColor = "black"; } allCellsIsNotSelected() { for (let i = 0; i < this.map.cells.length; i++) { const cell = this.map.cells[i]; if (cell.fillColor === "green") return false; } return true; } cellMayBeSelected(cell) { if (cell.col === this.col && cell.row === this.row) return false; let maxDistanse = Math.sqrt(this.map.app.score.holes + 1) / 2; if (maxDistanse < this.START_MAY_BE_SELECTED_CELLS_DISTANCE) maxDistanse = this.START_MAY_BE_SELECTED_CELLS_DISTANCE; const rowDiff = cell.row - this.row; const colDiff = cell.col - this.col; const distanse = Math.sqrt(rowDiff * rowDiff + colDiff * colDiff); return distanse <= maxDistanse; } draw() { this.drawBasicRect(); if (this.isPrimeValue()) this.drawPrimeCircle(); if (this.helper === true) this.drawHelper(); this.intPosition === 0 ? this.drawLogoCircle() : this.drawCenterCircle(); if (this.intPosition !== 0) this.drawNumber(); } drawBasicRect() { this.map.app.layer.context.beginPath(); this.map.app.layer.context.roundRect( this.map.app.layer.w / 2 + this.col * this.map.app.layer.cellSize - this.map.app.layer.cellSize / 2 + this.map.dx, this.map.app.layer.h / 2 + this.row * this.map.app.layer.cellSize - this.map.app.layer.cellSize / 2 + this.map.dy, this.map.app.layer.cellSize, this.map.app.layer.cellSize, this.map.app.layer.cellSize * this.BORDER_RADIUS_CELL_SIZE_RATIO, ); this.map.app.layer.context.strokeStyle = this.BORDER_COLOR; this.map.app.layer.context.lineWidth = this.map.app.layer.cellSize * this.LINE_WIDTH_CELL_SIZE_RATIO; this.map.app.layer.context.fillStyle = this.fillColor; this.map.app.layer.context.fill(); this.map.app.layer.context.stroke(); } drawCenterCircle() { this.map.app.layer.context.beginPath(); this.map.app.layer.context.arc( this.map.app.layer.w / 2 + this.col * this.map.app.layer.cellSize + this.map.dx, this.map.app.layer.h / 2 + this.row * this.map.app.layer.cellSize + this.map.dy, this.map.app.layer.cellSize * 0.25, 0, 2 * Math.PI, ); const bgColor = this.intPosition === 0 ? "white" : this.getCellColor(this.intPosition); this.map.app.layer.context.fillStyle = bgColor; this.map.app.layer.context.fill(); this.map.app.layer.context.lineWidth = this.map.app.layer.cellSize * this.LINE_WIDTH_CELL_SIZE_RATIO; this.map.app.layer.context.strokeStyle = this.BORDER_COLOR; this.map.app.layer.context.stroke(); } drawPrimeCircle() { this.map.app.layer.context.beginPath(); this.map.app.layer.context.arc( this.map.app.layer.w / 2 + this.col * this.map.app.layer.cellSize + this.map.dx, this.map.app.layer.h / 2 + this.row * this.map.app.layer.cellSize + this.map.dy, this.map.app.layer.cellSize * 0.3, 0, 2 * Math.PI, ); this.map.app.layer.context.fillStyle = "blue"; this.map.app.layer.context.fill(); this.map.app.layer.context.lineWidth = this.map.app.layer.cellSize * this.LINE_WIDTH_CELL_SIZE_RATIO; this.map.app.layer.context.strokeStyle = "blue"; this.map.app.layer.context.stroke(); } drawHelper() { this.map.app.layer.context.beginPath(); this.map.app.layer.context.arc( this.map.app.layer.w / 2 + this.col * this.map.app.layer.cellSize + this.map.dx, this.map.app.layer.h / 2 + this.row * this.map.app.layer.cellSize + this.map.dy, this.map.app.layer.cellSize * (this.helperTime * 0.5), 0, 2 * Math.PI, ); this.map.app.layer.context.fillStyle = "lime"; this.map.app.layer.context.fill(); this.map.app.layer.context.lineWidth = this.map.app.layer.cellSize * this.LINE_WIDTH_CELL_SIZE_RATIO; this.map.app.layer.context.strokeStyle = "lime"; this.map.app.layer.context.stroke(); } drawLogoCircle() { const centerX = this.map.app.layer.w / 2 + this.col * this.map.app.layer.cellSize + this.map.dx; const centerY = this.map.app.layer.h / 2 + this.row * this.map.app.layer.cellSize + this.map.dy; const radius = this.map.app.layer.cellSize * 0.3; this.map.app.layer.context.beginPath(); this.map.app.layer.context.arc(centerX, centerY, radius, 0, 2 * Math.PI); const bgColor = "transparent"; this.map.app.layer.context.fillStyle = bgColor; this.map.app.layer.context.fill(); this.map.app.layer.context.lineWidth = this.map.app.layer.cellSize * this.LINE_WIDTH_CELL_SIZE_RATIO; this.map.app.layer.context.strokeStyle = this.BORDER_COLOR; this.map.app.layer.context.stroke(); const imgSize = radius * 1.9; const logoImage = this.getLogoByScore(); if (logoImage?.complete) { this.map.app.layer.context.drawImage( logoImage, centerX - imgSize / 2, centerY - imgSize / 2, imgSize, imgSize, ); } } getLogoByScore() { // 391 = 46 // 7, 15, 19, 31, 35, 39, 51, 63, 67, 71, 79, 95, 99, 103, 115, // 127, 131, 139, 155, 159, 163, 167, 175, 191, 195, 199, 211, 223, // 235, 239, 255, 259, 271, 275, 283, 287, 315, 319, 323, 335, 351, // 355, 359, 375, 383, 391, 395, 399, 403, 415, 427, 431, 439, 451, // 475, 479, 483, 511, 515, 523, 527, 539, 543, 555, 559, 571, 575, // 595, 611, 623, 635, 639, 659, 671, 675, 683, 703, 715, 719, 723, // 739, 751, 755, 763, 783, 795, 799, 811, 831, 835, 843, 851, 863, // 875, 879, 883, 895, 899, 915, 931, 955, 959, 971, 975, 979, 991, 999 if (this.map.app.score.holes < 7) return this.map.levelImages.ulam; if (this.map.app.score.holes < 15) return this.map.levelImages.tao; if (this.map.app.score.holes < 19) return this.map.levelImages.perelman; if (this.map.app.score.holes < 31) return this.map.levelImages.rassel; if (this.map.app.score.holes < 35) return this.map.levelImages.gedel; if (this.map.app.score.holes < 39) return this.map.levelImages.gilbert; if (this.map.app.score.holes < 51) return this.map.levelImages.neiman; if (this.map.app.score.holes < 63) return this.map.levelImages.kolmogorov; if (this.map.app.score.holes < 67) return this.map.levelImages.matiyasevich; if (this.map.app.score.holes < 71) return this.map.levelImages.puankare; if (this.map.app.score.holes < 79) return this.map.levelImages.neter; if (this.map.app.score.holes < 95) return this.map.levelImages.einstein; if (this.map.app.score.holes < 99) return this.map.levelImages.erdesh; if (this.map.app.score.holes < 103) return this.map.levelImages.ramanujan; if (this.map.app.score.holes < 115) return this.map.levelImages.hardi; if (this.map.app.score.holes < 127) return this.map.levelImages.kantor; if (this.map.app.score.holes < 131) return this.map.levelImages.klein; if (this.map.app.score.holes < 139) return this.map.levelImages.kovalevskaya; if (this.map.app.score.holes < 155) return this.map.levelImages.riman; if (this.map.app.score.holes < 159) return this.map.levelImages.lobachevski; if (this.map.app.score.holes < 163) return this.map.levelImages.chebishev; if (this.map.app.score.holes < 167) return this.map.levelImages.galua; if (this.map.app.score.holes < 175) return this.map.levelImages.gamilton; if (this.map.app.score.holes < 191) return this.map.levelImages.dirihle; if (this.map.app.score.holes < 195) return this.map.levelImages.koshi; if (this.map.app.score.holes < 199) return this.map.levelImages.gauss; if (this.map.app.score.holes < 211) return this.map.levelImages.euler; if (this.map.app.score.holes < 223) return this.map.levelImages.bernulli; if (this.map.app.score.holes < 235) return this.map.levelImages.lagrange; if (this.map.app.score.holes < 239) return this.map.levelImages.leibnic; if (this.map.app.score.holes < 255) return this.map.levelImages.paskal; if (this.map.app.score.holes < 259) return this.map.levelImages.mersenn; if (this.map.app.score.holes < 271) return this.map.levelImages.ferma; if (this.map.app.score.holes < 275) return this.map.levelImages.dekart; if (this.map.app.score.holes < 283) return this.map.levelImages.newton; if (this.map.app.score.holes < 287) return this.map.levelImages.viet; if (this.map.app.score.holes < 315) return this.map.levelImages.fibonacci; if (this.map.app.score.holes < 319) return this.map.levelImages.alhorezmi; if (this.map.app.score.holes < 323) return this.map.levelImages.hayam; if (this.map.app.score.holes < 335) return this.map.levelImages.diofant; if (this.map.app.score.holes < 351) return this.map.levelImages.gipatia; if (this.map.app.score.holes < 355) return this.map.levelImages.arhimed; if (this.map.app.score.holes < 359) return this.map.levelImages.eratosfen; if (this.map.app.score.holes < 375) return this.map.levelImages.evklid; if (this.map.app.score.holes < 383) return this.map.levelImages.fales; if (this.map.app.score.holes < 391) return this.map.levelImages.pifagor; } getTextByScore() { // 391 = 46 // 7, 15, 19, 31, 35, 39, 51, 63, 67, 71, 79, 95, 99, 103, 115, 127, 131, 139, 155, 159, 163, 167, 175, 191, 195, 199, 211, 223, 235, 239, 255, 259, 271, 275, 283, 287, 315, 319, 323, 335, 351, 355, 359, 375, 383, 391, 395, 399, 403, 415, 427, 431, 439, 451, 475, 479, 483, 511, 515, 523, 527, 539, 543, 555, 559, 571, 575, 595, 611, 623, 635, 639, 659, 671, 675, 683, 703, 715, 719, 723, 739, 751, 755, 763, 783, 795, 799, 811, 831, 835, 843, 851, 863, 875, 879, 883, 895, 899, 915, 931, 955, 959, 971, 975, 979, 991, 999 if (this.map.app.score.holes < 7) return "Стани́слав Ма́рцин У́лам — польский и американский математик. Известен как «отец водородной бомбы». Является одним из соавторов теоретической схемы искусственного запуска термоядерной реакции, применяемой в Манхэттенском проекте. Им предложен вычислительный метод Монте-Карло. Изобретатель скатерти Улама, по мотивам которой и придумана данная игра."; if (this.map.app.score.holes < 15) return "Те́ренс Та́о — австралийско-американский математик китайского происхождения, работающий в основном в области гармонического анализа, дифференциальных уравнений в частных производных, комбинаторики, теории чисел и теории представлений. Наиболее известной его работой является доказательство (совместно с британским математиком Беном Грином) существования сколь угодно длинных арифметических прогрессий простых чисел (теорема Грина — Тао). Доктор философии, профессор математики в Калифорнийском университете в Лос-Анджелесе. Лауреат Филдсовской премии."; if (this.map.app.score.holes < 19) return "Григо́рий Я́ковлевич Перельма́н — российский математик, доказавший гипотезу Пуанкаре, которая была нерешённой проблемой около века, а в настоящий момент это единственная решённая математическая проблема из семи задач тысячелетия."; if (this.map.app.score.holes < 31) return "Бе́ртран А́ртур Уи́льям Ра́ссел — британский философ, логик, математик и общественный деятель. Внёс значительный вклад в математическую логику, историю философии и теорию познания. Рассел считается одним из основателей английского неореализма, а также неопозитивизма. Лауреат Нобелевской премии по литературе. Также Рассел известен трудами по эстетике, педагогике и социологии. Рассел считается одним из наиболее влиятельных логиков XX века. В редакторских замечаниях к мемориальному сборнику «Бертран Рассел — философ века» отмечалось, что вклад Рассела в математическую логику является наиболее значительным и фундаментальным со времён Аристотеля."; if (this.map.app.score.holes < 35) return "Курт Фри́дрих Гёдель — австрийский логик, математик и философ математики. Наиболее известен сформулированными и доказанными им теоремами о неполноте, которые оказали огромное влияние на представление об основаниях математики. Считается одним из наиболее выдающихся мыслителей XX века."; if (this.map.app.score.holes < 39) return "Дави́д Ги́льберт — немецкий математик-универсал, внёс значительный вклад в развитие многих областей математики. В 1910—1920-е годы (после смерти Анри Пуанкаре) был признанным мировым лидером математиков. Гильберт разработал широкий спектр фундаментальных идей во многих областях математики. Наиболее известны его первая полная аксиоматика евклидовой геометрии и теория гильбертовых пространств, одна из основ современного функционального анализа. Он внёс значительный вклад в теорию инвариантов, общую алгебру, математическую физику, интегральные уравнения и основания математики."; if (this.map.app.score.holes < 51) return "Джон фон Не́йман — венгеро-американский математик, физик и педагог еврейского происхождения, сделавший важный вклад в квантовую физику, квантовую логику, функциональный анализ, теорию множеств, информатику, экономику и другие отрасли науки. Наиболее известен как человек, с именем которого связывают архитектуру большинства современных компьютеров (так называемая архитектура фон Неймана), применение теории операторов к квантовой механике (алгебра фон Неймана), а также как участник Манхэттенского проекта и как создатель теории игр и концепции клеточных автоматов."; if (this.map.app.score.holes < 63) return "Андре́й Никола́евич Колмого́ров — советский математик, один из крупнейших математиков XX века. Один из основоположников современной теории вероятностей, им получены фундаментальные результаты в топологии, геометрии, математической логике, классической механике, теории турбулентности, теории сложности алгоритмов, теории информации, теории функций, теории тригонометрических рядов, теории меры, теории приближения функций, теории множеств, теории дифференциальных уравнений, теории динамических систем, функциональном анализе и в ряде других областей математики и её приложений. Автор новаторских работ по философии, истории, методологии и преподаванию математики, известны его работы в статистической физике (в частности, уравнение Джонсона — Мела — Аврами — Колмогорова)."; if (this.map.app.score.holes < 67) return "Ю́рий Влади́мирович Матиясе́вич — советский и российский математик, исследователь Санкт-Петербургского отделения Математического института им. В. А. Стеклова РАН, член экспертной комиссии РСОШ по математике, академик Российской академии наук, доктор физико-математических наук. Внёс существенный вклад в теорию вычислимости, завершив решение десятой проблемы Гильберта."; if (this.map.app.score.holes < 71) return "Жюль Анри́ Пуанкаре́ — французский математик, механик, физик, астроном и философ. Историки причисляют Анри Пуанкаре к величайшим математикам всех времён. Он считается, наряду с Гильбертом, последним математиком-универсалом, учёным, способным охватить все математические результаты своего времени. Среди его самых крупных достижений: создание топологии, создание качественной теории дифференциальных уравнений, разработка теории автоморфных функций, разработка новых, чрезвычайно эффективных методов небесной механики, создание математических основ теории относительности, а также обобщение принципа относительности на все физические явления, наглядная модель геометрии Лобачевского."; if (this.map.app.score.holes < 79) return "Ама́лия Э́мми Нётер — немецкий математик, наиболее известна своим вкладом в абстрактную алгебру и теоретическую физику. Альберт Эйнштейн считал её величайшей женщиной в истории математики. В качестве одного из величайших математиков двадцатого века она коренным образом изменила теорию колец, полей и алгебр. В физике теорема Нётер впервые открыла связь между симметрией в природе и законами сохранения."; if (this.map.app.score.holes < 95) return "Альбе́рт Эйнште́йн — швейцарский, немецкий и американский физик-теоретик и общественный деятель-гуманист, один из основателей современной теоретической физики. Лауреат Нобелевской премии по физике. Его теория относительности изменила основания физики, заменив классическую механику и закон всемирного тяготения Ньютона. Персона XX века по версии журнала Time."; if (this.map.app.score.holes < 99) return "Пал Э́рдёш — венгерский математик, один из наиболее продуктивных математиков XX века. Работал в самых разных областях современной математики: комбинаторика, теория графов, теория чисел, математический анализ, теория приближений, теория множеств и теория вероятностей. Лауреат множества математических наград. Основатель премии Эрдёша."; if (this.map.app.score.holes < 103) return "Сринива́са Рамануджа́н Айенго́р — индийский математик. Не имея специального математического образования, получил замечательные результаты в области теории чисел. Наиболее значительна его работа совместно с Годфри Харди по асимптотике числа разбиений."; if (this.map.app.score.holes < 115) return "Го́дфри Ха́ролд Ха́рди — английский математик, известный своими работами в теории чисел и математическом анализе. В биологии он известен Законом Харди — Вайнберга, являющимся базовым принципом популяционной генетики. В дополнение к его исследованиям, его помнят за его эссе 1940 года об эстетике математики под названием «Апология математика». Харди также был наставником индийского математика Сринивасы Рамануджана."; if (this.map.app.score.holes < 127) return "Гео́рг Фе́рдинанд Лю́двиг Фи́липп Ка́нтор — немецкий математик. Наиболее известен как создатель теории множеств. Кантор впервые определил сравнение произвольных множеств, включая бесконечные, по их «мощности» (обобщению понятия количества) через понятие взаимно-однозначного соответствия между множествами. Он классифицировал множества по их мощности, определил понятия кардинальных и порядковых чисел, арифметику кардинальных и порядковых чисел. Теория Кантора о трансфинитных числах первоначально была воспринята как нарушение многовековых традиций, заложенных ещё древними греками и отрицающих актуальную бесконечность как легальный математический объект. Со временем канторовская теория множеств была поставлена на аксиоматическую основу и стала краеугольным камнем в современном построении оснований математики, на неё опираются математический анализ, топология, функциональный анализ, теория меры и многие другие разделы математики."; if (this.map.app.score.holes < 131) return "Феликс Христиан Клейн — немецкий математик и педагог. Внёс значительный вклад в общую алгебру (особенно в теорию групп и теорию непрерывных групп), теорию эллиптических и автоморфных функций. Одним из важнейших его достижений стало первое доказательство непротиворечивости геометрии Лобачевского. Он предложил пример односторонней поверхности — «бутылку Клейна»."; if (this.map.app.score.holes < 139) return "Со́фья Васи́льевна Ковале́вская — русский математик и механик, с 1889 года — иностранный член-корреспондент Петербургской академии наук. Первая в мире женщина — профессор математики."; if (this.map.app.score.holes < 155) return "Гео́рг Фри́дрих Бе́рнхард Ри́ман — немецкий математик, механик и физик. За свою короткую жизнь (всего десять лет трудов) он преобразовал сразу несколько разделов математики, в том числе математический анализ, комплексный анализ, дифференциальную геометрию, математическую физику и арифметику, внёс вклад в создание топологии."; if (this.map.app.score.holes < 159) return "Никола́й Ива́нович Лобаче́вский — русский математик, один из первооткрывателей неевклидовой («гиперболической») геометрии, деятель университетского образования и народного просвещения. Лобачевский впервые детально исследовал (в современной терминологии) неевклидов мир отрицательной кривизны, подробно описал его необычные геометрические, тригонометрические и аналитические свойства и публично предложил придать ему легальный статус. Он опередил своё время и до конца жизни остался непонятым, лишь в 1870-е годы пришла всемирная слава, сделавшая Лобачевского первым в ряду великих русских математиков XIX века."; if (this.map.app.score.holes < 163) return "Пафну́тий Льво́вич Чебышёв — русский математик и механик, основоположник петербургской математической школы, академик Петербургской академии наук и ещё 24 академий мира. Чебышёв — «величайший, наряду с Н. И. Лобачевским, русский математик XIX века». Он получил фундаментальные результаты в теории чисел (распределение простых чисел) и теории вероятностей (центральная предельная теорема, закон больших чисел), построил общую теорию ортогональных многочленов, теорию равномерных приближений и многие другие. Основал математическую теорию синтеза механизмов и разработал ряд практически важных концепций механизмов."; if (this.map.app.score.holes < 167) return "Эвари́ст Галуа́ — французский математик, основатель современной высшей алгебры. Радикальный революционер-республиканец, он был застрелен на дуэли в возрасте двадцати лет."; if (this.map.app.score.holes < 175) return "Уи́льям Ро́уэн Га́мильтон — ирландский математик, механик-теоретик, физик-теоретик, «один из лучших математиков XIX века». Известен фундаментальными открытиями в математике (кватернионы, основы векторного анализа, вариационное исчисление, обоснование комплексных чисел), аналитической механике (гамильтонова механика) и оптике. Автор предельно общего вариационного принципа наименьшего действия, применяемого во многих разделах физики."; if (this.map.app.score.holes < 191) return "Ио́ганн Пе́тер Гу́став Лежён Дирихле́ — немецкий математик, внёсший существенный вклад в математический анализ, теорию функций и теорию чисел."; if (this.map.app.score.holes < 195) return "Огюсте́н Луи́ Коши́ — французский математик и механик. Разработал фундамент математического анализа, внёс огромный вклад в анализ, алгебру, математическую физику и многие другие области математики; один из основоположников механики сплошных сред. Его имя внесено в список величайших учёных Франции, помещённый на первом этаже Эйфелевой башни."; if (this.map.app.score.holes < 199) return "Иога́нн Карл Фри́дрих Га́усс — немецкий математик, механик, физик, астроном и геодезист. Считается одним из величайших математиков всех времён, «королём математиков»."; if (this.map.app.score.holes < 211) return "Леона́рд Э́йлер — швейцарский, прусский и российский математик и механик, внёсший фундаментальный вклад в развитие этих наук (а также физики, астрономии и ряда прикладных наук). Наряду с Лагранжем — крупнейший математик XVIII века, считается одним из величайших математиков в истории."; if (this.map.app.score.holes < 223) return "Иога́нн Берну́лли — швейцарский математик, механик, врач и филолог-классицист. Один из первых разработчиков математического анализа, после смерти Ньютона — лидер европейских математиков. Учитель Эйлера."; if (this.map.app.score.holes < 235) return "Жозе́ф Луи́ Лагра́нж — французский математик, астроном и механик итальянского происхождения. Наряду с Эйлером — крупнейший математик XVIII века. Внёс огромный вклад в математический анализ, теорию чисел, в теорию вероятностей и численные методы, создал вариационное исчисление."; if (this.map.app.score.holes < 239) return "Го́тфрид Ви́льгельм Ле́йбниц — немецкий философ, логик, математик, механик, физик, юрист, историк, дипломат, изобретатель и языковед. Независимо от Ньютона создал математический анализ — дифференциальное и интегральное исчисления, основанные на бесконечно малых. Создал комбинаторику как науку. Заложил основы математической логики. Описал двоичную систему счисления с цифрами 0 и 1. В механике ввёл понятие «живой силы» (прообраз современного понятия кинетической энергии) и сформулировал закон сохранения энергии. В психологии выдвинул понятие бессознательно «малых перцепций» и развил учение о бессознательной психической жизни."; if (this.map.app.score.holes < 255) return "Блез Паска́ль — французский математик, механик, физик, литератор, философ и теолог. Классик французской литературы, один из основателей математического анализа, теории вероятностей и проективной геометрии, создатель первых образцов счётной техники, автор основного закона гидростатики."; if (this.map.app.score.holes < 259) return "Маре́н Мерсе́нн — французский математик, физик, философ и богослов, теоретик музыки. На протяжении первой половины XVII века был, по существу, координатором научной жизни Европы, ведя активную переписку практически со всеми видными учёными того времени. Эта переписка имеет огромную научную и историческую ценность. Имеет также серьёзные личные научные заслуги в области математики, акустики и теории музыки."; if (this.map.app.score.holes < 271) return "Пьер де Ферма́ — французский математик-самоучка, один из создателей аналитической геометрии, математического анализа, теории вероятностей и теории чисел. По профессии юрист. Один из величайших математиков всех времён. Наиболее известен формулировкой Великой теоремы Ферма, «самой знаменитой математической загадки всех времён»."; if (this.map.app.score.holes < 275) return "Рене́ Дека́рт — французский философ, математик и естествоиспытатель; один из основоположников философии Нового времени, создатель аналитической геометрии, одна из ключевых фигур научной революции."; if (this.map.app.score.holes < 283) return "Исаа́к Нью́то́н — английский физик, математик, механик и астроном, один из создателей классической физики и математического анализа."; if (this.map.app.score.holes < 287) return "Франсуа́ Вие́т, сеньор де ля Биготьер — французский математик, основоположник символической алгебры."; if (this.map.app.score.holes < 315) return "Леона́рдо Пиза́нский — первый крупный математик средневековой Европы. Наиболее известен под прозвищем Фибона́ччи."; if (this.map.app.score.holes < 319) return "Аль-Хорезми́ — персидский и среднеазиатский учёный IX века из Хорезма, математик, астроном, географ и историк. Благодаря ему в математике появились термины «алгоритм» и «алгебра»."; if (this.map.app.score.holes < 323) return "Ома́р Хайя́м — персидский философ, математик, астроном и поэт. Известен во всём мире как выдающийся поэт, автор цикла философских рубаи; считается национальным поэтом в Иране, Таджикистане и Афганистане. Внёс вклад в алгебру построением классификации кубических уравнений и их решением с помощью конических сечений. Омар Хайям также известен созданием самого точного из ныне используемых календарей."; if (this.map.app.score.holes < 335) return "Диофа́нт Александри́йский — древнегреческий математик, живший предположительно в III веке н. э. Автор «Арифметики» — книги, посвящённой нахождению положительных рациональных решений неопределённых уравнений. В наше время под «диофантовыми уравнениями» обычно понимают уравнения с целыми коэффициентами, решения которых требуется найти среди целых чисел. Диофант был первым греческим математиком, который рассматривал дроби наравне с другими числами. Диофант также первым среди античных учёных предложил развитую математическую символику, которая позволяла формулировать полученные им результаты в достаточно компактном виде."; if (this.map.app.score.holes < 351) return "Гипа́тия Александри́йская — философ-неоплатоник времён поздней античности, математик, астроном и механик. Считается одной из первых женщин - математиков."; if (this.map.app.score.holes < 355) return "Архиме́д — древнегреческий учёный и инженер, самый известный математик Античности. Родился и бо́льшую часть жизни прожил в городе Сиракузы на Сицилии. Сделал множество открытий в области геометрии, предвосхитил многие идеи математического анализа. Заложил основы механики, гидростатики, был автором ряда важных изобретений. С именем Архимеда связаны многие математические понятия."; if (this.map.app.score.holes < 359) return "Эратосфе́н Кире́нский — древнегреческий математик, астроном, географ, филолог и поэт. Глава Александрийской библиотеки. Первый известный учёный, вычисливший размеры Земли."; if (this.map.app.score.holes < 375) return "Евкли́д — древнегреческий математик, геометр, автор первого из дошедших до нас теоретических трактатов по математике. Его главная работа «Начала» содержит изложение планиметрии, стереометрии и ряда вопросов теории чисел; в ней он подвёл итог предшествующему развитию древнегреческой математики и создал фундамент дальнейшего развития данной науки."; if (this.map.app.score.holes < 383) return "Фале́с Милетский — древнегреческий философ и математик из Милета в Малой Азии. С именем Фалеса связаны многочисленные открытия в астрономии и математике."; if (this.map.app.score.holes < 391) return "Пифаго́р Са́мосский — древнегреческий философ, математик, теоретик музыки и мистик, создатель религиозно-философской школы пифагорейцев."; } drawNumber() { this.map.app.layer.context.font = `bold ${this.map.app.layer.cellSize * this.TEXT_CELL_SIZE_RATIO}px monospace`; this.map.app.layer.context.fillStyle = this.TEXT_COLOR; const textValue = this.intValue.toString(); this.map.app.layer.context.fillText( textValue, this.map.app.layer.w / 2 + this.col * this.map.app.layer.cellSize - (textValue.length * this.map.app.layer.cellSize * this.TEXT_CELL_SIZE_RATIO) / 3.3 + this.map.dx, this.map.app.layer.h / 2 + this.row * this.map.app.layer.cellSize + (this.map.app.layer.cellSize * this.TEXT_CELL_SIZE_RATIO) / 3 + this.map.dy, ); } getCellColor(cellIndex) { const t = cellIndex / (this.map.cells.length - 1); const hue = (t * 360 * 2) % 360; const saturation = 50 + Math.sin(t * Math.PI * 4) * 20; const lightness = 40 + Math.sin(t * Math.PI * 2 + Math.PI / 4) * 15; return this.hslToRgbString(hue, saturation, lightness); } hslToRgbString(h, s, l) { h /= 360; s /= 100; l /= 100; let r, g, b; if (s === 0) { r = g = b = l; } else { const hue2rgb = (p, q, t) => { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1 / 6) return p + (q - p) * 6 * t; if (t < 1 / 2) return q; if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; return p; }; const q = l < 0.5 ? l * (1 + s) : l + s - l * s; const p = 2 * l - q; r = hue2rgb(p, q, h + 1 / 3); g = hue2rgb(p, q, h); b = hue2rgb(p, q, h - 1 / 3); } return `rgb(${Math.round(r * 255)}, ${Math.round(g * 255)}, ${Math.round(b * 255)})`; } getTextColorForBackground(bgColor) { const matches = bgColor.match(/\d+/g); if (!matches || matches.length < 3) return "rgb(255, 255, 255)"; const r = parseInt(matches[0]); const g = parseInt(matches[1]); const b = parseInt(matches[2]); const brightness = (r * 299 + g * 587 + b * 114) / 1000; return brightness > 186 ? "rgb(0, 0, 0)" : "rgb(255, 255, 255)"; } isPrimeValue() { if (!Number.isInteger(this.intValue) || this.intValue <= 1) return false; if (this.intValue === 2) return true; if (this.intValue % 2 === 0) return false; const limit = Math.sqrt(this.intValue); for (let i = 3; i <= limit; i += 2) { if (this.intValue % i === 0) return false; } return true; } onCheck() { const selectedCellsId = []; for (let i = 0; i < this.map.cells.length; i++) { const cell = this.map.cells[i]; if (cell.fillColor === "green") { const cellId = this.map.cells.indexOf(cell); selectedCellsId.push(cellId); } cell.fillColor = "black"; } if (selectedCellsId.length !== 2) return; const cell1 = this.map.cells[selectedCellsId[0]]; const cell2 = this.map.cells[selectedCellsId[1]]; const gcdValue = this.map.gcd(cell1.intValue, cell2.intValue); if (gcdValue === 1) return; this.map.cells[selectedCellsId[0]].intValue /= gcdValue; this.map.cells[selectedCellsId[1]].intValue /= gcdValue; this.map.app.score.value += gcdValue; while (this.deleteUnit()) this.map.regenerate(); } deleteUnit() { for (let i = 1; i < this.map.cells.length; i++) { const cell = this.map.cells[i]; if (cell.intValue === 1) { this.map.cells.splice(i, 1); this.map.app.score.holes++; this.map.nextMaxValue++; return true; } } return false; } toJSON() { return { intPosition: this.intPosition, intValue: this.intValue, col: this.col, row: this.row, direction: this.direction, fillColor: this.fillColor, }; } }