ลด html ถึง n ตัวอักษรในขณะที่รักษาการฟอร์แมต


11

เกือบทุกภาษามีฟังก์ชั่นในตัวที่สามารถแยกสตริงที่ตำแหน่งที่กำหนด อย่างไรก็ตามทันทีที่คุณมีแท็ก html ในสตริงฟังก์ชันในตัวจะทำงานไม่ถูกต้อง

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่แยกสตริงที่ตัวอักษรที่ n แต่ไม่นับตัวอักษรของแท็ก html และจะส่งออก html ที่ถูกต้อง โปรแกรมจะต้องทำการฟอร์แมตต่อไป ช่องว่างด้านนอกแท็ก html อาจถูกนับหรือไม่นับตามที่คุณต้องการ แต่ต้องได้รับการเก็บรักษาไว้ อย่างไรก็ตามคุณสามารถแลกเปลี่ยนช่องว่างหลายช่องติดต่อกันเป็นช่องว่างเดียวได้

การป้อนข้อมูล:

  1. สตริง
  2. ตำแหน่งที่จะแยกที่ (อิงตาม 0)

สิ่งเหล่านี้สามารถนำมาเป็นข้อโต้แย้งของโปรแกรมหรือฟังก์ชั่นหรือสามารถอ่านได้จากอินพุตมาตรฐาน

เอาต์พุต: สตริงการแยกที่สามารถส่งคืนหรือเขียนไปยังเอาต์พุตมาตรฐาน

อินพุตจะเป็น html ที่ถูกต้อง แต่จะไม่มีเอนทิตีใด ๆ (เช่น ) แท็กที่เปิดหลังจากขีด จำกัด อักขระควรละเว้นจากผลลัพธ์ (ดูตัวอย่างสุดท้าย)

ตัวอย่าง:

อินพุต: <i>test</i>, 3
เอาต์พุต:<i>tes</i>

อินพุต: <strong><i>more</i> <span style="color: red">complicated</span></strong>, 7
เอาท์พุท:<strong><i>more</i> <span style="color: red">co</span></strong>

อินพุต: no html, 2
เอาท์พุท:no

อินพุต: <b>no</b> <i>html root</i>, 5
เอาท์พุท:<b>no</b> <i>ht</i>

อินพุต: <b>no img</b><img src="test.png" />more text, 6
เอาท์พุท:<b>no img</b>

คุณสามารถใช้ภาษาใดก็ได้และไลบรารีมาตรฐานของภาษาที่กำหนด นี่คือรหัสกอล์ฟโปรแกรมที่สั้นที่สุดชนะ มีความสุข!


1
อินพุตสามารถมี "<" s และ ">" s ที่ไม่ได้เป็นส่วนหนึ่งของแท็ก HTML ได้หรือไม่
xem

ควรใช้&lt;และ&gt;แทนที่จะเป็น<>ดังนั้นจึงไม่มี ( &lt;หรือ&gt;จะไม่ปรากฏด้วย)
David Frank

คุณสามารถรวมตัวอย่างที่มีการทำเครื่องหมายหลังจากโหนดข้อความที่เกิดการแบ่งหรือไม่ ชอบ<i>ab</i><b>cd</b> 1ไหม
Martin Ender

มีตัวเลือกอื่นนอกเหนือจากนี้<i>a</i>ไหม?
David Frank

@DavidFrank <i>a</i><b></b>(ซึ่งทำให้รู้สึกว่าคุณพิจารณาว่าbยังอาจเป็นdivหรือimg.)
มาร์ตินเอนเดอร์

คำตอบ:


2

คำตอบนี้ใช้ไม่ได้กับกฎล่าสุด

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

คุณช่วยระบุรหัสที่ไม่ตีกอล์ฟได้หรืออาจจะเป็นเพียงคำอธิบายว่าทำไมและทำไมรหัสจึงถึงเป็นเช่นนั้น ปัจจุบันมันยากที่จะเข้าใจ ขอบคุณ!
Gaurang Tandon

@GaurangTandon เพิ่มรหัสที่ไม่ได้ลงคะแนนพร้อมความคิดเห็น
nderscore

2

Rebol - 252 ตัวอักษร

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

ไม่พอใจกับความคิดเห็น:

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:

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

สิ่งนี้จะทำลายกฎสุดท้าย: แท็กที่เปิดหลังจากขีด จำกัด อักขระควรละเว้นจากผลลัพธ์ (ดูตัวอย่างสุดท้าย) ในตัวอย่างสุดท้ายควรละเว้นและขยายแท็ก b กฎนี้ทำให้ความท้าทายเป็นไปไม่ได้เกือบ
edc65

@ edc65 - น่าเสียดาย (@David Frank) ยังไม่ได้แสดงความคิดเห็นหรืออัปเดตตัวอย่างของเขาดังนั้นจึงไม่ชัดเจนว่าเขาต้องการพฤติกรรมนี้หรือไม่? ฉันหวังว่าตัวอย่างสุดท้ายของฉันจะกวนบางสิ่งบางอย่าง! จะออกไปตามที่เป็นอยู่จนกว่าเราจะได้รับการชี้แจง อย่างไรก็ตามมันจะใช้เวลาเพิ่มอีก 17 ตัวอักษรเพื่อให้มันทำงานตามที่คุณแนะนำ ฉันไม่ชอบแฮ็คเป็นพิเศษดังนั้นแทนที่จะเขียนมันใหม่ที่นี่ (ไม่ได้รับของ) - gist.github.com/draegtun/93682f5a07c40bd86e31
draegtun

0

ทับทิม ... มีรูลูไลค์ที่มีลูปน้อยมาก

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

คำถามนี้ถูกทำเครื่องหมายเป็น codegolf คุณควรตีกลับการตอบกลับของคุณ คุณสามารถเริ่มต้นด้วยการแทนที่ชื่อตัวแปรเป็นชื่อตัวอักษรหนึ่งชื่อโดยใช้ชื่อฟังก์ชั่นที่สั้นลงและลบ white-space ออกได้ทุกที่
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}

ตอนนี้ฉันรู้สึกสกปรก แต่ต้องเริ่มลบตัวอักษรเหล่านั้นทั้งหมด ...

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

Disclaimer:

  • ทำงานในคอนโซล IE

1
การแบ่งกฎ (บ้า) ครั้งสุดท้ายนี้: แท็กที่เปิดหลังจากที่ จำกัด จำนวนอักขระที่ควรละเว้นจากผลลัพธ์ (ลองตัวอย่างของฉันในความคิดเห็นด้านบน)
edc65

@ edc65 หวังว่าการปรับปรุงการตรวจสอบรุ่นในทุกกฎ
eithed
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.