Shubbles and Smoles - ตอนที่ 1


10

การตั้งค่า

พิจารณากล่องรูปทรงแปลก ๆ ที่มีเซลล์จำนวน 29 เซลล์ดังแสดงในรูปที่ 1 ด้านล่าง

ฟองและ Smoles

ภายในกล่อง 2D นี้เป็นสัตว์ที่มีรูปทรงสี่เหลี่ยมสองชนิดคือฟองอากาศและสโมล รูปที่ 1 (a) แสดงฟองอากาศสีน้ำเงินและมีสีแดงบางส่วน สิ่งมีชีวิตแต่ละคนตรงหนึ่งเซลล์ตาราง กล่องอาจมีที่ใดก็ได้ระหว่าง 0 ถึง 26 ฟอง แต่จะมีสองช่องเสมอ

เมื่ออยู่ภายใต้แรงดึงดูดของโลกฟองและปล่องจะนั่งอยู่ที่ด้านล่างของกล่อง ทั้งสองสปีชีส์ขี้เกียจเป็นพิเศษและยังคงนิ่งเฉยอยู่ตลอดเวลา

กล่องยังมี stot ซึ่งแสดงเป็นสี่เหลี่ยมจัตุรัสสีดำซึ่งตรงกับเซลล์กริดหนึ่งเซลล์ จุดที่ไม่อยู่ภายใต้แรงโน้มถ่วง

กล่องมีช่องเปิดหนึ่งช่องที่ด้านล่างของเซลล์ 28 ดังแสดงในรูป

เพื่อเป็นตัวแทนของการกำหนดค่าของฟอง, Smoles และ stot ในกล่อง textually เราใช้สตริง 29 ตัวอักษรหนึ่งตัวต่อเซลล์ตารางในลำดับที่ระบุด้วยการ.เป็นตัวแทนของเซลล์ที่ว่างเปล่าoแทนเศษเล็กเศษน้อยxเป็นตัวแทนของ smole และ@เป็นตัวแทนของ stot ยกตัวอย่างเช่นการกำหนดค่าของมะเดื่อ. 1 (ก) .........@...o....ooo..xox...เป็นตัวแทนจากสตริง

กิจวัตร

กล่องสามารถหมุนได้หลายเท่าของ 90 ° ในขณะที่กล่องกำลังถูกหมุนฟองอากาศและสไมลส์จะยังคงอยู่กับที่ภายในเซลล์กริด ทันทีที่การหมุนเสร็จสมบูรณ์พวกมันจะตกลงไปข้างล่างจนกว่าi ) พวกมันถูกบล็อกโดยกำแพงด้านล่างii ) พวกมันถูกบล็อกโดย shubble, smole หรือ stot ด้านล่างหรือiii ) มันตกลงไปในรูในเซลล์ 28 และออกจากกล่อง Stot ไม่ตก มันยังคงอยู่ในเซลล์ปัจจุบันแม้ว่าสิ่งมีชีวิตจะอยู่ด้านบน

กล่องไม่สามารถหมุนได้อีกจนกว่าสัตว์จะล้มและได้มาถึงการกำหนดค่าที่มั่นคงใหม่

โดยปกติการหมุนของกล่องจะแสดงแทนด้วย+การหมุนตามเข็มนาฬิกา 90 ° |สำหรับการหมุน 180 °และ-สำหรับการหมุนทวนเข็มนาฬิกา 90 °

นอกจากนี้ stot สามารถเคลื่อนย้ายได้ในทิศทางเข็มทิศสี่ทิศทางโดยเพิ่มขึ้นทีละหนึ่งเซลล์ การเคลื่อนไหวอาจไม่: i ) ทำให้เกิดการปะทะกันระหว่าง stot และสัตว์ (เช่นเซลล์กริดปลายทางต้องว่างเปล่า) ii ) ทำให้เกิดการชนกันระหว่าง stot และ wall และiii ) ทำให้ stot ออกจากกล่องผ่าน หลุมในเซลล์ 28

