Автор Тема: Определение номера элемента в массиве  (Прочитано 9283 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Alniger

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Зравствуйте, webscript.ru

Помогите, решить задачу:

Существует массив
@var1=(2000,6000,9000,12000);
есть переменная $mas1=6000;
соответсвенно есть элемент в массиве @var1 равный $mas1 => он же @var1[1];
Каким образом можно определить этот номер элемента в массиве и записать его в переменную $nomelem (должно получиться $nomelem=1);

Заранее благодарю, за Вашу помощь.

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Определение номера элемента в массиве
« Ответ #1 : 17 Мая 2006, 12:41:35 »
my $nomelem = 0; print grep { defined } map { $cnt++; $_ == $mas1 ? $cnt : undef } @var1;

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Определение номера элемента в массиве
« Ответ #2 : 17 Мая 2006, 12:42:24 »
my $nomelem = 0; print grep { defined } map { $nomelem++; $_ == $mas1 ? $nomelem-1 : undef } @var1;

Оффлайн Alniger

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Определение номера элемента в массиве
« Ответ #3 : 17 Мая 2006, 13:02:02 »
Прописал програмку, проходит но:
#!/usr/bin/perl -w

$mas1=5.2;

@var1=(2.1,2.8,3.6,4.8,5.2);

print "Content-Type: text/html\\n\\n";
my $nomelem = 0;
print grep { defined } map { $nomelem++; $_ == $mas1 ? $nomelem-1 : undef } @var1;

Как значение присвоить к переменной $nomelem2 допустим.

А то результат получается

print "$nomelem"; #5

а правильно 4.
« Последнее редактирование: 17 Мая 2006, 13:21:34 от Alniger »

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Определение номера элемента в массиве
« Ответ #4 : 17 Мая 2006, 13:19:29 »
# perl -de0
  DB<1> @var1=(2.1,2.8,3.6,4.8,5.2);
  DB<2> my $nomelem = 0; print grep { defined } map { $nomelem++; $_ == 5.2 ? $nomelem-1 : undef } @var1;
4
  DB<3> my $nomelem = 0; print grep { defined } map { $nomelem++; $_ == 2.1 ? $nomelem-1 : undef } @var1;
0
  DB<4> my $nomelem = 0; print grep { defined } map { $nomelem++; $_ == 4.8 ? $nomelem-1 : undef } @var1;
3
  DB<5>

Оффлайн Alniger

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Определение номера элемента в массиве
« Ответ #5 : 17 Мая 2006, 13:21:46 »
Прописал програмку, проходит но:
#!/usr/bin/perl -w

$mas1=5.2;

@var1=(2.1,2.8,3.6,4.8,5.2);

print "Content-Type: text/html\\n\\n";
my $nomelem = 0;
print grep { defined } map { $nomelem++; $_ == $mas1 ? $nomelem-1 : undef } @var1;

Как значение присвоить к переменной $nomelem2 допустим.

А то результат получается

print "$nomelem"; #5

а правильно 4.

Оффлайн Zerokool

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 22
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Определение номера элемента в массиве
« Ответ #6 : 17 Мая 2006, 14:48:34 »
Самый быстрый способ:
foreach (@var1) { ++$i; if ($var1[$i-1] == $_) { $nomelem = $i-1 }}
На перле тока так. Ибо не питон.

P.S. Извращенцы :)))

Оффлайн Alniger

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Определение номера элемента в массиве
« Ответ #7 : 17 Мая 2006, 14:59:45 »
Спасибо Вам огромнейшее!!!

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Определение номера элемента в массиве
« Ответ #8 : 17 Мая 2006, 15:29:31 »
# perl -MBenchmark=timethese -de0
  DB<1> @var1=(2000,6000,9000,12000);

  DB<2> timethese (10_000_000,{\'A\' => q|$i = 0;foreach (@var1) { ++$i; if ($var1[$i-1] == $_) { $nomelem = $i-1 }}|,\'B\' => q|$nomelem = 0;map { $_ == 6000 ? last : $nomelem++ } @var1;|})
Benchmark: timing 10000000 iterations of A, B...
         A: 40 wallclock secs (38.48 usr +  0.02 sys = 38.50 CPU) @ 259740.26/s (n=10000000)
         B: -2 wallclock secs (-2.21 usr +  0.00 sys = -2.21 CPU) @ -4524886.88/s (n=10000000)
            (warning: too few iterations for a reliable count)

  DB<3> $nomelem = 0;map { $_ == 6000 ? last : $nomelem++ } @var1

  DB<4> print $nomelem
1

Оффлайн Zerokool

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 22
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Определение номера элемента в массиве
« Ответ #9 : 17 Мая 2006, 17:33:29 »
arto, все понял. Очень интересно и странно для меня.
какая ось? какой перл?

Оффлайн Kannabismus

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 18
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Определение номера элемента в массиве
« Ответ #10 : 17 Мая 2006, 18:17:10 »
-2 секунды на исполнение это просто высший пилотаж!

Оффлайн Zerokool

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 22
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Определение номера элемента в массиве
« Ответ #11 : 17 Мая 2006, 21:18:56 »
На 10000000 итераций это, в принципе, хуйня, но вывод все же очень интересный. Вопрос открыт.

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Определение номера элемента в массиве
« Ответ #12 : 18 Мая 2006, 00:06:14 »
# perl -v | head -2

This is perl, v5.8.8 built for i386-linux-thread-multi
# uname -srvpio
Linux 2.6.16-1.2080_FC5 #1 Tue Mar 28 03:38:34 EST 2006 athlon i386 GNU/Linux

#

Оффлайн xames

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 62
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Определение номера элемента в массиве
« Ответ #13 : 18 Мая 2006, 07:07:03 »
timethese (10_000_000,{
   \'A\' => q|for($i=0;$i   \'B\' => q|foreach (@var1) { ++$i; if ($var1[$i-1] == $mas1) { $nomelem = $i-1;last }}|});


Benchmark: timing 10000000 iterations of A, B...
         A: 38 wallclock secs (34.97 usr +  0.00 sys = 34.97 CPU) @ 285951.22/s
(n=10000000)
         B: 83 wallclock secs (79.12 usr +  0.06 sys = 79.18 CPU) @ 126288.14/s
(n=10000000)

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Определение номера элемента в массиве
« Ответ #14 : 18 Мая 2006, 10:15:31 »
# perl -MBenchmark=timethese -de0
  DB<1> @var1 = map { int rand 10240 } 1..10240
  DB<2> $mas1 = 6000
  DB<3> timethese (100_000,{ \'A\' => q|for($i=0;$i q|$nomelem = 0; foreach (@var1) { if ($var1[$nomelem++] == $mas1) { $nomelem--; last }}|});
Benchmark: timing 100000 iterations of A, B...
         A: 411 wallclock secs (365.74 usr +  4.51 sys = 370.25 CPU) @ 270.09/s (n=100000)
         B: 281 wallclock secs (243.22 usr +  3.32 sys = 246.54 CPU) @ 405.61/s (n=100000)

 

Sitemap 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