Python3、モンテカルロタイムです!
この問題を解決するために、最初にデフォルトのキーボードで必要な「クリック」回数をカウントします(最初はabc,def,ghi,jkl,mno,pqrs,tuv,wxyz)。次に、このキーボードを変更して、価格が安いかどうかを確認します(テキストは少ないクリックで記述されます)。このキーボードが安価な場合は、デフォルトのキーボードになります。このプロセス1M時間を繰り返します。
キーボードを変更するには、最初に変更する数を決定します(変更の最大数は、キーボードの文字の総数です)。次に、すべてのスイッチに対して、2つのボタンと2つの位置を選択し、最初の位置から2番目の位置にキャラクターを転送します。
1回あたりのスイッチの最大数は、2つの完全に異なるキーボードから切り替える必要がある変更の最小数であるため、キーボードの文字数です。(あるキーボードから他のキーボードにいつでも切り替えることができるようにしたい)
出力 echo "jackdawslovemybigsphinxofquartz" | python .\myscript.pyは次のとおりです。
61 ['anb', 'sef', 'hjc', 'iykl', 'odm', 'qgr', 'tuxv', 'wpz']
61特定のメッセージを作成するために押されたボタンの数はどこにあります。
文字(スペースおよびコメントなし):577
私はその長いことを知っていますが、私はこのものに本当に新しいです。
from random import *
S=['abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
def P(L): # perform a switch of the keys of the keyboard:to switch from a given keyboard to another, the maximum number of exchanges is the number of the keys.
R=randint
N = len(''.join(L))
W = randint(1,N) # decide how many switches to perform
EL = list(L)
for i in range(0,W):
B1=R(0,len(EL)-1) # decide what buttons are considered in the switch
B2=R(0,len(EL)-1)
if len(EL[B1])==0: continue
P1=R(0,len(EL[B1])-1) # decide what letter to switch and where
if len(EL[B2])==0: P2=0
else: P2=R(0,len(EL[B2])-1)
C1 = EL[B1][P1]
EL[B1]=EL[B1].replace(C1,'')
EL[B2]=EL[B2][:P2]+C1+EL[B2][P2:]
return EL
def U(L,X): # count how many clicks you need to compose the text X
S=0
Z=' '
for A in X:
for T in L:
if A in T and Z not in T: S+=1+T.index(A)
if A in T and Z in T: S+=3+T.index(A) # if the last character was in the same button..here the penality!
Z=A
return S
X=input()
n_iter=10**6
L = list(S)
cc=U(L,X)
print(cc,L)
for i in range(0,n_iter): #do some montecarlo stuff
cc=U(L,X)
pl=P(L)
pc=U(pl,X)
if(cc>pc):
L=pl
print(pc,L)
とてもおもしろいと思ったので、このアルゴリズムをLO HOBBITで試すことにしました(自宅にもオリジナルのコピーがあります!)。それには383964文字があり、これらは私が見つけているカップルのクリック対キーパッドです:
909007 ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
879344 ['abkc', 'def', 'gqhi', 'jl', 'mno', 'rs', 'tupv', 'wxyz']
861867 ['abg', 'def', 'qhyi', 'jcl', 'mno', 'r', 'tupxv', 'swkz']
851364 ['abg', 'e', 'qchi', 'jyl', 'mn', 'dr', 'tupxv', 'sowkfz']
829451 ['ag', 'ef', 'qchi', 'jyl', 'mn', 'dbr', 'tupxv', 'sowkz']
815213 ['amg', 'ef', 'qch', 'ojyl', 'i', 'dbnr', 'tupxv', 'swkz']
805521 ['amg', 'ef', 'ch', 'ojyl', 'qi', 'dbnr', 'tupxv', 'swkz']
773046 ['amg', 'ef', 'ch', 'ojyl', 'qi', 'bnr', 'tupxv', 'dswkz']
759208 ['amg', 'eqf', 'ch', 'ojyl', 'i', 'bnr', 'tupxv', 'dswkz']
746711 ['ag', 'ekq', 'clh', 'sojy', 'bi', 'nmfr', 'tupxv', 'dwz']
743541 ['ag', 'ekq', 'clh', 'sojy', 'bi', 'nmfr', 'tpxv', 'dwuz']
743389 ['ag', 'ekq', 'clh', 'sojy', 'i', 'nmfr', 'tpxbv', 'dwuz']
734431 ['ag', 'ekq', 'lh', 'sjy', 'ci', 'nrf', 'tpxbv', 'dowumz']
705730 ['ag', 'oekq', 'lh', 'sjy', 'ci', 'nrf', 'tpxbv', 'dwumz']
691669 ['ag', 'oekq', 'lh', 'nsjy', 'ic', 'rf', 'tpxbv', 'dwumz']
665866 ['ag', 'hokq', 'el', 'nsjy', 'ic', 'rbf', 'tpxv', 'dwumz']
661610 ['agm', 'hokq', 'e', 'nsj', 'ilc', 'rbf', 'tpyxv', 'dwuz']
それで、私はこの最後のものが(クリックに関して)最も実用的なキーパッドの一つであると主張します。