Shubbles and Smoles - Teil I.


10

Die Einrichtung

Stellen Sie sich eine seltsam geformte Box mit 29 nummerierten Zellen vor, wie in Abb. 1 unten gezeigt.

shubbles und smoles

In dieser 2D-Box befinden sich zwei Arten quadratischer Tiere: Shubbles und Smoles. Fig. 1 (a) zeigt einige blaue Flecken und einige smoles in rot. Jede Kreatur belegt genau eine Gitterzelle. Die Box kann zwischen 0 und 26 Shubbles enthalten, enthält aber immer genau zwei Smoles.

Da sie der Schwerkraft ausgesetzt sind, sitzen Trümmer und Smoles auf dem Boden der Kiste und stapeln sich über allem, was sich unter ihnen befindet. Beide Arten sind außergewöhnlich faul und bleiben ständig bewegungslos.

Die Box enthält auch einen Stot, der als schwarzes Quadrat dargestellt ist und genau eine Gitterzelle belegt. Der Stot ist nicht der Schwerkraft ausgesetzt .

Die Box hat eine Öffnung am Boden der Zelle 28, wie in der Abbildung dargestellt.

Um die Konfiguration von Shubbles, Smoles und dem Stot in der Box in Textform darzustellen, verwenden wir eine Zeichenfolge mit 29 Zeichen, ein Zeichen pro Gitterzelle, in der aufgezählten Reihenfolge, wobei .eine leere Zelle, oein Shubble, xein Smole dargestellt wird. und @Darstellen des Stots. Zum Beispiel wird die Konfiguration von Fig. 1 (a) durch die Zeichenkette dargestellt .........@...o....ooo..xox....

Manipulationen

Die Box kann um ein Vielfaches von 90 ° gedreht werden. Während die Box gedreht wird, bleiben die Shubbles und Smoles in ihren Gitterzellen stationär. Sobald eine Drehung abgeschlossen ist, fallen sie direkt nach unten, bis entweder i ) sie durch eine Wand darunter blockiert werden, ii ) sie durch ein Shubble, Smole oder Stot darunter blockiert sind oder iii ) sie durch das Loch in Zelle 28 fallen und verlassen Sie die Box. Der Stot fällt nicht; Es bleibt in seiner aktuellen Zelle fixiert, auch wenn Kreaturen darauf ruhen.

Die Box kann erst wieder gedreht werden, wenn die Kreaturen gefallen sind und eine neue stabile Konfiguration erreicht haben.

Textuell werden Boxdrehungen +für eine Drehung um 90 ° im Uhrzeigersinn, |für eine Drehung um 180 ° und -für eine Drehung um 90 ° gegen den Uhrzeigersinn bezeichnet.

Zusätzlich kann der Stot in Schritten von einer Gitterzelle in die vier Kompassrichtungen bewegt werden . Eine Bewegung darf nicht: i ) eine Kollision zwischen dem Stot und einer Kreatur verursachen (dh die Zielgitterzelle muss leer sein), ii ) eine Kollision zwischen dem Stot und einer Wand verursachen, noch iii ) den Stot durch die Box verlassen das Loch in Zelle 28.

Außerdem kann sich der Stot nicht bewegen, wenn Kreaturen darauf ruhen (in Bezug auf die aktuelle Schwerkraft).

Textuell werden Stot-Moves <für links, >rechts, ^oben und vunten bezeichnet. Stot-Bewegungen werden immer in Bezug auf den in den Figuren dargestellten "Standard" -Rahmen (nicht gedreht) angegeben . Wenn sich der Stot in Zelle 10 befindet, wird er durch Verschieben ^immer in Zelle 5 und durch Verschieben >immer in Zelle 11 verschoben. Die Ausrichtung des Felds hat keinen Einfluss auf die Bewegungsrichtung.

Manipulationssequenzen werden mit Zeichenfolgen von links nach rechts codiert. Beispielsweise zeigt die Zeichenfolge +<<^-an, dass die Box um 90 ° im Uhrzeigersinn gedreht wurde, der Stot zweimal nach links und einmal nach oben bewegt wurde (in Bezug auf den Standardrahmen) und die Box dann um 90 ° gegen den Uhrzeigersinn zurück in ihre ursprüngliche Ausrichtung gedreht wurde.

Die Herausforderung

Aus ganz guten Gründen (die ich nicht offenlegen kann) möchten wir alle Trümmer aus der Schachtel herausholen, ohne einen einzigen Smole herauszulösen. Um dies zu erreichen, können wir die oben speziell beschriebenen Manipulationen verwenden.

Bevor wir dieses Problem lösen, müssen wir simulieren, wie sich unsere verschiedenen Manipulationen auf den Inhalt der Box auswirken, auf die sich diese Herausforderung konzentriert.

Sie müssen ein Programm schreiben, das zwei Argumente von stdin(oder einem gleichwertigen) akzeptiert :

  • Eine Zeichenfolge, die den Anfangszustand der Box beschreibt
  • eine Folge von Manipulationen

Sie können davon ausgehen, dass beide Argumente syntaktisch gültig sind, dass die Box in der Standardausrichtung beginnt und dass der Anfangszustand der Box stabil und legal ist.

Das Programm muss stdoutentweder (oder gleichwertig) ausgeben :

  • ( Fall 1 ) Der Endzustand der Box, ausgedrückt als Zeichenfolge, wenn die Reihenfolge der Bewegungen legal ist (sie verstößt nicht gegen die Regeln für Stot-Bewegungen) und keine Smoles dazu veranlasst, die Box zu verlassen. Die endgültige Ausrichtung der Box ist unwichtig.

  • ( Fall 2 ) ein einzelnes Ausrufezeichen !, wenn die Reihenfolge der Bewegungen unzulässig ist oder Smoles die Box verlassen

Wertung

Das Gewinnerprogramm ist das kürzeste Programm nach Byteanzahl , vorbehaltlich einiger äußerst lukrativer Bonusmultiplikatoren:

  • beanspruchen Sie einen Multiplikator von 0,65, wenn das Programm anstelle des Druckens der codierten Ausgabe für Fall 1 ein ASCII-Bild der Box in ihrem endgültigen Zustand und ihrer Ausrichtung ausgibt, wobei die Spezifikationszeichen für Shubbles, Smoles, Stots und leere Zellen verwendet werden und a platziert wird *in der Zelle direkt außerhalb des Lochs in Zelle 28. Führende und nachfolgende Leerzeichen werden ignoriert.

    Wenn zum Beispiel Fig. 1 (a) um 90º gedreht wird, wäre die Ausgabe

       .  .
      .....
      .o...
      xo.@.
     *ooo..
      x  .
    
  • beanspruchen Sie einen Multiplikator von 0,22, wenn das Programm anstelle der codierten Ausgabe für Fall 1 eine Bilddatei ausgibt oder ein GUI-Fenster mit einem Bild der Box in ihrem endgültigen Zustand und ihrer Ausrichtung anzeigt. Das Bild sollte im Stil von Abb. 1 (a) sein und die Gitterzellen, Wände und Kreaturen / Stots mit farbigen Kästchen zeigen.

  • beanspruchen Sie einen Multiplikator von 0,15, wenn das Programm anstelle der codierten Ausgabe für Fall 1 ein animiertes GIF- oder animiertes GUI-Fenster ausgibt, das alle Zwischenzustände in der Simulation in Intervallen von 1 Sekunde anzeigt. Es gelten die gleichen Bildregeln wie für den 0,22-Multiplikator. Das erste Bild der Animation sollte den Anfangszustand der Simulation darstellen. Zusätzlich sollte die Animation "versteckte" Zwischenzustände anzeigen, die sind

    • Die Shubbles / Smoles fallen nach einer Drehung um eine Zelle pro Animationsframe in eine stabile Konfiguration

    • der um 90 ° gedrehte Zwischenzustand der Box in einer 180 ° -Drehung

  • Fordern Sie einen Multiplikator von 0,12 an, wenn das Programm ein animiertes GIF- oder animiertes GUI-Fenster des oben genannten Stils erstellt, das jedoch mit 20 fps und Shows ausgeführt wird

    • glatte, kontinuierliche Animationen der Box rotieren

    • sanfte, kontinuierliche Animationen des sich bewegenden Stots und der in eine stabile Konfiguration fallenden Shubbles / Smoles

    Durch das Loch in Zelle 28 fallende Blasen sollten aus der Box austreten und einmal ganz draußen verschwinden. Sie können Ihr eigenes Timing für die Animation auswählen, solange nicht mehr als 1 Manipulation / Sek. Ausgeführt wird.

Gesamtpunktzahl ist floor( base score * multiplier ). Es kann nur ein Multiplikator beansprucht werden.

Es ist doch eine smole Welt. ;)


2
+1 für die Spezifikation, aber ich werde wahrscheinlich nicht teilnehmen.
John Dvorak

Das klingt nach Spaß. Nur um sicherzugehen: Die Form der Box ist komplett festgelegt, ja? Wir müssen also keine anderen Formen berücksichtigen?
Ingo Bürk

@ IngoBürk: Richtig. Die Kastenform ist festgelegt.
COTO

Können wir Ihr Bild für die Bildausgabe als Ressource (oder irgendeine Art von Ressource) verwenden oder müssen wir es vollständig im Code zeichnen? Wenn wir es benutzen können, wie zählt es? Ich werde versuchen, es zu versuchen, aber ich bin gerade im Urlaub.
Ingo Bürk

1
Sie können externe Grafikressourcen (z. B. Bilder, SVG-Markup) verwenden, solange Sie deren Byteanzahl in die Gesamtsumme des Programms einbeziehen. Das Grundbild muss nicht besonders kompliziert sein. 12 Linien bilden das Gitter; die Mauer; und die farbigen Kästchen in der Kiste. Wenn Sie möchten, kann ein farbiges Feld eine gesamte Gitterzelle ausfüllen, und die Wand kann genau entlang des Randes der äußersten Zellen verläuft. Somit kann das gesamte Bild definiert werden, indem Rechtecke, Linien und eine Polylinie auf einem 6x6-Quadratkoordinatengitter gezeichnet werden.
COTO

Antworten:


2

MATLAB, noch ungolfed * 0.15

Es wäre großartig, wenn jemand eine Vermutung wagen könnte, ob dies richtig funktioniert.

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

Beispiel-Endergebnis für einige zufällige Züge:

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

Geben Sie hier die Bildbeschreibung ein


1
Könnten Sie tatsächlich ein GIF der Animation zeigen?
Martin Ender

Cool! Ich werde es heute Abend ausprobieren (und ein paar Testfälle posten).
COTO

Das Programm muss kein animiertes GIF ausgeben. Wenn Sie jedoch ein Feersum generieren möchten, wird in diesem Artikel erläutert, wie dies auf einfache Weise funktioniert.
COTO
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.