2017-10-19 15 views
1

chapter 12 of Real World Haskellを完成させています。この章では、EAN13 encodingでバーコード認識を実行する方法について説明します。EAN13ハスケルのバーコードエンコーディング:それをテストするには?

私はthe book snippets into my repoからのコードの大部分を再現し、私は最終的には期待通りに動作し、私は悪いニュースだコードの私の300行を超えるかどうかを確認するために到着したとき:本が出版されて以来

-- Finding the Correct Sequence 
*Main> let input = zip (runLengths $ encodeEAN13 "9780132114677") (cycle [Zero, One]) 
*Main> listToMaybe . solve . candidateDigits $ input 
Just [0,2,0,1,0,0,0,0,0,0,0,0,1] -- WRONG Actual 
Just [9,7,8,0,1,3,2,1,1,4,6,7,7] -- Expected 

を私は最後の1から除き、GHCiの中のすべての例を再現してみましたと

$ ghci 
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
Prelude> import qualified Data.Map as M 
Prelude M> :t M.lookup 
M.lookup :: Ord k => k -> M.Map k a -> Maybe a 
-- in the book: M.lookup :: (Ord k, Monad m) => k -> M.Map k a -> m a 

私はいつもこの本と同じ結果を取得するには、次のような、私はいくつかの型シグネチャが変更されました気づきました。

誰もがこの本からそのトピックをカバーしていますか?

著者は、コードのすべての単一の行を説明されていないと、特に、input変数がテストのためにどこlet input = zip (runLengths $ encodeEAN13 "9780132114677") (cycle [Zero, One])

一部EAN13符号化されたバーコードが定義されていませんか?機能上の私のテストが正しいことを確認するには

*Main M> encodeEAN13 "9780132114677" 
"101011101100010010100111001100101000010101011011001100110110011010111001010000100010010001001010000101" 

は、誰もこの本を知っていない場合は、あなたがEAN13のいくつかのサンプルを持っているでしょうなどバーコードをエンコード?

は事前あなたの1のシーケンスと0との三つの問題があるように見えます

答えて

1

あなたの実装では2つのバグがあります。それはsplitAt 6あるべきとき

まず、encodeDigitsに、あなたはsplitAt 5を書きました。これは、@Brian Andersonが指摘しているエンコードバグを修正したものです。

第二には、bestScoresでは、あなたが書いた:

[(distance d (scaleToOne ps), n) | d <- srl, n <- digits] 

あなたが書かれている必要があるとき:

zip [distance d (scaleToOne ps) | d <- srl] digits 

これはあなたのデコードバグを修正します。

私はこれらのバグを見つけるために私の超人的なデバッグスキルを使用してもいいと思っていますが、ちょうど2,3年前に自分自身でBarcode.hsというコピーを持っていました。

+0

ありがとうございました!それは完全に働いた – mabe02

1

enter image description here

にありがとうございました。最初はあなたの[A] EAN-13センターコードがあなたの6番目の文字の頭を上書きしているようです。それは本当に[B]がどこにあるのでしょうか。また、余分な4つのゼロと余分な終了マーカーがシーケンスの終わりに貼り付けられています。

はここでチェックサムを生成し、1と0をレイアウトする作業を行うツールです。

var arrayCodeEANBin, arrayStructEAN; 
 
arrayCodeEANBin = [ [ '0001101', '0011001', '0010011', '0111101', '0100011', '0110001', '0101111', '0111011', '0110111', '0001011' ], [ '0100111', '0110011', '0011011', '0100001', '0011101', '0111001', '0000101', '0010001', '0001001', '0010111' ], [ '1110010', '1100110', '1101100', '1000010', '1011100', '1001110', '1010000', '1000100', '1001000', '1110100' ] ]; 
 
arrayStructEAN = ['000000', '001011', '001101', '001110', '010011', '011001', '011100', '010101', '010110', '011010'] 
 

 
var strRaw = ""; 
 
var strText = ""; 
 

 
function funcEAN() { // EAN-13 
 
var intSumOdd = 0, intSumEven = 0, intCheck, i, j, strStruct; 
 
// Compute check digit and add it to raw string 
 
for (i = 0; i < 12; i += 2) { 
 
    intSumEven += parseInt(strText[i]); 
 
    intSumOdd += parseInt(strText[i+1]); 
 
} 
 
intCheck = ((intSumOdd * 3) + intSumEven) % 10; 
 
if (intCheck > 0) { 
 
    \t intCheck = 10 - intCheck; 
 
} 
 
strText += intCheck; 
 
// Converts Code EAN array into string of 1's and 0's 
 
strRaw = "101" 
 
// First six bar sequences 
 
for (i = 1; i < 7; i += 1) { 
 
    strStruct = arrayStructEAN[strText[0]]; 
 
    strRaw += arrayCodeEANBin[strStruct[i-1]][strText[i]]; 
 
} 
 
// Middle sequence 
 
strRaw += "01010"; 
 
// Last six bar sequences, including check digit 
 
for (i = 0; i < 6; i += 1) { 
 
    strRaw += arrayCodeEANBin[2][strText[i+7]]; 
 
} 
 
strRaw += "101"; 
 
} // End EAN-13 
 

 

 
var buttonBarcode = document.getElementById("btnGenBar"); 
 
buttonBarcode.onclick = function() { 
 
strText = document.getElementById("textBarcode").value; 
 
funcEAN(); 
 
document.getElementById("textRaw").value = strRaw; 
 
document.getElementById("textRaw").select(); 
 
}
<head> 
 
<title>EAN-13 Barcodes in vanilla JavaScript</title> 
 
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" > 
 
</head> 
 
<body> 
 
<div id="inputForm"> 
 
    \t Enter Text:&nbsp;<input type="text" id="textBarcode" tabindex=1/> 
 
    \t &nbsp;<input type="button" id="btnGenBar" value="Gen 1's and 0's" tabindex=4/> 
 
</div> 
 
<p></p> 
 
<div id="result"></div> 
 
<p></p> 
 
<textarea rows="3" cols="110" id="textRaw" tabindex=0></textarea> 
 
<script type="text/javascript" src="./SO_JS-EAN-13.js"></script> 
 
</body> 
 
</html>

あなたが生成され、実際のバーコードを表示したい場合は、私がcodepenを持っています。書式付きテキストは追加されませんが、バーコードがスキャンされます。

関連する問題