配列を伸ばす


13

先ほど、配列を粉砕するプロセスを定義しました

クラッシュでは、配列を左から右に読み取ります。ある時点で2つの同じ要素が連続して出現した場合、最初の要素を削除し、2番目の要素を2倍にします。

例は、次の配列を粉砕するプロセスです

[5,2,2,4]
 ^
[5,2,2,4]
   ^
[5,2,2,4]
     ^
[5,4,4]
   ^
[5,4,4]
     ^
[5,8]
   ^

同じ要素を複数回折りたたむことができることに注意してください。この例で2,2,48、1回のパスで折りたたまれました。

配列の粉砕は簡単になりましたが、難しいのは配列を粉砕することです。あなたの仕事は、正の整数の配列を入力として受け取り、繰り返し押しつぶされたときに入力を形成できる最大の配列を出力することです。たとえば、配列[4]は粉砕によって形成され、粉砕[2,2]は粉砕によって形成され[1,1,1,1]ます。非整数値を持つ[1,1,1,1]ことはできないため、これ以上クラッシュさせることはできず、それが答えです。

この0ような配列は無期限に拡張できるため、入力配列でa を受け取ることはありません。また、同じ奇数の番号が2つ並んでいるケースを受け取ることはありません。そのようなケースは、粉砕の結果ではありません。

これはため、回答はバイト単位で測定されたソースのサイズでスコアリングされ、バイト数は少ない方が良いです。

答えを始める前に、この挑戦​​は見かけよりもはるかに難しいと言いたいだけです。進むにつれて直観を確認し、答えがすべてのテストケースに合格することを確認します。

テストケース

[] -> []
[5] -> [5]
[6] -> [3,3]
[8] -> [1,1,1,1,1,1,1,1]
[4,8] -> [1,1,1,1,1,1,1,1,1,1,2]
[2,8] -> [1, 1, 1, 1, 2, 1, 1, 1, 1]
[4,4] -> [1,1,1,1,1,1,1,1]

1
申し訳ありませんが、まだルールを理解できません。なぜ[1,1,1,1,1,1,1,1,1,1,2]プロデュース[4, 8]するの[8, 4]ですか?これはする必要がありますか[1,>1,1,1,1,1,1,1,1,1,2][2,1,>1,1,1,1,1,1,1,2][2,>2,1,1,1,1,1,1,2][4,1,>1,1,1,1,1,2][4,2,1,>1,1,1,2][4,2,>2,1,1,2][4,>4,1,1,2][8,1,>1,2][8,2,>2][8,4]
tsh

2
@tsh粉砕の仕組みに誤解があると思います。ここでは、最初のパスを取るパスは:[1,>1,1,1,1,1,1,1,1,1,2][2,>1,1,1,1,1,1,1,1,2][2,1,>1,1,1,1,1,1,1,2][2,2,>1,1,1,1,1,1,2][2,2,1,>1,1,1,1,1,2][2,2,2,>1,1,1,1,2][2,2,2,1,>1,1,1,2][2,2,2,2,>1,1,2][2,2,2,2,1,>1,2][2,2,2,2,2,>2][2,2,2,2,4>]、第二のパス:[2,>2,2,2,4][4,>2,2,4][4,2,>2,4][4,4,>4][4,8>]。うまくいけばそれで解決するでしょう。いくつかのコードに前の質問を見てもらいたい場合は、クラッシュ関数を実装する回答があります。
ポストロックガーフハンター

それぞれが改行で区切られた数値を出力しても大丈夫ですか?
スコッティネット

@scottinetこれはリストを出力する合理的な方法です。どうぞ。
ポストロックガーフハンター

テストケースでは[4, 4]、我々はストレッチした後、その配列を得ることはできないとして、削除する必要があります=>クラッシュシーケンス、これはとなってしまいますので、[8]
scottinet

回答:


2

JavaScript(Node.js)237 221 213 186バイト

