2017-09-30 6 views
0

(ハッカーランクのBashスクリプト)番号が正しく機能していない比較:は、以下のリンクに記載された問題によると

https://www.hackerrank.com/contests/bash-and-linux-shell-practice/challenges/bash-tutorials---comparing-numbers/problem

私のコードは、Mac OSXのターミナルでは正常に動作しますが、同じコードを提出しながら、さHackerrankでは、テストケースの1つが失敗しています。なぜこれが起こっているのか分かりません。どんな答えにも本当に感謝します。

read X 
read Y 

if [[ $X > $Y ]] 
then 
    echo "X is greater than Y" 
elif [[ $X < $Y ]] 
then 
    echo "X is less than Y" 
else 
    echo "X is equal to Y" 
fi 

HackerRank Custom Test Case: 

Compilation Successful 
Input (stdin) 
-100 
100 
Your Output 
X is greater than Y 

答えて

3

なぜ結果が得られるのかわかりません。私は実際のbashでは "XはYより小さい"と表示します。しかし、あなたのスクリプトは実際には異なる方法で間違っています:[[ ]]<および>では、数値比較ではなくアルファベット比較を行います。その違いを理解するには、文字のソート順序で「5」が「1」の後に来るため、[[ 5 < 1000 ]]がfalseとなることを考慮してください。数値比較を行うには、代わりに-lt-gtを使用してください。

x=-5 
y=5 

if ((x>y)); then 
    echo "X is greater than Y" 
elif ((x<y)); then 
    echo "X is less than Y" 
else 
    echo "X is equal to Y" 
fi 

それともinteger comparison[[ ... ]]内部テストを使用します:

+0

@dawg Oopsie。編集していただきありがとうございます。 –

+0

前、後、大きく、小さく - 私はまだ私の指に数えています! ;-) – dawg

+0

問題文に記載されているように、Mac端末で正しい答えを得ています。しかし、Hackerrankに解決策を提出している間、それは上記のエラーを示しています。 コメントは非常に有益なので、私は非常に満足しています。 – user3443599

2

あなたは、より一般的な算術比較を取得するには、テストコンテキスト[[ ... ]]対バッシュdouble-parenthesisコンテキスト((...))を使用することができます[[ ... ]]<インサイド

if [[ "$x" -gt "$y" ]]; then 
    echo "X is greater than Y" 
elif [[ "$x" -lt "$y" ]]; then 
    echo "X is less than Y" 
else 
    echo "X is equal to Y" 
fi 

を、 >または==は文字列の比較をテストします。

これらの方法はどちらも整数でのみ機能します。浮動小数点数を使用するには、awk,bcまたは他のfloatインタープリタを使用する必要があります。ユーザー入力で(())

ために必要されていない二重引用符[[ test ]]"$x"と引用符や印章を使用してください、$x$yが実際 数値であることをテストしてください。良いテストhere ...

+0

あなたのソリューションはMac端末とHackerRankで動作します。私が間違っていたことが分かりましたが、なぜ今のところ私のソリューションはMac端末で動作し、HackerRankでは動作しません。 – user3443599

+0

HackerRankの問題は、xとyの値を読み取る方法です。コード提出の先頭に 'read x'と' read y'を置くと、私がそこにある両方のソリューションが動作します。 – dawg

関連する問題