서식을 유지하면서 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
입력에 HTML 태그의 일부가 아닌 "<"및 ">"를 포함 할 수 있습니까?
xem

하나는 사용 안 &lt;하고 &gt;대신에 <>, 그래서 ( &lt;또는 &gt;하나 존재하지 않습니다).
David Frank

분할이 발생한 텍스트 노드 다음에 마크 업이있는 예를 포함시킬 수 있습니까? 처럼 <i>ab</i><b>cd</b> 1?
마틴 엔더

이외의 다른 옵션이 <i>a</i>있습니까?
David Frank

@DavidFrank <i>a</i><b></b>( 또는 b그럴 수도 있다고 생각한다면 말이됩니다 .)divimg
Martin Ender

답변:


2

이 답변은 더 이상 최신 규칙에 유효하지 않습니다.

자바 스크립트 ( 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>'

언 골프 드 :

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은 주석이 달린 ungolfed 코드를 추가했습니다
nderscore

2

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

다시 말하지만 이것은 마지막 규칙을 위반합니다. 문자 제한 이후에 열린 태그는 출력에서 ​​생략해야합니다 (마지막 예 참조). 마지막 예에서 span 및 b 태그는 생략해야합니다. 이 규칙은 도전을 거의 불가능하게 만듭니다.
edc65

@ edc65-불행히도 (@David Frank)는 자신의 사례에 댓글을 달지 않았거나 업데이트하지 않아서이 행동을 원하는지 아닌지 확실하지 않습니까? 나는 나의 마지막 예가 무언가를 저어주기를 바랐다! 우리가 설명을 얻을 때까지 그대로 떠날 것입니다. 어쨌든 그것은 당신이 제안한 방식으로 작동하도록 추가 17자를 필요로합니다. - 그래서 대신에 여기 (ungolfed)을 다시 썼다 해킹과 같은 특정하지 않았다 gist.github.com/draegtun/93682f5a07c40bd86e31
draegtun

0

루비 ... 루프와 함께 아주 unrubylike

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로 표시되어 있으며 답장을 보내야합니다. 더 짧은 함수 이름을 사용하고 가능하면 공백을 제거하여 변수 이름을 하나의 문자 이름으로 바꾸는 것으로 시작할 수 있습니다.
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}

기권:

  • IE 콘솔에서 실행

1
이것은 마지막 (mad) 규칙을 위반합니다 : 문자 제한 이후에 열린 태그는 출력에서 ​​생략해야합니다 (위의 주석에서 예제를보십시오).
edc65

@ edc65 희망, 모든 규칙에 업데이트 된 버전 검사
eithed
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.