Draw Spiral Words [fermé]

11

Le scénario

Étant donné une entrée de lettres et d'espaces minuscules ASCII, dessinez une spirale de caractères qui retrace l'entrée d'origine des caractères à l'exclusion des espaces.

Les règles

1) Les personnages doivent tourner en spirale dans le sens antihoraire vers la gauche de façon extérieure. Si un virage à gauche n'est pas possible, alors allez tout droit.

Given: abcdefg
Output:
  g
baf   
cde   

Premier exemple de traçage d'image

2) Les personnages peuvent se transformer en caractères précédents tant que la règle n ° 1 n'est pas violée. De plus, si ce caractère est en spirale, alors ce caractère est en majuscule. Une fois qu'un personnage est en majuscule, il restera en majuscule quel que soit le nombre de fois qu'il sera réutilisé.

Given: apples appeal
Output:
PAs
PLe
ea

Deuxième exemple de traçage d'image

Tim Reddy
la source
1
Donc, si le mot reste dans la spirale mais viole le caractère suivant, le programme s'arrête?
Matt
Je pense que ce qui en fait un bon défi, c'est qu'il faudrait "rembobiner la pile" pour ainsi dire et reprendre à un point qui fait que la règle # 1 fonctionne toujours.
Tim Reddy
5
Le libellé actuel fait que la règle 2 semble tout à fait facultative. Si cela devait être obligatoire, je pense qu'une suite de tests beaucoup plus complète est nécessaire.
Peter Taylor
1
Quelle devrait être la sortie pour l'entrée abcdefghab?
Peter Taylor

Réponses:

2

JavaScript, 225 221 212 octets

-9 octets grâce à Conor O'Brien

Veuillez noter que vos cas de texte sont en conflit les uns avec les autres. Votre premier cas de test commence au milieu de la spirale. Votre deuxième test élémentaire commence au milieu supérieur de la spirale. Je suis allé avec votre premier cas de test, car c'était le premier que j'ai vu. Vous n'avez pas modifié votre question depuis plus d'un an, alors désolé pour la présomption.

Premier cas de test:

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

Deuxième cas de test:

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

Sans plus tarder, voici le code du golf. Je suis sûr à 100% que si la communauté réussit, cela pourrait être considérablement réduit. Cela renvoie un tableau multiligne.

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

Extrait de simplification (imprime une chaîne multiligne sur la console). Veuillez noter les différents dans mon cas de test # 2 et le cas de test OP # 2 (voir ci-dessus si vous ne l'avez pas déjà fait):

(si quelqu'un ayant plus d'expérience avec les extraits de code souhaite corriger cela en entrée HTML, n'hésitez pas à le modifier, je dois me coucher).

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

Non golfé et explication

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
la source
1
a.split("")est équivalent à [...a]; s=>{...;return a;}est équivalent à s=>eval("...;a")(et ;est facultatif dans la version la moins golfée); tous les points-virgules suivis d'un }sont facultatifs
Conor O'Brien
@ ConorO'Brien merci :)
Stephen
Quelle sortie obtenez-vous pour le cas de test apples appeal? Je vois ppa eas aLe, ce qui n'est certainement pas correct car il n'y a pas à lcôté de l' part.
Peter Taylor
@PeterTaylor la sortie est correcte, selon l'ordre en spirale du premier cas de test, sur lequel j'ai basé mon programme. Le deuxième scénario de test utilise un ordre de spirale différent (commence en haut). J'ai ajouté un journal pour chaque itération de l'extrait. Regardez cela - cela pourrait avoir plus de sens.
Stephen
Selon la logique du premier cas de test, la sortie serait eppa apas lple s.
Peter Taylor