Игра на тролове
Задача #1 от конкурса на Telerik
и PC Magazine Bulgaria, 2012/2013
Дивите тролове са недружелюбна, мистична и миришеща раса, обитаваща дълбоките гори на още по-мистичния и измислен континент Азерот. В хобитата им навлизат дейности като състезания по надяждане със дървесна смола, турнири на ловци на глави, дразнене на каменни гиганти, надлъгване, пушене на камъни, дебнене на питомни крави в размножителен период, пускане на досадни коментари в Интернет и още много други неща, до които въображението на читателя може да достигне, но моралът не позволява да бъде написано.
Изследвания на INT32 (Института за Наблюдение на Троловете, основан през 1932 г.) разкриват, че напоследък троловете все по-често играят една интересна и находчива игра, която от института наричат “Игра на тролове”. Те дори са склонни да я играят с чуждоземци (например хора). Е, ако съответния чуждоземец има нещастието да изгуби… ще оставим това на историята да разкаже. От друга страна, при печалба, троловете позволяват на чуждоземецът свободно да обитава техните земи, което дава огромни възможности за наблюдение на културата на тези толкова интересни създания, дори участие в хранителния им режим.
За да не рискуват последствията (и миризмата) от една игра с троловете, учени от Казмоданския Висше Образователно-Разузнавателен Елитен Чародейски Институт (КВО-РЕЧИ) съвместно с INT32 са решили да изпратят парен робот (няма пари за слънчеви батерии), програмиран да изиграе успешна игра на предстоящите турнири и след това да наблюдава троловете, в името на научния прогрес. Тъй като в КВО-РЕЧИ и INT32 няма много програмисти, те молят вас за помощ. Ще помогнете ли за разкриването на вечната мистерия на троловете?
Описание на “Игра на тролове”
Играта се играе в квадратно поле, съставено от N*N квадратни плочки (всяка страна има по N плочки), като на всяка плочка има кули от каменни кубчета, наредени едно върху друго. В играта се въвеждат концепцията на “съседни плочки“, “съседни кули” и “височина на кула“. Височина на кула наричаме броя кубчета, от които се състои една кула върху дадена плочка. Две плочки са съседни, ако имат обща страна, т.е. една плочка може да има най-много 4 съседни плочки (ако е в някой от ъглите има 2, а ако е на някоя от страните, без да е в ъгъл, има 3). Съседни кули съответно ще наричаме всички кули, които са върху съседни плочки.
В началото на играта няма кули, с еднакви височини, които да са съседи. Играчът получава право на точно C на брой хода, като може на всеки ход да прави точно една от следните две операции:
- Да добавя едно кубче върху някоя кула (т. е. увеличаване на височината на една кула).
- Да взема едно кубче от някоя кула (т. е. намаляване на височината на една кула).
За един ход, играчът може да вземе или добави точно едно кубче от някоя от кулите. Съответно сумарно броят кубчета, които играчът може да вземе или добави за цялата игра съответства на броя ходове, на които има право.
В играта има едно интересно правило – ако на някой ход от играта две или повече съседни кули са с еднаква височина, всичките кубчета в тези кули се премахват от полето автоматично, без това допълнително да отнема ход на играча. Всъщност в далечен Азерот тролът-съдия-шаман следи за правилата и когато две или повече съседни кули се изравнят по височина, той ги изравнява със земята с тайнствен ритуал и в крайна сметка на засегнатите плочки остават по точно 0 кубчета.
На края на играта играчът печели точки, равни на броя премахнати кубчета от полето (т.е. броя първоначални кубчета минус останалите на полето кубчета). Съответно целта на играча е в рамките на позволения брой ходове да играе така, че на игралното поле да останат възможно най-малко кубчета.
Алгоритмична задача – стратегия за “Игра на тролове”
Напишете програма (алгоритъм), която управлява парния робот на КВО-РЕЧИ, така че той да играе “Игра на тролове” възможно най-успешно, спрямо дадените ходове и игрално поле.
Входни данни
Входните данни се четат от конзолата. На първия ред стои числото C – броят ходове, на които роботът има право. На втория ред стои числото N – дължината на страната на квадратното игрално поле (т.е. броя плочки във всеки ред и всяка колонка в игралното поле).
На следващите N реда стоят по точно N положителни цели числа на ред. Всеки ред числа описва един ред плочки от игралното поле – всяко число на реда показва колко кубчета има върху всяка една плочка от този ред (т.е. височината на кулата, намираща се на тази плочка).
Входните данни винаги ще бъдат валидни и в описания формат.
Изходни данни
Изходните данни трябва да бъдат точно в описания по-долу формат, в противен случай е възможно парният робот да бъде изяден от троловете, а на алгоритъмът да бъдат присъдени съответно 0 точки в класирането.
Изходните данни се печатат на стандартния изход (конзолата). На изхода трябва да бъдат отпечатани точно C на брой реда (т.е. колкото е броят позволени ходове), всеки от които съдържа една команда и две цели положителни числа, разделени с по точно една шпация (интервал).
Командата може да бъде “put” или “take” (без кавичките) – съответно обозначаваща поставяне или вземане на кубче. Двете цели положителни числа описват съответно редът и колонката (т.е. координатите на кулата), от които трябва да бъде извършено поставянето или вземането на кубче.
Забележка: троловете и програмистите започват да броят от 0 – тоест координатите на първата плочка на първия ще бъдат 0 0, а не 1 1. Съответно координатите на втората плочка на първия ред ще бъдат 0 1, координатите на третата плочка на първия ред ще бъдат 0 2 и т.н.
Ако изходът е правилно форматиран, но съдържа по-малко от C на брой реда, се считат за изиграни само толкова ходове, колкото редове са били изведени.
Ограничения
- Числата C и N са цели и са в сила ограниченията 1 ? C, N ? 1000.
- В началото никоя кула няма да има височина по-голяма от 1000
- Програмата трябва да завършва своята работа за най-много 3 секунди. След третата секунда програмата ще бъде спряна автоматично.
- Ако на една плочка не са останали кубчета, ако програмата се опита да вземе кубче от тази плочка, този ход ще се счита за “пропилян”, тоест нищо няма да се случи, но играчът няма да бъде наказан.
- Възможно е крайният резултат да е отрицателен (например ако само добавяме кубчета, без да вземаме и без да се случват изравнявания на височини).
- При невалиден ход (например невалидна команда координати извън игралното поле) играчът може да получи наказание по преценка на журито.
Пример
Примерен вход |
Примерен изход |
2 4 1 2 3 4 5 6 7 8 9 1 8 7 1 2 3 4 |
put 2 3 take 3 1 |
Обяснение
Ход 1: повишаваме седмицата с едно |
Резултат: 3 съседни осмици и зануляване |
Ход 2: намаляваме двойката с едно |
Резултат: 3 съседни единици и зануляване |
1 2 3 4 5 6 7 8 9 1 8 7 1 2 3 4 |
1 2 3 4 5 6 7 8 9 1 8 8 1 2 3 4 |
1 2 3 4 5 6 7 0 9 1 0 0 1 2 3 4 |
1 2 3 4 5 6 7 0 9 1 0 0 1 1 3 4 |
Краен резултат: За първи ход на полето са останали 8 + 8 + 7 кубчета по-малко (автоматично 8 + 8 + 8, но сме добавили 1). За втори ход сме намалили с още 4 кубчета (автоматично 1 + 1 + 1 и още 1 от вземане на кубче). Разликата между първоначалния брой кубчета и крайния брой кубчета след изиграване на ходовете е 27 и това е резултатът ни за този пример. |
Още един пример
Примерен вход |
Примерен изход |
4 3 1 2 3 5 6 7 9 1 8 |
take 0 2 take 0 2 take 0 2 take 0 2 |
Краен резултат: просто сме опитали да вземем 4 пъти от тройката на първия ред. Първият път се получават две съседни двойки и те се нулират. Следващите 3 хода са празни (опитваме да вземем от празна плочка). Като резултат получаваме 5 точки от първия ход и по 0 от останалите 3 хода (общо 5 точки). Забележка: това е валидно поведение, независимо че не печели възможно най-много точки. |
Задача по приложно програмиране – визуализация на “Игра на тролове”
Учените от КВО-РЕЧИ не се изчерпват от идеи бързо. Освен алгоритъм за игра с троловете, имат нужда и от визуализация на това как е протекла играта, за да може да изследват както поведението на алгоритъма, така и какви подобрения могат да направят, за бъдещи срещи.
Малко по-формално описано, учените искат освен алгоритъма, още едно софтуерно приложение, което да използва същия алгоритъм, който е ползван за играта, но този път им трябва всеки ход да бъде описан в HTML формат.
Вашата задача е да напишете програма, която играе и визуализира “Игра на тролове”, като:
- Приема същите входни данни в описания вече формат или в друг формат по ваше желание.
- Форматът трябва да бъде описан по някакъв начин – било със подсказки по време на изпълнение на програмата или в допълнителен файл, или по друг начин.
- По желание може да се реализира и потребителски интерфейс за интерактивно въвеждане на игралното поле.
- Генерира отделна уеб страница за всеки ход от играта.
- Страницата трябва визуализира състоянието на игралното поле в този момент и може да съдържа и друга полезна информация (по ваш избор).
- Всяка страница трябва да има връзка (hyperlink) към страниците описващи предишния и следващия ход. По желание може да бъде реализирано автоматично преминаване към следващия ход (с 1 или няколко секунди изчакване).
- Начинът на визуализация не е строго дефиниран – състезателите имат свобода да решат как ще покажат игралното поле (таблица, картинки с камъни, само числа, графики, стилове, интерактивност, …), както и да визуализират текущия ход, така че визуализацията да бъде удобна и привлекателна за разглеждане.
- Състезателите имат право да ползват както HTML, така и CSS и JavaScript, такива че страниците да изглеждат коректно на съвременен уеб браузър от 2012 г.
- Приложението има права за четене и писане в директорията, в която се намира изпълнимият му файл.
- Отваря автоматично страницата, описваща първия ход:
- Това може да стане чрез извикване на уеб браузъра по подразбиране.
- По желание състезателите имат право да вградят визуализацията в собственото си приложение, при положение че тя е базирана на HTML и работи по същия начин, както в по-известните съвременни браузъри.
- Приемане на входни данни за играта.
- Генериране на толкова на брой изходни файлове, колкото ходове трябва да бъдат изиграни.
- Визуализиране на отделните страници и навигация между тях (например чрез браузър или вградена визуализация в приложението).
Обобщени задължителните функционалности на приложението
Начинът, по който изискваните функционалности са имплементирани не е строго определен и състезателите могат да проявят въображение и творчество. Насърчаваме добавянето на всякакви допълнителни функционалности по идея на състезателите, оригинални подходи и привлекателен дизайн.
Критерии за оценяване
Оценяване на алгоритмичната част
При оценяването ще бъдат ползвани 5 различни по големина игрални полета.
- Всеки алгоритъм ще бъде пуснат да играе на всяко едно от игралните полета.
- Резултат на един алгоритъм е сумата от резултатите му на различните игрални полета.
- Накрая, алгоритъмът с най-висок общ резултат, ще получи 10 точки в крайното класиране, а останалите ще получат пропорционален процент от тези точки, закръглен до цяло число.
- Ако резултатът на най-добрия алгоритъм е G, а резултатът на някой от алгоритмите е P, то този с резултат P ще има крайни точки = P/G * 10, закръглено до цяло число.
- Пример: ако играят алгоритми A, B и C, и алгоритъм B има резултат 520, алгоритъм C – 260, а алгоритъм A – 95 точки, крайните точки в класирането ще са следните: B – 10 точки; C – 5 точки; A – 2 точки.
- Максимални точки в крайното класиране за алгоритмичната част: 10
Критерии за оценяване на приложната част
Оценяването на приложната задача ще се извърши по-следните критерии:
- Коректност (доколко задължителните функционалности работят) – 3 точки
- Справяне с грешки (справяне с некоректно поведение и непредвидени ситуации) – 1 точка
- Ползваемост (доколко е удобна и интуитивна е работата с приложението) – 2 точки
- UI дизайн (доколко са приятни и удобни интерфейсът и визуализацията) – 2 точки
- Оригинални функции и решения, които да впечатлят журито – 2 точки
- Максимални точки в крайното класиране за приложната част: 10
Допълнителни изисквания
Задачите позволяват използването на различни езици за програмиране и технологии (например C#, PHP, C, C++, Delphi, Python, WPF, Windows Forms, Java, Swing, Flash, JavaScript, HTML5). Всички предадени решения ще бъдат тествани в Windows 7 среда съгласно общите условия на конкурса.
За алгоритмичната част се изисква да бъде предаден пълен сорс код + изпълним файл за Windows (.exe). Ако програмирате на език, който по природа не създава изпълними .exe файлове (например PHP, Python, Java или JavaScript), използвайте подходящ компилатор (потърсете в Интернет).
За приложната част се изисква да бъде предаден пълен сорс код + изпълним файл. Състезателите имат право да изберат начина, по който тяхното приложение ще бъде стартирано, така че това да е удобно в Windows среда (приложението може също да бъде web-базирано и да се отваря през браузър). Тъй като оценяването на приложната част ще бъде извършвано и от гледната точка на потребител (а потребителите искат да стартират едно приложение възможно най-бързо и лесно), сериозни затруднения при намирането и стартирането на приложението могат да намалят присъдените от журито точки.
Характеристики на системата, върху която ще бъде проведено тестването
- Intel® Xeon® CPU E31225 @ 3.10 GHz
- 16 GB RAM
- 128 MB Video Memory (dedicated) Intel® HD Graphics video card
- 232 GB HDD
- Microsoft Windows 7 64-bit OS
Краен срок
Краен срок за предаване на решения: 16 декември 2012 г.
Инструкции за предаване на решения ще бъдат публикувани в раздел “Качи решение” в следващите седмици
Naki
November 17, 2012
Имате проблем с примерите!
Цитирам:
На първия ред стои числото C …
На втория ред стои числото N …
На следващите N реда стоят по точно N положителни цели числа на ред.
Примерът е:
241 2 3 45 6 7 8
9 1 8 7
1 2 3 4
вместо
2
4
1 2 3 4
5 6 7 8
9 1 8 7
1 2 3 4
За изходните данни:
На изхода трябва да бъдат отпечатани точно C на брой реда (т.е. колкото е броят позволени ходове), всеки от които съдържа една команда и две цели положителни числа
Пример:
put 2 3take 3 1
вместо
put 2 3
take 3 1
Моля оправете примерите и/или условието!
Благодаря предварително.
Naki
November 18, 2012
“Още единият пример” и той е грешен!
Joro
December 4, 2012
Да разбирам ли, че C и N са между 1 и 1000?
admin
December 4, 2012
Да, така са дефинирани ограниченията в условието: “Числата C и N са цели и са в сила ограниченията 1 ? C, N ? 1000.”
Johny
November 18, 2012
И кажете мерси на “хейтърите” и “троловете” от форум Програмисти в clubs.dir.bg
http://clubs.dir.bg/showflat.php?Board=programers&Number=1952559065&page=0&view=collapsed&sb=5&part=
че ви оправят задачките, geniuses.
nakov
November 18, 2012
Благодарим на колегите Naki и Johny за забелязаната неточност във форматирането, която е довела до грешка в примерите. Оправихме проблема.
Поради някаква причина WordPress произволно трие празни редове (т.е. съединява последователни параграфи) при редакция на статия – добре известен бъг, който и друг път сме хващали.
nakov
November 19, 2012
Уточнение до всички:
1) При тестване на UI частта ще ползваме браузър Chrome, последна версия (към датата на тестване).
2) При видимо бавна работа на UI частта ще бъдат отнемани точки. Това не включва евентуални анимации (т.е. “анимация” не означава “бавно”).
Марио Стоилов
November 19, 2012
Здравейте, имам въпрос относно приложната част. В условието пише:
“Малко по-формално описано, учените искат освен алгоритъма, още едно софтуерно приложение, което да използва същия алгоритъм, който е ползван за играта, но този път им трябва всеки ход да бъде описан в HTML формат.”
Въпроса е: Трябва ли приложната част да е написана на HTML, или просто трябва да изкарва HTML файлове, в които е описано как е преминала играта?
Или по просто зададен въпроса: Искам да напиша приложната част на WPF и там да се правят всички визуализации/анимации/четене на вход/ и т.н. и тази програма на WPF да генерира HTML файлове, в които е описано как е ПРЕМИНАЛА играта. Това ще се приеме ли от журито?
nakov
November 20, 2012
Приложната част може да бъде написана на език за програмиране по избор (например на C#, Java или PHP). Тя трябва да ползва HTML за визуализация (например като записва резултатите в HTML формат и ги показва в браузъра или като вгражда контрола “уеб браузър” в настолно GUI приложение).
Може да ползваш WPF, но визуализацията трябва да минава през HTML и уеб браузър. Визуализация базирана на XAML не отговаря на изискванията.
Иван Иванов
November 28, 2012
Задължително ли е наличието на сървърна част? Бихме ли могли да разпледелим цялата логика на приложението в клиентския браузър (javascript) или задължително трябва да бъде въпроизвеждана и изпращана от сървъра? Ако сървърната част е задължителна, то всеки път ли трябва да презареждаме страницата или е позволено да използваме AJAX заявки и обновяване само на нужните елементи?
admin
November 29, 2012
Става дума за приложната част, нали? Тя може да бъде направена изцяло по ваше желание – може да има сървърна част, може да няма, може да е смесица, може да е desktop приложение, което просто генерира HTML. Единственото, което се изисква, е да може да проиграва една игра и да визуализира ходовете чрез HTML (+ CSS и JavaScript по желание), който да изглежда добре в последната версия на Chrome (ако е нужно отваряне с браузър). Оценката ще бъде извършена по предварително зададените критерии за коректност, ползваемост, справяне с грешки, дизайн и оригиналност.
Sestrimski
November 20, 2012
Имам въпрос свързан с втория пример:
4
3
1 2 3
5 6 7
9 1 8
Ако това е първоначалното поле и първия ход е:
take 0 2
т.е. както пише в пояснението -> 3-ката от първия ред става на 2-ка и се получава:
1 2 2
5 6 7
9 1 8
В този момент Азерот тролът-съдия-шаман не трябва ли да събори двете съседни кули от (0,1) и (0,2) и след това да имаме още 3 “пропиляни”
хода:
take 0 2.
Ако разсъжденията ми са верни, то крайния резултат трябва да е 5.
nakov
November 20, 2012
Да, беше грешка. Поправихме я. Благодарим, че ни обърнахте внимание.
Nikito
November 20, 2012
Когато се пращат решенията, трябва ли да опишем по-подробно използваната технология, например ако аз искам да пиша на PHP някоя си верия да опиша версията и сървара който ми е необходим, за рънване на приложението.
admin
November 21, 2012
За алгоритмичната част е задължително да предадеш .exe файл, който е изпълним под Windows на машината, описана в условието – така че ако ще пишеш алгоритъм на PHP ще се наложи да намериш компилатор, който превръща PHP код в .exe за Windows.
За приложната част отново е нужно приложението да работи под Windows на същата машина, или поне да може да се отвори с браузър Chrome, последна версия – тоест ако пишеш приложната част на PHP, трябва да предадеш пълния сорс код на решението си, да качиш приложението си на някой сървър, и да дадеш линк към приложението си в предадените файлове, за да можем ние да видим приложението ти в действие (т.е. да го “отворим” в браузъра). Иначе не е нужно да описваш версията и сървъра – те са твоя отговорност, ако избереш този подход (конкретно за тази задача).
Слави Георгиев
November 29, 2012
Здравейте! Имам един въпрос по алгоритмичната част. Ако програмата ни направи time limit и бъде спряна от системата, ще се вземат ли под внимание вече отпечатаните команди или целият тест ще получи 0 точки? Благодаря.
nakov
November 30, 2012
По традиция в алгоритмичните състезания ако на даден тест дадена програма превиши позволеното време за изпълнение, се дават 0 точки. Така ще бъде и в този конкурс. Лесно можеш да добавиш таймер или друг механизъм, който спира програмата, когато достигне ограничението по време.
Георги Петков
December 4, 2012
Ако имаме сървърна част на скриптов език, можем ли да разчитаме че тестовият компютър разполага със сървър или трябва да качим приложението някъде на чужд сървър?
admin
December 4, 2012
Накратко не, най-добре е приложението да бъде достъпно в Интернет на външен сървър, като в предадените файлове трябва да има ясно описание (или директно линк) за достигане до приложението. Кодът обаче трябва да бъде пратен.
Георги Петков
December 6, 2012
Да, благодаря. В условието пише, че “Генерира отделна уеб страница за всеки ход от играта.”, но в същото време сте отговорили на колегата @Иван Иванов тук, че може да бъде изцяло по наше желание. В крайна сметка задължителна ли е нова уеб страница за всеки ход или е възможно да обновяваме само част от нея с AJAX заявка?
admin
December 7, 2012
Да, изглежда се получи лека неяснота. С две думи – важното е описанието на ходовете да бъде направено чрез HTML ( + , CSS и JS по желание), както пише във втория абзац на частта “Задача по приложно програмиране – визуализация на ‘Игра на тролове'”. В този смисъл ползването на AJAX и визуализация на една и съща страница също е валидно, тъй като отново ползва HTML. Дори, строго погледнато, ползването на AJAX и подменянето на HTML съдържанието в една страница отново е генериране на нова уеб страница – която браузърът визуализира (макар да не се “създава нов файл”). Така че няма проблем с това и можете да ползвате който вариант ви харесва повече 🙂
Boyan Zhelyakov
December 4, 2012
Краен резултат: За първи ход на полето са останали 8 + 8 + 7 кубчета по-малко (автоматично 8 + 8 + 8, но сме добавили 1). За втори ход сме намалили с още 4 кубчета (автоматично 1 + 1 + 1 и още 1 от вземане на кубче). Разликата между първоначалния брой кубчета и крайния брой кубчета след изиграване на ходовете е 27 и това е резултатът ни за този пример.
При първия ход слагаме 1 кубче при което става наистина 8+8+8.
При втория ход избираме да вземем 1 кубче и става 1+1+1
което е 24+3=27
къде отива това кубче което сме взели на втория ход не трябва ли и то да се прибави към сумата от 27+1=28 и това да е отговора
Поздрави,
Боян Желязков
admin
December 4, 2012
Важно е да се отбележи, че не се брои колко кубчета са изчезнали за един ход, а колко са изчезнали в крайното състояние, спрямо началното (тоест може да сметнеш сумата на всички кубчета в началното състояние и да извадиш от нея сумата на всички в крайното състояние). На първи ход добавяме 1 кубче, при което се унищожават 8 + 8 + 8. Но с добавяне на кубче ние си “влошаваме с резултата” с 1, тоест в крайна сметка печелим 8 + 8 + 8 – 1 = 23. Погледнато по друг начин – за целия ход унищожаваме кулите 8, 8 и 7 – съответно на края на първия ход разликата между първоначалните кубчета на дъската и крайните кубчета на дъската е 8 + 8 + 7 = 23. За втория ход, както сам си установил, общо премахваме 4 кубчета (реално премахване кулите 1, 1 и 2, сборът на които е 4). Тоест крайния резултат за двата хода е 23 (първи) + 4 (втори) = 27
Boyan Zhelyazkov
December 5, 2012
интересно 🙂
Мерси за пояснените
Димитър Дилянов Иванов
December 7, 2012
Здравейте,искам да ви попитам това валиден изход ли е ?
http://store.picbg.net/pubpic/8E/B6/bb98f9677f338eb6.png
admin
December 9, 2012
Ако е за алгоритмичната част – не. За нея трябва да бъде изведен изход точно в описания по условие формат, защото проверката ще бъде автоматизирана – съответно отклонения от формата ще доведат до некоректно интерпретиран резултат от проверяващата програма.
Йонко
December 7, 2012
В началото никоя кула няма да има височина по-голяма от 1000
Това значи ли, че може да имаме вход от сорта на:
2
4
1000 2 3 4
1000 1000 1000 1000
500 100 50 10
11 23 599 1000
admin
December 9, 2012
Точно като този пример вход не може да има, тъй като по условие “В началото на играта няма кули, с еднакви височини, които да са съседи”. Но може да има вход от този сорт:
2
4
1000 2 3 4
999 1000 999 1000
500 100 50 10
11 23 599 1000
Георги Парушев
December 9, 2012
Допустимо ли е върху съборена кула да се слагат кубчета?
т.е. Ако входните данни са примерно
4
3
5 9 5
2 7 2
5 9 5
то
put 1 1
put 1 1
put 1 1
put 1 1
ще направи ли 29 точки?
5 9 5 2 5 9 5 0 5 0 5 2 5 0 5 0 5 0 5
2 7 2 –> 2 9 2 –> 2 0 2 –> 2 2 2 –> 0 0 0
5 9 5 5 9 5 5 0 5 5 0 5 5 0 5
49 51 24 26 20
admin
December 9, 2012
Да, възможно е поставянето на кубчета върху съборени кули (т.е. върху клетки със стойност 0). Съответно примерът е верен и действително постига резултат 29 точки.
Димитър Дилянов Иванов
December 9, 2012
Възможно ли е да получим пример, който използва по-голяма матрица, за да можем да отстраним евентуално бъговете, който ще излязат 🙂 – примерно матрица 200х200 за тест или по-голяма би било добре.
Ако не може ще се задоволя и с това, което е дадено 🙂
admin
December 10, 2012
При този тип задачи е препоръчително всеки състезател/отбор да генерира свои собствени тестове, с които да провери работата на алгоритъма си. Дадените примери са предимно с цел описване на формата на входа и изхода, както и доизясняване на условието. Не е добра практика да се разчита само на дадените примери.
Стоян Петров Атанасов
December 11, 2012
Лол, 1000х1000 2D масив само обхождането му не може да бъде направено за 3 сек, поне от моя компютър. 🙂
admin
December 11, 2012
Не е толкова много всъщност, това са общо 1 милион елемента, или приблизително колкото пиксела имаш на екрана в средния случай – а видеокартата ти ги обхожда по минимум 25 пъти в секунда. Също така, 1 милион елемента би следвало да могат да се обходят за 1 секунда от процесор на 1 GHz (дори повече от веднъж), а този, на който ще бъде проведено тестването е с 4 ядра, всяко на по 3 GHz (в условието на задачата има подробности по тази тема). Така че да не те плашат измеренията : )
Стоян Петров Атанасов
December 11, 2012
еми пуснах един for с 1000х1000 и ми завърши за 7-8 секунди 🙂
А процесора ми е intel core I3 -2.40ghr,по твоята логика би трябвало да може да сметне 2x – това,което вие имате като изискване 🙂
admin
December 13, 2012
Направих няколко задълбочени теста – четене, запазване в масив (1000 по 1000 матрица), печатане на сумата на всички редове. На C++ и на C# всичко това се случва за под секунда (като четенето и печатането отнемат най-много, може би около 0.3 секунди когато е оптимизирано). Нещо, което трябва да имате предвид – входът и изходът ще бъдат пренасочване на файлове от и към конзолата – самата визуализация (печатането на символи) на конзолата е бавна, но когато към конзолата се пренасочи файл (командата от вида algorithm.exe < input.txt в Command Prompt), това става значително по-бързо (данните отново минават през конзолата, но поради липсата на визуализация имаме забързване).
Марин Попов
December 11, 2012
Тук има някои примерни полета>
http://forums.academy.telerik.com/36420/%D1%81%D0%BF%D0%BE%D0%B4%D0%B5%D0%BB%D1%8F%D0%BD%D0%B5-%D1%81%D1%80%D0%B0%D0%B2%D0%BD%D1%8F%D0%B2%D0%B0%D0%BD%D0%B5-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%82%D0%B0%D1%82%D0%B8-%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%D1%82%D0%B0-%D0%BA%D0%BE%D0%BD%D0%BA%D1%83%D1%80%D1%81%D0%B0-magazine
Miroslav
December 11, 2012
Задължително ли е всеки ход да е на различен HTML документ при визоализацията часта с визоализацията и там ще се следи ли дали при конзолата се надвишават тези 3 секунди защото ще се налага и генериране на HTML?
admin
December 12, 2012
Задължително е визуализацията на полето да е направена чрез HTML (+CSS и JS) и всеки ход да може да бъде показан по този начин – оттам нататък може да прецениш дали ще правиш отделни файлове, дали ще имаш js който подменя html и т.н. Ограничението за време няма да се следи да е 3 секунди както за алгоритмичната част, но ако приложението се бави твърде много ще получи по-малко точки
Venelin
December 13, 2012
Искам да попитам, дали няма някаква грешка в примерите, защото те не са най-доброто решение на задачата или може би са дадени само за пример да се демонстрира функционалност.
Например на първия пример с вход:
2
4
1 2 3 4
5 6 7 8
9 1 8 7
1 2 3 4
Не е ли по-точно изхода да е:
put 2 3
take 1 2
защото така броя на кубчетата намалява с 34 което е по-добре от 27.
Също така дали има значение дали е
put 2 3 или put 2 1, както и
put 1 0 или take 1 2.
admin
December 14, 2012
Примерите, както си се досетил, са само за показване на примерна функционалност и за да опишат точно вход-изходният формат. Задачата не изисква писане на решение, което винаги прави възможно най-добрия резултат – дори не е ясно дали може да бъде написано такова в тези ограничения (3 секунди, 1000×1000). Оценяването ще бъде на база на постигнатите точки – т.е. крайните резултати ще зависят не от това колко добре играят алгоритмите спрямо оптималната игра, а ще зависят от това колко добре играе един алгоритъм спрямо останалите. Съответно колкото по-оптимално играе един алгоритъм, толкова по-висок резултат ще получи, но ако играе слабо крайният му резултат пак може да бъде висок, стига конкуренцията да е слаба.
Виктор
December 14, 2012
Има ли нужда в алгоритмичната част, или в UI частта да имплементираме възможност за вкарване на входните данни чрез текстови файлове и изкарването им в същия формат?
admin
December 14, 2012
В алгоритмичната част не, даже е лоша идея, тъй като проверяващата система ще предава и приема данни само и единствено от конзолата. В UI частта обаче може да бъде имплементирано, стига да решите, че имате нужда от такъв тип вход.
Денис
December 14, 2012
Здравейте, крайният срок за предаване на решението до 16 включително ли е или не? Т.е. 16.12.2012 23:59 ли е или е до 15.12.2012 23:59?
admin
December 14, 2012
Здравей, срокът е до 16 включително, т.е. до 16.12.2012 23:59, както пише в страницата на конкурса в студентската система на Академията на Телерик, където се предават решенията – http://telerikacademy.com/Courses/Courses/Details/13
Драган Първанов
December 14, 2012
Добър ден! Имам ли право да попитам дали тестовете за алгоритмичната част са специално предвидени да „чупят“ програмите ни или са просто случайни числа? Мерси 🙂
admin
December 14, 2012
Здравей, тестовете имат за цел да установят колко добре алгоритмите се справят с различни входни данни. В този смисъл ще има както общи случаи и “случайни числа”, така и тестове с нарочно направени конфигурации. Но не разбирай последното като нещо което да “чупи” програмите а просто като наблюдение на поведение над определени условия. Също така, входните данни ще са винаги в описания формат и валидни, така че и този смисъл на “чупене” отпада 🙂
nakov
December 14, 2012
Понеже няколко колеги ме питаха как да забързат входа и изхода, защото им изяждат времето и не остават секунди за самия алгоритъм, ще споделя какво им отговорих:
1) Най-бързият начин да прочетете входа е да ползвате StreamReader.ReadToEnd(). След това прочетеният вход може да се разпарчедоса чрез String.Split().
2) Най-бързият начин да изпечатате на конзолата обемен изход е да го натрупате в StringBuilder и да го отпечатате накрая наведнъж.
Повече по темата има във форума: http://forums.academy.telerik.com/36420/
Наков
Miroslav
December 14, 2012
Ако визуализацията ми се “бави” при по-големи числа, под по-големи разбирам матрица 6×6 с числата от 1-36, как ще се оцени това?
admin
December 14, 2012
Добре е да помислиш за оптимизация. 6×6 са доста малки измерения, сравнено с 1000×1000 максимално и натрапчиви забавяния в този случай няма да бъдат оценени добре.
Martin
December 16, 2012
Здравейте, бих искал да попитам дали ако случайно изведем повече от с команди, ще бъдем ли наказани или просто излишните няма да се вземат под внимание? Благодаря.
admin
December 16, 2012
Принципно ако форматът не е спазен точно, журито има право да отсъди 0 точки за съответния тест. Изключения могат да бъдат правени, когато това не затруднява допълнително проверката и когато това няма да бъде нечестно спрямо останалите алгоритми. Така че в твоя случай е възможно да бъде направен компромис, но не обещаваме нищо. Най-добре е да спазиш описания формат.
Stilqn
December 17, 2012
Хайде де, давайте задача 2.
admin
December 17, 2012
Търпение : ), ще я дадем следобед
Никола
December 18, 2012
Позволено ли е използването на мулти тред програми?
И… междинното класиране кога ще излзе, че съм на нокти да разбера как съм се представил.
admin
December 18, 2012
Да, позволено е. Междинното класиране ще излезе скоро – алгоритмичната част е оценена, предстои да оценим приложната. До края на седмицата (най-вероятно по-рано) ще публикуваме резултатите.
Марин Попов
December 21, 2012
Здравейте,
Искам да запитам: Какво да разбираме под “До края на седмицата …”? – Петък или Неделя.
Мерси и поздрави!
DonttnoD
May 31, 2013
В тази задача има повече дешифриране и математика отколкото програмиране…
admin
May 31, 2013
Все пак е първи кръг. Но можеш да погледнеш решенията на приложната задача на най-добре представилите се в кръга и ще видиш, че при тях програмирането не е малко