Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/254: Рейтинг темы: голосов - 254, средняя оценка - 4.70
Модератор
 Аватар для Curry
5165 / 3525 / 536
Регистрация: 01.06.2013
Сообщений: 7,675
Записей в блоге: 9
23.02.2015, 01:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Программа полностью "работабельна" (проверил в тестирующей системе):
Я не стал вдаваться что это там делается, надо ли отдельную ф-ию для извращения gcd писать, зачем "-1" в конце выводится который в выводе не виден, но всё тривиально
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
import Control.Monad
 
main = do
    l <- readLn :: IO Integer
    r <- readLn :: IO Integer
    mapM_ putStrLn $ do 
        i <- [l..r]
        j <- [i..r]
        guard $ gcd i j == 1
        k <- [j..r]
        guard $ gcd j k == 1
        guard $ gcd k i /= 1
        return $ show i ++ "  " ++ show j ++ "  " ++ show k
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
23.02.2015, 02:05  [ТС]
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Я не стал вдаваться что это там делается
Задача тривиальная. Долго вдаваться не придётся:
Опровержение гипотез
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
надо ли отдельную ф-ию для извращения gcd писать
Можно использовать более быструю сишную функцию gcd() из std.numeric, но она не работает с BigInt.
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
зачем "-1" в конце выводится который в выводе не виден
Если гипотезу не опровергнуть, то нужно вывести "-1".
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
для извращения gcd
А какое тут извращение? Модифицированный алгоритм Евклида с остатками.
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
guard
Я так понимаю, что guard используется для перебора всех значений из диапазона. А как переводят это слово в этом значении?
И как написать условный оператор с flag'ом на Haskell, чтобы программа могла вывести "-1", если гипотезу не опровергнуть?
0
Модератор
 Аватар для Curry
5165 / 3525 / 536
Регистрация: 01.06.2013
Сообщений: 7,675
Записей в блоге: 9
23.02.2015, 02:08
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Если гипотезу не опровергнуть, то нужно вывести "-1".
А, вона чё. Надо только первую строку вывести, если её нет то -1.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import Control.Monad
import Safe
 
main = do
    l <- readLn :: IO Integer
    r <- readLn :: IO Integer
    putStrLn $ headDef "-1" $ do 
        i <- [l..r]
        j <- [i..r]
        guard $ gcd i j == 1
        k <- [j..r]
        guard $ gcd j k == 1
        guard $ gcd k i /= 1
        return $ show i ++ "  " ++ show j ++ "  " ++ show k
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
23.02.2015, 02:13  [ТС]
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Haskell
1
import Safe
Тут и без флага можно обойтись, как я вижу.
0
Модератор
 Аватар для Curry
5165 / 3525 / 536
Регистрация: 01.06.2013
Сообщений: 7,675
Записей в блоге: 9
23.02.2015, 02:15
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Я так понимаю, что guard используется для перебора всех значений из диапазона.
Тут это скорее
C++
1
if(!условие)continue
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
23.02.2015, 02:23  [ТС]
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Тут это скорее
Понятно. Я забыл, что в ФЯП вместо циклов рекурсия.

Чего-то Haskell GHC 7.6 не смог скомпилировать вашу программу в тестирующей системе:
Can't compile file:

