Spiralwörter zeichnen [geschlossen]

11

Das Szenario

Zeichnen Sie bei einer Eingabe von ASCII-Kleinbuchstaben und Leerzeichen eine Zeichenspirale, die die ursprüngliche Eingabe von Zeichen ohne Leerzeichen nachzeichnet.

Die Regeln

1) Die Zeichen müssen sich nach außen gegen den Uhrzeigersinn nach links drehen. Wenn eine Linkskurve nicht möglich ist, fahren Sie geradeaus.

Given: abcdefg
Output:
  g
baf   
cde   

Bildverfolgung erstes Beispiel

2) Die Zeichen können zu vorherigen Zeichen werden, solange Regel 1 nicht verletzt wird. Wenn dieses Zeichen spiralförmig ist, wird dieses Zeichen in Großbuchstaben geschrieben. Sobald ein Zeichen in Großbuchstaben geschrieben ist, bleibt es in Großbuchstaben, unabhängig davon, wie oft es wiederverwendet wird.

Given: apples appeal
Output:
PAs
PLe
ea

Bildverfolgung zweites Beispiel

Tim Reddy
quelle
1
Wenn das Wort also in der Spirale bleibt, aber das nächste Zeichen verletzt, stoppt das Programm?
Matt
Ich denke, was dies zu einer guten Herausforderung macht, ist, dass Sie den Stapel sozusagen "zurückspulen" und an einem Punkt fortfahren müssen, an dem Regel 1 immer funktioniert.
Tim Reddy
5
Der aktuelle Wortlaut lässt Regel 2 völlig optional erscheinen. Wenn es obligatorisch sein sollte, denke ich, dass eine viel umfassendere Testsuite notwendig ist.
Peter Taylor
1
Was soll die Ausgabe für die Eingabe sein abcdefghab?
Peter Taylor

Antworten:

2

JavaScript, 225 221 212 Bytes

-9 Bytes dank Conor O'Brien

Bitte beachten Sie, dass Ihre Textfälle miteinander in Konflikt stehen. Ihr erster Testfall beginnt in der Mitte der Spirale. Ihr zweiter Testfall beginnt in der oberen Mitte der Spirale. Ich habe Ihren ersten Testfall durchgeführt, weil es der erste war, den ich gesehen habe. Sie haben Ihre Frage seit über einem Jahr nicht mehr bearbeitet. Entschuldigen Sie die Vermutung.

Erster Testfall:

9<-8<-7
|     |
2<-1  6
|     |
3->4->5

Zweiter Testfall:

2<-1<-6
|     |
3->4->5
|     |
7->8->9

Hier ist ohne weiteres der Golfcode. Ich bin mir zu 100% sicher, dass dies erheblich reduziert werden könnte, wenn die Community dies tut. Dies gibt ein mehrzeiliges Array zurück.

s=>eval("s=[...s.replace(/ /g,'')];i=0;k=j=1;a=[[],[],[]];b='00122210';c=b*100+'';for(;;){for(l=0;l<8;l++){if(!s[i])break;if(a[k][j]==s[i])s[i]=s[i].toUpperCase();a[k][j]=s[i];k=b[l];j=c[l];i++}if(!s[i])break}a")

Prettification-Snippet (druckt eine mehrzeilige Zeichenfolge an die Konsole). Bitte beachten Sie die Unterschiede in meinem Testfall Nr. 2 und dem Testfall Nr. 2 von OP (siehe oben, falls Sie dies noch nicht getan haben):

(Wenn jemand mit mehr Erfahrung mit Snippets dies in HTML-Eingaben korrigieren möchte, kann er dies gerne bearbeiten. Ich muss ins Bett gehen.)

f=
s=>eval("s=[...s.replace(/ /g,'')];i=0;k=j=1;a=[[],[],[]];b='00122210';c=b*100+'';for(;;){for(l=0;l<8;l++){if(!s[i])break;if(a[k][j]==s[i])s[i]=s[i].toUpperCase();a[k][j]=s[i];k=b[l];j=c[l];i++;g(a)}if(!s[i])break}a")

//replace argument here to change output
var arr = f("apples appeal");

function g(ar) {
  var str = "";

  for (x = 0; x < 3; x++) {
    for (y = 0; y < 3; y++) {
      str += ar[y][x] || " ";
    }
    str += "\n";
  }
  console.log(str);
}

Ungolfed und Erklärung

f=(input)=>{
    //remove spaces
    input = input.replace(/ /g, "");

    //convert to array (so I can uppercase individual letters)
    input = input.split("");

    //position in input
    var pos = 0;

    //positions inside output
    var xPos = 1;
    var yPos = 1;

    //output container (3 rows, 3 columns)
    var arr = [[],[],[]];

    //counterclockwise indexes for x
    var xOrder = "00122210";

    //counterclockwise indexes for y
    //var yOrder = "12221000"
    var yOrder = xOrder * 100 + "";

    //loop infinitely (breaks when input[pos] is undefined)
    for (;;) {
        //loop around circle
        for (var i = 0; i < 8; i++) {
            if (!input[pos]) {
                break;
            }

            //if item already in array equal next item in input, set next item in input to caps before
            if (arr[xPos][yPos] == input[pos]) {
                input[pos] = input[pos].toUpperCase(); 
            }

            //write or overwrite in array with current from input
            arr[xPos][yPos] = input[pos];

            //increment last because we do not prime our loops
            xPos = xOrder[i];
            yPos = yOrder[i];
            pos++;
        }
        if(!input[pos]) {
            break;
        }
    }
    return arr;
}
Stephen
quelle
1
a.split("")ist gleichbedeutend mit [...a]; s=>{...;return a;}ist äquivalent zu s=>eval("...;a")(und das ;ist optional in der weniger Golfversion); Alle Semikolons gefolgt von einem }sind optional
Conor O'Brien
@ ConorO'Brien danke :)
Stephen
Welche Ausgabe erhalten Sie für den Testfall apples appeal? Ich sehe ppa eas aLe, was definitiv nicht richtig ist, weil es kein lneben dem ps gibt.
Peter Taylor
@PeterTaylor Die Ausgabe ist korrekt, entsprechend der Spiralreihenfolge des ersten Testfalls, auf dem mein Programm basiert. Der zweite Testfall verwendet eine andere Spiralreihenfolge (beginnt oben). Ich habe für jede Iteration des Snippets ein Protokoll hinzugefügt. Schau dir das an - es könnte sinnvoller sein.
Stephen
Nach der Logik des ersten Testfalls wäre die Ausgabe eppa apas lple s.
Peter Taylor