簡體   English   中英

分別對數組的奇數和偶數索引求和 - Perl

[英]Sum the odd and even indices of an array separately - Perl

我有一個由11個元素組成的數組。 我想把奇數元素加在一起,包括第一個和最后一個元素作為一個標量,而另一個元素作為另一個元素。

這是我的代碼我試圖使用map為每個索引添加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}";

實現這一目標的好方法是什么?

偶數/奇數指數的總和(你要求的,但不是你想要的[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. 我把這些包括在內,以防有人在這個Q&A上需要這些土地。

在奇數和偶數索引處添加值

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 )示例中

您可以使用?:運算符可分配的事實

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並獲取索引的mod 2, @barcode索引除以2並取余數,如果余數為1 @barcode元素添加到$even否則為$odd

這看起來很奇怪,直到你記得數組為0,所以你的第一個條形碼存儲在$barcode[0] ,這是一個偶數索引。

chomp( my @barcode = //, <STDIN> ); 大概應該在//之前split

@barcode將讀取行中的所有字符,包括換行符。 chomp會將最后一個元素從換行符更改為空字符串。

最好先咬一下,這樣你就可以在陣列中找到你的數字了:

chomp(my $barcode = <STDIN>);
my @barcode = split //, $barcode;

另一個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

$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM