Shubbles ve Smoller - Bölüm I


10

Kurulum

Aşağıdaki Şekil 1'de gösterildiği gibi 29 numaralı hücre içeren garip şekilli bir kutuyu düşünün.

shubbles ve smolbs

Bu 2D kutunun içinde iki kare şekilli hayvan türü vardır: shubble ve smol. Şekil 1 (a) bazı shubble'ları mavi ve bazı smolleri kırmızı gösterir. Her canlı tam olarak bir ızgara hücresi kaplar. Kutu 0 ile 26 arasında shubble içerebilir, ancak her zaman tam iki smol içerecektir.

Yerçekimine maruz kalan shubbles ve smoller kutunun altında oturur ve altındaki herhangi bir şeyin üstüne istiflenir. Her iki tür de son derece tembeldir ve sürekli hareketsiz kalır.

Kutu ayrıca, tam olarak bir ızgara hücresini kaplayan siyah bir kare olarak tasvir edilen bir stot içerir. Stot yer çekimine tabi değildir .

Kutuda, şekilde gösterildiği gibi, 28 hücresinin altında bir delik bulunur.

Kutunun içindeki shubble, smol ve stot yapılandırmasını metinsel olarak .temsil etmek için, numaralandırılmış sırada, boş bir hücreyi otemsil eden, xbir smolble'ı temsil eden, ve @stotı temsil ediyor. Örneğin, Şekil 1 (a) 'nın konfigürasyonu ip ile temsil edilmektedir .........@...o....ooo..xox....

Manipulasyonları

Kutu, 90 ° 'nin katları ile döndürülebilir . Kutu döndürülürken, shubbles ve smoller ızgara hücreleri içinde sabit kalır. Bir rotasyon tamamlanır tamamlanmaz, i ) aşağıdaki duvarlardan biri tarafından engellenene kadar doğrudan aşağıya düşer , ii ) bir shubble, smole veya altındaki stot tarafından bloke edilirler veya iii ) 28 hücresindeki delikten düşerler ve kutudan çıkın. Stot düşmez; yaratıklar üstünde dursa bile mevcut hücresinde sabit kalır.

Yaratıklar düşene ve yeni bir kararlı konfigürasyona ulaşana kadar kutu tekrar döndürülemez.

Metinsel olarak, kutu dönüşleri +saat yönünde 90 ° döndürme, |180 ° döndürme ve -saat yönünün tersine 90 ° döndürme ile gösterilir.

Ek olarak stot, bir ızgara hücresinin artışlarıyla dört pusula yönünde hareket ettirilebilir . Hareket şunları yapamaz: i ) stot ile yaratık arasında bir çarpışmaya neden olabilir (yani hedef ızgara hücresi boş olmalıdır), ii ) stot ve duvar arasında bir çarpışmaya neden olabilir veya iii ) stotun kutudan çıkmasına neden olabilir 28 hücresindeki delik.

Ayrıca, üzerinde duran herhangi bir canlı varsa (mevcut yerçekimine göre) stot hareket etmeyebilir .

Metin olarak, stot hareketleri <sol, >sağ, ^yukarı ve vaşağı için ile gösterilir. Stot hareketleri her zaman şekillerde gösterilen "standart" (döndürülmemiş) çerçeveye göre belirlenir. Yani, eğer hücre 10 hücresindeyse, hareket ^daima hücre 5'e hareket >edecektir ve hareket daima hücre 11'e hareket edecektir. Kutunun oryantasyonu hareketin yönünü etkilemez.

Manipülasyon dizileri soldan sağa karakter dizgileri kullanılarak kodlanır. Örneğin, dize +<<^-kutunun saat yönünde 90 ° döndürüldüğünü gösterir, daha sonra stot iki kez ve standart çerçeveye göre bir kez yukarı sola hareket ettirilir, daha sonra kutu saat yönünün tersine 90 ° döndürülür.

Meydan okuma

Gayet iyi nedenlerden dolayı (ben ifşa edemez), biz kutusundan tüm shubbles kurtarmak isteyen olmadan tek Smole extricating. Bunu başarmak için, yukarıda özel olarak açıklanan manipülasyonları kullanabiliriz.

Bu sorunu çözmeden önce, çeşitli manipülasyonlarımızın, bu zorluğun odağı olan kutunun içeriğini nasıl etkileyeceğini simüle etmek bizi harekete geçirir.

stdin(Veya dengi) ifadesinden iki bağımsız değişkeni kabul eden bir program yazmalısınız :

  • kutunun başlangıç ​​durumunu tanımlayan bir dize
  • bir dizi manipülasyon

Her iki argümanın da sözdizimsel olarak geçerli olduğunu, kutunun standart yönde başladığını ve kutunun başlangıç ​​durumunun kararlı ve yasal olduğunu varsayabilirsiniz.

Program aşağıdakilerden birine stdout(veya eşdeğerine) çıktı almalıdır :

  • ( durum 1 ) hamle sırası yasalsa (stot hamle kurallarını ihlal etmiyorsa) ve herhangi bir smolenin kutudan çıkmasına neden olmazsa, dize olarak ifade edilen kutunun son durumu. Kutunun son yönü önemsizdir.

  • ( durum 2 ) !hamle sırası yasadışıysa veya herhangi bir küçükün kutudan çıkmasına neden oluyorsa , tek bir ünlem işareti