นอกจากนี้ stot อาจไม่เคลื่อนไหวหากมีสิ่งมีชีวิตใด ๆ วางอยู่ด้านบนของมัน (ด้วยความเคารพต่อแรงโน้มถ่วงในปัจจุบัน)

โดยทั่วไปแล้วการเคลื่อนที่แบบสต๊อตจะถูกแทนด้วย<สำหรับซ้าย, >ขวา, ^ขึ้นและvลง การเคลื่อนไหวแบบสต็อตมักระบุตามกรอบ "มาตรฐาน" (ไม่หมุน) ซึ่งแสดงในรูป นั่นคือถ้า stot อยู่ในเซลล์ 10 การเคลื่อนที่^จะย้ายไปที่เซลล์ 5 เสมอและการเคลื่อนที่>จะย้ายไปที่เซลล์ 11 เสมอการวางแนวของกล่องจะไม่ส่งผลกระทบต่อทิศทางของการเคลื่อนที่

ลำดับของการจัดการจะถูกเข้ารหัสโดยใช้สตริงอักขระจากซ้ายไปขวา ตัวอย่างเช่นสตริง+<<^-ระบุว่ากล่องหมุนตามเข็มนาฬิกา 90 °จากนั้น stot จะถูกย้ายไปทางซ้ายสองครั้งขึ้นไปหนึ่งครั้ง (เทียบกับกรอบมาตรฐาน) จากนั้นกล่องจะหมุน 90 องศาทวนเข็มนาฬิกากลับสู่ทิศทางเดิม

ความท้าทาย

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

ก่อนที่จะแก้ปัญหานี้เราจะต้องจำลองว่าการเปลี่ยนแปลงที่หลากหลายของเราจะมีผลต่อเนื้อหาของกล่องซึ่งเป็นจุดสนใจของการท้าทายนี้อย่างไร

คุณต้องเขียนโปรแกรมที่ยอมรับสองข้อโต้แย้งจากstdin(หรือเทียบเท่า):

  • สตริงที่อธิบายถึงสถานะเริ่มต้นของกล่อง
  • ลำดับของการยักย้ายถ่ายเท

คุณอาจสมมติว่าอาร์กิวเมนต์ทั้งสองนั้นมีความถูกต้องตามหลักไวยากรณ์กล่องเริ่มต้นในการวางแนวมาตรฐานและสถานะเริ่มต้นของกล่องนั้นเสถียรและถูกกฎหมาย

โปรแกรมจะต้องส่งออกไปยังstdout(หรือเทียบเท่า) อย่างใดอย่างหนึ่ง:

  • ( กรณีที่ 1 ) สถานะสุดท้ายของกล่องซึ่งแสดงเป็นสตริงหากลำดับของการเคลื่อนไหวนั้นถูกกฎหมาย (มันไม่ได้ละเมิดกฎการเคลื่อนที่ของสโต๊ต) และไม่ทำให้เกิดสโมลใด ๆ ที่จะออกจากกล่อง การวางแนวสุดท้ายของกล่องนั้นไม่สำคัญ

  • ( กรณีที่ 2 ) เครื่องหมายอัศเจรีย์เดี่ยว!หากลำดับของการเคลื่อนไหวผิดกฎหมายหรือเป็นสาเหตุให้มีการออกจากกล่อง

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

