Yağma için Katlama


12

Giriş

Uzun bir savaştan sonra, bir Sfenks'i bir bilmeceler yarışmasında yenmeyi başardınız. Yeteneklerinizden etkilenen Sfenks, size zekanızla orantılı bir ödül vermek istiyor ve her biri rakam içeren sekiz kutuya bölünmüş büyülü bir parşömen şeridi varıyor.

"Parşömen kırışık," diyor Sfenks, "kutuların üst üste binmesi ve bu kutuların toplama veya çarpma yoluyla birleşmesi. Bir kutu kaldığında değeri altın paralarla ödülünüz olacak."

Görev

Bir liste / dizi / sekiz doğal sayıdan herhangi birini girdi olarak alan ve bir dizi 'katlama' işlemi ile elde edilebilecek maksimum ödülü döndüren / basan bir program veya işlev yazmalısınız.

mekanik

'Katlama' işlemi, bazı hücrelerde ve operatörle +veya *operatör olarak gerçekleştirilir. Listenin ilk n hücresi katlanır ve hedef hücrelerle operatör kullanılarak birleştirilir. Birleştirme işleminde tüketilmeyen hücreler değiştirilmeden bırakılır.

İşte n = 3 hücre kullanarak katlama örneği:

resim açıklamasını buraya girin

bununla sonuçlanacak her iki eklemeyi de kullanarak:

resim açıklamasını buraya girin

ya da bununla sonuçlanacak çarpma:

resim açıklamasını buraya girin

Not: Basitlik açısından, listenin uzunluğundan daha büyük veya ona eşit sayıda hücre ile kırışmaya olduğu gibi 1'den az hücre ile katlama izni verilmez. Bununla birlikte, bir liste hücre sayısının yarısından fazlasıyla kırılabilir.

8 hücreli bir liste 5 ile katlanabilir, bu da uzunluk 5'in yeni bir listesiyle sonuçlanır: operatörün kullanacağı [0,1,2,3,4,5,6,7]5 hücre tarafından katlanır .+[9,9,9,1,0]

puanlama

Standart kod golf kuralları - doğru çıktı üreten ve en az bayt sayısına sahip olan kod kazanır.

Bonus: Kodunuz aynı zamanda maksimum ödüle neden olan kırışıklık işlemleri sırasını da döndürür / yazdırırsa, puanınızı 0,8 ile çarpın. Örnek çıktı aşağıdaki gibi olabilir:

crease 5 +
crease 2 *
crease 2 +
crease 1 *

Örnekler

Şu girişleri ve sonuçları kullanarak kodunuzu şu şekilde test edin input - maximum reward:

[0, 1, 2, 3, 4, 5, 6, 7] - 7560
[0, 9, 0, 3, 2, 6, 1, 5] - 1944
[0, 1, 0, 3, 0, 2, 0, 4] - 36
[6, 0, 9, 1, 9, 0, 7, 3] - 11907
[0, 5, 2, 0, 1, 3, 8, 8] - 2560

"Puanlama" başlığı altındaki örnek çıktı geçersiz. 5 ve 2'yi kırdıktan sonra sadece 3 hücre kaldı, bu yüzden 3'ü kırmak mantıklı değil.
El-E-Gıda

İyi bir nokta. Ben değiştireceğim.
phosgene

Yanıtlar:


2

Pyth, 31 bayt

Le+bSyMsm,sMJ.T,_<bd>bdm*FkJtUb

Bu y, katlama değerini hesaplayan bir işlevi tanımlar .

Gösteri.

Bu, mümkün olan her halefin maksimum puanını alarak tekrarlayan yöntemi kullanır.

Özyinelemenin temel durumu, girdiyi olası ardılların sıralı değerleriyle birleştirerek ve ardından sonuç listesinin sonunu alarak uygulanır. Girişte yalnızca 1 öğe varsa, ardıllar yoktur ve bu nedenle listenin sonu girişteki tek öğedir.


Bunun dövüldüğünü hayal etmek zor. Belki CJam'ın bir şansı vardır?
phosgene

2

C #, 275 272 bayt

Her dalda dolaşan ve en iyi puanı veren özyinelemeli bir işlevdir.

Netlik için girintili:

using M=System.Math;
int F(int[]n){
    int b=0,g,h,i=0,j,k,l=n.Length;
    if(l<2)
        return n[0];
    for(;++i<l;){
        int[]m=new int[k=M.Max(i,l-i)],o=new int[k];
        for(j=0;j<k;j++){
            m[j]=((g=i-j-1)<0?0:n[g])+((h=i+j)<l?n[h]:0);
            o[j]=h<l&g>=0?n[g]*n[h]:m[j];
        }
        b=M.Max(b,M.Max(F(m),F(o)));
    }
    return b;
}
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.