f=a=>a.map(b=>{for(i=1;~b%2;b/=2)i*=2;return Array(i).fill(b)}).reduce((t,c,i,s)=>{b=c.slice();if(i)r=2*s[--i].length,b.length>=r&&b[0]==s[i][0]?b[r-2]+=b.pop():b;return t.concat(b)},[])

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

このアルゴリズムは、各数値を最大値に引き伸ばすことで最適な引き伸ばされた配列を計算し、必要に応じて適切な位置で数値のペアを押し戻し、「クラッシュブロッカー」を効果的に作成し、前の番号のクラッシュシーケンスを中断します。

例えば:

[1, 1, 1, 1, 1, 1]与え[4,2]破砕した後、しかし[1, 1, 1, 1, 2]結果で[2, 4]

課題は、結果の配列を押しつぶすことで正しい結果が得られるように、押しつぶしブロッカーを正確に配置する場所を決定することです。

  • クラッシュブロッカーを配置する必要があるのは、以前のストレッチされた数が現在の数と等しく、現在のストレッチされたシーケンスが以前のものよりも大きい場合のみです。たとえば[2, 4]、クラッシュブロッカーが必要です(引き伸ばされた数は1、繰り返され、[1, 1]より短い[1,1,1,1])が[4, 2][2, 6]必要ありません
  • n前のストレッチされたシーケンスを呼び出し、上記の条件が検証された場合、現在のシーケンスはシーケンスの繰り返しですn。前の番号のクラッシュシーケンスを中断するには、nストレッチする現在の番号の2番目のシーケンスの最後にクラッシュブロッカーを配置する必要があります。例:[2, 8] => [(1, 1)=n, (1, 1) + (2) + (1, 1) + ...]、または[4, 8] => [(1, 1, 1, 1)=n, (1, 1, 1, 1) + (1, 1, 2) + ...]


1

パイソン2230の 228 226バイト

入力リストと同じ合計ですべての可能なリストを反復することにより機能します。押しつぶされた状態の入力配列と等しくないものを削除し、最も長いものを選択します。

編集:ifメイン関数のを削除して-2バイト

編集: 2つの不要な角かっこを削除して-2バイト

lambda x:max((c(z[:],x),len(z),z)for z in b(sum(x)))[2]
def c(x,y):
 i=e=1
 while x[i:]:
	if x[~-i]==x[i]:del x[i];i-=1;x[i]*=2;e=2
	i+=1
 return x==y or~-e and c(x,y)
b=lambda s:[z+[-~i]for i in range(s)for z in b(s+~i)]+[[]]

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

説明

すべての可能な解決策を見つけ、最も長いものを選択する主な機能

lambda x:max((c(z[:],x),len(z),z)for z in b(sum(x)))[2]

yがクラッシュの1つに等しいかどうかをチェックするクラッシュ機能。

def c(x,y):
 i=e=1
 while x[i:]:
	if x[~-i]==x[i]:del x[i];i-=1;x[i]*=2;e=2
	i+=1
 return x==y or~-e and c(x,y)

指定された合計で可能なすべての順列を生成します

b=lambda s:[z+[-~i]for i in range(s)for z in b(s+~i)]+[[]]

0

05AB1E41 37バイト

vy[DÉ#2÷]DYQX©NoDU‹&sDV¸X∍sić·®·Íǝ}»,

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

私のJavascriptソリューションのポート。

説明:

vy                   for each member of the list
[DÉ#2÷]              divide by 2 until odd: stack = stretched value, N = iterations
DYQ                  stetched value equal to the previous one?
X©NoDU‹              previous size < current one? (+store the new size in X)
&                    AND on the 2 previous tests
sDV¸X∍s              build a list of the new stretched value repeated X times
                      (+store the new stetched value in Y)
ić·®·Íǝ}             if the previous tests are true:
                       reduce the result list size by 1
                       multiply by 2 the number at the crush block position
»,                   join by newline + print the list
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.