โปรแกรมที่ชนะคือโปรแกรมที่สั้นที่สุดด้วยจำนวนไบต์ซึ่งขึ้นอยู่กับตัวคูณโบนัสที่มีกำไรมาก:

  • อ้างสิทธิ์ตัวคูณ 0.65ถ้าแทนที่จะพิมพ์ผลลัพธ์ที่เข้ารหัสสำหรับกรณีที่ 1 โปรแกรมจะแสดงรูปภาพ ASCII ของกล่องในสถานะสุดท้ายและการวางแนวโดยใช้อักขระข้อมูลจำเพาะสำหรับฟองอากาศ smoles stots และเซลล์ว่างและวาง a *ในเซลล์นอกรูในเซลล์ 28 ช่องว่างนำหน้าและต่อท้ายจะถูกละเว้น

    ตัวอย่างเช่นถ้ารูปที่ 1 (a) ถูกหมุน 90 °เอาต์พุตจะเป็น

       .  .
      .....
      .o...
      xo.@.
     *ooo..
      x  .
    
  • อ้างสิทธิ์ตัวคูณ 0.22ถ้าแทนที่จะพิมพ์ผลลัพธ์ที่เข้ารหัสสำหรับกรณีที่ 1 โปรแกรมจะส่งไฟล์ภาพหรือแสดงหน้าต่าง GUI พร้อมรูปภาพของกล่องในสถานะสุดท้ายและการวางแนว รูปภาพควรอยู่ในรูปแบบของรูปที่ 1 (a) แสดงเซลล์กริดผนังและสิ่งมีชีวิต / stot โดยใช้กล่องสี

  • อ้างสิทธิ์ตัวคูณ 0.15ถ้าแทนที่จะพิมพ์เอาท์พุทที่เข้ารหัสสำหรับกรณีที่ 1 โปรแกรมจะส่งออกภาพเคลื่อนไหวหน้าต่าง. gif หรือหน้าต่าง GUI แบบเคลื่อนไหวที่แสดงสถานะตัวกลางทั้งหมดในการจำลองที่ช่วงเวลา 1 วินาที ใช้กฎรูปภาพเดียวกันกับตัวคูณ 0.22 เฟรมแรกของภาพเคลื่อนไหวควรแสดงสถานะเริ่มต้นของการจำลอง นอกจากนี้ภาพเคลื่อนไหวควรแสดงสถานะสื่อกลาง "ซ่อน" ซึ่งก็คือ

    • shubbles / smoles ตกลงไปในการกำหนดค่าที่มั่นคงโดยหนึ่งเซลล์ต่อเฟรมภาพเคลื่อนไหวหลังจากการหมุน

    • ระดับกลาง 90 ° - สถานะการหมุนของกล่องในการหมุน 180 °

  • รับตัวคูณทวีคูณ 0.12ถ้าโปรแกรมสร้างหน้าต่าง. gif หรือภาพเคลื่อนไหว GUI เคลื่อนไหวของรูปแบบข้างต้น แต่ทำงานที่ 20 fps และแสดง

    • ภาพเคลื่อนไหวที่ต่อเนื่องและราบรื่นของกล่องหมุน

    • ภาพเคลื่อนไหวต่อเนื่องที่ราบรื่นและต่อเนื่องของการเคลื่อนที่แบบสต๊อต

    ฟองอากาศที่ตกลงมาในรูในเซลล์ 28 ควรจะแสดงออกมาจากกล่องและควรหายไปทันทีนอก คุณสามารถเลือกช่วงเวลาของตัวเองสำหรับภาพเคลื่อนไหวตราบใดที่ไม่มีการจัดการมากกว่า 1 ครั้ง / วินาที

floor( base score * multiplier )คะแนนรวม อาจมีการอ้างสิทธิ์หนึ่งตัวคูณเท่านั้น

มันเป็นโลกแห่งการซ่อนเร้น ;)


2
+1 สำหรับข้อมูลจำเพาะ แต่ฉันจะไม่เข้าร่วมอาจเป็นไปได้
John Dvorak

ฟังดูเหมือนสนุก เพียงเพื่อให้แน่ใจว่า: รูปร่างของกล่องได้รับการแก้ไขทั้งหมดใช่หรือไม่ ดังนั้นเราไม่จำเป็นต้องคำนึงถึงรูปร่างอื่น ๆ ?
Ingo Bürk

@ IngoBürk: ถูกต้อง รูปร่างของกล่องได้รับการแก้ไข
COTO

