Disegna parole a spirale [chiuso]


11

Lo scenario

Dato un input di lettere e spazi minuscoli ASCII, disegna una spirale di caratteri che traccia l'input originale di caratteri esclusi gli spazi.

Le regole

1) I personaggi devono girare a spirale in senso antiorario a sinistra verso l'esterno. Se una svolta a sinistra non è possibile, quindi andare dritto.

Given: abcdefg
Output:
  g
baf   
cde   

Primo esempio di tracciamento dell'immagine

2) I personaggi possono passare a spirale nei personaggi precedenti purché la regola 1 non venga violata. Inoltre, se quel personaggio viene trasformato in una spirale, quel personaggio viene maiuscolo. Una volta che un personaggio è maiuscolo, rimarrà maiuscolo indipendentemente dal numero di volte che viene riutilizzato.

Given: apples appeal
Output:
PAs
PLe
ea

Secondo esempio di tracciamento dell'immagine


1
Quindi se la parola rimane nella spirale ma viola il carattere successivo, il programma si ferma?
Matt

Penso che ciò che rende questa una buona sfida sia che dovresti "riavvolgere lo stack" per così dire e riprendere in un punto che fa funzionare sempre la regola n. 1.
Tim Reddy,

5
L'attuale formulazione rende la regola 2 del tutto facoltativa. Se dovesse essere obbligatorio, penso che sia necessaria una suite di test molto più completa.
Peter Taylor,

1
Quale dovrebbe essere l'output per l'input abcdefghab?
Peter Taylor,

Risposte:


2

JavaScript, 225 221 212 byte

-9 byte grazie a Conor O'Brien

Si noti che i casi di testo sono in conflitto tra loro. Il tuo primo caso di test inizia nel mezzo della spirale. Il tuo secondo test case inizia nella parte superiore centrale della spirale. Sono andato con il tuo primo caso di test, perché è stato il primo che ho visto. Non hai modificato la tua domanda da oltre un anno, quindi mi dispiace per la presunzione.

Primo caso di test:

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

Secondo caso di prova:

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

Senza ulteriori indugi, ecco il codice golf. Sono sicuro al 100% che se la community chip questo potrebbe essere ridotto in modo significativo. Ciò restituisce un array multilinea.

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")

Snippet di prettificazione (stampa una stringa multilinea su console). Notare le differenze nel mio caso di test n. 2 e nel caso di test n. 2 di OP (vedi sopra se non lo hai già fatto):

(se qualcuno con più esperienza con i frammenti vuole sistemarlo nell'input HTML, sentiti libero di modificarlo, devo andare a letto).

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 e spiegazione

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;
}

1
a.split("")è equivalente a [...a]; s=>{...;return a;}è equivalente a s=>eval("...;a")(ed ;è facoltativo nella versione meno giocata); tutti i punti e virgola seguiti da un }sono facoltativi
Conor O'Brien

@ ConorO'Brien grazie :)
Stephen,

Quale output ottieni per il test case apples appeal? Sto vedendo ppa eas aLe, che sicuramente non è corretto perché non c'è laccanto alla ps.
Peter Taylor,

@PeterTaylor l'output è corretto, secondo l'ordine a spirale del primo caso di test, su cui ho basato il mio programma. Il secondo caso di test utilizza un diverso ordine a spirale (inizia in alto). Ho aggiunto un registro per ogni iterazione dello snippet. Guarda che potrebbe avere più senso.
Stephen,

Secondo la logica del primo caso di test, l'output sarebbe eppa apas lple s.
Peter Taylor,
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.