Telerik Alpha - JS Mock Exam: Coki's Pyramids


0

Здравейте,

Някой може ли да даде малко разяснения по условието на втора задача от пробния по JS?

Тотално се оплетох с това обяснение, че пирамидата е правоъгълен равнобедрен триъгълник и в следващия момент в примера отдолу няма нищо такова. Дори ако си я представя като сет от колони... в условието пише, че най-лявата е най-ниска (т.е. 1), пък в примера е обратното.

Не успявам дори да я започна тази задача :( Реално не знам какво се търси...

Благодаря на всеки отзовал се! :)




Отговори



0

Здравей, 

условието леко обърква, но като се абстрахираш от равнобедрените триъгилници и т.н., просто си представи визуално, че имаш кръгчета, който трябва да се увеличават със всеки следващ ред. Реално output-a е броя на кръгчетата в последния ред. 

Например да си представим, че имаш Input 7. Тогава имаш следното:

o -  1 кръгче, остават ти още 6
oo - 2 кръгчета, остават ти още 4
ooo - 3 кръгчета,  това е максимума, който можеш да постигнеш, съответно това е и output-а. Остава ти само 1 символ, но той е недостатъчен за да направиш нов ред с 4 символа, затова спираш цикъла тук и output-а ти е 3.

Ако трябва да го изобразя, изглежда по следния начин:

о
о
оо
ооо

Това е логиката, с която реших задачата със 100 точки, надявам се да съм ти помогнал.




0

Здравей,

Благодаря за помощта! След като разбрах условието, ползвам г/д същата логика, но без успех!

Създавам два масива, един с числата от 0 до N (blocksArray) и един празен (dumpArray), в който за всеки i ред, добавям i на брой числа от blocksArray. Като директно използвам shift в/у blocksArray и по този начин му намалям дължината. Така винаги получавам триъгълник от масиви (примерно за N = 7, dumpArray = [ [ 0 ], [ 1, 2 ], [ 3, 4, 5 ] ] ). Изкарвам на конзолата дължината на последния масив от dumpArray и готово... нулевите тестове минават :D Но на другите много ми се бави програмата! Някакви насоки откъм оптимизация и изобщо правилна ли ми е логиката?

Ето snippet:

for (let i = 0; i < blocks; i += 1) { blocksArray.push(i); } for (let row = 0; row < blocksArray.length; row += 1) { dumpArray[row] = []; for (let col = 0; col < dumpArray.length; col += 1) { dumpArray[row].push(blocksArray.shift()); } } let lastArray= dumpArray.length - 1; let len = dumpArray[lastArray].length; console.log(len);

Благодаря още веднъж!


от shdw_skip (0 точки)

0

Здравей, 

може да решиш задачата и без използване на масиви и вложени цикли, просто ти трябва един counter, който да отчита увеличаването с 1 при всяка итерация и съответно да спре, когато не е останал достатъчен брой. 

Аз реших задачата с 2 променливи и 1 while цикъл. Едната ти променлива е реално входа(обърнат в int, да го наречем n), а втората ти променлива е counter-a(да го наречем c). Циклиш докато n е по-малък от 0 и слагаш условие цикъла да break-не, когато n стане по-малък от c + 1.  При всяка итерация, към c добавяш 1(все едно добавяш по един символ), а от изваждаш съответно c. ( n -= c). Реално цикъла спира, когато нямаш достатъчен брой символи, за добавяне и изхода ти е c. 

Реших да ти опиша логиката, вместо директно да ти слагам кода, предполагам така е по-добре. Реално имаш 2 променливи, 1 цикъл и едно условие вътре в него. Надявам се да съм помогнал!





0

Може да пробваш да запълваш матрицата по диагонал, също така и да си я завъртиш както ти е удобно (старт 0,0) май е най лесно. 

7

4 8

2 5 9

1 3 6 10

Търси се броя на запълнени колони на първия ред.

Може и някаква формула да се измисли.


от ktsvetanov (705 точки)


0

Има математическа формула, с която задачата става на един ред...
Подаденото число или е триъгълно число, или се намира между две триъгълни числа. 
(Google Triangular numbers) 
Ако X е n-тото триъгълно число, или по-голямо от него, но по-малко от следващото, n+1-во триъгълно число, броя на колонките е точно n. :)

И формулата не е крайно плашеща: var a = Math.floor(((Math.sqrt(8*b+1))-1)/2);

Ако не е триъгълно, просто вземаме Math.floor (предишното). Сигурно затова в условието пише full columns ;)
Успех!




0
Благодаря, ще опитам и този начин на решение! :)

от shdw_skip (0 точки)