Shubbles and Smoles - Part I


10

Il set up

Considera una scatola di forma strana contenente 29 celle numerate, come mostrato nella Figura 1 di seguito.

bolle e smole

All'interno di questa scatola 2D ci sono due specie di animali di forma quadrata: bolle e smole. La Figura 1 (a) mostra alcune bolle in blu e alcune bolle in rosso. Ogni creatura occupa esattamente una cella della griglia. La confezione può contenere da 0 a 26 bolle, ma conterrà sempre esattamente due smole.

Essendo soggetti alla gravità, bolle e smole siedono sul fondo della scatola, accatastandosi su qualsiasi cosa sotto di loro. Entrambe le specie sono eccezionalmente pigre e rimangono perennemente immobili.

La scatola contiene anche uno stot, rappresentato come un quadrato nero, che occupa esattamente una cella della griglia. Il ceppo non è soggetto alla gravità.

La scatola ha un'apertura situata nella parte inferiore della cella 28, come mostrato nella figura.

Per rappresentare testualmente la configurazione di bolle, smole e stot nella casella, utilizziamo una stringa di 29 caratteri, un carattere per cella della griglia, nell'ordine elencato, con la .rappresentazione di una cella vuota, che orappresenta una shubble, che xrappresenta un sorriso, e @rappresenta lo stot. Ad esempio, la configurazione di Fig. 1 (a) è rappresentata dalla stringa .........@...o....ooo..xox....

manipolazioni

La scatola può essere ruotata di qualsiasi multiplo di 90 °. Mentre la scatola viene ruotata, le bolle e i buchi rimangono fermi all'interno delle celle della griglia. Non appena una rotazione è completa, cadono direttamente verso il basso fino a quando i ) non vengono bloccati da un muro sottostante, ii ) vengono bloccati da una stoppia, un sorriso o un ceppo al di sotto, oppure iii ) cadono attraverso il foro nella cella 28 e uscire dalla scatola. Il moncone non cade; rimane fisso nella sua cella corrente, anche se le creature vi si trovano sopra.

La scatola non può essere ruotata di nuovo fino a quando le creature non hanno finito di cadere e hanno raggiunto una nuova configurazione stabile.

Dal punto di vista testuale, le rotazioni della scatola sono indicate da +una rotazione di 90 ° in senso orario, |per una rotazione di 180 ° e -per una rotazione di 90 ° in senso antiorario.

Inoltre, lo stot può essere spostato nelle quattro direzioni della bussola con incrementi di una cella della griglia. Una mossa non può: i ) provocare una collisione tra lo stot e una creatura (cioè la cella della griglia di destinazione deve essere vuota), ii ) causare una collisione tra lo stot e un muro, né iii ) causare lo stot attraverso la scatola il buco nella cella 28.

Inoltre, il ceppo potrebbe non muoversi se ha delle creature appoggiate su di esso (rispetto alla gravità attuale).

Testualmente, le mosse di stot sono indicate da <per sinistra, >per destra, ^per su e vper giù. Le mosse vengono sempre specificate rispetto al telaio "standard" (non ruotato) rappresentato nelle figure. Cioè, se lo stot è nella cella 10, lo spostamento lo sposta ^sempre nella cella 5 e lo spostamento lo sposta >sempre nella cella 11. L'orientamento del riquadro non influisce sulla direzione dello spostamento.

Le sequenze di manipolazioni sono codificate usando stringhe di caratteri da sinistra a destra. Ad esempio, la stringa +<<^-indica che la scatola viene ruotata di 90 ° in senso orario, quindi lo stot viene spostato a sinistra due volte e verso l'alto una volta (rispetto al telaio standard), quindi la scatola viene ruotata di 90 ° in senso antiorario di nuovo nel suo orientamento originale.

La sfida

Per ragioni perfettamente valide (che non posso rivelare), desideriamo districare tutte le bolle dalla scatola senza districarle in un solo sorriso. Per fare ciò, possiamo usare le manipolazioni specificatamente descritte sopra.

Prima di risolvere questo problema, è necessario simulare in che modo le nostre varie manipolazioni influenzeranno il contenuto della confezione, che è al centro di questa sfida.

Devi scrivere un programma che accetta due argomenti stdin(o equivalenti):

  • una stringa che descrive lo stato iniziale della scatola
  • una sequenza di manipolazioni

Si può presumere che entrambi gli argomenti siano sintatticamente validi, che la casella inizi con l'orientamento standard e che lo stato iniziale della casella sia stabile e legale.

