書式を維持しながら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 14

の代わりに&lt;とを使用する必要&gt;<>あるため、no(&lt;または&gt;存在しません)。
デビッドフランク14

分割が発生するテキストノードの後にマークアップがある例を含めることができますか?好き<i>ab</i><b>cd</b> 1
マーティンエンダー14

他のオプションはあり<i>a</i>ますか?
デビッドフランク14

@DavidFrank <i>a</i><b></b>(あなたはそれが考慮すれば理にかなってbも、可能性divまたはimg。)
マーティン・エンダー

回答:


2

この回答は、最新のルールでは無効になりました。

Javascript(ES694 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

ゴルフされていないコードを提供してもらえますか、それともコードが何を、なぜ行うのかについての説明だけをお願いします。現時点では把握するのが少し難しいです。ありがとう!
ゴーランタンドン14

@GaurangTandonはコメントなしのコードを追加しました
nderscore 14

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

繰り返しますが、これは最後のルールに違反します:文字制限の後に開かれるタグは、出力から省略されるべきです(最後の例を参照)。最後の例では、spanタグとbタグを省略する必要があります。このルールにより、チャレンジはほとんど不可能になります。
edc65 14

@ edc65-残念ながら(@David Frank)は彼の例をコメントしたり更新したりしていないので、この動作が必要かどうかは不明です。私の最後の例が何かをかき立てることを望んでいた!明確になるまでそのままにしておきます。とにかく、あなたが提案したように機能させるために、追加の17文字しか必要としません。ハックは特に好きではなかったので、代わりにここで書き直しました(変更なし)-gist.github.com/draegtun/93682f5a07c40bd86e31
draegtun 14

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としてマークされているので、返信してください。変数名を1文字の名前に置き換え、短い関数名を使用して、可能な限り空白を削除することから開始できます
-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
これにより、最後の(狂った)規則が破られます:文字数制限の後に開かれるタグは、出力から省略されるべきです(上記のコメントの私の例を試してください)。
edc65 14

@ edc65願わくば、すべてのルールの更新されたバージョンチェック
14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.