С Новым годом! Форум программистов, компьютерный форум, киберфорум
D (DLang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/71: Рейтинг темы: голосов - 71, средняя оценка - 4.96
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446

Как быстро проверить массив на наличие равных элементов

05.02.2015, 22:17. Показов 15683. Ответов 51

Студворк — интернет-сервис помощи студентам
Можно написать такую функцию:
C++
1
2
3
4
5
6
int busy(int j) {
    foreach (i; 0 .. j)
        if (a[i] == a[j])
            return 0;
    return 1;
}
Но меня интересует: есть ли в D уже готовые функции, которые возвращают 0/1 или индексы равного элемента одинаковых элементов массива.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.02.2015, 22:17
Ответы с готовыми решениями:

Проверить матрицу на наличие элементов, равных данному
Нужно проверить есть ли в двумерном массиве повторяющийся максимальный элемент. Если находим хотя бы один такой же, то сразу выходим из...

Проверить наличие в нем хотя бы двух равных между собой элементов
Здраствуйте! Задано массив A ( n ) . Проверить наличие в нем хотя бы двух равных между собой элементов . Немогу написать код.Написал,...

Проверить массив на наличие нулевых элементов, в первый из этих элементов записать число
Мне нужно проверить массив на наличие в нем элементов со значением 0. А потом в первый из этих элементов со значением 0 записать число.

51
Заблокирован
06.02.2015, 01:35
Лучший ответ Сообщение было отмечено Dennis Ritchie как решение

Решение

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Но меня интересует: есть ли в D уже готовые функции, которые возвращают 0/1
Dennis Ritchie, оно? http://dlang.org/library/std/algorithm/any.html

Добавлено через 9 минут
Добавлю пример использования:
C++
1
2
3
4
5
6
7
8
9
10
import std.stdio;
import std.algorithm;
void main()
{
writeln(any!"a ==2"([1, 2, -3, -4])); 
 
writeln(any!"a ==4"([1, 2, -3, -4]));
 
writeln(any!"a > 4"([1, 2, -3, -4]));
}
Code
1
2
3
true
false
false
http://ideone.com/o6WXfH
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.02.2015, 01:40  [ТС]
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Dennis Ritchie, оно?
Покажите пример. Я чего-то не очень понял, как это использовать.

Я нашёл операцию in, но вместе с ней нельзя использовать оператор ~=, так как размер массива int, и операция in возвращает элемент указатель на элемент массива, если он там есть, или же null:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
import std.stdio;
import std.typecons;
 
int[int] a;
 
void main() {
    foreach(i; 0 .. 10) {
        a[i] = i + 1;
    }
 
    if (12 !in a)
        writeln("No");
}
0
Заблокирован
06.02.2015, 01:42
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Покажите пример. Я чего-то не очень понял, как это использовать.
Dennis Ritchie, пример выше, я позже добавил. Хотя по ссылке есть описание.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.02.2015, 01:47  [ТС]
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Dennis Ritchie, пример выше, я позже добавил. Хотя по ссылке есть описание.
Спасибо. Это именно то, что нужно. Просто я недостаточно хорошо знаю английский, поэтому мне иногда непросто понять документацию на официальном сайте.
0
Заблокирован
06.02.2015, 01:57
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Спасибо. Это именно то, что нужно. Просто я недостаточно хорошо знаю английский, поэтому мне иногда непросто понять документацию на официальном сайте.
Dennis Ritchie, а тут не нужно знать английский. Чаще всего используют стандартные названия методов. Я впервые столкнулся с языком D, но в C# иногда пользуюсь этим методом. Остается только закинуть в поиск его название и посмотреть пример.
Даже в С++ такой метод есть:
http://www.cplusplus.com/refer... hm/any_of/
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.02.2015, 02:10  [ТС]
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Dennis Ritchie, а тут не нужно знать английский.
Я раньше никогда не пользовался такими методами, поэтому и не знал, как они называются.

Теперь следующий раунд. Как найти равный элемент в парном кортеже?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import std.stdio;
import std.typecons;
import std.algorithm;
 
Tuple!(int, bool)[] a;
 
void main() {
    
    int n;
    int arr[];
    
    readf(" %s", &n);
    
    int c;
    foreach (i; 0 .. n) {
        readf(" %s", &c);
        a ~= tuple(c, true);
    }
 
    int k = 4;
    writeln(any!"a[][0] == k"(a[][0])); // не работает
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33370 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,889
Записей в блоге: 12
06.02.2015, 03:03
C++
1
writeln(any!"a == Tuple!(int, bool)(4, true)"(a)); // только вот так пока
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.02.2015, 03:58  [ТС]
Мне надо, чтобы переменная c могла изменяться:
C++
1
2
3
4
5
6
7
8
9
10
11
12
import std.stdio;
import std.algorithm;
 
void main() {
    int a[];
    foreach(i; 0 .. 6) {
        a ~= i + 1;
    }
 
    int c = 3;
    writeln(any!"a == c"(a));       // не работает
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33370 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,889
Записей в блоге: 12
06.02.2015, 05:01
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
// не работает
И не должно. Написано же:
Many functions in this module are parameterized with a function or a predicate. The predicate may be passed either as a function name, a delegate name, a functor name, or a compile-time string.
, а ты хочешь сделать с переменной, которая может изменяться уже после компиляции. Не пойдет.

Я бы проверил так:
C++
1
writeln(find(a, c).length != 0);
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.02.2015, 07:17  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Я бы проверил так:
volvo, а можно сделать так, чтобы функция find() проверяла элементы массива от 0 до предпоследнего элемента? Просто последний элемент массива и есть искомый.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33370 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,889
Записей в блоге: 12
06.02.2015, 12:20
C++
1
2
3
4
5
6
7
    int a[];
    foreach(i; 0 .. 6) {
        a ~= i + 1;
    }
    int c = 5; // вернет true
    // int c = 6; // вернет false
    writeln(find(take(a, a.length-1), c).length != 0);
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
07.03.2015, 18:07  [ТС]
А можно применить функцию take внутри функции find так, чтобы искать равный элемент во всём массиве, кроме i-го элемента?
0
Заблокирован
07.03.2015, 18:42
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
можно применить функцию take внутри функции find так, чтобы искать равный элемент во всём массиве, кроме i-го элемента?
Dennis Ritchie, Нет. take для этого не предназначен.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
07.03.2015, 18:54  [ТС]
Ev_Hyper, может быть, есть что-нибудь, что подойдёт, кроме take?
0
Заблокирован
07.03.2015, 19:12
Dennis Ritchie, можно скомбинировать take, concat и skip. Но может тут лучше использовать обычный цикл? Скажите задачу целиком.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38164 / 21099 / 4306
Регистрация: 12.02.2012
Сообщений: 34,687
Записей в блоге: 14
07.03.2015, 20:34
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Можно написать такую функцию:
- и зачем искать стандартную? Чем плоха эта функция?

Добавлено через 2 минуты
Мне кажется, что поиск одинаковых элементов в массиве длины n имеет сложность O(n2), как ни программируй...
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
08.03.2015, 16:48  [ТС]
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Скажите задачу целиком.
Смысл не в задаче. Просто мне очень часто приходится использовать функцию find(), потому что это быстрее и меньше, чем писать целый цикл и вызывать его через функцию с параметрами-итераторами.
Цитата Сообщение от Catstail Посмотреть сообщение
Чем плоха эта функция?
Ничем. Но проще же написать:
C++
1
2
auto a = [1, 4, 6, 7, 8, 0];
writefln("%(%s %)", a);
Чем писать в стиле C++:
C++
1
2
3
auto a = [1, 4, 6, 7, 8, 0];
foreach (i; a)
    write(i);
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
можно скомбинировать take, concat и skip.
А вы продемонстрируйте, а я потом решу, что лучше использовать.
Цитата Сообщение от Catstail Посмотреть сообщение
Мне кажется, что поиск одинаковых элементов в массиве длины n имеет сложность O(n2), как ни программируй...
Зато количество символов в записи метода поиска можно уменьшить.

Вообще можно вот так записать эту функцию для поиска во всём массиве:
C++
1
2
3
4
5
6
int busy(int j) {
    foreach (i, elem; a)
        if (elem == a[j] && i != j)
            return 0;
    return 1;
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33370 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,889
Записей в блоге: 12
08.03.2015, 16:54
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
количество символов в записи метода поиска можно уменьшить
А теперь барабанная дробь, и вопрос на засыпку: зачем? От этого что, программа быстрее работать станет? Не станет. Тебе больше заплатят за код, который будет на одну букву короче? Не заплатят. Смысл в чем?

Я ж говорю, проще взять человека, не умеющего программировать вообще, чем выкорчевать из олимпиадника его причуды, которые никому, кроме меряний известно чем на олимпиадных сайтах, не нужны.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
08.03.2015, 17:02  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
А теперь барабанная дробь, и вопрос на засыпку: зачем?
Чтобы быстрее написать программу (уже "сотню" раз всем говорил, что участвую в соревнованиях на скорость). Мне важна скорость написания программы. А на её качество мне наплевать, лишь бы работала. Чем быстрее участник напишет рабочую программу, тем больше баллов он получит.
Цитата Сообщение от volvo Посмотреть сообщение
Я ж говорю, проще взять человека, не умеющего программировать вообще
Куда взять? К вам на работу? Я что ли к вам на работу хоть раз просился?
Цитата Сообщение от volvo Посмотреть сообщение
меряний известно чем на олимпиадных сайтах, не нужны.
Мерятся "мозги" участников. Сейчас я участвую на олимпиадных сайтах, потом планирую выиграть реальный чемпионат (но это уже другая история).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.03.2015, 17:02
Помогаю со студенческими работами здесь

Проверить двумерный массив на наличие отрицательных элементов
Если в массиве есть хоть один отрицательный элемент, нужно, чтоб на экран вывелось сообщение "You have negative elements in your...

Проверить массив на наличие в нем положительных элементов
Здравствуйте, дорогие форумчане. Помогите с программой. Условие: переписать положительные элементы массива x, до последнего вхождения...

Проверить массив на наличие в нем элементов со значениями 25 и 45
Написать программу на языке VBA, которая проверяет массив элементов M(i), в котором 30 значений, на наличие в нем элементов со значениями...

Как проверить весь массив на наличие строки?
Как проверить весь массив на наличие строки? если строки нету- записать Добавлено через 14 минут строка всегда динамическая string...

Как проверить массив на наличие имен с базы mysql
У меня есть база в mysql names, состоящая из 30 имен, и есть массив massnames, в котором 5 имен. Как сделать, чтобы данные с базы смерялись...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru