141 Востаннє редагувалося quez (15.02.2015 00:45:37)

Re: Цікаві задачі

0xDADA11C7 написав:

Вважаю, що хто не вміє писати сями, той VTrim про математичні абстракції не знає. Єдине виключення - Чароўны Трусік, але його нема.

А як же вибір інструмента під задачу? Для останньої ідеально підходить Хаскель, наприклад.

142

Re: Цікаві задачі

Вибір є в того, хто знає про декілька інструментів. Макаки вибору не мають. Щодо того, що може бути приємніше писати якоюсь іншою мовою, ніж сями - ви мене переконали, переносю.

143 Востаннє редагувалося quez (15.02.2015 04:09:03)

Re: Цікаві задачі

Я не просто так казав, що Хаскель для цієї задачі підходить набагато краще за плюси. Код має бути легко зрозумілим кожному, хто знайомий з програмуванням, він схожий на інструкцію, написану для іншої людини, незахаращену конструкціями мови.

import Data.List

-- Оголошуємо тип Колір, який може приймати одне з перелічених значень і який можна порівнювати
data Color = Red | Orange | Yellow | Green | Blue | Violet deriving Eq

-- Тип Поворот, приймає одне з перечислених значень
data Turn = Forward | Backward | Clockwise | Counterclockwise | ToRight | ToLeft

-- Куб — складний тип, складається з шести Кольорів.
-- Виглядає як сішна структура, використовується схожим чином,
-- за винятком того, що містить не поля, а функції, які приймають Куб 
-- і повертають колір відповідної сторони
data Cube = Cube{front 
                ,back  
                ,left  
                ,right 
                ,up    
                ,down  :: Color
                } deriving Eq



-- Функція, застосовує до Куба cube Поворот turn 
-- Точніше, повертає новий куб, повернутий відносно старого. Підміни ніхто не помітить :)  
rotate :: Turn -> Cube -> Cube
rotate turn cube = case turn of
                        -- читати так: якщо turn == Forward, то повернути (з функції) куб, у якого передня грань така ж, 
                        -- як верхня у старого куба, задня така ж, як нижня у старого і т. д.
                        Forward          -> Cube{front = up cube,    back = down cube,  left = left cube,  right = right cube, up = back cube,  down = front cube}
                        Backward         -> Cube{front = down cube,  back = up cube,    left = left cube,  right = right cube, up = front cube, down = back cube}
                        Clockwise        -> Cube{front = front cube, back = back cube,  left = down cube,  right = up cube,    up = left cube,  down = right cube}
                        Counterclockwise -> Cube{front = front cube, back = back cube,  left = up cube,    right = down cube,  up = right cube, down = left cube}
                        ToRight          -> Cube{front = left cube,  back = right cube, left = back cube,  right = front cube, up = up cube,    down = down cube}
                        ToLeft           -> Cube{front = right cube, back = left cube,  left = front cube, right = back cube,  up = up cube,    down = down cube}



-- Деякі варіанти можна звести до одного й того ж за допомогою обертання.
-- Назвемо «канонічною» таку орієнтацію, при якій передня грань червона, 
-- а оранжева грань знаходиться справа або ззаду, причому якщо вона ззаду,
-- то справа знаходиться жовта. До такої орієнтації можна звести будь-яку іншу.
rotateToCanonical :: Cube -> Cube
-- Точкою позначається композиція функцій : зробити orangeOrYellowToRight з результатом виконання redToFront
-- ці дві функції оголошені тут же, трохи нижче
rotateToCanonical cube = (orangeOrYellowToRight . redToFront) cube
                         where
                            -- Якщо передня грань червона, то повертаємо куб так як є, нічого не крутимо
                            -- Якщо ж червона задня грань, то повертаємо направо і ще раз повертаємо направо
                            -- В rotate ToRight присутні не всі аргументи, але помилки немає, тому що
                            -- rotate ToRight повертає функцію, яка приймає куб і повертає куб.
                            redToFront c | (front c == Red) = c
                                         | (back c  == Red) = (rotate ToRight . rotate ToRight) c
                                         | (left c  == Red) = rotate ToRight c
                                         | (right c == Red) = rotate ToLeft c
                                         | (up c    == Red) = rotate Forward c
                                         | (down c  == Red) = rotate Backward c

                            orangeOrYellowToRight c | (back c  == Orange) = yellowToRight c
                                                    | (left c  == Orange) = (rotate Clockwise . rotate Clockwise) c
                                                    | (right c == Orange) = c
                                                    | (up c    == Orange) = rotate Clockwise c
                                                    | (down c  == Orange) = rotate Counterclockwise c
                                                    where yellowToRight c1 | (right c1 == Yellow) = c1
                                                                           | (left c1  == Yellow) = (rotate Clockwise . rotate Clockwise) c1
                                                                           | (up c1    == Yellow) = rotate Clockwise c1
                                                                           | (down c1  == Yellow) = rotate Counterclockwise c1



-- Ця функція приймає список списків в кожному з яких по шість кольорів,
-- і перетворює кожен із цих списків на куб
-- map — це функція відображення, вона приймає функцію і список 
-- і застосовує функцію до кожного елемента списку
colorsToCubes :: [[color]] -> [Cube]
colorsToCubes l = map f l
                  where 
                    f l1 = Cube{front = l1 !! 0, back = l1 !! 1, left = l1 !! 2, right = l1 !! 3, up = l1 !! 4, down = l1 !! 5}



-- Ця функція видаляє куби, які повторюються 
removeDuplicate :: [Cube] -> [Cube]
removeDuplicate list =  nub [rotateToCanonical cube | cube <- list]


-- Всі перестановки списку з усіх кольорів
perm = permutations([Red, Orange, Yellow, Green, Blue, Violet])



main = print $ (length . removeDuplicate . colorsToCubes) perm 
Результат

30, гугл каже, що правильно.

Подякували: 0x9111A, 0xDADA11C72

144 Востаннє редагувалося koala (15.02.2015 08:54:54)

Re: Цікаві задачі

Мені легше тут розв'язати математично, аніж програмою. Першу грань можна поставити як завгодно(1 спосіб). Другу можна або притулити до неї, тоді решту можна скомбінувати 4! способами, або поставити на протилежний бік, тоді третю можна ставити як завгодно, все одно можна повернути (1 спосіб), а решту - 3! способами. Разом 4!+3! = 24+6 = 30.

Про всяк випадок - код:
#include <iostream>
int main()
{
  std::cout << 30 << std::endl;
  return 0;
}
Подякували: Yola1

145 Востаннє редагувалося VTrim (15.02.2015 10:52:26)

Re: Цікаві задачі

0xDADA11C7 написав:

Вибір є в того, хто знає про декілька інструментів. Макаки вибору не мають. Щодо того, що може бути приємніше писати якоюсь іншою мовою, ніж сями - ви мене переконали, переносю.

Вам не здається,що ви багато собі дозволяєте?
Ніхто вам не давав право мене ображати тільки через те,що я чогось не знаю.
Мабуть ви великий гуру у IT і все знаєте?
Це не перший раз.. Але тоді я промовчав.

Нездатність самому розвязати задачу спонукає вас ображати інших?

146

Re: Цікаві задачі

Пан koala отримав пропозицію роботи, знання Haskel паном quez нас приємно здивувало, тому резюме пана quez ми збережемо в базі даних і якщо в нас з'явиться відповідна позиція, то ми обов'язково передзвонимо :)

147

Re: Цікаві задачі

Yola написав:

Пан koala отримав пропозицію роботи, знання Haskel паном quez нас приємно здивувало, тому резюме пана quez ми збережемо в базі даних і якщо в нас з'явиться відповідна позиція, то ми обов'язково передзвонимо :)

Ви передзвонюйте, я ще багато чого знаю :)

148

Re: Цікаві задачі

koala написав:

