Re: Цікаві задачі
Вважаю, що хто не вміє писати сями, той VTrim про математичні абстракції не знає. Єдине виключення - Чароўны Трусік, але його нема.
А як же вибір інструмента під задачу? Для останньої ідеально підходить Хаскель, наприклад.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Алгоритми та структури даних, технології → Цікаві задачі
Сторінки Попередня 1 … 6 7 8 9 10 … 20 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
Вважаю, що хто не вміє писати сями, той VTrim про математичні абстракції не знає. Єдине виключення - Чароўны Трусік, але його нема.
А як же вибір інструмента під задачу? Для останньої ідеально підходить Хаскель, наприклад.
Вибір є в того, хто знає про декілька інструментів. Макаки вибору не мають. Щодо того, що може бути приємніше писати якоюсь іншою мовою, ніж сями - ви мене переконали, переносю.
Я не просто так казав, що Хаскель для цієї задачі підходить набагато краще за плюси. Код має бути легко зрозумілим кожному, хто знайомий з програмуванням, він схожий на інструкцію, написану для іншої людини, незахаращену конструкціями мови.
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
Мені легше тут розв'язати математично, аніж програмою. Першу грань можна поставити як завгодно(1 спосіб). Другу можна або притулити до неї, тоді решту можна скомбінувати 4! способами, або поставити на протилежний бік, тоді третю можна ставити як завгодно, все одно можна повернути (1 спосіб), а решту - 3! способами. Разом 4!+3! = 24+6 = 30.
Вибір є в того, хто знає про декілька інструментів. Макаки вибору не мають. Щодо того, що може бути приємніше писати якоюсь іншою мовою, ніж сями - ви мене переконали, переносю.
Вам не здається,що ви багато собі дозволяєте?
Ніхто вам не давав право мене ображати тільки через те,що я чогось не знаю.
Мабуть ви великий гуру у IT і все знаєте?
Це не перший раз.. Але тоді я промовчав.
Нездатність самому розвязати задачу спонукає вас ображати інших?
Пан koala отримав пропозицію роботи, знання Haskel паном quez нас приємно здивувало, тому резюме пана quez ми збережемо в базі даних і якщо в нас з'явиться відповідна позиція, то ми обов'язково передзвонимо
Пан koala отримав пропозицію роботи, знання Haskel паном quez нас приємно здивувало, тому резюме пана quez ми збережемо в базі даних і якщо в нас з'явиться відповідна позиція, то ми обов'язково передзвонимо
Ви передзвонюйте, я ще багато чого знаю
Мені легше тут розв'язати математично, аніж програмою. Першу грань можна поставити як завгодно(1 спосіб). Другу можна або притулити до неї, тоді решту можна скомбінувати 4! способами, або поставити на протилежний бік, тоді третю можна ставити як завгодно, все одно можна повернути (1 спосіб), а решту - 3! способами. Разом 4!+3! = 24+6 = 30.
▼Про всяк випадок - код:
Мій код — це скоріше ілюстрація слів про легший розв’язок на Хаскелі. Зверніть увагу, що сама задача розв’язується тільки в main, що дозволяє розв’язувати інші задачі про розфарбований куб в один рядок. А якщо підходити з практичної сторони, то відповідь гуглиться в будь-якому разі швидше, ніж розв’язується математично.
Але після нагуглення розв'язку його треба перевірити, і тут не певен, що гуглення+обдумування розв'язку буде швидшим за просте обдумування
Але після нагуглення розв'язку його треба перевірити, і тут не певен, що гуглення+обдумування розв'язку буде швидшим за просте обдумування
Я нагуглив не просто число, а розв’язок, так що в цьому випадку мимо. А взагалі ви правий, так.
Ніхто вам не давав право мене ображати тільки через те,що я чогось не знаю.
Хибна думка насправді. Більша половина форуму знає ще менш.
Це не перший раз.. Але тоді я промовчав.
Ви також усомнилися в божественній сутності модераторів.
Це ж VTrim, так?
Пане VTrim, сприймайте це не як образу, а як дружній копняк в сторону розуміння абстракцій.
Це ж VTrim, так?
Пане VTrim, сприймайте це не як образу, а як дружній копняк в сторону розуміння абстракцій.
А справа і не в цьому. Про математичні абстракції мені вже нагадували.
Тут діло про макаку,веб-макаку.)
quez написав:Це ж VTrim, так?
Пане VTrim, сприймайте це не як образу, а як дружній копняк в сторону розуміння абстракцій.А справа і не в цьому. Про математичні абстракції мені вже нагадували.
Тут діло про макаку,веб-макаку.)
Що саме вас зачепило, веб чи макака?
VTrim написав:quez написав:Це ж VTrim, так?
Пане VTrim, сприймайте це не як образу, а як дружній копняк в сторону розуміння абстракцій.А справа і не в цьому. Про математичні абстракції мені вже нагадували.
Тут діло про макаку,веб-макаку.)Що саме вас зачепило, веб чи макака?
Вибір є в того, хто знає про декілька інструментів. Макаки вибору не мають.
Можливо VTrim був одним з анонімусів на сторонньому ресурсі, якому я вказав на його рівень, тому він казиться.
quez написав:VTrim написав:А справа і не в цьому. Про математичні абстракції мені вже нагадували.
Тут діло про макаку,веб-макаку.)Що саме вас зачепило, веб чи макака?
Вибір є в того, хто знає про декілька інструментів. Макаки вибору не мають.
Цілком згоден з цими висловлюваннями. Чому вони вас зачіпають?
Звичайно,мені ж дуже важлива ваша думка!1
І чому відразу на сторонньому якщо ви все сказали тут?
Знайти [formula](x^x)'[/formula] і [formula]\int \ln x dx[/formula]