Решение на Carpets от 23.01.2015


15

Здравейте на всички,

Днес реших поедин начин задачката `Carpets` и някои от вас искаха да споделя кода за да могат да си го разглеждат. Ето линк към моят GitHub

Успех на всички ;)




Отговори



0
Благодарско! Помага много ^^



0
Супер, ето и моето

от topalkata (6442 точки)


0

Вчера половин час я мъчих.

  Така и не зацепих какво да направя в средата на килима, и накрая приложих най-баламия метод - Запазвам последния символ в левия квадранта(чартичка или спейс) и започвам десния квадрант със съответния.

 Накрая решението ми излезе 98 реда.

 П.С. Най-хубавото на тези задачи е че веднъж да направиш фигурката винаги вадят 100/100 :)


от ivan.mihov1 (4988 точки)


0
Ето и едно решение с матрица за тези, които се интересуват. :)

от lnikod4s (6538 точки)


0
Благодарско! Щях да бягам с USB stick-а към теб, егоистично така, но колегите ме изпревариха с предложение за Гит-а :D

от Pip3r4o (3392 точки)


1

За тези които работят с матрица - а не можете ли да ползвате матрица с N/2 реда? :)

При печата просто я отпечатате 2 пъти - първия път както трябва, втория път почвате от най-долния ред нагоре ,а всеки ред - от дясно на ляво...

Дребни хитринки, но когато ви притискат за милисекунди... помагат много. Спестявате наполовина въртене на тежките цикли и наполовина паметта за съхранение на матрицата.

Ако пък се изхитрите още малко - можете да минете и само с 1/4 от матрицата, и с една проверка при печата, която замества '/' с '\'  и '/' с '\' ... Тук вече трябва "в полеви условия" да се види кое ще е по-изгодно - да жертвате памет за бързодействие или бързодействие за памет.

Сега ако не се научите да търсите още при четенето на условието начини за оптимизирането на решенията... нататък няма да имате време.


от JulianG (5316 точки)


0
 Още на C#2 стават големи проблеми с оптимизацията. От изпитните задачи, които пробвах повечето ми гърмяха за време и памет

от ivan.mihov1 (4988 точки)


2
Днес реших и аз да я реша по мой начин,който на мен ми се вижда най-опростен и е с 1 цикъл за цялата височина на фигурата. Това е решението. :)

от IvayloAndonov (1994 точки)


0
Здравей, погледнах ти задачата, хареса ми килимчето, само че има един проблем с четно число излиза ОК, ама с нечетно в единия квадрант нещата се разместват. Може би ще трябва нещо да корегираш в кода

от venelingp (1371 точки)


2
Условието на килима е само за вход от четни числа...

от divided.zero (692 точки)

0
Да, само с четни е по условие :)

от IvayloAndonov (1994 точки)



1

Аз по-кратка не можах да я измисля... :)

http://pastebin.com/HMaDZR53

Има 3 реда (между 2-та цикъла), дет ги подритвах отляво, подритвах отдясно... не можах да мина без тях.

Бих искал да ви обърна внимание на "семплото, но елегантното и актуално през този сезон" използване на вече сглобените в първия цикъл парченца от килима, което ми помага втората половина да е значително по-кратка. Това може да се каже че е вуйчо на пра-пра-пра дядото на динамичното оптимиране :)

Ще е ужасяваща откъм бързодействие. Такива операции със стрингове (substring, remove) са изключително бавни. Не пишете такъв код, освен ако наистина нямате никакво друго решение.


от JulianG (5316 точки)


0

Ако сложиш един StringBuilder, ще стане перфектно! 

Браво, невероятни показатели: 40 реда код, 8.83 МБ памет и 0.014с време! :)

Edit: Със StringBuilder падна на 8.81 МБ и 0.013с време!


от lnikod4s (6538 точки)


0

опитах се да изтъка килима докрай с логиката на Евлоги и се бъгнах жестоко до положение няма мърдане...

За по прегледно съм оставил 1 и 4ти "включени" а 2ри и3ти "изключени"... ако някой има идея как точно да включа точките извън пределите на ромба (когато са изключени)... или най-добре обратното как да премахна онези вътре без да елиминирам точките отвън..(това когато всичко е включено)

ето и линк:

https://github.com/darkyto/carpet_examTraining/blob/master/Carpets/Carpets.cs


от divided.zero (692 точки)


1

За да изключиш точките мисля, че трябва да направиш следната проверка във външните if-ове: isInQuadrantOne && isCoreOne. В момента ти проверяваш само дали се намираш в съответния квадтрант и то продължава да си рисува в целия квадрант. Не можех да оправя кода да работи както трябва и не съм на 100% сигурна какво е сбъркано, по-лесно ми се струва, че ще е да се пренапише. Аз промених булевите изрази, за да получа картинката от условието (по-скоро само знаците > и <) така:

 bool isCoreOne = r + c - n / 2 + 1 >= 0;
 bool isCoreTwo = r - c + n / 2 >= 0;
 bool isCoreThree = c - r + n / 2 >= 0;
 bool isCoreFour = r + c - 3 * n / 2 + 1 <= 0;


от FunnyBunny (180 точки)

0

Опитах да изключа точките в очертанието на ромба без да използвам 4-те булеви променливи isCoreOne .. isCoreFour. а само с допълнителни && и || условия по координатната система .

Просто не можах да създам логика която да изключва точките в триъгълните участъци на 2ри и 3ти триъгълник (isCoreTwo , isCoreThree) тъй като там логиката за координатната система им убягна

Сега ще погледна твоето предложение с новите стойности да видя на какъв принцип работят.. благодаря за идеята и помощта!


от divided.zero (692 точки)