Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Ivan Z
0 / 0 / 1
Регистрация: 06.01.2017
Сообщений: 6
1

Замена элементов массива по условию встречи элементов в нем

23.01.2017, 13:33. Просмотров 984. Ответов 10
Метки нет (Все метки)

Добрый день.
Имеем последовательность чисел: 100 2 3 65 4 3 12 100 1 1 1 3 200 23 23 43 22 2 2 3 5 100 3 4 200 2 100 8 и т.д.
Основное внимание на числа 100 и 200. Первым в массиве будет обязательно 100 или 200. массив может заканчиваться любым числом.
Числа между 100 и 200 заменяются по первому правилу: 2 на 10, 3 на 15, 12 на 6.
Числа между 200 и 100 заменяются по второму правилу: 2 на 7, 3 на 27, 12 на 65.


Заранее спасибо за помощь.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2017, 13:33
Ответы с готовыми решениями:

Замена элементов строк из файла по условию встречи элементов в нем
Ест файл txt, содержащий числовую последовательность (числа разделены двойным...

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

Вычислить количество элементов массива, удовлетворяющих условию
Вычислить количество элементов массива, для которых выполняется неравенство: 1...

Создать array из элементов исходного массива, удовлетворяющих условию
неужели нужно сначала пересчитать сколько их имеется, затем создать массив и...

Замена элементов массива
Дан одномерный массив Размерность массива задаётся с клавиатуры Заменить...

10
kolorotur
Эксперт .NET
10617 / 8798 / 2195
Регистрация: 17.09.2011
Сообщений: 15,075
Завершенные тесты: 1
23.01.2017, 14:13 2
Лучший ответ Сообщение было отмечено Даценд как решение

Решение

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
using System.Collections.Generic;
 
 
class Program
{
    static void Main()
    {
        var ruleset = new Dictionary<int, Dictionary<int, int>>
        {
            [100] = new Dictionary<int, int>
            {
                [2] = 10,
                [3] = 15,
                [12] = 16
            },
            [200] = new Dictionary<int, int>
            {
                [2] = 7,
                [3] = 27,
                [12] = 65
            }
        };
 
        int[] arr = { 100, 2, 3, 65, 4, 3, 12, 100, 1, 1, 1, 3, 200, 23, 23, 43, 22, 2, 2, 3, 5, 100, 3, 4, 200, 2, 100, 8 };
 
        int current = 0;
        for (int i = 0; i < arr.Length; i++)
        {
            int num = arr[i];
            if (num == 100 || num == 200)
                current = num;
            else if (ruleset[current].TryGetValue(num, out num))
                arr[i] = num;
        }
    }
}
1
TopLayer
785 / 584 / 302
Регистрация: 23.10.2016
Сообщений: 1,391
Завершенные тесты: 7
23.01.2017, 15:00 3
Кликните здесь для просмотра всего текста
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
void Main()
{
    IList<int> sequence = CreateSequence();
    Console.WriteLine(string.Join(" ", sequence));
    
    IList<int> indicesOf_100_200 = GetIndecesOf_100_200(sequence);
    
    var rulesFactory = new RulesFactory();
    
    IList<int> result = Transform(sequence, indicesOf_100_200, rulesFactory);
    Console.WriteLine(string.Join(" ", result));
}
 
IList<int> Transform(IList<int> sequence, IList<int> indicesOf_100_200, RulesFactory rulesFactory)
{
    var newSequence = new List<int>(sequence.Count);
    
    for (int i = 0; i < indicesOf_100_200.Count; i++)
    {
        int firstIndex = indicesOf_100_200[i];
        int lastIndex = (i == indicesOf_100_200.Count - 1) ? sequence.Count : indicesOf_100_200[i + 1];
 
        int firstValue = sequence[firstIndex];
        int lastValue = sequence.ElementAtOrDefault(lastIndex);
 
        newSequence.Add(firstValue);
 
        var rule = rulesFactory.GetRuleFor(firstValue, lastValue);
 
        for (int j = firstIndex + 1; j < lastIndex; j++)
        {
            newSequence.Add(rule(sequence[j]));
        }
    }
    
    return newSequence;
}
 
IList<int> CreateSequence()
{
    return "100 2 3 65 4 3 12 100 1 1 1 3 200 23 23 43 22 2 2 3 5 100 3 4 200 2 100 8"
        .Split()
        .Select(int.Parse)
        .ToArray();
}
 
int[] GetIndecesOf_100_200(IList<int> sequence)
{
    return Enumerable.Range(0, sequence.Count)
        .Where(i => sequence[i] == 100 || sequence[i] == 200)
        .ToArray();
}
 
class RulesFactory
{
    private Dictionary<int, int> subsFor_100_200 = new Dictionary<int, int>
    {
        [2] = 10,
        [3] = 15,
        [12] = 6
    };
    
    private Dictionary<int, int> subsFor_200_100 = new Dictionary<int, int>
    {
        [2] = 7,
        [3] = 27,
        [12] = 65
    };
    
    private Func<int, int> GetRule(Dictionary<int, int> subs)
    {
        subs = subs ?? new Dictionary<int, int>();
 
        return delegate (int x)
        {
            int value;
            
            if (subs.TryGetValue(x, out value))
            {
                return value;
            }
            
            return x;
        };
    }
 
    public Func<int, int> GetRuleFor(int firstValue, int lastValue)
    {
        var subs = (firstValue == 100 && lastValue == 200) ? subsFor_100_200 :
            (firstValue == 200 && lastValue == 100) ? subsFor_200_100 : null;
        
        return GetRule(subs);
    }
}


Добавлено через 2 минуты
kolorotur, ваше решение заменяет числа между первыми 100 и 100. Не думаю, что это имелось в виду в условии.

Добавлено через 3 минуты
Точнее будет сказать, что ваше решение неверно.
2
kolorotur
Эксперт .NET
10617 / 8798 / 2195
Регистрация: 17.09.2011
Сообщений: 15,075
Завершенные тесты: 1
23.01.2017, 15:39 4
Цитата Сообщение от TopLayer Посмотреть сообщение
ваше решение заменяет числа между первыми 100 и 100.
Точно, про этот случай я не подумал.

Спасибо за указание на ошибку!
0
ata
270 / 242 / 186
Регистрация: 28.10.2015
Сообщений: 709
23.01.2017, 18:18 5
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Linq;
 
class Program
{
    public static void Main()
    {
        int[] a = "100 2 3 65 4 3 12 100 1 1 1 3 200 23 23 43 22 2 2 3 5 100 3 4 200 2 100 8".Split().Select(Int32.Parse).ToArray();
        bool after100 = a[0] == 100;
        for (int i = 1; i < a.Length; i++)
        {
            after100 = !after100 && a[i] == 100;
            after100 = !(after100 && a[i] == 200);
            switch(a[i])
            {
                case 2: a[i] = after100 ? 10 : 7; break;
                case 3: a[i] = after100 ? 15 : 27; break;
                case 12: a[i] = after100 ? 6 : 65; break;
            }
        }
        Console.WriteLine(String.Join(" ", a));
    }
}
0
TopLayer
785 / 584 / 302
Регистрация: 23.10.2016
Сообщений: 1,391
Завершенные тесты: 7
23.01.2017, 19:05 6
ata, у вас такая же ошибка, как и у kolorotur
0
ata
270 / 242 / 186
Регистрация: 28.10.2015
Сообщений: 709
23.01.2017, 20:37 7
Цитата Сообщение от TopLayer Посмотреть сообщение
ata, у вас такая же ошибка, как и у kolorotur
Еще раз прочитал ТЗ. Там не сказано, что между 100 и 200 не должно быть 100. Пусть ТС прояснит этот вопрос.
0
TopLayer
785 / 584 / 302
Регистрация: 23.10.2016
Сообщений: 1,391
Завершенные тесты: 7
23.01.2017, 21:19 8
Цитата Сообщение от ata Посмотреть сообщение
Там не сказано, что между 100 и 200 не должно быть 100
Если добавить, что ещё не сказано о том, что программа должна работать и для других последовательностей, кроме этой, тогда, наверное, вы будете правы. А если же должна, тогда вот контрпример к вашему решению: 100 2 3 65 4 3 12 100. По идее, в этой последовательности ничего не должно меняться.
0
Ivan Z
0 / 0 / 1
Регистрация: 06.01.2017
Сообщений: 6
24.01.2017, 16:25  [ТС] 9
Внутри последовательности от 100 до 200 может содержаться несколько 100. Суть в замене после 100 по определенному правилу, пока не появиться 200, что что является флагам для смены условий замены. Даже между 100 и 100 замена должна производиться.
В конце последовательности написал "и т.д.", подразумевая что она может продолжаться или быть совсем другой.

Добавлено через 17 минут
Код kolorotur подходит. СПС.

Добавлено через 5 минут
У ata замена только по первому условию во всем массиве. Но все равно спасибо.

Добавлено через 2 минуты
TopLayer Также спасибо, Хоть немного не то, полезно.

Добавлено через 8 минут
Подскажите еще пожалуйста. Если эту последовательность надо взять из файла (там только цифры), замену произвести (возможно менять на символы), потом опять залить в файл.
Тут уже не с массивом а со строкой надо работать.
0
TopLayer
785 / 584 / 302
Регистрация: 23.10.2016
Сообщений: 1,391
Завершенные тесты: 7
24.01.2017, 16:36 10
Цитата Сообщение от Ivan Z Посмотреть сообщение
потом опять залить в файл.
Если допускается загрузка всей строки в память, то можно разбить строку на числа таким образом:
C#
1
int[] a = "12345".Select(char.GetNumericValue).ToArray(); // a = { 1, 2, 3, 4, 5}
0
Ivan Z
0 / 0 / 1
Регистрация: 06.01.2017
Сообщений: 6
24.01.2017, 19:16  [ТС] 11
Не понял для чего это.
0
24.01.2017, 19:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2017, 19:16

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

Замена элементов массива.
Задание такое. Найти в строке слово &quot;no&quot; и заменить его на &quot;yes&quot;. Найти -...

Замена элементов массива
Подскажите, как поменять минимальные и следующие минимальные значения массива...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru