Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2016-04-11

Seam Carving

Seam Carving это способ поменять у картинки размеры, вырезая полоску пикселов с наименьшей значимостью.

И задали нам задачку, написать программу для этого дела
Это из курса

Дело нехитрое, когда знаешь – как. Сел, написал. Отдаю на проверку.
А, кстати, проверяльщик автоматический у них довольно мощный, порядка сотни тестов да с разными комбинациями параметров. Но, ЧСХ для этого курса, студням код тестов недоступен, и это печалит неимоверно.
Проверил: два теста провалено, это около 2% итоговой оценки. С одной стороны хорошо: с первой попытки я изобразил корректную программу, тест фейлится на вспомогательном коде, где надо вернуть mutable картинку. То есть, по идее, я отдаю картинку и клиент может делать с ней что хочет, откуда следует, что отдавать я должен копию. Авотхуй.

Я, сцуко, три часа потратил на то, чтобы угадать, что этим блядским двум тестам надо.
Test 10a: Check that client can mutate the Picture object that is passed to the constructor
==> passed
Test 10b: Check that client can mutate the Picture object that is returned by picture()
==> passed

Два самых интересных варианта непрохождения тестов
Test 10a: Check that client can mutate the Picture object that is passed to the constructor
==> passed
Test 10b: Check that client can mutate the Picture object that is returned by picture()
     - repeated calls to picture() return reference to same Picture object
==> FAILED

Test 10a: Check that client can mutate the Picture object that is passed to the constructor
     - picture() return a Picture object that is not equal to argument Picture object
       even though no seams have been removed
==> FAILED
Test 10b: Check that client can mutate the Picture object that is returned by picture()
==> passed
Фактически, два взаимоисключающих условия: 1-- надо отдавать копию; 2-- не надо делать копию, если картинка не ресайзилась.

Сразу скажу, тесты проверяют не совсем то, что написано в сообщениях об ошибках.
Методом тыка я выяснил, что тесты проверяют: 1-- ты работаешь с копией входных данных; 2-- если в отданной тобой картинке клиент поменял хоть один пиксель, надо делать новую копию.

В итоге, вместо очевидного решения с кешированием результата, получается вот такое говно (зато 100% балл)
    public Picture picture() {
        if (cache == null) {
            cache = new Picture(currPic);
            return cache;
        }
        if (cache.height() != height || cache.width() != width) {
            cache = new Picture(currPic);
            return cache;
        }
        for (int row = 0; row < height; row++) {
            for (int col = 0; col < width; col++) {
                if (currPic.get(col, row) != cache.get(col, row)) {
                    cache = new Picture(currPic);
                    return cache;
                }
            }
        }
        return cache;
    }

Ну что тут сказать: Принстон, Принстон … учился я в этом вашем Принстоне. Ничего особенного, там тоже говны имеются.

P.S.
Лично меня в такой ситуации раздражают две вещи:
– дайте студню тесты, чтобы он мог понять, что же от него требуют. Большинство курсов не стесняется выдать код для тестирования.
– вот такие вот два теста – что они, блиат, проверяют? Что я умею работать с картинкой в попиксельном режиме? Тема задачи была: Shortest path in directed acyclic graph. Я уж не говорю о том, что мутабельность/иммутабельность проверяют не так (не сравнением адресов).

А в целом, вот в такие моменты начинаешь особо ценить функциональный подход (иммутабельные типы данных).





original post http://vasnake.blogspot.com/2016/04/seam-carving.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)