2012-05-01 7 views
1

私はこの問題を投げ捨てて、どのような優雅なソリューションの人々が何かを見いだすことができると思った。 はプロセス中でうまくいけば新しいルビーを学ぶだろう トリック。ruby​​:多くの可変長文字列から構成された長さ制約付きの文字列を構築する

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

(私はそれが問題の焦点では​​ないとして、競技外バイト、CHAR、およびエンコーディングの問題 を取るためにさえずりテキスト宝石を使用しました。)

主な制約が達成していることです必要な最大長は、 が切り捨てられなければならない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 

特に重複していると醜いです。アイデア?

+0

上記のコードを複製するのではなく、 'gsub''" fixed preamble#{text_a} "'を切り詰めたバージョンで使用するのはなぜですか? –

+0

したがって: 'text.gsub(text_a、text_a [0 ..-(excess_length + 1)])' gsubはすべての出現を置き換えますので、text_bおよび/またはsuffixを叩くことはできません。 – auxbuss

+0

ジョブに 'gsub'を使うのは本当に悪い考えです。特に' text_a [0 ..-(excess_length + 1)] + text [text_a.size ..- 1] ' –

答えて

0

最初に文字列を正しく作成しないのはなぜですか?

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 
+0

私はあなたが間違ってそこに '結合'を残したと思う。 (私は問題をより理解しやすくするために、冗長で手続き的な目的で作成しました) あなたの興味深い解決策です。特にtext_aの前に「あまりにも長い」ケースを扱うことは考慮されています!アイデアをありがとう。 – auxbuss

+0

@auxboss:はい、間違いでしたが、コードを変更するときに削除するのを忘れてしまいました。一般的に、特定の質問を投稿する場合は、特定の回答を得ることを期待する必要があります。 –

+0

ありがとうございます。私はそれを2行に減らすことができました(主に.concat()を使用していました)。これは私が持っていた3よりも優れていて、もっと分かりやすく、読みやすくなっています。 – auxbuss

関連する問題