program.hs:2:8:
Could not find module `Safe'
Use -v to see a list of the files searched for.
Safe компилятор не может найти.
0
Модератор
 Аватар для Curry
5165 / 3525 / 536
Регистрация: 01.06.2013
Сообщений: 7,675
Записей в блоге: 9
23.02.2015, 02:38
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Safe компилятор не может найти.
Она не входит в поставку "из каробки". В командной строке cabal update, потом cabal install safe и не забыть перезапустить интерпретатор
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
23.02.2015, 02:52  [ТС]
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
В командной строке cabal update, потом cabal install safe и не забыть перезапустить интерпретатор
Установил. Теперь работает. Я работаю не в интерпретаторе, а в командной строке (программу редактирую в блокноте).
Но у программы есть ещё одна проблема: не может считать числа через пробел.
0
Модератор
 Аватар для Curry
5165 / 3525 / 536
Регистрация: 01.06.2013
Сообщений: 7,675
Записей в блоге: 9
23.02.2015, 10:05
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
не может считать числа через пробел.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import Control.Monad
import Safe
import System.IO
 
main = do
    s <- getLine
    case map read (words s) :: [Integer] of
        [l,r] -> putStrLn $ headDef "-1" $ do 
            i <- [l..r]
            j <- [i..r]
            guard $ gcd i j == 1
            k <- [j..r]
            guard $ gcd j k == 1
            guard $ gcd k i /= 1
            return $ show i ++ "  " ++ show j ++ "  " ++ show k
        _ -> putStrLn "Ha4u dve 4isla!" >> hFlush stdout >> main
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
23.02.2015, 18:12  [ТС]
Собственно, улучшенный switch ():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import std.stdio, std.string, std.container, std.conv, std.numeric, std.range;
import std.array, std.bigint, std.algorithm, std.math, std.typecons, std.random;
 
int[] a;
 
void trans(int n) {
    
    switch (n) {
        case 2: .. case 3: case 5: case 7:
            a ~= n;
            break;
        case 4:
            a ~= [3, 2, 2];
            break;
        case 6:
            a ~= [5, 3];
            break;
        case 8:
            a ~= [7, 2, 2, 2];
            break;
        case 9:
            a ~= [7, 3, 3, 2];
            break;
        default:
            break;
    }
}
 
void main() {
    
    byte n;
    
    readf(" %s\n", &n);
    
    int c;
    foreach (i; 0 .. n) {
        c = getchar();
        if (c - '0' > 1)
            trans(c - '0');
    }
    
    sort!("a > b")(a);
    
    writefln("%(%s%)", a);
}
P.S. Это не все нововведения в switch ()'e. В одну программу (Drazil и факториал) не вышло запихнуть всё сразу.
0
Модератор
 Аватар для Curry
5165 / 3525 / 536
Регистрация: 01.06.2013
Сообщений: 7,675
Записей в блоге: 9
23.02.2015, 19:11
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Это не все нововведения в switch ()'e.
А как насчёт одновременной проверки разных сочетаний условий?
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{-# LANGUAGE ViewPatterns #-}
import Data.List
 
main = 
    case ([1,2],4,"Test!") of
        ([],i,s) -> putStrLn $ "Empty, i=" ++ show i ++ "  s=" ++ s
        ([c],3,_) -> putStrLn $ "Only one element and number == 3  : " ++ show c
        ([c],_,_) -> putStrLn $ "Only one element : " ++ show c
        ((1:_),3,s) -> putStrLn $ "The first element ==1 and  the number == 3,  s=" ++ s
        (a,i,"Test") -> putStrLn $ "It is test. i=" ++ show i ++ "  a=" ++ show a
        (elemIndex 1 -> Just n,even -> True, length -> sz) -> putStrLn $ " Number 1 has index " 
                                                              ++ show n ++ 
                                                              ", i is even and length of string ="
                                                              ++ show sz
        ((i1:i2:_),i,_) | i1 == i2 && i1 < i -> putStrLn "The first and second elements are equal" 
        _ -> putStrLn "Else"
И, кстати, что насчёт сравнения скорости компиляции при прочих равных с плюсами?
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
23.02.2015, 20:16  [ТС]
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
А как насчёт одновременной проверки разных сочетаний условий?
Такого не имеется. Смысла нет. Если такое реализовать, то язык потеряет скорость.
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
И, кстати, что насчёт сравнения скорости компиляции при прочих равных с плюсами?
Компиляция, конечно, идёт дольше, чем в C/C++; но зато по скорости работы программы, написанные на D, работают практически всегда быстрее, чем на C++ (иногда обгоняют даже чистый C).
Кстати, а в Haskell есть инструкция with? А есть в C++ static if ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.02.2015, 20:17
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
но зато по скорости работы программы, написанные на D, работают практически всегда быстрее, чем на C++ (иногда обгоняют даже чистый C).
А доказательства есть или мы, пардон, в священных войнах ?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
23.02.2015, 20:34
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А есть в C++ static if
нет такого нет.А что оно делает и для чего нужно?
0
Модератор
 Аватар для Curry
5165 / 3525 / 536
Регистрация: 01.06.2013
Сообщений: 7,675
Записей в блоге: 9
23.02.2015, 21:11
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Кстати, а в Haskell есть инструкция with?
Нет. Есть в Pascal/Delphi. Опасная инструкция, если явно не указываешь что откуда берёшь, можно взять не оттуда. В произошедшей от паскаля Аде её убрали. В хаскеле несколько полей сразу можно заменить так
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
data Struct = Struct { i :: Int
                     , s :: String
                     , b :: Bool
                     } deriving Show  
 
main = 
    let s= Struct 12 "qwerty" True
        s'= s{ 
              i=33,
              s="asdfg"
             }
    in print s'
Кстати, раз уж про Аду. В ней можно описать, тип, который в рантайме будет проверяться на какие то условия при любом присваивании переменной такого типа, например:
Pascal
1
2
3
4
5
6
7
8
type Not_Null is new Integer
with Dynamic_Predicate => Not_Null /= 0;
 
subtype Dice_Throw is Integer
with Dynamic_Predicate => Dice_Throw in 1 .. 6;
 
type Even is new Integer
with Dynamic_Predicate => Even mod 2 = 0;
- Если в переменную типа Not_Null попытаться записать ноль - вылетит исключение. Dice_Throw может быть только от 1 до 6 включительно, а переменная типа Even может быть только чётной.
Такое на Ди возможно?
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
23.02.2015, 22:29  [ТС]
Цитата Сообщение от S_el Посмотреть сообщение
А что оно делает и для чего нужно?
Приведу одну из возможностей (так как все возможности объяснить трудно):
C++
1
2
3
4
5
static if (a > b) {{
    auto max = 5;
    b += max;
}}
/* переменная max здесь не видна */
C++
1
2
3
4
5
static if (a > b) {
    auto max = 5;
    b += max;
}
/* переменная max здесь видна (попадает в область видимости) */
C++
1
2
3
4
5
if (a > b) {
    auto max = 5;
    b += max;
}
/* переменная max здесь не видна */
Там, где в фокус внимания попадают пространства имён и области видимости, static if срезает внешние скобки, если они есть (их необязательно ставить, если с помощью условной инструкции контролируется только одна инструкция. Если вы действительно хотите поставить скобки (в их традиционном значении), просто добавьте еще одну пару.
Инструкция static if позволяет осуществлять выбор во время компиляции и очень похожа на директиву #if языка C. Встречая static if, компилятор вычисляет условие. Если оно не нулевое, компилируется соответствующий код; иначе компилируется код, соответствующий выражению else (если таковое присутствует).
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Такое на Ди возможно?
Я предполагаю, что возможно. Пример кода привести не смогу. Никогда такими делами не занимался.
Цитата Сообщение от Убежденный Посмотреть сообщение
А доказательства есть или мы, пардон, в священных войнах ?
D ничем не уступает C++:
Миниатюры
D vs C++  
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.02.2015, 22:38
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
D ничем не уступает C++
О да, эта табличка на многое мне сразу открыла глаза. Вопросов больше нет.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
24.02.2015, 10:41
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А есть в C++ static if ?
В C++ есть constexpr, позволяющий описывать compile-time функции, а не ограничиваться одними if'ами.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
24.02.2015, 16:17  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
описывать compile-time функции
Оооо! Это вы зря. Разработчики D уделили большое внимание compile-time (в книге Александреску про это много написано). Сомневаюсь, что на C++ имеется больше возможностей для описания compile-time функций. static if - это всего лишь нововведение, которое может срезать ненужные скобки на этапе компиляции.

D может бороться против всех, но когда кодеры видят его мощь, то сразу же задают тупой и наивный вопрос:
А без библиотек слабо?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
24.02.2015, 17:23
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
D может бороться против всех
Бессмысленно и беспощадно, ага.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Закрытая тема Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru