PPCG Старший Шутка


19

Вскоре мы переходим к полноценному сайту, и до окончания обучения остается сделать только одно: потянуть старшую шутку! Я думаю, что мы должны сделать вариацию на классический кляп "заполнить коридор чашками с водой".

Вызов

Ваша программа будет читать текст и выводить этот текст в перевернутых чашах с водой. Перевернутая чашка воды выглядит следующим образом: /~\
эти чашки могут быть помещены только в пустое пространство на входе и могут быть размещены только так, чтобы все три символа чашки находились непосредственно над непробельным символом (в противном случае вода будет проливаться вне!). Чашки нельзя укладывать поверх других чашек. Чашки должны быть размещены в каждом доступном отверстии, и предполагается, что каждый вход окружен бесконечным полем пробела.

Вы можете предположить, что ввод дополнен прямоугольником с пробелами.

Нам нужно быстро выполнить шалость, чтобы никто не заметил, поэтому побеждает наименьшее количество байтов на каждом языке.

Тестовые случаи

Входные данные:

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

Выход:

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

Входные данные:

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

Выход:

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

1
Возможно, настало время воскресить некоторые из этих языков сопоставления двухмерных шаблонов ...
mbomb007

Ответы:


10

Сетчатка , 41 байт

Число байтов предполагает кодировку ISO 8859-1.

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

Обратите внимание, что в первой строке есть три пробела.

Требуется, чтобы ввод был дополнен прямоугольником.

Попробуйте онлайн!

объяснение

Это довольно стандартное вертикальное соответствие:

(?<=(.)*)

Здесь подсчитываются символы, предшествующие совпадению, путем захвата такого количества символов в группу 1.

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

Это проверяет наличие трех непробельных символов в одной и той же позиции на следующей строке. Это сделано, выскакивая из группы1 пока она не опустеет, (?<-1>.)*и предотвращения возврата с атомной группой (?>...).

Наконец мы сопоставляем фактические пробелы. Они просто заменяются буквальной строкой /~\. Удобно, что совпадения находятся слева направо и не могут перекрываться.


3

JavaScript (ES6), 163 байта

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`
`

Быстро взломанное вместе решение, безусловно, может быть в гольфе. Добавляет пустую строку выше, находит тройные пробелы и заменяет кубок, если следующая строка не содержит пробелов. Делает допустимое предположение, что ввод будет прямоугольным. Любые символы возврата на входе должны быть экранированы (как и следовало ожидать в JS).


Я думаю, что это возвращает неправильный вывод для a test.
Нил

1

JavaScript (ES6), 109 байт

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

Помимо того, что требуется прямоугольный ввод, также предполагается, что первая строка заканчивается новой строкой, даже если это единственная строка ввода. Использует динамически сгенерированный просмотр, чтобы убедиться, что он находит три пробела «над» тремя непробелами, чтобы не запутаться в дырах.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.