Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Задачка на массивы массивов


Автор: Suppir 20.12.2010, 16:56
Есть файл со следующими данными:

(7800720) - 7843751
(7800750) - 7809551, 7800751
(7800860) - 7800862, 7800861
(7800880) - 7938926, 7938927, 7938928, 7938929, 7800881
(7800890) - 7916898
(7800920) - 7843835, 7843836
(7800950) - 7843841
(7801010) - 7915891
(7801030) - 7860572, 7860645, 7860646

1. Необходимо по эти данным построить массив массивов вида:

1-й элемент: 7800720, 7843751
2-й элемент: 7800750, 7809551, 7800751
3-й элемент: 7800860, 7800862, 7800861
4-й элемент: 7800880, 7938926, 7938927, 7938928, 7938929, 7800881
5-й элемент: 7800890, 7916898
6-й элемент: ...


2. После построения массива, при выполнении программы появляются две переменные: $a и $b

Необходимо сделать проверку: если номер $a является одним из элементов массива массивов, то номер $b должен:
1) существовать в той же строке массиве
2) находиться правее чем $a

Т.е. если $a = 7800880, а $b = 7938926, то результат положительный
если $a = 7800880, а $b = 3, то результат отрицательный
если $a = 7800881, а $b = 7938929, то результат отрицательный (потому что $b находится левее).





Автор: ginnie 20.12.2010, 17:37
Suppir, что-же у Вас не получается?

Автор: Jimy 20.12.2010, 17:56
Использование массива массивов - обязательное условие?
Все числа, хранящиеся в файле, уникальны?

Автор: chorny 20.12.2010, 18:08
я бы начал с   split / \)\s-\s | ,\s /x

Автор: alezzz 20.12.2010, 19:42
массив обязательно нужен?
можно так:
Код

my $ok=0;
my $a="7938926";
my $b="7938927";

while (<DATA>)
{
  $ok=1 if /\D$a\D.*\D$b\D/;
}

print "$ok";

__DATA__
(7800720) - 7843751
(7800750) - 7809551, 7800751
(7800860) - 7800862, 7800861
(7800880) - 7938926, 7938927, 7938928, 7938929, 7800881
(7800890) - 7916898
(7800920) - 7843835, 7843836
(7800950) - 7843841
(7801010) - 7915891
(7801030) - 7860572, 7860645, 7860646


но если нужен массив то тогда так:
Код

my @arr, @inda=(-1,-1), @indb=(-1,-1);
my $a="7800862";
my $b="7800861";

while (<DATA>)
{
  s/\(//;
  push @arr, [split /\D+/];
}
for $i ( 0 .. $#arr ) 
{
  for $j ( 0 .. $#{$arr[$i]} )
  {
    @inda=($i,$j) if $arr[$i][$j] == $a;
    @indb=($i,$j) if $arr[$i][$j] == $b;
  }                      
}
if (($inda[0]!=-1) && ($inda[0]==$indb[0]) && ($inda[1]<$indb[1]))
{
  print "+";
}
else

  print "-";
}

__DATA__
(7800720) - 7843751
(7800750) - 7809551, 7800751
(7800860) - 7800862, 7800861
(7800880) - 7938926, 7938927, 7938928, 7938929, 7800881
(7800890) - 7916898
(7800920) - 7843835, 7843836
(7800950) - 7843841
(7801010) - 7915891
(7801030) - 7860572, 7860645, 7860646


Автор: ginnie 20.12.2010, 19:52
alezzz, первый вариант неверный - попробуйте (7800880) - 7938926, 17938927

Автор: Suppir 20.12.2010, 20:02
Цитата(Jimy @  20.12.2010,  17:56 Найти цитируемый пост)
Использование массива массивов - обязательное условие?
Все числа, хранящиеся в файле, уникальны? 


1. Нет, не обязательное. Я, вот, думаю, что проще было бы использовать массив строк, а при проверке проходиться по этим строкам регулярным выражением. Правда, строк около 100 тыс, а всего чисел около 300 тыс.
2. Да, все уникальны.



Автор: ginnie 20.12.2010, 20:28
Suppir, а зачем массив? Проверку нужно делать многократно? Если да, то можно еще попробовать сделать хэш, где числа будут ключем, значением будет массив "номер строки", "позиция в строке".  Тогда проверка будет $hash{$a}[0] == $hash{$b}[0] и $hash{$a}[1] < $hash{$b}[1]

Автор: alezzz 20.12.2010, 20:44
Цитата(ginnie @  20.12.2010,  19:52 Найти цитируемый пост)
alezzz, первый вариант неверный - попробуйте (7800880) - 7938926, 17938927


Попробовал. В какой комбинации не верно (что в $a и $b) ?

Автор: ginnie 20.12.2010, 20:46
Цитата(alezzz @ 20.12.2010,  20:44)
Попробовал. В какой комбинации не верно (что в $a и $b) ?

Я писал про Ваш вариант до исправления.

Автор: Suppir 20.12.2010, 21:15
Цитата(ginnie @  20.12.2010,  20:28 Найти цитируемый пост)
Проверку нужно делать многократно? 


да, несколько десятков миллионов раз smile


Цитата(ginnie @  20.12.2010,  20:28 Найти цитируемый пост)
Если да, то можно еще попробовать сделать хэш, где числа будут ключем, значением будет массив "номер строки", "позиция в строке". 


Это очень интересный вариант, спасибо!

Добавлено через 4 минуты и 52 секунды
Пожалуй, на этом варианте и остановлюсь, потому что его легко реализовать и скорость будет высокой (наличие в хеше почти моментально определяется). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)