Creasing for Loot


12

บทนำ

หลังจากการต่อสู้ที่ยาวนานคุณสามารถเอาชนะสฟิงซ์ได้ในการแข่งขันปริศนา สฟิงซ์สร้างความประทับใจให้กับทักษะของคุณปรารถนาที่จะให้รางวัลแก่คุณด้วยความฉลาดของคุณและเสกให้กลายเป็นแผ่นหนังเวทย์มนตร์ที่แบ่งออกเป็นแปดกล่องแต่ละกล่องมีตัวเลข

"สร้างกระดาษหนัง" สฟิงซ์กล่าว "กล่องซ้อนทับกันและกล่องเหล่านั้นจะรวมเข้าด้วยกันด้วยการบวกหรือการคูณเมื่อกล่องใดกล่องหนึ่งเหลืออยู่ค่าของมันจะเป็นรางวัลของคุณในเหรียญทอง"

งาน

คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นที่ใช้เป็นรายการ / อาเรย์ / ตัวเลขแปดตัวใด ๆ และป้อนกลับ / พิมพ์รางวัลสูงสุดที่เป็นไปได้ที่ได้รับผ่านชุดการดำเนินงาน 'รอยพับ'

กลศาสตร์

ของรอยพับ 'การดำเนินงานจะดำเนินการในจำนวนของเซลล์บางส่วนและมีทั้ง+หรือ*เป็นผู้ประกอบการ n เซลล์แรกของรายการจะถูกพับและรวมเข้ากับเซลล์ปลายทางโดยใช้โอเปอเรเตอร์ เซลล์ใด ๆ ที่ไม่ได้ใช้ในการดำเนินการผสานจะไม่ได้รับการแก้ไข

นี่คือตัวอย่างของการตีโดยใช้ n = 3 เซลล์:

ป้อนคำอธิบายรูปภาพที่นี่

ใช้อย่างใดอย่างหนึ่งนอกจากนี้ซึ่งจะส่งผลในนี้:

ป้อนคำอธิบายรูปภาพที่นี่

หรือการคูณซึ่งจะส่งผลให้สิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ: เพื่อความง่ายการไม่อนุญาตให้มีการ creasing ที่มีเซลล์น้อยกว่า 1 เซลล์เช่นเดียวกับ creasing ที่มีจำนวนเซลล์มากกว่าหรือเท่ากับความยาวของรายการ อย่างไรก็ตามรายชื่อสามารถลดจำนวนเซลล์ได้มากกว่าครึ่ง

รายการ 8 เซลล์สามารถยับ 5 ส่งผลให้ในรายการใหม่ของความยาว 5: [0,1,2,3,4,5,6,7]ยับ 5 เซลล์โดยใช้ผู้ประกอบการจะให้+[9,9,9,1,0]

เกณฑ์การให้คะแนน

กฎของรหัสกอล์ฟมาตรฐาน - รหัสที่สร้างผลลัพธ์ที่ถูกต้องและมีจำนวนไบต์น้อยที่สุดที่ชนะ

โบนัส: หากรหัสของคุณส่งคืน / พิมพ์ลำดับการพับซึ่งนำไปสู่รางวัลสูงสุดให้คูณคะแนนของคุณด้วย 0.8 เอาต์พุตตัวอย่างอาจมีลักษณะดังนี้:

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

ตัวอย่าง

ทดสอบรหัสของคุณโดยใช้อินพุตและผลลัพธ์เหล่านี้ในรูปแบบของ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

ตัวอย่างผลลัพธ์ภายใต้หัวข้อ "การให้คะแนน" ไม่ถูกต้อง หลังจากการพับ 5 และ 2 มีเซลล์เหลือเพียง 3 เซลล์ดังนั้นการพับ 3 จึงไม่สมเหตุสมผล
Hand-E-Food

จุดดี. ฉันจะเปลี่ยนมัน
phosgene

คำตอบ:


2

Pyth, 31 ไบต์

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

ฟังก์ชันนี้กำหนดฟังก์ชันyซึ่งคำนวณค่ารอยพับ

สาธิต.

วิธีนี้ใช้วิธีการซ้ำ ๆ กันซึ่งจะได้คะแนนสูงสุดของผู้สืบทอดที่เป็นไปได้

กรณีพื้นฐานของการเรียกซ้ำถูกนำไปใช้โดยการต่อข้อมูลเข้ากับค่าที่เรียงลำดับของผู้สืบทอดที่เป็นไปได้จากนั้นนำจุดสิ้นสุดของรายการผลลัพธ์ หากมีเพียงองค์ประกอบเดียวในอินพุตจะไม่มีผู้สืบทอดดังนั้นจุดสิ้นสุดของรายการจึงเป็นองค์ประกอบหนึ่งในอินพุต


มันยากที่จะจินตนาการว่าสิ่งนี้จะพ่ายแพ้ บางที CJam มีโอกาส?
ฟอสจีน

2

C #, 275 272 ไบต์

มันเป็นฟังก์ชั่นเรียกซ้ำที่ลัดเลาะไปตามทุกสาขาและให้คะแนนที่ดีที่สุด

เยื้องเพื่อความชัดเจน:

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.