PPCG Senior Prank

19

Kami akan segera lulus ke situs penuh, dan hanya ada satu hal yang harus dilakukan sebelum lulus: tarik lelucon senior! Saya pikir kita harus melakukan variasi pada lelucon "mengisi lorong dengan cangkir air" klasik.

Tantangan

Program Anda akan membaca dalam teks dan menampilkan teks itu, tercakup dalam cangkir air terbalik. /~\
Gelas air terbalik terlihat seperti ini: Gelas ini hanya dapat ditempatkan di ruang putih di input, dan hanya dapat ditempatkan sehingga ketiga karakter cangkir langsung di atas karakter non-ruang putih (jika tidak air akan tumpah di luar!). Cangkir tidak dapat ditumpuk di atas gelas lainnya. Piala harus ditempatkan di setiap celah yang tersedia, dan diasumsikan bahwa setiap input dikelilingi oleh bidang spasi putih yang tak terbatas.

Anda dapat mengasumsikan bahwa input diisi ke sebuah persegi panjang dengan spasi.

Kita perlu melakukan prank dengan cepat dan tanpa ada yang memperhatikan, sehingga byte paling sedikit di setiap bahasa menang.

Uji Kasus

Memasukkan:

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

Keluaran:

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

Memasukkan:

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

Keluaran:

 L   /~\/~\/~\/~\/~\/~\/~\
LOL  ROFL:ROFL:LOL:ROFL:ROFL
 L\\/~\/~\  ____I____
    ========/~\ |  |[\
            \___O==___)
            ___I_I__/
Mike Bufardeci
sumber
1
Ini mungkin waktu untuk menghidupkan kembali beberapa bahasa pencocokan pola 2D ...
mbomb007

Jawaban:

10

Retina , 41 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

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

Perhatikan bahwa baris pertama memiliki tiga spasi tambahan.

Membutuhkan input untuk diisi ke persegi panjang.

Cobalah online!

Penjelasan

Ini adalah pencocokan vertikal standar:

(?<=(.)*)

Ini menghitung karakter sebelum pertandingan dengan menangkap banyak karakter ke dalam grup 1.

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

Ini memeriksa bahwa ada tiga karakter non-spasi di pada posisi yang sama di baris berikutnya. Ini dilakukan dengan muncul dari grup 1hingga kosong dengan (?<-1>.)*dan mencegah backtracking dengan grup atom (?>...).

Akhirnya kami mencocokkan ruang yang sebenarnya. Itu hanya diganti dengan string literal /~\. Mudahnya, pertandingan ditemukan dari kiri ke kanan dan tidak bisa tumpang tindih.

Martin Ender
sumber
3

JavaScript (ES6), 163 byte

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

Solusi yang diretas bersama dengan cepat, pasti dapat diturunkan. Menambahkan baris kosong di atas, menemukan tiga spasi, dan mengganti dengan piala jika baris berikutnya tidak mengandung spasi. Membuat asumsi yang dibolehkan bahwa input akan berbentuk persegi panjang. Setiap backspace dalam input harus keluar (seperti yang diharapkan dengan JS).

Mwr247
sumber
Saya pikir ini mengembalikan output yang salah untuk a test.
Neil
1

JavaScript (ES6), 109 byte

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

Serta membutuhkan input persegi panjang, juga mengasumsikan baris pertama berakhir dengan baris baru, bahkan jika itu adalah satu-satunya jalur input. Menggunakan lookahead yang dihasilkan secara dinamis untuk memastikan bahwa ia menemukan tiga spasi "di atas" tiga non-spasi, agar tidak bingung oleh lubang.

Neil
sumber