デジタルクロックマッチパズル


10

特定の数のマッチを追加、削除、または移動して新しい数または形を作成することを含む、マッチに関する多くのパズルがあります。これはデジタル時計のようなものです。

12時間のデジタル時計の有効な時間を考慮して、最も少ない行を移動する必要がある数字を出力して、時計上のすべての可視数字がその数字になるようにします。2桁以上の場合は、すべて出力してください。すべての桁を同じにすることが不可能である場合、出力-1または0以外の偽の値(これらの多くが得られます)。

時計の数字は次のようになります。

  |
  |
 _
 _|
|_
 _
 _|
 _|

|_|
  |
 _
|_
 _|
 _
|_
|_|
 _
  |
  |    
 _ 
|_|
|_|
 _
|_|
 _|
 _
| |
|_|

テストケース:

入力: 123

時計表示:

       _   _
  | :  _|  _|
  | : |_   _|

出力: 4

説明:の表示で1:23は、合計12本の線を引く必要があります。したがって、すべての桁が同じになるには、各桁に4行が必要です。4行ある唯一の数字は4です。したがって、答えはでなければなりません4

入力: 1212

時計表示:

     _        _
  |  _| :  |  _|
  | |_  :  | |_

出力: -1

説明:の表示に12:12は14行が必要です。14を4で割った値は整数ではないため、すべての桁を同じにすることは不可能です。

入力: 654

時計表示:

 _     _  
|_  : |_  |_|
|_| :  _|   |

出力: 5

説明:行の総数は15です。15を3で割ると5になるため、各桁には5行が必要です。5つのラインを持っている唯一の数字であり235。答えは5、すべての数字を5にするために2回の移動しか必要ないためです。6の左下の線を4の最下部に移動するだけで、次のようになります。

 _     _  
|_  : |_  |_|
 _| :  _|  _|

次に、ご覧のとおり、元々4だった数字の右上の行を上に移動するだけで、が得られ5:55ます。すべての数字aを作るために、2または32つの以上の移動が必要となります。

入力: 609

時計表示:

 _     _   _
|_  : | | |_|
|_| : |_|  _|

出力:6096,0,9または[6,0,9]もOK)。

説明:60、および96つのラインを持っている唯一の数字です。そのため、これらは唯一の可能な解決策でもあります。これらのいずれかを唯一の数字にするために2つの動きが必要であることを理解するのは難しくありません。したがって、3桁すべてを出力します。

ノート:

  • 入力時間は有効である必要がありますが、出力時間は有効ではありません(たとえば999、出力には問題がないため)。
  • 私は入力に関して非常に柔軟です。先頭に0を付けることができます。小数点付きの数値を使用できます。文字列を使用できます。配列を使用できます。すべての桁にパラメータを設定できます。

回答:


1

ジュリア、160 157 154

x->(c=count_ones;l=[119;36;93;109;46;107;123;37;127;111];m=l[x+1];n=map(a->c(a)==mean(map(c,m))?sum(map(b->c(a$b),m)):1/0,l);find(n.==minimum(n).!=1/0)-1)

これはラムダ関数です。これを変数に割り当てて呼び出します。0-9任意の長さの範囲の整数のベクトルを受け入れ、結果の(おそらく空の)ベクトルを返します。

テストケース

julia> clock = x->(c=co...        # assign function to variable
(anonymous function)

julia> clock([1 2 3])
1-element Array{Int64,1}:
 4

julia> clock([1 2 1 2])
0-element Array{Int64,1}

julia> clock([6 5 4])
1-element Array{Int64,1}:
 5

clock([6 0 9])
3-element Array{Int64,1}:
 0
 6
 9

説明

7つのセグメントを列挙し、それらをビットベクトルとして表します。

+---+                     +-0-+
|   |      Enumerate      1   2
+---+   >  the seven  >   +-3-+
|   |      segments       4   5
+---+                     +-6-+

例:( 1セグメント2 + 5が有効)は36(ビット2 + 5セット)になります。
数字の表記は次のとおり0-9です。

l=[119;36;93;109;46;107;123;37;127;111];
m=l[x+1];

数字をインデックスとして使用して、ビットベクトル表現を取得できます。+1juliaでは1ベースのインデックス付けのため。

この関数c=count_ones;は、整数の1ビットの数をカウントします。より頻繁に必要になるため、エイリアスを割り当てます。

完全なプログラム、やや手に負えないもの:

x->(
  c=count_ones;
  l=[119;36;93;109;46;107;123;37;127;111];
  m=l[x+1];
  n=map(a->c(a)==mean(map(c,m))?sum(map(b->c(a$b),m)):1/0,l);
  find(n.==minimum(n).!=1/0)-1
)

ここで、最後の2行の詳細:

mean(map(c,m)) 入力桁ごとの平均行数を計算します。

n=map(a->...,l) すべての数字のベクトル表現をループします。

現在の数字の行数がa入力の平均行数と等しくない場合は、を返しinfます。

c(a)==mean(map(c,m))?...:1/0

そうでない場合は、現在の桁とすべての入力桁の間のハミング距離の合計を返します。

sum(map(b->c(a$b),m))

これで、すべての入力桁をその数値に変換するために実行する必要がある追加/削除の合計数を示す数値を表すn長さのベクトルが得られました。または、そのような変換が行数を変更せずに不可能である場合。100-9inf

find(n.==minimum(n).!=1/0)-1

最後に、ではないすべての最小値の位置(0ベース)を出力しますinf

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