Sim's blog

電子工作はじめてみました

ICFP2007 (19) 誤り訂正符号

2007-09-06 21:52:57 | ICFPプログラミングコンテスト
CFP2007 (18) 暗号解読の続きです。

鍵が分かったので復号してみました。


復号に使ったprefixです。
IIPIFFCPICFPPICIICIPCCCPIICIPPPCCFCFCFIICIIPIIPIPCICIICCIIICPIICIPCICCCCIICCCIII
CCICIICCCPIICIICIPPCPCCCFFCFFCFFFCFFCCCCCCCCICFFCCFFFFCCFFCCFFCFCCCCFICCCFCFFCFI
CCFCCFFCFICFFFFFFFFICIPPPIICIPCCCCICIICICICCPIIPIPICCCIIIIICICIICCCCIIICPIIPIPIC
CCIIIIICICPIICIPCICIIIICCIIIIICCICCCIICPIICIICIPPPIPPCPCFFFCFCCFCFFFCCFFCFFCCFIC
CFCCCCCCCCCCFCFCCCCCCCCICFCFCCCFCFCCFFFCCFCFCCCFICCCCCCFCCFFCCCCCCCCCCCCCICIIC

helpScreen = 84;
crypt("42", help-error-correcting-codes, 0x006ed8);
startup();

8-4ハミング符号なんて書いてあります。correctErrorsという関数を調べてみました。impdocには

void correctErros(int24 data, int24 ecc, int24 size)
Correct errors in a DNA region using the Hamming bits in another DNA region.

と書かれています。dataとeccは同じ長さで各々2文字づつ処理します。dataから取り出した2文字とeccから取り出した2文字を連結して下の表を引いた結果の2文字をdataに書き戻します。??になっているのは、誤り訂正能力を超えていて何に戻せばいいのか分からないところです。IIIIからPPPPまでで4^4 = 256通りあります。
IIII→II	IIIC→II	IIIF→II	IIIP→??	IICI→II	IICC→??	IICF→??	IICP→IF
IIFI→II	IIFC→??	IIFF→??	IIFP→CI	IIPI→??	IIPC→FI	IIPF→IC	IIPP→??
ICII→II	ICIC→??	ICIF→??	ICIP→FC	ICCI→??	ICCC→CC	ICCF→IC	ICCP→??
ICFI→??	ICFC→IP	ICFF→IC	ICFP→??	ICPI→IC	ICPC→??	ICPF→IC	ICPP→IC
IFII→II	IFIC→??	IFIF→??	IFIP→IF	IFCI→??	IFCC→IF	IFCF→IF	IFCP→IF
IFFI→??	IFFC→IP	IFFF→FF	IFFP→??	IFPI→CF	IFPC→??	IFPF→??	IFPP→IF
IPII→??	IPIC→IP	IPIF→CP	IPIP→??	IPCI→FP	IPCC→??	IPCF→??	IPCP→IF
IPFI→IP	IPFC→IP	IPFF→??	IPFP→IP	IPPI→??	IPPC→IP	IPPF→IC	IPPP→??
CIII→II	CIIC→??	CIIF→??	CIIP→CI	CICI→??	CICC→CC	CICF→PI	CICP→??
CIFI→??	CIFC→CI	CIFF→CI	CIFP→CI	CIPI→CF	CIPC→??	CIPF→??	CIPP→CI
CCII→??	CCIC→CC	CCIF→CP	CCIP→??	CCCI→CC	CCCC→CC	CCCF→??	CCCP→CC
CCFI→PC	CCFC→??	CCFF→??	CCFP→CI	CCPI→??	CCPC→CC	CCPF→IC	CCPP→??
CFII→??	CFIC→PF	CFIF→CP	CFIP→??	CFCI→CF	CFCC→??	CFCF→??	CFCP→IF
CFFI→CF	CFFC→??	CFFF→??	CFFP→CI	CFPI→CF	CFPC→CF	CFPF→CF	CFPP→??
CPII→CP	CPIC→??	CPIF→CP	CPIP→CP	CPCI→??	CPCC→CC	CPCF→CP	CPCP→??
CPFI→??	CPFC→IP	CPFF→CP	CPFP→??	CPPI→CF	CPPC→??	CPPF→??	CPPP→PP
FIII→II	FIIC→??	FIIF→??	FIIP→FC	FICI→??	FICC→FI	FICF→PI	FICP→??
FIFI→??	FIFC→FI	FIFF→FF	FIFP→??	FIPI→FI	FIPC→FI	FIPF→??	FIPP→FI
FCII→??	FCIC→FC	FCIF→FC	FCIP→FC	FCCI→FP	FCCC→??	FCCF→??	FCCP→FC
FCFI→PC	FCFC→??	FCFF→??	FCFP→FC	FCPI→??	FCPC→FI	FCPF→IC	FCPP→??
FFII→??	FFIC→PF	FFIF→FF	FFIP→??	FFCI→FP	FFCC→??	FFCF→??	FFCP→IF
FFFI→FF	FFFC→??	FFFF→FF	FFFP→FF	FFPI→??	FFPC→FI	FFPF→FF	FFPP→??
FPII→FP	FPIC→??	FPIF→??	FPIP→FC	FPCI→FP	FPCC→FP	FPCF→FP	FPCP→??
FPFI→??	FPFC→IP	FPFF→FF	FPFP→??	FPPI→FP	FPPC→??	FPPF→??	FPPP→PP
PIII→??	PIIC→PF	PIIF→PI	PIIP→??	PICI→PI	PICC→??	PICF→PI	PICP→PI
PIFI→PC	PIFC→??	PIFF→??	PIFP→CI	PIPI→??	PIPC→FI	PIPF→PI	PIPP→??
PCII→PC	PCIC→??	PCIF→??	PCIP→FC	PCCI→??	PCCC→CC	PCCF→PI	PCCP→??
PCFI→PC	PCFC→PC	PCFF→PC	PCFP→??	PCPI→PC	PCPC→??	PCPF→??	PCPP→PP
PFII→PF	PFIC→PF	PFIF→??	PFIP→PF	PFCI→??	PFCC→PF	PFCF→PI	PFCP→??
PFFI→??	PFFC→PF	PFFF→FF	PFFP→??	PFPI→CF	PFPC→??	PFPF→??	PFPP→PP
PPII→??	PPIC→PF	PPIF→CP	PPIP→??	PPCI→FP	PPCC→??	PPCF→??	PPCP→PP
PPFI→PC	PPFC→??	PPFF→??	PPFP→PP	PPPI→??	PPPC→PP	PPPF→PP	PPPP→PP

cow-spot-middleをcow-spot-middle-eccを使って誤り訂正できました。integrity checkはpassになりました。

色々な仕掛けがしてあります。