Мені легше тут розв'язати математично, аніж програмою. Першу грань можна поставити як завгодно(1 спосіб). Другу можна або притулити до неї, тоді решту можна скомбінувати 4! способами, або поставити на протилежний бік, тоді третю можна ставити як завгодно, все одно можна повернути (1 спосіб), а решту - 3! способами. Разом 4!+3! = 24+6 = 30.

Про всяк випадок - код:
#include <iostream>
int main()
{
  std::cout << 30 << std::endl;
  return 0;
}

Мій код — це скоріше ілюстрація слів про легший розв’язок на Хаскелі. Зверніть увагу, що сама задача розв’язується тільки в main, що дозволяє розв’язувати інші задачі про розфарбований куб в один рядок. А якщо підходити з практичної сторони, то відповідь гуглиться в будь-якому разі швидше, ніж розв’язується математично.

Подякували: koala1

149

Re: Цікаві задачі

Але після нагуглення розв'язку його треба перевірити, і тут не певен, що гуглення+обдумування розв'язку буде швидшим за просте обдумування :)

150

Re: Цікаві задачі

koala написав:

Але після нагуглення розв'язку його треба перевірити, і тут не певен, що гуглення+обдумування розв'язку буде швидшим за просте обдумування :)

Я нагуглив не просто число, а розв’язок, так що в цьому випадку мимо. А взагалі ви правий, так.

151

Re: Цікаві задачі

VTrim написав:

Ніхто вам не давав право мене ображати тільки через те,що я чогось не знаю.

Хибна думка насправді. Більша половина форуму знає ще менш.

VTrim написав:

Це не перший раз.. Але тоді я промовчав.

Ви також усомнилися в божественній сутності модераторів.

152

Re: Цікаві задачі

Це ж VTrim, так?
Пане VTrim, сприймайте це не як образу, а як дружній копняк в сторону розуміння абстракцій.

Подякували: Chemist-i1

153

Re: Цікаві задачі

quez написав:

Це ж VTrim, так?
Пане VTrim, сприймайте це не як образу, а як дружній копняк в сторону розуміння абстракцій.

А справа і не в цьому. Про математичні абстракції мені вже нагадували.
Тут діло про макаку,веб-макаку.)

154

Re: Цікаві задачі

VTrim написав:
quez написав:

Це ж VTrim, так?
Пане VTrim, сприймайте це не як образу, а як дружній копняк в сторону розуміння абстракцій.

А справа і не в цьому. Про математичні абстракції мені вже нагадували.
Тут діло про макаку,веб-макаку.)

Що саме вас зачепило, веб чи макака?

Подякували: leofun011

155

Re: Цікаві задачі

quez написав:
VTrim написав:
quez написав:

Це ж VTrim, так?
Пане VTrim, сприймайте це не як образу, а як дружній копняк в сторону розуміння абстракцій.

А справа і не в цьому. Про математичні абстракції мені вже нагадували.
Тут діло про макаку,веб-макаку.)

Що саме вас зачепило, веб чи макака?

Вибір є в того, хто знає про декілька інструментів. Макаки вибору не мають.

156

Re: Цікаві задачі

Можливо VTrim був одним з анонімусів на сторонньому ресурсі, якому я вказав на його рівень, тому він казиться.

157

Re: Цікаві задачі

VTrim написав:
quez написав:
VTrim написав:

А справа і не в цьому. Про математичні абстракції мені вже нагадували.
Тут діло про макаку,веб-макаку.)

Що саме вас зачепило, веб чи макака?

Вибір є в того, хто знає про декілька інструментів. Макаки вибору не мають.

Цілком згоден з цими висловлюваннями. Чому вони вас зачіпають?

158

Re: Цікаві задачі

Звичайно,мені ж дуже важлива ваша думка!1
І чому відразу на сторонньому якщо ви все сказали тут?

159

Re: Цікаві задачі

Знайти [formula](x^x)'[/formula] і [formula]\int \ln x dx[/formula]

160

Re: Цікаві задачі

Нічого цікавого. Перший стає тривіальним при записі exp(xln(x)), другий взагалі табличний.

Подякували: quez, leofun012