สำหรับการแสดงผลภาพเราสามารถใช้ภาพของคุณเป็นทรัพยากร (หรือทรัพยากรใด ๆ ) หรือเราต้องวาดมันทั้งหมดในรหัส? ถ้าเราใช้มันจะนับได้อย่างไร ฉันจะลองทำแบบนี้ แต่ฉันจะไปเที่ยวพักผ่อน
Ingo Bürk

1
คุณสามารถใช้ทรัพยากรกราฟิกภายนอก (เช่นภาพมาร์กอัป SVG) ได้ตราบใดที่คุณรวมจำนวนไบต์ไว้ด้วยกันสำหรับโปรแกรม ภาพพื้นฐานไม่จำเป็นต้องมีความซับซ้อนมาก 12 เส้นประกอบเป็นกริด; กำแพง; และกล่องสีภายในกล่อง หากคุณต้องการกล่องสีสามารถเติมเต็มทั้งกริดเซลล์และผนังสามารถติดตามได้อย่างแม่นยำตามแนวชายแดนของเซลล์นอกสุด ดังนั้นรูปภาพทั้งหมดสามารถกำหนดได้โดยการวาดรูปสี่เหลี่ยมเส้นและรูปหลายเหลี่ยมบนตารางพิกัด 6x6 ตาราง
COTO

คำตอบ:


2

MATLAB ยังไม่ได้รับการแก้ไข * 0.15

มันจะดีถ้ามีใครสักคนอาจเสี่ยงต่อการเดาว่ามันทำงานถูกหรือไม่

n = @()input('', 's');
E = @()fprintf('!');
M = zeros(7,9);
G = M;
I = [9:7:44 17:7:52 18:7:46 12:7:47 20:7:55];
M0 = M;
M0(I) = 1;
M([I 49]) = 1;
G(I) = n()-46;
trot = 0;
Xtr = [0 1-10i 11-7i 8+i];
X0 ='c66++66++oozzoozzn'-i*'YYNNAA--  ++88LLYY'-22+22i;
for a = [97 n()]
    a = find('-|+a^<v>'==a);
    if a<5
        R = @(m) rot90(m, a);
        G = R(G);
        [nr,nc] = size(G);
        M = R(M);
        M0 = R(M0);
        trot = mod(trot+a,4);
        X = exp(i*pi*trot/2)*X0 + 11*Xtr(trot+1);
    else
        z = find(G==18);
        J = z + [-nr,1]*[0,-1;1,0]^(trot+a)*[1;0];
        if ~M0(J) | G(J) | G(z+1)
            E();return
        end
        G(z) = 0;
        G(J) = 18;
    end
    fall = 1; 
    while fall
        clf
        plot(X/11,'k','LineW',3);
        for x = 2:nc; for y = 2:nr
             ch = G(y,x);
             if M0(y,x) 
                 rectangle('Po',[x,-y,1,1],'F',~ch|ch==[74 1 65]);
             end
        end;end
        pause(1);
        G2 = G;
        for r = nr-1:-1:2
            s = G2 > 30;
            f = G2(r,:) .* (s(r,:) & ~s(r+1,:) & M(r+1,:) & G(r+1,:)~=18);
            if r==size(G,1)-1 & any(f==74)
                E();return
            end
            G2(r:r+1,:) = G2(r:r+1,:) + [-f;f];
        end
        G2 = G2 .* M0;
        fall = any(any(G2 ~= G));
        G = G2;
    end 
end

ตัวอย่างผลลัพธ์สุดท้ายสำหรับการย้ายแบบสุ่ม:

.........@...o....ooo..xox...
+>|<-v+^+

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


1
คุณช่วยแสดง GIF ของอนิเมชั่นได้หรือไม่?
Martin Ender

เย็น! ฉันจะตรวจสอบในเย็นวันนี้ (และโพสต์กรณีทดสอบสองสามข้อ)
COTO

โปรแกรมไม่จำเป็นต้องแสดงผลเป็น. gif แบบเคลื่อนไหว แต่หากคุณต้องการสร้างมันขึ้นมาบทความนี้จะอธิบายวิธีการทำอย่างง่ายดาย
COTO
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.