Biçimlendirmeyi korurken HTML'yi n karaktere düşürün


11

Hemen hemen her dilde, belirli bir konumda bir dizeyi ayırabilen yerleşik bir işlev vardır. Bununla birlikte, dizede html etiketleri olur olmaz yerleşik işlev düzgün çalışmaz.

Göreviniz, n. Karaktere bir dize ayıran, ancak html etiketlerinin karakterlerini saymayan ve geçerli bir html çıkaran bir program veya işlev yazmaktır. Program biçimlendirmeyi korumalıdır. Html etiketlerinin dışındaki boşluklar istediğiniz gibi sayılabilir veya sayılmaz, ancak korunması gerekir. Ancak, birden fazla ardışık alanı tek bir alana dönüştürebilirsiniz.

Giriş:

  1. dize
  2. bölünecek konum (0 tabanlı)

Bunlar program veya fonksiyon argümanları olarak alınabilir veya standart girişten okunabilir.

Çıktı: Standart çıktıya döndürülebilen veya yazılabilen bölünmüş dize.

Girdi geçerli html olacak, herhangi bir varlık (örneğin  ) içermeyecek . Karakter sınırlamasından sonra açılan etiketler çıktıdan çıkarılmalıdır (son örneğe bakın).

Misal:

Giriş:, <i>test</i>3
Çıkış:<i>tes</i>

Giriş:, <strong><i>more</i> <span style="color: red">complicated</span></strong>7
Çıkış:<strong><i>more</i> <span style="color: red">co</span></strong>

Giriş:, no html2
Çıkış:no

Giriş:, <b>no</b> <i>html root</i>5
Çıkış:<b>no</b> <i>ht</i>

Giriş:, <b>no img</b><img src="test.png" />more text6
Çıkış:<b>no img</b>

Herhangi bir dili ve verilen dilin standart kütüphanesini kullanabilirsiniz. Bu kod golf, en kısa program kazanır. İyi eğlenceler!


1
girdi bir HTML etiketinin parçası olmayan "<" ve ">" içerebilir?
xem

Kişi kullanmalı &lt;ve &gt;bunun yerine <>, hayır ( &lt;ya &gt;da mevcut olmayacaktır).
David Frank

Bölünmenin meydana geldiği metin düğümünden sonra işaretleme olan bir örnek ekleyebilir misiniz ? Gibi <i>ab</i><b>cd</b> 1mi?
Martin Ender

Bundan başka seçenek var <i>a</i>mı?
David Frank

@DavidFrank <i>a</i><b></b>(eğer düşünüyorlarsa çok mantıklı bda olabilir divya img.)
Martin Ender

Yanıtlar:


2

Bu cevap artık en son kuralla geçerli değil.

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

Ungolfed:

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

Lütfen golf oynamayan kodu verebilir misiniz, ya da kodun ne ve neden yaptığını açıklayabilir misiniz? Şu anda kavramak biraz zor. Teşekkürler!
Gaurang Tandon

@GaurangTandon yorumlarla ungolfed kodu ekledi
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])]]]]

Yorum yapılmamış

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

Rebol konsolundaki örnekler:

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

Yine bu son kuralı ihlal eder: karakter sınırlamasından sonra açılan etiketler çıktıdan çıkarılmalıdır (son örneğe bakın). Son örnekte span ve b etiketleri atlanmalıdır. Bu kural, meydan okumayı neredeyse imkansız hale getirir.
edc65

@ edc65 - Ne yazık ki (@David Frank) örneklerini yorum yapmadı ya da güncellemedi, bu yüzden bu davranışı isteyip istemediğine belirsiz mi? Son örneğimin bir şeyler karıştırmasını umuyordum! Açıklık elde edene kadar olduğu gibi gidecek. Her neyse, önerdiğiniz şekilde çalışması için yalnızca 17 karakter daha gerekir. Kesmek gibi özellikle beğenmedim, bunun yerine burada yeniden yazdım (ungolfed) - gist.github.com/draegtun/93682f5a07c40bd86e31
draegtun 12:14

0

Ruby ... Döngülerle çok saçma

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

Bu soru kodgolf olarak işaretlenmiştir, cevabınızı golf oynamalısınız. Değişken adlarını bir harf adıyla değiştirerek, daha kısa işlev adlarını kullanarak ve mümkün olan her yerde beyaz boşluğu kaldırarak başlayabilirsiniz
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}

Şimdi kendimi kirli hissediyorum. Ancak tüm bu karakterleri kaldırmaya başlamanız gerekiyor ...

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

Yasal Uyarı:

  • IE konsolunda çalıştır

1
Bu son (çılgın) kuralı kır: Karakter sınırlamasından sonra açılan etiketler çıktıdan çıkarılmalıdır (yukarıdaki yorumlarda örneğimi deneyin).
edc65

@ edc65 umarım, güncellenmiş sürüm tüm kuralları kontrol eder
eithed
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.