Shubbles and Smoles - Bagian I

10

Pengaturan

Pertimbangkan kotak berbentuk aneh yang berisi 29 sel bernomor seperti yang ditunjukkan pada Gambar. 1 di bawah ini.

shubble dan smoles

Di dalam kotak 2D ini ada dua spesies hewan berbentuk persegi: shubbles dan smoles. Gbr. 1 (a) menunjukkan beberapa shubble berwarna biru, dan beberapa smoles berwarna merah. Setiap makhluk menempati tepat satu sel kotak. Kotak mungkin berisi antara 0 dan 26 shubble, tetapi akan selalu mengandung dua smoles.

Menjadi sasaran gravitasi, shubble dan smoles duduk di bagian bawah kotak, menumpuk di atas apa pun di bawahnya. Kedua spesies ini sangat malas dan tetap tidak bergerak.

Kotak itu juga berisi kotak, yang digambarkan sebagai kotak hitam, yang menempati tepat satu sel kotak. Stot tidak tunduk pada gravitasi.

Kotak memiliki satu lubang yang terletak di bagian bawah sel 28, seperti yang digambarkan dalam gambar.

Untuk mewakili konfigurasi shubble, smoles, dan stot dalam kotak secara tekstual, kami menggunakan string 29-karakter, satu karakter per sel grid, dalam urutan yang disebutkan, dengan .mewakili sel kosong, omewakili shubble, xmewakili smole, dan @mewakili stot. Sebagai contoh, konfigurasi Gambar. 1 (a) diwakili oleh string [email protected]....

Manipulasi

Kotak dapat diputar dengan kelipatan 90 °. Saat kotak diputar, shubbles dan smoles tetap diam di dalam sel kisi mereka. Segera setelah rotasi selesai, mereka jatuh langsung ke bawah sampai saya ) mereka diblokir oleh dinding di bawah, ii ) mereka diblokir oleh shubble, smole, atau stot di bawah, atau iii ) mereka jatuh melalui lubang di sel 28 dan keluar dari kotak. Stot tidak jatuh; tetap di selnya saat ini, bahkan jika makhluk hidup di atasnya.

Kotak tidak dapat diputar lagi sampai makhluk selesai jatuh dan telah mencapai konfigurasi stabil baru.

Secara teks, rotasi kotak dilambangkan dengan +untuk rotasi searah jarum jam 90 °, |untuk rotasi 180 °, dan -untuk rotasi berlawanan arah jarum jam 90 °.

Selain itu, stot dapat dipindahkan dalam empat arah kompas dengan penambahan satu sel kisi. Langkah mungkin tidak: i ) menyebabkan tabrakan antara stot dan makhluk (yaitu sel grid tujuan harus kosong), ii ) menyebabkan tabrakan antara stot dan dinding, atau iii ) menyebabkan stot keluar dari kotak melalui lubang di sel 28.

Juga, stot mungkin tidak bergerak jika ada makhluk yang bersandar di atasnya (sehubungan dengan gravitasi saat ini).

Secara teks, gerakan stot dilambangkan dengan <untuk kiri, >kanan, ^atas, dan vbawah. Stot move selalu ditentukan sehubungan dengan frame "standar" (tidak diputar) yang digambarkan dalam gambar. Artinya, jika stot berada di sel 10, bergerak ^akan selalu memindahkannya ke sel 5, dan bergerak >akan selalu memindahkannya ke sel 11. Orientasi kotak tidak mempengaruhi arah gerakan.

Urutan manipulasi dikodekan menggunakan string karakter kiri-ke-kanan. Sebagai contoh, string +<<^-menunjukkan kotak diputar searah jarum jam 90 °, kemudian stot dipindahkan ke kiri dua kali dan ke atas sekali (sehubungan dengan bingkai standar), maka kotak diputar 90 ° berlawanan arah jarum jam kembali ke orientasi aslinya.

Tantangan

Untuk alasan yang sangat baik (yang tidak bisa saya ungkapkan), kami ingin melepaskan semua shubble dari kotak tanpa mengeluarkan satu pun smole. Untuk mencapai ini, kita dapat menggunakan manipulasi yang dijelaskan di atas.

Sebelum memecahkan masalah ini, penting bagi kita untuk mensimulasikan bagaimana berbagai manipulasi kita akan mempengaruhi isi kotak, yang merupakan fokus dari tantangan ini.

Anda harus menulis sebuah program yang menerima dua argumen dari stdin(atau yang setara):

  • string yang menggambarkan kondisi awal kotak
  • serangkaian manipulasi

Anda dapat mengasumsikan bahwa kedua argumen secara sintaksis valid, bahwa kotak dimulai dalam orientasi standar, dan bahwa keadaan awal kotak stabil dan sah.

Program harus menghasilkan ke stdout(atau setara) baik:

  • ( kasus 1 ) keadaan akhir kotak, dinyatakan sebagai string, jika urutan gerakan legal (tidak melanggar aturan langkah stot) dan tidak menyebabkan smoles keluar dari kotak. Orientasi akhir kotak tidak penting.

  • ( kasus 2 ) tanda seru tunggal !,, jika urutan gerakan ilegal atau menyebabkan smoles keluar dari kotak

Mencetak gol

Program yang menang adalah program terpendek berdasarkan jumlah byte , tergantung pada pengganda bonus yang sangat menguntungkan:

  • klaim pengganda 0,65 jika alih-alih mencetak output yang dikodekan untuk kasus 1, program menghasilkan gambar ASCII dari kotak dalam keadaan akhir dan orientasi, menggunakan karakter spesifik untuk shubble, smoles, stots, dan sel kosong, dan menempatkan *di sel tepat di luar lubang di sel 28. Ruang kosong yang mengarah dan tertinggal diabaikan.

    Misalnya, jika Gambar. 1 (a) diputar 90 °, hasilnya akan menjadi

       .  .
      .....
      .o...
      xo.@.
     *ooo..
      x  .
    
  • klaim pengganda 0,22 jika alih-alih mencetak keluaran yang dikodekan untuk kasus 1, program menghasilkan file gambar atau menampilkan jendela GUI dengan gambar kotak dalam keadaan akhir dan orientasi. Gambar harus dalam gaya Gambar 1 (a), menunjukkan sel-sel kotak, dinding, dan makhluk / stot menggunakan kotak berwarna.

  • klaim pengganda 0,15 jika alih-alih mencetak keluaran yang disandikan untuk kasus 1, program ini menghasilkan jendela GUI atau GUI animasi yang menunjukkan semua keadaan perantara dalam simulasi pada interval 1 detik. Aturan gambar yang sama dengan untuk pengali 0,22 berlaku. Kerangka pertama animasi harus menggambarkan keadaan awal simulasi. Selain itu, animasi harus menunjukkan status perantara "tersembunyi", yaitu

    • shubbles / smoles jatuh ke konfigurasi stabil oleh satu sel per bingkai animasi setelah rotasi

    • kondisi kotak terproteksi 90 ° tengah dalam rotasi 180 °

  • klaim pengganda 0,12 jika program menghasilkan jendela animasi .gif atau GUI animasi dengan gaya di atas, tetapi berjalan pada 20 fps dan pertunjukan

    • animasi kotak yang halus dan terus menerus berputar

    • animasi yang mulus dan terus menerus dari stot yang bergerak, dan shubbles / smoles jatuh ke dalam konfigurasi yang stabil

    Shubble yang jatuh melalui lubang di sel 28 harus ditunjukkan keluar dari kotak, dan harus menghilang sekali di luar. Anda dapat memilih waktu Anda sendiri untuk animasi selama tidak lebih dari 1 manipulasi / detik dilakukan.

Skor total adalah floor( base score * multiplier ). Hanya satu pengali yang dapat diklaim.

Bagaimanapun, ini adalah dunia yang berbau harum. ;)

COTO
sumber
2
+1 untuk spec, tapi saya tidak akan berpartisipasi, mungkin.
John Dvorak
Ini kedengarannya menyenangkan. Hanya untuk memastikan: bentuk kotak sepenuhnya sudah diperbaiki, ya? Jadi kita tidak perlu menjelaskan bentuk lainnya?
Ingo Bürk
@ IngoBürk: Benar. Bentuk kotak sudah diperbaiki.
COTO
Untuk output gambar, dapatkah kami menggunakan gambar Anda sebagai sumber daya (atau sumber daya apa pun) atau apakah kami harus menggambar seluruhnya dalam kode? Jika kita bisa menggunakannya, bagaimana cara menghitungnya? Saya akan mencoba untuk mencobanya, tetapi saya sedang berlibur sekarang.
Ingo Bürk
1
Anda dapat menggunakan sumber daya grafis eksternal (mis. Gambar, markup SVG) selama Anda memasukkan jumlah byte mereka dalam total untuk program. Gambar dasar tidak harus sangat rumit. 12 garis yang membentuk grid; dinding; dan kotak-kotak berwarna di dalam kotak. Jika Anda suka, kotak berwarna dapat mengisi seluruh sel kisi, dan dinding dapat menelusuri persis di sepanjang perbatasan sel terluar. Dengan demikian seluruh gambar dapat didefinisikan dengan menggambar persegi panjang, garis, dan polyline pada kotak koordinat 6x6 persegi.
COTO

Jawaban:

2

MATLAB, yang belum disunat * 0.15

Akan lebih bagus jika seseorang bisa menebak apakah ini berfungsi dengan benar.

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

Contoh hasil akhir untuk beberapa gerakan acak:

[email protected]...
+>|<-v+^+

masukkan deskripsi gambar di sini

feersum
sumber
1
Bisakah Anda benar-benar menunjukkan GIF animasi?
Martin Ender
Keren! Saya akan memeriksanya malam ini (dan memposting beberapa kasus uji).
COTO
Program ini tidak perlu mengeluarkan animasi .gif, tetapi jika Anda ingin membuatnya, feersum, artikel ini menjelaskan cara melakukannya dengan mudah.
COTO