Bir diziyi genişletme


13

Daha önce bir dizi ezme işlemini tanımladım

Bir çarpışmada diziyi soldan sağa okuyoruz. Bir noktada, aynı öğenin üst üste ikisiyle karşılaşırsak, ilkini kaldırır ve ikincisini iki katına çıkarırız.

Örneğin, aşağıdaki diziyi ezme süreci

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

Aynı öğenin birden çok kez daraltılabileceğini unutmayın. Örnekte tek geçişte 2,2,4çöktü 8.

Şimdi dizileri ezmek kolaydır, ne zor onları ezmektir. Göreviniz bir dizi pozitif tamsayı girdi olarak almak ve tekrar tekrar ezildiğinde girdiyi oluşturabilecek en büyük diziyi çıkarmaktır. Örneğin dizi [4], ezme ile oluşan ezme [2,2]ile oluşturulur [1,1,1,1]. Tamsayı olmayan değerlere [1,1,1,1]sahip olamadığımız için daha fazla kırılamaz ve bu nedenle cevabımızdır.

Bu 0tür diziler süresiz olarak genişletilebileceğinden, giriş dizinizde hiçbir zaman a almazsınız . Ayrıca hiçbir zaman yan yana aynı tek sayıya sahip bir dava almazsınız, bu gibi durumlar ezilmenin sonucu olamaz.

Bu bu nedenle cevaplar kaynaklarının boyutu bayt cinsinden ölçülür ve daha az bayt daha iyi olur.

Cevabınızı vermeden önce, bu zorluğun göründüğünden çok daha zor olduğunu söylemek istiyorum. Devam ederken sezginizi kontrol edin ve cevabınızın tüm test senaryolarını geçtiğinden emin olun.

Test Durumları

[] -> []
[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
Üzgünüm ama kuralı hala anlayamıyorum. neden yerine [1,1,1,1,1,1,1,1,1,1,2]üretiyoruz ? Bu olmalı , , , , , , , , , ? [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 Bence ezmenin nasıl işlediğine dair bir yanılgı var. Burada ilk pası alıyor yol: [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>], ikinci geçiş: [2,>2,2,2,4], [4,>2,2,4], [4,2,>2,4], [4,4,>4], [4,8>]. Umarım bu onu temizler. Eğer bazı kod önceki soruya bakmak istiyorsanız kırma işlevi uygulayan cevapları vardır.
Ad Hoc Garf Hunter

Her biri bir satırsonu karakteriyle ayrılmış sayılar çıkarsam sorun olmaz mı?
scottinet

@scottinet Bu, bir liste çıkarmanın makul bir yoludur. Devam et.
Ad Hoc Garf Hunter

Test [4, 4]dizisi kaldırılmalıdır, çünkü bu diziyi bir streç => ezilme dizisinden sonra asla alamayacağız, çünkü bu sona erecek[8]
scottinet

Yanıtlar:


2

JavaScript (node.js) , 237 221 213 186 bayt

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)},[])

Çevrimiçi deneyin!

Bu algoritma, her bir sayıyı maksimuma çıkararak optimum gerilmiş dizileri hesaplar ve daha sonra gerekirse bir çift sayıyı doğru yerde ezerek etkili bir şekilde bir "ezilme engelleyici" oluşturarak önceki sayının ezilme sırasını kesintiye uğratır.

Örneğin:

[1, 1, 1, 1, 1, 1]verir [4,2]ezilmiş bir kez, ancak [1, 1, 1, 1, 2]sonuçları[2, 4]

Zorluk, sonuçta oluşan dizinin ezilmesinin doğru sonucu vermesi için tam olarak bir ezilme engelleyicinin nereye yerleştirilmesi gerektiğini belirlemektir:

  • Bir ezilme engelleyicinin yalnızca bir önceki uzatılmış sayı mevcut olana eşitse ve mevcut uzatılmış dizi bir öncekinden daha büyükse yerleştirilmelidir. Örneğin, [2, 4]bir ezilme engelleyici gerektirir (gerilmiş sayı olduğu 1, tekrarlanan ve [1, 1]daha kısadır [1,1,1,1]), ancak [4, 2]ve [2, 6]şifreye gerek olmasa
  • nönceki uzatılmış sekansı çağırırsak ve yukarıdaki koşul doğrulanırsa, geçerli sekans sekansın bir tekrarıdır n. Önceki sayının ezilme dizisini kesmek için, ezilme engelleyiciyi ngermek için mevcut sayının ikinci dizisinin sonuna yerleştirmemiz gerekir . Örnek:, [2, 8] => [(1, 1)=n, (1, 1) + (2) + (1, 1) + ...]veya[4, 8] => [(1, 1, 1, 1)=n, (1, 1, 1, 1) + (1, 1, 2) + ...]


1

Piton 2 , 230 228 226 bayt

Giriş listesiyle aynı toplamdaki tüm olası listeleri yineleyerek çalışır. Bazı ezilmiş durumlarda giriş dizisine eşit olmayanları kaldırmak, en uzun olanı seçmek.

Düzenleme:if Ana işlevde kaldırarak -2 bayt

Düzenleme: İki gereksiz köşeli parantez kaldırarak -2 bayt

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)]+[[]]

Çevrimiçi deneyin!

açıklama

Ana işlev, tüm olası çözümleri bulmak ve en uzun olanı seçmekle sorumludur

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

Ezme işlevi, y'nin ezmelerden birine eşit olup olmadığını kontrol eder.

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)

Verilen toplamla olası tüm permütasyonları üretin

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

0

05AB1E , 41 37 bayt

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

Çevrimiçi deneyin!

Javascript çözümümün bağlantı noktası.

açıklamalar:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.