マッチスティックパズルを解く


17

不可解なSEには、「マッチスティックの問題」と呼ばれるものがあり、そこでは数学がマッチスティックに書き込まれ、特定のプロパティを取得するために特定の数を動かすことが許可されます。

この質問では、7セグメント表示形式で表される整数のみを検討します。以下は、その形式の10桁すべてです。

 __          __   __          __    __    __    __    __
|  |     |   __|  __|  |__|  |__   |__      |  |__|  |__|
|__|     |  |__   __|     |   __|  |__|     |  |__|   __|    

ディスプレイの各セグメントは1つの「マッチ棒」であり、残りの番号とは無関係に移動できます。マッチ棒は不可分で破壊不能であり、いかなる手段によっても破壊または除去することはできません。

一般的なパズルは、ベース10で指定された数を取得し、指定された数の移動で可能な限り最大の数にすることです。移動は、使用中のスロットから他の未使用のスロットへのマッチスティックの1つの移動と見なされます。数字の両側に新しい数字を作成することは完全に許可されています。たとえば、0から77に3の動きを与えることができます

 __      __  __      __   __      __   __
|  |    |  |        |  |    |       |    |
|__| ,   __|     ,     |      ,     |    |

ただし、1つのスロットを2にしたり、既存のスロットの間に新しいスロットを作成したりすることはできません。たとえば、数字の途中で4を11にしたり、既存のスロットの間に新しい数字を挿入したりできます。各動きは適切な数字を作る必要はありませんが、最終結果はベース10 7セグメント表示の適切な数字になるはずです。あなたがしたくない場合は、すべての動きを使用する必要はありません。不可解な場合とは異なり、これは[tag:close end question] であり、答えには演算子(乗算、べき乗など)や数学定数(Pi、Grahamの数など)を使用できません

仕事

入力として数字と動きの数を取り、元の数字のその数の動きで作成できる最大数を返すプログラムまたは関数を作成します。

これは質問なので、回答はバイト単位でスコアリングされ、バイト数が少ない方が良いでしょう。

テストケース

n, moves -> max
0, 1     -> 9
0, 3     -> 77
0, 4     -> 111
8, 3     -> 74
220, 1   -> 320
220, 2   -> 520
220, 3   -> 7227
220, 4   -> 22111
220, 5   -> 32111
747, 1   -> 747
747, 2   -> 7171
747, 3   -> 7711

関連する


5
私は...昨夜遅くまで起きて、さまざまなマッチ
スティックの

1
中央に形成された空のスロットは最後に無視できますか?例:919, 2 -> 991
DanTheMan


小麦ウィザード、どのグリッドが使用されていますか?
-tuskiomi

@tuskiomi「ただし、1つのスロットを2つにしたり、既存のスロットの間に新しいスロットを作成したりすることはできません」
ポストロックガーフハンター

回答:


7

JavaScript(ES6)、297 286 279 267バイト

カリー化構文(s)(k)で入力を受け取ります。ここで、sは数字の配列、kは移動数(整数)です。

s=>k=>(B=(n,b=0)=>n?B(n^n&-n,b+1):b,b=[...p='u"[k,iy#}m'].map(c=>c.charCodeAt()+2),r=[],g=(n,d='')=>n?n>0&&b.map((v,i)=>g(n-B(v),d+i)):r.push(d))(s.reduce((s,c)=>s+B(b[c]),M=0))&&b.map((_,j)=>r.map(n=>M=[...n+p].reduce((t,d,i)=>t+B(b[d]^b[s[i-j]]),0)>k*2|+n<M?M:n))|M

テストケース


どうやって?

形状データとヘルパー関数

  • 配列bは、各ビットがセグメントである7ビット整数として数字の形状を記述します。

    7セグメント

    たとえば、「7」の形状は0b0100101 = 37です。

  • ヘルパー関数B()は、指定された数のバイナリ表現で1の数を返します。

    B = (n, b = 0) => n ? B(n ^ n & -n, b + 1) : b

ステップ1

最初に、入力番号で使用されるマッチ棒の数を数えます:

s.reduce((s, c) => s + B(b[c]), 0)

ステップ2

この値を再帰関数g()に渡します。この関数は、正確にこの数のマッチスティックで構築できるすべての数値をリストrに追加します。

g = (n, d = '') =>
  n ?
    n > 0 &&
    b.map((v, i) => g(n - B(v), d + i))
  :
    r.push(d)

たとえば、g(5)rにロード[ '17', '2', '3', '5', '71' ]されます。

ステップ#3

現在、最も高い番号を選択する必要がMR移動させるの許容数内、実際に入力された番号から得ることができるK

rの各数値nは、入力数値sと同じ数マッチスティックを使用するため、snに変換するために必要な移動数は、各桁間のセグメント差の数の半分に等しくなります。

2桁のxyのセグメントの差の数は、b [x] XOR b [y]のバイナリ表現の1の数で与えられます。

最後に、sの最初の数字は必ずしもnの最初の数字にマッピングされるとは限らないため、いくつかの可能な桁揃えを試す必要があることに注意することが重要です。数字間のシフトは、コード内の変数jによって与えられます。


1

Mathematica、188 197 200 203 170 174 バイト

注:コードはまだバグのようなものです。私はそれに取り組んでいます。

+30バイトのバグ

(p=PadLeft;q=IntegerDigits;g=Join@@(#~q~2~p~7&/@ToCharacterCode["w$]m.k{% o"][[1+q@#]])&;h=(v=g@#2~#~96-g@i~#~96;Tr@v==0&&Tr@Abs@v<=2#3)&;For[i=10^Tr@g@#,!h[p,##]&&!h[PadRight,##],--i];i)&

文字は間%oする必要があります0x7Fが、SEはそれを許可しません。pastebinリンクをクリックして、元のコードをコピーできます。

6〜7本以上のスティックがあると、コードに時間がかかります。(開始値をiより小さい数値に変更してテストできます)

説明

gfor は、数字をスティック表現のリスト(ここに記載)に変換するヘルパー関数です({1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1}for など)220

h は、2つの数値間の左詰めと右詰めを処理するヘルパー関数です。

f10^Tr@g@#(上限)から反復し1て、スティック表現の量が元の数と同じで1 -> 0あり0 -> 1、その数が2番目の引数より小さいか等しい整数を探します。


勝利の答えが他の答えよりも低いスコアを持っているのを見たことがないので、+ 1を与えました。オンラインテストのオプションがないためだと思います。Mathematicaを持っている人が来てテストし、うまく動作することを確認するかもしれません。または、可能であれば、誰かがそれをOctaveに変換できます。
-geokavel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.