Kurangi html ke n karakter sambil tetap memformat

11

Hampir setiap bahasa memiliki fungsi bawaan yang dapat memisahkan string pada posisi tertentu. Namun, segera setelah Anda memiliki tag html di string, fungsi bawaan tidak akan berfungsi dengan baik.

Tugas Anda adalah menulis sebuah program atau fungsi yang membagi string pada karakter ke-n tetapi tidak menghitung karakter dari tag html dan akan menghasilkan html yang valid. Program harus tetap memformat. Spasi di luar tag html dapat dihitung atau tidak dihitung, seperti yang Anda inginkan, tetapi harus dipertahankan. Anda dapat, bagaimanapun, menukar banyak ruang berurutan menjadi satu ruang.

Memasukkan:

  1. string
  2. posisi untuk dibagi pada (berbasis 0)

Ini dapat diambil sebagai argumen program atau fungsi atau dapat dibaca dari input standar.

Output: String split yang dapat dikembalikan atau ditulis ke output standar.

Masukan akan menjadi html yang valid, tidak akan mengandung entitas apa pun (seperti  ). Tag yang dibuka setelah batas karakter harus dihilangkan dari output (lihat contoh terakhir).

Contoh:

Input:, <i>test</i>3
Output:<i>tes</i>

Input:, <strong><i>more</i> <span style="color: red">complicated</span></strong>7
Output:<strong><i>more</i> <span style="color: red">co</span></strong>

Input:, no html2
Output:no

Input:, <b>no</b> <i>html root</i>5
Output:<b>no</b> <i>ht</i>

Input:, <b>no img</b><img src="test.png" />more text6
Output:<b>no img</b>

Anda dapat menggunakan bahasa apa saja dan perpustakaan standar dari bahasa yang diberikan. Ini golf kode, program terpendek yang menang. Selamat bersenang-senang!

David Frank
sumber
1
dapatkah input berisi "<" dan ">" yang bukan bagian dari tag HTML?
xem
Seseorang harus menggunakan &lt;dan &gt;bukannya <>, jadi tidak ( &lt;atau &gt;tidak akan hadir juga).
David Frank
Bisakah Anda memasukkan contoh di mana ada tanda setelah simpul teks tempat perpecahan terjadi? Suka <i>ab</i><b>cd</b> 1?
Martin Ender
Apakah ada opsi lain selain <i>a</i>?
David Frank
@ DavidFrank <i>a</i><b></b>(Yang masuk akal jika Anda menganggap itu bbisa juga divatau img.)
Martin Ender

Jawaban:

2

Jawaban ini tidak lagi valid dengan aturan terbaru.

Javascript ( ES6 ) 94 91

f=(s,l)=>s.split(/(<[^>]+>)/).map(x=>x[0]=='<'?x:[l-->0?y:''for(y of x)].join('')).join('')
f('<strong><i>more</i> <span style="color: red">complicated</span></strong>', 7);
// '<strong><i>more</i> <span style="color: red">co</span></strong>'

Tidak Disatukan:

f=(s,l)=>
    s.split(/(<[^>]+>)/). // split string s by <*>, capture group is spliced into the array 
    map(x=> // map function to every item in the array
        x[0]=='<'? // if first character is a <
            x // don't modify the string
        : // else
            [ // array comprehension
                for(y of x) // for every character y in x
                    l-->0? // if l > 0 (and decrement l)
                        y // character y
                    : // else
                        '' // empty string 
            ].join('') // join characters in array
        ).
    join('') // join all strings in array
nderscore
sumber
Bisakah Anda memberikan kode un-golfed, atau mungkin hanya penjelasan tentang apa dan mengapa kode itu? Saat ini agak sulit untuk dipahami. Terima kasih!
Gaurang Tandon
@GaurangTandon menambahkan kode ungolfed dengan komentar
nderscore
2

Rebol - 252 karakter

c: complement charset"<>"f: func[s n][t: e: 0 to-string collect[parse s[any[(m: 0)copy w[["</"some c">"](-- t)|["<"some c"/>"]|["<"some c">"](++ t)| any c(m: 1)](if e = 0[if m = 1[w: copy/part w n n: n - length? w]keep w]if all[n <= 0 t = 0][e: 1])]]]]

Tidak dikoleksi dengan komentar:

c: complement charset "<>"

