Суммируйте нечетные и четные индексы массива отдельно - Perl - PullRequest
0 голосов
/ 30 января 2019

У меня есть массив из 11 элементов.Где я хочу суммировать нечетные элементы, включая первый и последний элементы, как один скаляр, а четные - как другой.

Это мой код, я пытаюсь использовать карту, добавляя 2 к каждому индексу для достижения результата, но якажется, я неправильно понял.

use strict;
use warnings;
use Data::Dumper;

print 'Enter the 11 digiet serial number: ';
chomp( my @barcode = //, <STDIN> );

my @sum1 = map { 2 + $_ } $barcode[1] .. $barcode[11];
my $sum1 = sum Dumper( \@sum1 );

# sum2 = l2 + l4 + l6 + r8 + r10;
printf "{$sum1}";

Какой хороший способ добиться этого?

Ответы [ 5 ]

0 голосов
/ 30 января 2019

Другой Perl, если строка имеет длину 11 и содержит только цифры

$ perl -le ' $_="12345678911"; s/(.)(.)|(.)$/$odd+=$1+$3;$even+=$2/ge; print "odd=$odd; even=$even" '
odd=26; even=21

$

с другим вводом

$ perl -le ' $_="12121212121"; s/(.)(.)|(.)$/$odd+=$1+$3;$even+=$2/ge; print "odd=$odd; even=$even" '
odd=6; even=10

$
0 голосов
/ 30 января 2019

chomp( my @barcode = //, <STDIN> ); предположительно должен был иметь split до того, как в //?

@barcode будут прочитаны все символы в строке, включая символ новой строки.Chomp изменит последний элемент с новой строки на пустую строку.

Лучше сначала скомпоновать, чтобы у вас были только цифры в массиве:

chomp(my $barcode = <STDIN>);
my @barcode = split //, $barcode;
0 голосов
/ 30 января 2019

Вы можете использовать тот факт, что оператор ?: можно назначить

print 'Enter the 11 digiet serial number: ';
chomp( my @barcode = //, <STDIN> );

my $odd = 0;
my $even = 0;
for (my $index = 0; $index < @barcode; $index++) {
    ($index % 2 ? $even : $odd) += $barcode[$index];
}

. Это работает путем индексации по @barcode и взятия мод 2 индекса, то есть деления индекса на 2 и принятияостаток, и если остаток равен 1, добавьте этот элемент от @barcode к $even, иначе к $odd.

Это выглядит странно, пока вы не вспомните, что массивы основаны на 0, поэтому ваш первый номер штрих-кода хранится в $barcode[0], который является четным индексом.

0 голосов
/ 30 января 2019

Суммируйте значения с нечетными и четными индексами

perl -wE'@ary = 1..6;  
    for (0..$#ary) { $_ & 1 ? $odds += $ary[$_] : $evens += $ary[$_] }; 
    say "odds: $odds, evens: $evens"
'

Примечание для тестов: с четными индексами (0,2,4) мы имеем (нечетные!) Значения (1,3,5),в этом (1..6) примере

0 голосов
/ 30 января 2019

Сумма четных / нечетных показателей (то, что вы просили, но не то, что вы хотите [1] ):

use List::Util qw( sum );   # Or: sub sum { my $acc; $acc += $_ for @_; $acc }

my $sum_of_even_idxs = sum grep { $_ % 2 == 0 } 0..$#nums;
my $sum_of_odd_idxs  = sum grep { $_ % 2 == 1 } 0..$#nums;

Сумма четных / нечетных значений (что вы такжеспросил, но не то, что вы хотите [1] ):

use List::Util qw( sum );   # Or: sub sum { my $acc; $acc += $_ for @_; $acc }

my $sum_of_even_vals = sum grep { $_ % 2 == 0 } @nums;
my $sum_of_odd_vals  = sum grep { $_ % 2 == 1 } @nums;

Сумма значений в четных / нечетных индексах (что, по-видимому, вы хотите):

use List::Util qw( sum );   # Or: sub sum { my $acc; $acc += $_ for @_; $acc }

my $sum_of_vals_at_even_idxs = sum @nums[ grep { $_ % 2 == 0 } 0..$#nums ];
my $sum_of_vals_at_odd_idxs  = sum @nums[ grep { $_ % 2 == 1 } 0..$#nums ];

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

use List::Util qw( sum );   # Or: sub sum { my $acc; $acc += $_ for @_; $acc }

my $sum_of_vals_at_even_idxs = sum @nums[0,2,4,6,8,10];
my $sum_of_vals_at_odd_idxs  = sum @nums[1,3,5,7,9];

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