Broma PPCG Senior

19

Pronto nos graduaremos a un sitio completo, y solo queda una cosa por hacer antes de la graduación: ¡hacer una broma para adultos mayores! Creo que deberíamos hacer una variación en la clásica mordaza "llenar un pasillo con vasos de agua".

Desafío

Su programa leerá en texto y generará ese texto, cubierto en vasos de agua al revés. Una taza de agua al revés se ve así: /~\
estas tazas solo se pueden colocar en el espacio en blanco en la entrada, y solo se pueden colocar de modo que los tres caracteres de la taza estén directamente encima de un carácter que no sea un espacio en blanco (de lo contrario, el agua se derramaría ¡fuera!). Las tazas no se pueden apilar sobre otras tazas. Las tazas deben colocarse en cada abertura disponible, y se supone que cada entrada está rodeada por un campo infinito de espacios en blanco.

Puede suponer que la entrada se rellena a un rectángulo con espacios.

Necesitamos sacar la broma rápidamente y sin que nadie lo note, por lo que gana la menor cantidad de bytes en cada idioma.

Casos de prueba

Entrada:

     ____________________________________________
    /   ___    /   ___    /   ______/   ________/
   /   /__/   /   /__/   /   /     /   /_______
  /   _______/   _______/   /     /   //__    /
 /   /      /   /      /   /_____/   /___/   /
/___/      /___/      /_________/___________/

Salida:

     /~\/~\/~\/~\/~\/~\/~\/~\/~\/~\/~\/~\/~\/~\
     ____________________________________________
    /   ___    /   ___    /   ______/   ________/
   /   /__//~\/   /__//~\/   /     /   /_______
  /   _______/   _______/   //~\  /   //__    /
 //~\/      //~\/      //~\/_____//~\/___//~\/
/___/      /___/      /_________/___________/

Entrada:

 L
LOL  ROFL:ROFL:LOL:ROFL:ROFL
 L\\        ____I____
    ========    |  |[\
            \___O==___)
            ___I_I__/

Salida:

 L   /~\/~\/~\/~\/~\/~\/~\
LOL  ROFL:ROFL:LOL:ROFL:ROFL
 L\\/~\/~\  ____I____
    ========/~\ |  |[\
            \___O==___)
            ___I_I__/
Mike Bufardeci
fuente
1
Este podría ser el momento de resucitar algunos de esos idiomas coincidencia de patrones 2D ...
mbomb007

Respuestas:

10

Retina , 41 bytes

El recuento de bytes asume la codificación ISO 8859-1.

(?<=(.)*)(?=.*¶(?>(?<-1>.)*)\S{3})   
/~\

Tenga en cuenta que la primera línea tiene tres espacios finales.

Requiere que la entrada se rellene en un rectángulo.

Pruébalo en línea!

Explicación

Esta es una coincidencia vertical bastante estándar:

(?<=(.)*)

Esto cuenta los caracteres que preceden al partido al capturar tantos caracteres en el grupo 1.

(?=.*¶(?>(?<-1>.)*)\S{3})

Esto verifica que haya tres caracteres que no sean espacios en la misma posición en la línea siguiente. Esto se realiza haciendo estallar desde el grupo 1hasta que esté vacío (?<-1>.)*y evitando el retroceso con el grupo atómico (?>...).

Finalmente hacemos coincidir los espacios reales. Esos simplemente se reemplazan con la cadena literal /~\. Convenientemente, las coincidencias se encuentran de izquierda a derecha y no pueden superponerse.

Martin Ender
fuente
3

JavaScript (ES6), 163 bytes

a=>(z=a.split`
`,z.unshift(z[0].replace(/./g,' ')),z).map((b,i)=>b.replace(/   /g, (c,j)=>(!z[i+1]||!z[i+1][j+2]||/ /.test(z[i+1].slice(j,j+3))?c:'/~\\'))).join`
`

Rápidamente hackeado juntos, definitivamente se puede jugar golf. Agrega una línea en blanco arriba, encuentra espacios triples y los reemplaza con una taza si la siguiente línea no contiene espacios. Hace la suposición permitida de que la entrada será rectangular. Cualquier espacio de retroceso en la entrada necesita escapar (como cabría esperar con JS).

Mwr247
fuente
Creo que esto devuelve la salida incorrecta para a test.
Neil
1

JavaScript (ES6), 109 bytes

s=>s.replace(/.*\n/,m=>(t=m).replace(/./g,' ')+m).replace(eval(`/   (?=[^]{${t.length-3}}[^ ]{3})/g`),"/~\\")

Además de requerir una entrada rectangular, también se supone que la primera línea termina con una nueva línea, incluso si es la única línea de entrada. Utiliza una búsqueda anticipada generada dinámicamente para garantizar que encuentre tres espacios "por encima" de tres no espacios, para no confundirse con los agujeros.

Neil
fuente