私が完了するのバッシュを使用しようとしているプロジェクトオイラー13。以下は、何が問題なのか理解できない私のコードです。
#!/bin/bash
sum=0
while read -r -d $'\r' line; do
sum=$(echo $sum + $line | bc)
done <<< "$(curl -s http://pastebin.com/raw/uHZ0PZjm)"
echo "${sum:0:10}"
exit
以前は2つのエラーが発生していました。
(standard_in) 1: syntax error
そして
(standard_in) 1: illegal character: ^M
いくつかの調査の結果、EOFターミネータの問題のようでした。次に、その上でdos2unixを実行しましたが、2番目のエラーは発生しなくなりましたが、最初のエラーが繰り返し発生しています。データをbcにパイプする方法に問題があるようですが、何をどのように修正するのかわかりません。
正解は5537376230です。何かお手伝いできることをありがとうございます。
システム情報は
GNU bash、バージョン4.3.11(1)-リリース(x86_64-pc-linux-gnu)
私はWindows10でcmderを使用しています。
(== 0x0d == CR ==キャリッジリターン)read
ではなく、\ n(== 0x0a == LF ==ラインフィード)を区切り文字として設定します\r
。それか、ペーストビンファイルの最後にCRを付けてください。Pastebinファイルの最後の行の終わりに行末記号シーケンスがないようです。そのため、最後の行がスクリプトに入力されることはありません。
$ curl -s http://pastebin.com/raw/uHZ0PZjm | hexdump -C | tail -n 8
...(snip)...
000013e0 35 30 39 35 31 36 0d 0a 32 30 38 34 39 36 30 33 |509516..20849603|
000013f0 39 38 30 31 33 34 30 30 31 37 32 33 39 33 30 36 |9801340017239306|
00001400 37 31 36 36 36 38 32 33 35 35 35 32 34 35 32 35 |7166682355524525|
00001410 32 38 30 34 36 30 39 37 32 32 0d 0a 35 33 35 30 |2804609722..5350|
00001420 33 35 33 34 32 32 36 34 37 32 35 32 34 32 35 30 |3534226472524250|
00001430 38 37 34 30 35 34 30 37 35 35 39 31 37 38 39 37 |8740540755917897|
00001440 38 31 32 36 34 33 33 30 33 33 31 36 39 30 |81264330331690|
0000144e
各番号の間に0x0d0a(CR LF)がありますが、最後の番号の後にはないことに注意してください。
$ while read -r -d $'\r' line; do echo $line; done <<< "$(curl -s http://pastebin.com/raw/uHZ0PZjm)" | tail -n 3
77158542502016545090413245809786882778948721859617
72107838435069186155435662884062257473692284509516
20849603980134001723930671666823555245252804609722
read
コマンドを実行すると、最後の番号535 [...] 690が欠落していることに注意してください。ただし、区切り文字をUnixネイティブのLF(\ n)改行文字に切り替えると、最後の行が含まれます。
$ while read -r -d $'\n' line; do echo $line; done <<< "$(curl -s http://pastebin.com/raw/uHZ0PZjm)" | tail -n 3
72107838435069186155435662884062257473692284509516
20849603980134001723930671666823555245252804609722
53503534226472524250874054075591789781264330331690
編集して追加:ペーストビンファイルのCRを処理する修正は次のとおりです。read
区切り文字としてCRLFを使用するように指示し、ペーストビンファイルの後にCRLFを追加するために追加のエコーを使用しました。
sum=0
while read -r -d $'\r\n' line; do
sum=$(echo $sum + $line | bc)
done <<< $(curl -s http://pastebin.com/raw/uHZ0PZjm; echo -e "\r\n")
echo "${sum:0:10}"
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加