Dibujar palabras en espiral [cerrado]

11

El escenario

Dada una entrada de letras minúsculas y espacios ASCII, dibuje una espiral de caracteres que rastree la entrada original de caracteres excluyendo espacios.

Las normas

1) Los caracteres deben girar en sentido contrario a las agujas del reloj hacia la izquierda de manera externa. Si no es posible girar a la izquierda, muévase derecho.

Given: abcdefg
Output:
  g
baf   
cde   

Primer ejemplo de rastreo de imagen

2) Los caracteres pueden ir en espiral hacia los caracteres anteriores siempre que no se viole la regla # 1. Además, si ese personaje está en espiral, entonces ese personaje está en mayúscula. Una vez que un personaje está en mayúscula, permanecerá en mayúscula independientemente de la cantidad de veces que se reutilice.

Given: apples appeal
Output:
PAs
PLe
ea

Segundo ejemplo de rastreo de imágenes

Tim Reddy
fuente
1
Entonces, si la palabra se mantiene en la espiral pero viola el siguiente carácter, ¿se detiene el programa?
Matt
Creo que lo que lo convierte en un buen desafío es que tendrías que "rebobinar la pila", por así decirlo, y reanudarlo en un punto que haga que la regla # 1 siempre funcione.
Tim Reddy
55
La redacción actual hace que la regla 2 parezca completamente opcional. Si fuera obligatorio, creo que es necesario un conjunto de pruebas mucho más completo.
Peter Taylor
1
¿Cuál debería ser la salida para la entrada abcdefghab?
Peter Taylor

Respuestas:

2

JavaScript, 225 221 212 bytes

-9 bytes gracias a Conor O'Brien

Tenga en cuenta que sus casos de texto entran en conflicto entre sí. Su primer caso de prueba comienza en el medio de la espiral. Su segundo caso de prueba comienza en la mitad superior de la espiral. Fui con tu primer caso de prueba, porque fue el primero que vi. No ha editado su pregunta en más de un año, así que disculpe la presunción.

Primer caso de prueba:

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

Segundo caso de prueba:

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

Sin más adiós, aquí está el código de golf. Estoy 100% seguro de que si la comunidad lo procesa, esto podría reducirse significativamente. Esto devuelve una matriz multilínea.

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

Fragmento de prettificación (imprime una cadena multilínea en la consola). Tenga en cuenta lo diferente en mi caso de prueba n. ° 2 y en el caso de prueba de OP n. ° 2 (consulte más arriba si aún no lo ha hecho):

(si alguien con más experiencia con fragmentos quiere corregir esto en la entrada HTML, siéntase libre de editar esto, necesito irme a la cama).

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

Sin Golf y Explicación

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
fuente
1
a.split("")es equivalente a [...a]; s=>{...;return a;}es equivalente a s=>eval("...;a")(y ;es opcional en la versión menos golfizada); todos los puntos y coma seguido de un }son opcionales
Conor O'Brien
@ ConorO'Brien gracias :)
Stephen
¿Qué resultado obtienes para el caso de prueba apples appeal? Estoy viendo ppa eas aLe, lo que definitivamente no es correcto porque no hay al llado del ps.
Peter Taylor
@PeterTaylor la salida es correcta, de acuerdo con el orden en espiral del primer caso de prueba, en el que basé mi programa. El segundo caso de prueba usa un orden espiral diferente (comienza en la parte superior). Agregué un registro para cada iteración del fragmento. Mira eso, podría tener más sentido.
Stephen
Según la lógica del primer caso de prueba, la salida sería eppa apas lple s.
Peter Taylor