古いコードレス電話


9

友達に電話する必要がありますが、コードレス電話のボタンが正しく機能しません。押すことができるボタンは、[上へ]、[下へ]、[通話]のみです。[上へ]および[下へ]を使用して最近の通話をナビゲートし、[通話]を使用して選択した名前を呼び出すことができます。私の電話にはN最近の通話を保持するリストがあり、私が呼び出す必要があるすべての友達がこのリストに含まれていることを知っています。


仕事:

番号Nと名前のリストが表示されますL

  • N 私の電話が覚えている最近の通話の数です。
  • L 私が呼ぶ必要がある順序で名前を持っています

最近の通話リストを最適に配置するために必要なボタンを押す回数を出力する必要があります。


例:

->入力:

アンナ、ボブ、そしてアンナを再び呼び出します。サイズ5の最近の通話リスト。

5
Anna
Bob
Anna

->出力:

可能な最適配置: Anna, Foo, Bar, Foobar, Bob

5    # Key presses: [Call] Anna, [Up] + [Call] Bob, [Down] + [Call] Anna

その他のテストケース:

Input: 5, Anna, Bob, Carl
Output: 5

Input: 5, Anna, Bob, Carl, Anna
Output: 8

Input: 5, A, B, C, D, E, A
Output: 11

Input: 6, A, B, C, D, E, A
Output: 12

Input: 4, A, B, C, B, A
Output: 10

ルール:

  • カーソルは常にリストの最初の位置から始まります。
  • 入力Nを取得し、Lキーボード、パラメーター、ファイルなどの任意のソースから取得できます。
  • リスト内の名前は、次のような適切な形式にすることができます。文字列、整数、文字。
  • 最近の通話リストの最後に達して、もう一度[下]を押すと、カーソルが一周します。最近の通話リストの最初にいて[Up]を押すと、同じことが起こります。
  • 誰かに電話をかけると、その人の名前が最近の通話リストの最初の位置に移動し、残りは押し下げられます。
  • 誰かに電話をかけると、カーソルが最初の位置に移動します。
  • 友達の名前は、最近の通話リストに複数回表示することはできません。
  • 最近の通話リストにダミーのエントリを入力できます(例を参照)。
  • 電話をかける友達の数はを超えませんN

回答:


1

Ruby97 95 94バイト

->n,a{r=a.size;1.upto(r-1){|i|r+=[p=a[(a[0,i].rindex(a[i])||i-2)+1...i].uniq.size,n-p].min};r}

オンラインでお試しください!

最適な配置では、名は1回押す(Call)。まだ呼び出されていない名前は、2回押す(Up Call)と、それ以降に呼び出された他の一意の名前の数と、リストの上部または下部のどちらに配置するかによって、番号が変化する名前になります。

これはWaffleCohnの戦略に類似または同一の戦略だと思います。


3

Pythonの3195の 185 164バイト

-4バイト@notjaganのおかげで
-27バイト@FelipeNardiBatistaのおかげで

lambda n,l:min(g([*x],l,n)for x in permutations(range(n)))
def g(x,l,n,r=0):
 for p in l:a=x.index(p);x=[x.pop(a)]+x;r-=~min(a,n-a)
 return r
from itertools import*

オンラインでお試しください!

L からの整数のリストとして [0, N)



@notjaganこれは、新しいリストオブジェクトへのx=[x[a]]+x[:a]+x[a+1:]割り当てとして機能していませんx。古いリストオブジェクトのメソッドのiままですindex
ovs

@ovs フェリペの提案と私が持っていなかったものを使用して-10バイトx.indexます。
notjagan


@FelipeNardiBatistaは感謝します
ovs

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.