Il programma deve produrre stdout(o equivalente):

  • ( caso 1 ) lo stato finale della scatola, espresso come una stringa, se la sequenza di mosse è legale (non viola le regole delle mosse di stot) e non fa uscire alcun sorriso dalla scatola. L'orientamento finale del riquadro non è importante.

  • ( caso 2 ) un singolo punto esclamativo !, se la sequenza di mosse è illegale o fa uscire eventuali smole dalla scatola

punteggio

Il programma vincente è il programma più breve per numero di byte , soggetto ad alcuni moltiplicatori di bonus estremamente redditizi:

  • richiedere un moltiplicatore di 0,65 se invece di stampare l'output codificato per il caso 1, il programma genera un'immagine ASCII della casella nel suo stato e orientamento finale, usando i caratteri di specifica per bolle, smole, stots e celle vuote e posizionando un *nella cella appena fuori dal buco nella cella 28. Lo spazio bianco iniziale e finale viene ignorato.

    Ad esempio, se la Figura 1 (a) viene ruotata di 90 °, l'uscita sarebbe

       .  .
      .....
      .o...
      xo.@.
     *ooo..
      x  .
    
  • richiedere un moltiplicatore di 0,22 se invece di stampare l'output codificato per il caso 1, il programma genera un file di immagine o visualizza una finestra della GUI con un'immagine della casella nel suo stato e orientamento finali. L'immagine dovrebbe essere nello stile di Fig. 1 (a), che mostra le celle della griglia, i muri e le creature / lo stot usando caselle colorate.

  • rivendicare un moltiplicatore di 0,15 se invece di stampare un output codificato per il caso 1, il programma emette una finestra GIF animata o GUI animata che mostra tutti gli stati intermedi nella simulazione a intervalli di 1 secondo. Si applicano le stesse regole dell'immagine per il moltiplicatore 0,22. Il primo fotogramma dell'animazione dovrebbe rappresentare lo stato iniziale della simulazione. Inoltre, l'animazione dovrebbe mostrare stati intermedi "nascosti", che sono

    • le bolle / i sorrisi cadono in una configurazione stabile di una cella per fotogramma di animazione dopo una rotazione

    • lo stato intermedio della scatola ruotato di 90 ° con una rotazione di 180 °

  • rivendica un moltiplicatore di 0,12 se il programma produce una GIF animata o una finestra della GUI animata dello stile sopra, ma funziona a 20 fps e mostra

    • animazioni fluide e continue della scatola rotante

    • animazioni fluide e continue dello stot in movimento e delle bolle / smole che cadono in una configurazione stabile

    Le bolle che cadono attraverso il foro nella cella 28 dovrebbero essere mostrate uscendo dalla scatola e dovrebbero scomparire una volta totalmente all'esterno. Puoi scegliere il tuo tempismo per l'animazione purché non venga eseguita più di 1 manipolazione / sec.

Il punteggio totale è floor( base score * multiplier ). È possibile richiedere un solo moltiplicatore.

È un mondo tutto sommato dopo tutto. ;)


2
+1 per le specifiche, ma probabilmente non parteciperò.
John Dvorak,

Sembra divertente. Solo per essere sicuri: la forma della scatola è completamente fissa, sì? Quindi non dobbiamo tenere conto di altre forme?
Ingo Bürk,

@ IngoBürk: corretto. La forma della scatola è fissa.
COTO

Per l'output dell'immagine, possiamo usare la tua immagine come risorsa (o qualsiasi tipo di risorsa) o dobbiamo disegnarla interamente nel codice? Se possiamo usarlo, come conta? Proverò a provarlo, ma adesso sono in vacanza.
Ingo Bürk,

1
È possibile utilizzare risorse grafiche esterne (ad es. Immagini, markup SVG) purché si includano i conteggi dei byte nel totale del programma. L'immagine di base non deve essere tremendamente complicata. 12 linee che compongono la griglia; il muro; e le scatole colorate all'interno della scatola. Se preferisci, una casella colorata può riempire un'intera cella della griglia e il muro può tracciare esattamente lungo il bordo delle celle più esterne. Pertanto, l'intera immagine può essere definita disegnando rettangoli, linee e una polilinea su una griglia di coordinate quadrata 6x6.
COTO

Risposte:


2

MATLAB, non ancora golfizzato * 0.15

Sarebbe bello se qualcuno potesse rischiare di indovinare se questo funziona bene.

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

Esempio di risultato finale per alcune mosse casuali:

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

inserisci qui la descrizione dell'immagine


1
Potresti davvero mostrare una GIF dell'animazione?
Martin Ender,

Freddo! Lo controllerò stasera (e pubblicherò alcuni casi di test).
COTO

Non è necessario che il programma generi un file GIF animato, ma se vuoi generarne uno, questo articolo spiega come farlo facilmente.
COTO
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.