2017-01-13 3 views
1

Ich übe einige Bash Scripting auf Hackerrank (Erholungs). Ein Problem, das gegeben ist, besteht darin, dass zwei Reihen von Zahlen jeweils Noten von Alice und Bob darstellen. Jedes Mal, wenn ein Element einer Reihe eine höhere Punktzahl für Alice hat, gewinnt sie einen Punkt und jedes Mal, wenn ein Element einer Reihe eine höhere Punktzahl für Bob hat, erhält er einen Punkt (Bindungen führen zu keiner Verstärkung). Die Ausgabe ist die Punktzahl von Alice und Bob in dieser Reihenfolge.Vergleicht man jeden Wert von zwei Reihen

5 6 7 
3 6 10 

Der Ausgang sein soll::

1 1 

Weil 5 größer als 3, so Alice ein Punkt gelangt, 6 Bande 6 und 7 weniger als 10, um ein Beispiel, diesen Eingang gegebenen Bob bekommt einen Punkt. Im Folgenden habe ich meine Lösung:

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" 

Meine Lösung funktioniert, aber es ist scheußlich. Ich habe es durch Googeln gemacht, wie man über Zeilen iteriert, auf Elemente von Zeilen zugreift und Grundrechenarten in einem Bash-Skript ausführt. Ich habe eine harte Zeit zu glauben, dass dies, wie bash Scripting sollte für ein solches Problem getan werden, gehe ich davon aus es meine Unerfahrenheit mit dieser Art von Bash-Skripte, aber konnte nicht relevante Ergebnisse für den Vergleich von zwei Reihen von Werten auf Google

finden

Kann jedes Element zwischen zwei Zeilen direkter verglichen werden?

+0

@Inian, immer zwei Reihen, immer die gleiche Anzahl von Elementen, nur bash – asimes

+0

Das heißt, 'bash' ist nicht das richtige Werkzeug für Bearbeitung von Dateien, verwenden Sie' Awk ' – Inian

Antwort

3

Sie können die Zeilen als Arrays lesen Sie die -a Option des read builtin verwendet wird. Dann Iterieren über ihnen wird viel einfacher:

#!/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" 
+0

Ich wusste nicht über' lesen -a'. Das ist viel besser, danke – asimes

+0

statt 'if-elif' man verwenden kann' [$ {a [i]} -gt $ {b [i]}] && ((aliceSum ++)) ', spart ein paar Tastenanschläge . – Andrey

Verwandte Themen