f: func [s n] [
    t: e: 0             ;; tag level (nesting) & end output flag
    to-string collect [
        parse s [
            any [
                (m: 0)                            ;; tag mode
                copy w [
                      ["</" some c ">" ] (-- t)   ;; close tag
                    | ["<"  some c "/>"]          ;; self-closing / void elements
                    | ["<"  some c ">" ] (++ t)   ;; open tag
                    | any c (m: 1)                ;; text mode
                ] (
                    ;; flag not set so can still output
                    if e = 0 [
                        ;; in text mode - so trim text
                        if m = 1 [
                            w: copy/part w n
                            n: n - length? w
                        ]
                        keep w
                    ]

                    ; if all trimmed and returned to flat tag level then end future output
                    if all [n <= 0  t = 0] [e: 1]
                )
            ]
        ]
    ]
]

Contoh di konsol Rebol:

>> f "<i>test</i>" 3
== "<i>tes</i>"

>> f {<strong><i>more</i> <span style="color: red">complicated</span></strong>} 7
== {<strong><i>more</i> <span style="color: red">co</span></strong>}

>> f {no html} 2
== "no"

>> f {<b>no</b> <i>html root</i>} 5
== "<b>no</b> <i>ht</i>"

>> f {<b>no img</b><img src="test.png" />more text} 6
== "<b>no img</b>"

>> f {<i>a</i><b></b>} 1
== "<i>a</i>"

>> f {<strong><i>even</i> <span style="color: red">more <b>difficult</b></span></strong>} 14
== {<strong><i>even</i> <span style="color: red">more <b>diff</b></span></strong>}

>> f {<strong><i>even</i> <span style="color: red">more <b>difficult</b></span></strong>} 3 
== {<strong><i>eve</i><span style="color: red"><b></b></span></strong>}
draegtun
sumber
Sekali lagi ini melanggar aturan terakhir: tag yang dibuka setelah batas karakter harus dihilangkan dari output (lihat contoh terakhir). Dalam contoh terakhir rentang dan tag b harus dihilangkan. Aturan ini membuat tantangan hampir tidak mungkin.
edc65
@ edc65 - Sayangnya (@ David Frank) belum berkomentar atau memperbarui contohnya sehingga tidak jelas apakah dia menginginkan perilaku ini atau tidak? Saya berharap contoh terakhir saya akan mengaduk sesuatu! Pergi seperti apa adanya sampai kita mendapatkan klarifikasi. Pokoknya itu hanya akan membutuhkan 17 karakter tambahan untuk membuatnya bekerja seperti yang Anda sarankan. Saya tidak terlalu suka hack, jadi alih-alih menulis ulang di sini (ungolfed) - gist.github.com/draegtun/93682f5a07c40bd86e31
draegtun
0

Ruby ... Sangat tidak suka dengan loop

def split(str,n)

  i = current = 0 
  return_str = ""

  while i < n
    if str[current] == "<"
      while str[current] != ">"
        return_str.concat str[current]
        current += 1
      end
      return_str.concat str[current]
      current += 1
    else
      return_str.concat str[current]
      i += 1
      current += 1
    end
  end

  while current < str.length
    if str[current] == "<"
      while str[current] != ">"
        return_str.concat str[current]
        current += 1
      end
      return_str.concat str[current]
      current += 1
    end
    current += 1
  end


  return_str + str[current..-1]
end
pengguna26900
sumber
Pertanyaan ini ditandai sebagai codegolf, Anda harus mengirim balasan Anda. Anda dapat mulai dengan mengganti nama variabel menjadi satu nama huruf, menggunakan nama fungsi yang lebih pendek dan menghapus spasi putih di mana pun Anda bisa
sagiksp
0

(IE) JS - 135

function f(t,n){b=document.body;b.innerHTML=t;r=b.createTextRange();r.moveStart("character",n);r.select();r.execCommand('cut');return b.innerHTML}

Sekarang saya merasa kotor. Tapi harus mulai menghapus semua karakter itu ...

function f(t,n)
{b=document.body;b.innerHTML=t;r=b.createTextRange();r.collapse();r.moveEnd("character",n);
r.select();return r.htmlText}

Penolakan:

  • berjalan di konsol IE
eithed
sumber
1
Ini melanggar aturan (mad) terakhir: Tag yang dibuka setelah batas karakter harus dihilangkan dari output (coba contoh saya di komentar di atas).
edc65
@ edc65 semoga, pembaruan versi memeriksa semua aturan
eithed