2017-10-19 3 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 

을 내가 마지막에서 제외 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의 일부 샘플 같은 바코드 인코딩 것?

미리 당신의 일의의 순서와 0의 세 가지 문제가있는 것 같습니다

답변

1

당신은 당신의 구현이 버그가 있습니다. @Brian Anderson이 지적한 인코딩 버그가 수정되었습니다.

둘째는, bestScores, 당신은 서면으로 작성했습니다 :

당신이 작성해야
[(distance d (scaleToOne ps), n) | d <- srl, n <- digits] 

:

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

이 당신의 디코딩 버그가 수정되었습니다.

나는 내 초인적 인 디버깅 기술을 사용하여이 버그를 찾을 수 있었으면 좋겠다.하지만 나는 방금 전에 제 12 장을했을 때 Barcode.hs이라는 사본을 가지고있었습니다.

+0

고맙습니다! 완벽하게 작동했습니다. – mabe02

1

enter image description here

에 대단히 감사드립니다. 첫 번째는 [A] EAN-13 센터 코드가 여섯 번째 문자의 시작 부분을 덮어 쓰는 것 같습니다. 그것은 정말로 [B]가있는 곳에 있어야합니다. 그리고 추가로 4 개의 0을 얻었고 추가 끝 마커를 시퀀스 끝에 추가했습니다. 여기

는 체크섬을 생성하고 레이아웃의 작업을 수행하는 도구의 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이 . 형식이 지정된 텍스트는 추가하지 않지만 바코드는 스캔합니다. 이 splitAt 6을해야 할 때

먼저, encodeDigits, 당신은 splitAt 5 쓴 :

관련 문제