Giảm html xuống n ký tự trong khi vẫn giữ định dạng


11

Hầu như mọi ngôn ngữ đều có chức năng tích hợp có thể phân tách một chuỗi tại một vị trí nhất định. Tuy nhiên, ngay khi bạn có các thẻ html trong chuỗi, hàm tích hợp sẽ không hoạt động đúng.

Nhiệm vụ của bạn là viết một chương trình hoặc hàm chia chuỗi ở ký tự thứ n nhưng không tính các ký tự của thẻ html và sẽ xuất ra một html hợp lệ. Chương trình phải giữ định dạng. Không gian bên ngoài các thẻ html có thể được tính hoặc không được tính, như bạn muốn, nhưng phải được giữ nguyên. Tuy nhiên, bạn có thể trao đổi nhiều không gian liên tiếp thành một không gian duy nhất.

Đầu vào:

  1. chuỗi
  2. vị trí để phân chia tại (dựa trên 0)

Chúng có thể được lấy làm đối số chương trình hoặc hàm hoặc có thể được đọc từ đầu vào tiêu chuẩn.

Đầu ra: Chuỗi phân tách có thể được trả về hoặc ghi vào đầu ra tiêu chuẩn.

Đầu vào sẽ là html hợp lệ, nó sẽ không chứa bất kỳ thực thể nào (chẳng hạn như  ). Các thẻ được mở sau giới hạn ký tự nên được bỏ qua từ đầu ra (xem ví dụ cuối cùng).

Thí dụ:

Đầu vào : <i>test</i>, 3
Đầu ra:<i>tes</i>

Đầu vào : <strong><i>more</i> <span style="color: red">complicated</span></strong>, 7
Đầu ra:<strong><i>more</i> <span style="color: red">co</span></strong>

Đầu vào : no html, 2
Đầu ra:no

Đầu vào : <b>no</b> <i>html root</i>, 5
Đầu ra:<b>no</b> <i>ht</i>

Đầu vào : <b>no img</b><img src="test.png" />more text, 6
Đầu ra:<b>no img</b>

Bạn có thể sử dụng bất kỳ ngôn ngữ và thư viện tiêu chuẩn của ngôn ngữ đã cho. Đây là mã golf, chương trình chiến thắng ngắn nhất. Chúc vui vẻ!


1
đầu vào có thể chứa "<" s và ">" không phải là một phần của thẻ HTML không?
xem

Người ta nên sử dụng &lt;&gt;thay vì <>, vì vậy không ( &lt;hoặc &gt;sẽ không có mặt).
David Frank

Bạn có thể bao gồm một ví dụ nơi có đánh dấu sau nút văn bản nơi xảy ra sự phân tách không? Giống như <i>ab</i><b>cd</b> 1?
Martin Ender

Có lựa chọn nào khác <i>a</i>không?
David Frank

@DavidFrank <i>a</i><b></b>(Điều này có ý nghĩa nếu bạn xem xét điều đó bcũng có thể divhoặc img.)
Martin Ender

Câu trả lời:


2

Câu trả lời này không còn hợp lệ với quy tắc mới nhất.

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

Ung dung:

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

Bạn có thể vui lòng cung cấp mã không được đánh gôn, hoặc có thể chỉ giải thích về những gì và tại sao mã này không? Hiện tại nó hơi khó nắm bắt. Cảm ơn!
Gaurang Tandon

@GaurangTandon đã thêm mã không mã hóa với các bình luận
nderscore

2

Rebol - 252 ký tự

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

Ungolfed với ý kiến:

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

Ví dụ trong bảng điều khiển 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>}

Một lần nữa, điều này phá vỡ quy tắc cuối cùng: các thẻ được mở sau giới hạn ký tự sẽ được bỏ qua khỏi đầu ra (xem ví dụ cuối cùng). Trong ví dụ cuối, thẻ span và b nên được bỏ qua. Quy tắc này làm cho thách thức gần như không thể.
edc65

@ edc65 - Thật không may (@David Frank) đã không bình luận hoặc cập nhật các ví dụ của anh ấy để không rõ liệu anh ấy có muốn hành vi này hay không? Tôi đã hy vọng ví dụ cuối cùng của tôi sẽ khuấy động một cái gì đó! Sẽ rời đi như là cho đến khi chúng tôi nhận được làm rõ. Dù sao, nó sẽ chỉ mất thêm 17 ký tự để làm cho nó hoạt động theo cách bạn đã đề xuất. Tôi không đặc biệt như hack nên thay vì viết lại nó ở đây (ungolfed) - gist.github.com/draegtun/93682f5a07c40bd86e31
draegtun

0

Ruby ... Rất không giống với các vòng lặp

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

Câu hỏi này được đánh dấu là codegolf, bạn nên đánh golf trả lời. Bạn có thể bắt đầu bằng cách thay thế tên biến thành một tên chữ cái, sử dụng tên hàm ngắn hơn và xóa khoảng trắng bất cứ nơi nào bạn có thể
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}

Bây giờ tôi cảm thấy bẩn. Nhưng cần phải bắt đầu loại bỏ tất cả những ký tự đó ...

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

Tuyên bố từ chối trách nhiệm:

  • chạy trong giao diện điều khiển IE

1
Điều này phá vỡ quy tắc (điên) cuối cùng: Các thẻ được mở sau giới hạn ký tự nên được bỏ qua khỏi đầu ra (thử ví dụ của tôi trong các nhận xét ở trên).
edc65

@ edc65 hy vọng, phiên bản cập nhật sẽ kiểm tra tất cả các quy tắc
vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.