比较两行的每个值

时间:2017-01-13 07:12:02

标签: bash shell

我在Hackerrank上练习一些bash脚本(娱乐性)。给出的问题是两行数字分别代表Alice和Bob的分数。每次一行的元素对Alice有更高的分数时,她获得一个点,并且每次一行的元素对Bob有更高的分数时,他获得一个点(关系导致没有增益)。输出是该顺序中Alice和Bob的分数。举个例子,给出这个输入:

5 6 7
3 6 10

输出应为:

1 1

因为5大于3所以Alice得到一个点,6个6个,7个小于10所以Bob得到一个点。下面我有我的解决方案:

read aliceIn
read bobIn

aliceSum=0
bobSum=0
i=0
while [ $i -lt $(echo "$aliceIn" | awk '{print NF}') ]; do
    j=$((i + 1))
    aliceVal=$(echo "$aliceIn" | cut -d ' ' -f $j)
    bobVal=$(echo "$bobIn" | cut -d ' ' -f $j)
    if   [ $aliceVal -gt $bobVal ]; then ((aliceSum++));
    elif [ $bobVal -gt $aliceVal ]; then ((bobSum++));
    fi
    ((i++))
done

echo "$aliceSum $bobSum"

我的解决方案确实有效,但它很可怕。我通过谷歌搜索如何迭代行,访问行的元素,并在bash脚本中做一些基本的算术。我很难相信这就是应该为这样一个问题做bash脚本的方法,我认为这是我对这些类型的bash脚本的经验不足,但无法找到相关结果来比较Google上的两行值

可以更直接地比较两行中的每个元素吗?

1 个答案:

答案 0 :(得分:3)

您可以使用-a内置的read选项将行读取为数组。然后迭代它们会更容易:

#!/bin/bash

read -a a
read -a b

aliceSum=0
bobSum=0
n=${#a[@]}
for (( i=0 ; i < n ; ++i ))
do
    if   [ ${a[i]} -gt ${b[i]} ]; then ((aliceSum++));
    elif [ ${b[i]} -gt ${a[i]} ]; then ((bobSum++));
    fi
done

echo "$aliceSum $bobSum"