puanlama

Kazanan program, son derece kazançlı bonus çarpanlarına tabi olarak, bayt sayısına göre en kısa programdır :

  • Bir İstem 0.65 çarpanı halinde yerine durumda 1 kodlanmış çıkış baskı, programın shubbles, smoles, stots ve boş hücreler için spec karakterleri kullanarak ve a yerleştirilmesi, son durumunda ve yönelimde meydana gelen kutusunun bir ASCII resim üretir *Hücre 28'deki deliğin hemen dışında yer alır.

    Örneğin, Şekil 1 (a) 90 ° döndürülürse, çıkış

       .  .
      .....
      .o...
      xo.@.
     *ooo..
      x  .
    
  • Bir İstem 0.22 çarpanı halinde yerine durumda 1 kodlanan çıkış baskı, program bir görüntü dosyası ya da görüntüler son durumunda ve yönelimde meydana gelen kutusunda bir resim ile bir GUI penceresi verir. Resim, Şekil 1 (a) 'daki tarzda olmalı ve ızgara kutuları, duvarlar ve renkli kutular kullanarak yaratıkları / stoku göstermelidir.

  • durum 1 için kodlanmış çıktıyı yazdırmak yerine, program 1 saniye aralıklarla simülasyondaki tüm ara durumları gösteren bir animasyonlu .gif veya animasyonlu GUI penceresi çıkarırsa 0.15 çarpanı talep edin. 0.22 çarpanı ile aynı resim kuralları geçerlidir. Animasyonun ilk karesi, simülasyonun başlangıç ​​durumunu göstermelidir. Ayrıca, animasyon "gizli" ara durumları göstermelidir.

    • bir döndürmeden sonra animasyon çerçevesi başına bir hücre tarafından kararlı bir konfigürasyona düşen shubbles / smol

    • 180 ° dönüşte kutunun ara 90 ° döndürülmüş durumu

  • Program yukarıdaki stilde bir animasyonlu .gif veya animasyonlu GUI penceresi oluşturuyor, ancak 20 fps'de çalışıyorsa ve şovlar gösteriyorsa 0.12 çarpanını talep edin

    • Kutunun dönmesinin düzgün, sürekli animasyonları

    • hareket eden stoğun ve sabit bir konfigürasyona düşen shubbles / smollerin düzgün, sürekli animasyonları

    28 hücresindeki delikten düşen shubble'lar kutudan çıkarken gösterilmeli ve tamamen dışarıda bir kez yok olmalıdır. En fazla 1 manipülasyon / sn gerçekleştirilmediği sürece animasyon için kendi zamanlamanızı seçebilirsiniz.

Toplam puan floor( base score * multiplier ). Yalnızca bir çarpan talep edilebilir.

Ne de olsa akıllı bir dünya. ;)


2
Spesifikasyon için +1, ancak muhtemelen katılmayacağım.
John Dvorak

Kulağa eğlenceli geliyor. Sadece emin olmak için: kutunun şekli tamamen sabittir, değil mi? Yani başka şekilleri hesaba katmamıza gerek yok mu?
Ingo Bürk

@ IngoBürk: Doğru. Kutu şekli sabittir.
COTO

Görüntü çıktısı için, görüntünüzü bir kaynak (ya da herhangi bir kaynak) olarak kullanabilir miyiz yoksa tamamen kodda mı çizmeliyiz? Kullanabilirsek, nasıl sayılır? Bunu denemeye çalışacağım, ama şu anda tatildeyim.
Ingo Bürk

1
Program için toplam bayt sayılarını dahil ettiğiniz sürece harici grafik kaynaklarını (örn. Resimler, SVG işaretlemesi) kullanabilirsiniz. Temel görüntünün çok karmaşık olması gerekmez. Izgarayı oluşturan 12 hat; duvar; ve kutunun içindeki renkli kutular. İsterseniz, renkli bir kutu tüm ızgara hücresini doldurabilir ve duvar en dıştaki hücrelerin sınırı boyunca tam olarak izleyebilir. Böylece, resmin tamamı 6x6 kare koordinat ızgarası üzerine dikdörtgenler, çizgiler ve bir çoklu çizgi çizerek tanımlanabilir.
COTO

Yanıtlar:


2

MATLAB, henüz çözülmemiş * 0.15

Birisinin bunun doğru çalışıp çalışmadığına dair bir tahminde bulunma tehlikesi varsa harika olurdu.

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

Bazı rastgele hareketler için örnek sonuç:

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

resim açıklamasını buraya girin


1
Animasyonun bir GIF'ini gerçekten gösterebilir misiniz?
Martin Ender

Güzel! Bu akşam kontrol edeceğim (ve birkaç test vakası yayınlayacağım).
COTO

Program, animasyonlu bir .gif çıktısı gerektirmez, ancak bir tane oluşturmak istiyorsanız, feersum, bu makalede bunu nasıl kolayca yapabileceğiniz açıklanmaktadır.
COTO
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.