我在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上的两行值
可以更直接地比较两行中的每个元素吗?
答案 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"