1

私はこの問題を投げ捨てて、人々がどのような洗練された解決策を考え出すことができるかを見て、うまくいけば、その過程でいくつかの新しい Ruby のトリックを学ぼうと考えました。

最大長が 140 文字の Twitter メッセージを作成するコンテキストで問題を設定します。text_a (必須)、text_b (オプション)、文字列を返す関数をトリガーするブール値 (オプション) の 3 つの入力から 140 文字以内のツイートを配信する簡潔な関数を探しています。

(問題の焦点では​​ないので、私は twitter-text gem を使用して、バイト、文字、およびエンコーディングの問題を解決しました。)

主な制約は、必要な最大長を達成するために切り捨てる必要があるのは text_a であるということです。

これは、うまくいけば要件を明確にする、長々としたサンプルコード (機能していると思います) です。

# encoding: utf-8

require 'twitter-text'

def tweet(text_a, text_b=nil, suffix=false)
  text = "fixed preamble #{text_a}"
  text << " #{text_b}" if text_b
  text << get_suffix if suffix
  return text unless Twitter::Validation.tweet_invalid?(text) == :too_long
  excess_length = Twitter::Validation.tweet_length(text) - Twitter::Validation::MAX_LENGTH
  text_a = text_a[0..-(excess_length + 1)]
  text = "fixed preamble #{text_a}"
  text << " #{text_b}" if text_b
  text << get_suffix if suffix
  text
end

def get_suffix
  " some generated suffix"
end

特に複製では醜いです。アイデア?

4

1 に答える 1

1

そもそも文字列を適切に構築しないのはなぜですか?

def tweet(text_a, text_b=nil, suffix=false)
  text = ""
  text << " #{text_b}" if text_b
  text << get_suffix if suffix

  space = Twitter::Validation::MAX_LENGTH - Twitter::Validation.tweet_length(text)
  raise "too long" unless space > 0

  "fixed preamble #{text_a}"[0, space] + text
end
于 2012-05-01T11:05:33.767 に答える