Календарь на три фигурки
Из серии безумных календарей, пусть будет такая вот пасхалка.
Для разложения на простые множители чисел 64, 365 и 366 (2*2*2*2*2*2=64, 5*73=365, 2*3*61=366) никакой шахматно-календарной идеи как в часах хаоса извлечь вчера не удалось, а вот сочетания и размещения для выборки по K
элементов из N
помочь могут, правда, там тоже ничего не равно 365, но есть Ar26 = 64
(только что это будут за размещения из шести фигур всего двух видов? По сути, получится номер дня в году в двоичной системе счисления, ноль - белая пешка, один - чёрная) и C143 = Cr123 = 364
, попробуем воспользоваться последним соотношением, поскольку 29 февраля можно сделать равным 28-му, а 31-е декабря 30-му (всё равно уже никто разницы не увидит) и тогда останется ровно 364 сочетания с повторением для двенадцати фигур, которые вполне могут оказаться шахматными.
Ниже показан скрипт в работе и полный исходник, конечно, можно вставить теги <style>
, внешний <div>
и <script> + <noscript>
в любой документ HTML, как сделано здесь.
Скрипт будет сам обновляться раз в минуту, поэтому смену даты отловит с такой погрешностью.
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <title>3 Pieces Calendar</title> <style> .wrapper_3pi { margin-left: auto; margin-right: auto; width:240px; } .board_3pi { padding: 0; border: 0; margin: 0; overflow:hidden; height:80px; white-space: nowrap; } .field_3pi { padding: 0; border: 0; margin: 0; width: 80px; height: 80px; display: inline-block; } .white_3pi { background-color: #f0d9b5; color: #b58863; } .black_3pi { background-color: #b58863; color: #f0d9b5; } .info_3pi { font-size: 0.8rem; font-family: monospace; } </style> </head><body> <div id="picturebox_3pi" style="display: none;"></div> <div class="wrapper_3pi"> <div class="board_3pi"> <!-- ниже форматировать именно так, чтобы не было разрывов --> <div id="data_3pi1" class="field_3pi black_3pi" ></div><div id="data_3pi2" class="field_3pi white_3pi" ></div><div id="data_3pi3" class="field_3pi black_3pi"></div> </div> <span id="info_3pi" class="info_3pi"></span> </div> <script> let url = 'http://scripts.kislenko.net/MyChessPGNPlayer/img/'; let imgSources = [ "bP.png", "wP.png", "bN.png", "wN.png", "bB.png", "wB.png", "bR.png", "wR.png", "bQ.png", "wQ.png", "bK.png", "wK.png" ]; let imagesDiv = document.getElementById('picturebox_3pi'); let comb = []; let comb_with_repetitions = function (N, K) { //Сочетания с повторением Cr(n,k) = (n+k-1)! / (k! * (n-1)!) let d = Array(N).fill(0).map(function(val,index){return index;}); N--; let v = Array(K+1).fill(0); let comb = []; while (true) { for (var i = 0; i < K; i++) { if (v[i] > N) { v[i + 1] += 1; for (var k = i; k >= 0; k--) v[k] = v[i + 1]; } } if (v[K] > 0) break; let item = []; for (var i = K - 1; i > -1; i--) { item.push (d[v[i]]+1); } comb.push (item); v[0]++; } return comb; } let getLeapYear = function (year) { return (year % 4 == 0 && year % 100 !=0 || year % 400 == 0 ? 1 : 0); } let getFormattedDate = function (dt) { let wds = ['Вс', 'Пн','Вт','Ср','Чт','Пт','Сб']; let wms = ['янв', 'фев', 'мар', 'апр', 'мая', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек']; let d = String(dt.getDate()).padStart(2,'0'), m = dt.getMonth(), wd = dt.getDay(), y = String(dt.getFullYear()%100).padStart(2,'0'); return wds[wd] + ', ' + d + ' ' + wms[m] + ' ' + y; } let numberOfDay = function () { //номер дня в году с единицы, 29.02 = 60-й день в високосном let now = new Date(); let start = new Date(now.getFullYear(), 0, 0); let diff = (now - start) + ((start.getTimezoneOffset() - now.getTimezoneOffset()) * 60 * 1000); let oneDay = 1000 * 60 * 60 * 24; let day = Math.floor(diff / oneDay); let leap = getLeapYear (now.getFullYear()); return [ day, leap, getFormattedDate(now) ]; } let startGame = function () { let [nday, leap, str] = numberOfDay (); let index = nday - 1; if (leap && nday > 59) index--; //29.02 как 28.02 if (index > comb.length - 1) index = comb.length - 1; //31.12 как 30.12 let combStr = ''; for (let i = 1; i <= 3; i++) { let div = document.getElementById('data_3pi'+i); while (div.firstChild) div.removeChild (div.firstChild); let j = comb[index][i-1]-1; let img = document.getElementById('img_3pi'+j); div.appendChild (img.cloneNode()); combStr += String(comb[index][i-1]).padStart(2,'0') + (i < 3 ? ',' : ''); } document.getElementById('info_3pi').innerHTML = '<' + combStr + '> ' + str + ', # '+String(nday).padStart(3,'0'); } let checkImgLoaded = function () { let width_1 = 80; let widthSum = 0; for (let i = 0; i < imgSources.length; i++) { let img = document.createElement('img'); img.src = url + imgSources[i]; widthSum += img.width; } if (widthSum == imgSources.length * width_1) { comb = comb_with_repetitions (12,3); //364 комбинации startGame(); setInterval (startGame,1000*60); //обновлять раз в минуту } else { alert ("Ошибка, картинки испорчены или не загружены"); } } window.addEventListener ('load', function (e) { let counter = 0; let imgArray = Array(imgSources.length).fill(''); let onLoadGame = function () { counter++; if (counter == imgSources.length) checkImgLoaded(); } for (let i = 0; i < imgSources.length; i++) { imgArray[i] = document.createElement('img'); imgArray[i].onload = imgArray.onerror = onLoadGame; imgArray[i].setAttribute('id', 'img_3pi'+i); imgArray[i].src = url + imgSources[i]; } for (let i = 0; i < imgSources.length; i++) imagesDiv.appendChild (imgArray[i]); }, false); </script> <noscript> <p>Включите Javascript в браузере для работы приложения.</p> </noscript> </body></html>
Картинки подгружаются из папки автоплеера. Можно было обойтись и без их предзагрузки с последующим копированием из скрытого раздела в разделы с id="img_3pi1"
, ..., img_3pi3
, но шаблон с предзагрузкой попался под руку первым.
Кроме этого приёма "клонирования" картинки ещё могут пригодиться методы:
comb_with_repetitions
- сочетания с повторениемCr(n,k) = (n+k-1)! / (k! * (n-1)!)
;numberOfDay
- номер дня в году начиная с единицы.
Вот последовательности выбора номеров фигур для дней 1, 2, ..., 364 (клик).
- 1, 1, 1
- 1, 1, 2
- 1, 1, 3
- 1, 1, 4
- 1, 1, 5
- 1, 1, 6
- 1, 1, 7
- 1, 1, 8
- 1, 1, 9
- 1, 1, 10
- 1, 1, 11
- 1, 1, 12
- 1, 2, 2
- 1, 2, 3
- 1, 2, 4
- 1, 2, 5
- 1, 2, 6
- 1, 2, 7
- 1, 2, 8
- 1, 2, 9
- 1, 2, 10
- 1, 2, 11
- 1, 2, 12
- 1, 3, 3
- 1, 3, 4
- 1, 3, 5
- 1, 3, 6
- 1, 3, 7
- 1, 3, 8
- 1, 3, 9
- 1, 3, 10
- 1, 3, 11
- 1, 3, 12
- 1, 4, 4
- 1, 4, 5
- 1, 4, 6
- 1, 4, 7
- 1, 4, 8
- 1, 4, 9
- 1, 4, 10
- 1, 4, 11
- 1, 4, 12
- 1, 5, 5
- 1, 5, 6
- 1, 5, 7
- 1, 5, 8
- 1, 5, 9
- 1, 5, 10
- 1, 5, 11
- 1, 5, 12
- 1, 6, 6
- 1, 6, 7
- 1, 6, 8
- 1, 6, 9
- 1, 6, 10
- 1, 6, 11
- 1, 6, 12
- 1, 7, 7
- 1, 7, 8
- 1, 7, 9
- 1, 7, 10
- 1, 7, 11
- 1, 7, 12
- 1, 8, 8
- 1, 8, 9
- 1, 8, 10
- 1, 8, 11
- 1, 8, 12
- 1, 9, 9
- 1, 9, 10
- 1, 9, 11
- 1, 9, 12
- 1, 10, 10
- 1, 10, 11
- 1, 10, 12
- 1, 11, 11
- 1, 11, 12
- 1, 12, 12
- 2, 2, 2
- 2, 2, 3
- 2, 2, 4
- 2, 2, 5
- 2, 2, 6
- 2, 2, 7
- 2, 2, 8
- 2, 2, 9
- 2, 2, 10
- 2, 2, 11
- 2, 2, 12
- 2, 3, 3
- 2, 3, 4
- 2, 3, 5
- 2, 3, 6
- 2, 3, 7
- 2, 3, 8
- 2, 3, 9
- 2, 3, 10
- 2, 3, 11
- 2, 3, 12
- 2, 4, 4
- 2, 4, 5
- 2, 4, 6
- 2, 4, 7
- 2, 4, 8
- 2, 4, 9
- 2, 4, 10
- 2, 4, 11
- 2, 4, 12
- 2, 5, 5
- 2, 5, 6
- 2, 5, 7
- 2, 5, 8
- 2, 5, 9
- 2, 5, 10
- 2, 5, 11
- 2, 5, 12
- 2, 6, 6
- 2, 6, 7
- 2, 6, 8
- 2, 6, 9
- 2, 6, 10
- 2, 6, 11
- 2, 6, 12
- 2, 7, 7
- 2, 7, 8
- 2, 7, 9
- 2, 7, 10
- 2, 7, 11
- 2, 7, 12
- 2, 8, 8
- 2, 8, 9
- 2, 8, 10
- 2, 8, 11
- 2, 8, 12
- 2, 9, 9
- 2, 9, 10
- 2, 9, 11
- 2, 9, 12
- 2, 10, 10
- 2, 10, 11
- 2, 10, 12
- 2, 11, 11
- 2, 11, 12
- 2, 12, 12
- 3, 3, 3
- 3, 3, 4
- 3, 3, 5
- 3, 3, 6
- 3, 3, 7
- 3, 3, 8
- 3, 3, 9
- 3, 3, 10
- 3, 3, 11
- 3, 3, 12
- 3, 4, 4
- 3, 4, 5
- 3, 4, 6
- 3, 4, 7
- 3, 4, 8
- 3, 4, 9
- 3, 4, 10
- 3, 4, 11
- 3, 4, 12
- 3, 5, 5
- 3, 5, 6
- 3, 5, 7
- 3, 5, 8
- 3, 5, 9
- 3, 5, 10
- 3, 5, 11
- 3, 5, 12
- 3, 6, 6
- 3, 6, 7
- 3, 6, 8
- 3, 6, 9
- 3, 6, 10
- 3, 6, 11
- 3, 6, 12
- 3, 7, 7
- 3, 7, 8
- 3, 7, 9
- 3, 7, 10
- 3, 7, 11
- 3, 7, 12
- 3, 8, 8
- 3, 8, 9
- 3, 8, 10
- 3, 8, 11
- 3, 8, 12
- 3, 9, 9
- 3, 9, 10
- 3, 9, 11
- 3, 9, 12
- 3, 10, 10
- 3, 10, 11
- 3, 10, 12
- 3, 11, 11
- 3, 11, 12
- 3, 12, 12
- 4, 4, 4
- 4, 4, 5
- 4, 4, 6
- 4, 4, 7
- 4, 4, 8
- 4, 4, 9
- 4, 4, 10
- 4, 4, 11
- 4, 4, 12
- 4, 5, 5
- 4, 5, 6
- 4, 5, 7
- 4, 5, 8
- 4, 5, 9
- 4, 5, 10
- 4, 5, 11
- 4, 5, 12
- 4, 6, 6
- 4, 6, 7
- 4, 6, 8
- 4, 6, 9
- 4, 6, 10
- 4, 6, 11
- 4, 6, 12
- 4, 7, 7
- 4, 7, 8
- 4, 7, 9
- 4, 7, 10
- 4, 7, 11
- 4, 7, 12
- 4, 8, 8
- 4, 8, 9
- 4, 8, 10
- 4, 8, 11
- 4, 8, 12
- 4, 9, 9
- 4, 9, 10
- 4, 9, 11
- 4, 9, 12
- 4, 10, 10
- 4, 10, 11
- 4, 10, 12
- 4, 11, 11
- 4, 11, 12
- 4, 12, 12
- 5, 5, 5
- 5, 5, 6
- 5, 5, 7
- 5, 5, 8
- 5, 5, 9
- 5, 5, 10
- 5, 5, 11
- 5, 5, 12
- 5, 6, 6
- 5, 6, 7
- 5, 6, 8
- 5, 6, 9
- 5, 6, 10
- 5, 6, 11
- 5, 6, 12
- 5, 7, 7
- 5, 7, 8
- 5, 7, 9
- 5, 7, 10
- 5, 7, 11
- 5, 7, 12
- 5, 8, 8
- 5, 8, 9
- 5, 8, 10
- 5, 8, 11
- 5, 8, 12
- 5, 9, 9
- 5, 9, 10
- 5, 9, 11
- 5, 9, 12
- 5, 10, 10
- 5, 10, 11
- 5, 10, 12
- 5, 11, 11
- 5, 11, 12
- 5, 12, 12
- 6, 6, 6
- 6, 6, 7
- 6, 6, 8
- 6, 6, 9
- 6, 6, 10
- 6, 6, 11
- 6, 6, 12
- 6, 7, 7
- 6, 7, 8
- 6, 7, 9
- 6, 7, 10
- 6, 7, 11
- 6, 7, 12
- 6, 8, 8
- 6, 8, 9
- 6, 8, 10
- 6, 8, 11
- 6, 8, 12
- 6, 9, 9
- 6, 9, 10
- 6, 9, 11
- 6, 9, 12
- 6, 10, 10
- 6, 10, 11
- 6, 10, 12
- 6, 11, 11
- 6, 11, 12
- 6, 12, 12
- 7, 7, 7
- 7, 7, 8
- 7, 7, 9
- 7, 7, 10
- 7, 7, 11
- 7, 7, 12
- 7, 8, 8
- 7, 8, 9
- 7, 8, 10
- 7, 8, 11
- 7, 8, 12
- 7, 9, 9
- 7, 9, 10
- 7, 9, 11
- 7, 9, 12
- 7, 10, 10
- 7, 10, 11
- 7, 10, 12
- 7, 11, 11
- 7, 11, 12
- 7, 12, 12
- 8, 8, 8
- 8, 8, 9
- 8, 8, 10
- 8, 8, 11
- 8, 8, 12
- 8, 9, 9
- 8, 9, 10
- 8, 9, 11
- 8, 9, 12
- 8, 10, 10
- 8, 10, 11
- 8, 10, 12
- 8, 11, 11
- 8, 11, 12
- 8, 12, 12
- 9, 9, 9
- 9, 9, 10
- 9, 9, 11
- 9, 9, 12
- 9, 10, 10
- 9, 10, 11
- 9, 10, 12
- 9, 11, 11
- 9, 11, 12
- 9, 12, 12
- 10, 10, 10
- 10, 10, 11
- 10, 10, 12
- 10, 11, 11
- 10, 11, 12
- 10, 12, 12
- 11, 11, 11
- 11, 11, 12
- 11, 12, 12
- 12, 12, 12
Порядок фигур виден из кода - это порядок их стандартных названий в массиве imgSources
.
16.04.2023, 12:20 [302 просмотра]