sentiment_dissatisfied

あぁ...パソコンではだめです。

このサイトは、スマートフォンからのみ体験できます。
より具体的には、画面の横幅が550px以下である必要があります。

QRコード
close

昨年は大変お世話になりました。
今年もよろしくお願いします。

とは、もちろん思っていますが、もっと伝えたいことがあります。

それは、この部分です。

誰にも盗み見されないように、LZ78符号で符号化しておきました。
次のページ以降で復号方法を紹介します。

1.Microsoft Lenseをインストールする

符号語はとっても長いので、手で打ち込むと大変です。
「Microsoft Lense」をインストールして読み込ませます。

Download on the App Store Google Play で手に入れよう

インストールしたら起動してください。

2.スキャンする

  1. 下のモードから一番左側の「処理」を選択します
  2. 年賀状全体が映るように、撮影します

3.符号語を読み込む

  1. 読み込み枠を符号語(0と1の部分)のみを含むように調整します。
  2. できたら、右下の「確認」ボタンを押します。

4.符号語をコピーする

  1. この画面が出たら、左下の「コピー」ボタンを押します。
  2. 「テキストがコピーされました」と出たのを確認します

準備完了です。

このホップアップを閉じて、「符号語」エリアに張り付けて復号してみましょう。

2024 close
符号語:
復号結果:
返信内容:
from js import document import math def main(): codewords = document.getElementById('FlexTextarea').value codewords = codewords.replace(" ", "").replace(" ", "").replace("\n", "") display(Decode(codewords), target="result_area") #符号語列を受け取り、復号結果の記号列を返す関数 def Decode(codewords): middle_codes = [] #復号する中間符号語を格納する中間符号語クラス配列を宣言し、空で初期化する middle_codes = returnMiddleCode(codewords, middle_codes, 0) #returnMiddleCode関数を用いて、符号語列を中間符号語列に変換する symbols = MiddleDecode(middle_codes) #MiddleDecode関数を用いて、中間符号語を復号する return symbols #復号結果の記号列を返す #符号語列を受け取り、中間符号語に変換し、中間符号語クラス配列で返す関数 def returnMiddleCode(codewords, middle_codes, i): if len(codewords)>0: #受け取った符号語列の長さが0の時は、中間符号語クラス配列をそのまま返す middle_index = 0 #中間符号語の第1要素を格納する変数 | 0番目の復号は第1要素は0で固定 k=0 if i!=0: k=math.ceil(math.log2(i+1)) #中間符号語の第1要素を表すビット列長を計算する middle_index = int(codewords[:k],2) #中間符号語の第1要素を整数型で求める middle_symbol = chr(int(codewords[k:k+8], 2)) #中間符号語第2要素を、後ろに続く8桁のビット列から求める middle_codes.append(MiddleCode(middle_index, middle_symbol)) #中間符号語クラス配列に、求めた中間符号語を追加する i+=1 middle_codes = returnMiddleCode(codewords[k+8:], middle_codes, i) #符号語列の内、今回使ったビット列以降のものを用いて再び中間符号語に変換する return middle_codes #結果である中間符号語クラス配列を返す #中間符号語クラス配列を受け取り、復号結果の記号語列を返す関数 def MiddleDecode(middle_codes): Tree = [EdgeNode(0,"")] #根ノード(0)のみを持つ辞書木を宣言する symbols = "" #復号結果の記号語列を格納する変数を宣言する for middle_code in middle_codes: #中間符号語1つ1つについて parent_node = list(filter(lambda x:x.index==middle_code.index, Tree))[0] #Tree配列のノードエッジの内、インデックスが中間符号語の第1要素と一致するものを親ノードとする(ノードインデックスは一意であるから一致するものは必ず1つである) new_symbol = parent_node.stack_symbols+middle_code.symbol #親ノードのスタックシンボルに中間符号語の第2要素を連結したものが、注目している中間符号語の復号結果である symbols += new_symbol #これまでの復号結果の後ろに、新たな復号結果を連結する new_node = EdgeNode(len(Tree), middle_code.symbol, new_symbol) #新たに辞書木に追加するノードを生成する Tree.append(new_node) #新たなノードを木に追加する parent_node.setNewChildren(new_node) #新たなノードを親ノードの子ノード配列に追加する # symbols = MiddleDecode(middle_codes[i:], Tree, symbols, index) return symbols #復号結果の記号語列を返す # 中間符号語クラス # - 中間符号語の第1要素 # - 中間符号語の第2要素 # を格納する class MiddleCode: def __init__(self, index, symbol) : self.index = index self.symbol = symbol def __repr__(self): return repr((self.index, self.symbol)) # エッジノードクラス: 木のノードと、自身とその親ノードまでの辺を1セットとしたクラス # - ノードの節点番号(ノードインデックス) # - ノードとその親ノードまでをつなぐ枝のラベル # - ノードの子ノード集合(実装上、配列を用いた) # - 親要素からノードまでにたどる過程で、枝で表現される記号列(スタックシンボルと呼ぶ) # を格納する class EdgeNode: def __init__(self, index, symbol, stack_symbols="") : self.index = index self.symbol = symbol self.children = [] self.stack_symbols = stack_symbols def __repr__(self): return repr((self.index, self.symbol, self.children, self.stack_symbols)) #エッジノードオブジェクトの子ノード配列に新たなノードを追加する関数 def setNewChildren(self, new_child): self.children.append(new_child)