1

Twitter アカウント名の配列があるとします。

string = %w[example1 example2 example3 example4 example5 example6 example7 example8 example9 example10 example11 example12 example13 example14 example15 example16 example17 example18 example19 example20]

そして、先頭に追加する変数と追加する変数:

prepend = 'Check out these cool people: '
append = ' #FollowFriday'

これを、それぞれ最大長が 140 文字のできるだけ少ない文字列の配列に変換するにはどうすればよいでしょうか。先頭テキストで始まり、追加テキストで終わり、すべて @ 記号で始まり、Twitter アカウント名とスペースで区切ります。このような:

tweets = ['Check out these cool people: @example1 @example2 @example3 @example4 @example5 @example6 @example7 @example8 @example9 #FollowFriday', 'Check out these cool people: @example10 @example11 @example12 @example13 @example14 @example15 @example16 @example17 #FollowFriday', 'Check out these cool people: @example18 @example19 @example20 #FollowFriday']

(アカウントの順序は重要ではないため、理論的には、使用可能なスペースを最大限に活用するために最適な順序を見つけようとすることができますが、必須ではありません。)

助言がありますか?メソッドを使用する必要があると考えscanていますが、まだ正しい方法がわかりません。

一連のループを使用するのは非常に簡単ですが、Ruby の適切なメソッドを使用する場合は、その必要はないと思います。これが私がこれまでに思いついたものです:

# Create one long string of @usernames separated by a space
tmp = twitter_accounts.map!{|a| a.insert(0, '@')}.join(' ')
# alternative: tmp = '@' + twitter_accounts.join(' @')

# Number of characters left for mentioning the Twitter accounts
length = 140 - (prepend + append).length

# This method would split a string into multiple strings
# each with a maximum length of 'length' and it will only split on empty spaces (' ')
# ideally strip that space as well (although .map(&:strip) could be use too) 
tweets = tmp.some_method(' ', length)

# Prepend and append
tweets.map!{|t| prepend + t + append}

PS誰かがより良いタイトルの提案を持っているなら、私に知らせてください. 質問を要約するのに苦労しました。

4

2 に答える 2

3

Stringrindexメソッドには、文字列内の後方検索を開始する場所を指定できるオプションのパラメーターがあります。

arr = %w[example1 example2 example3 example4 example5 example6 example7 example8 example9 example10 example11 example12 example13 example14 example15 example16 example17 example18 example19 example20]
str = arr.map{|name|"@#{name}"}.join(' ')
prepend =  'Check out these cool people: '
append = ' #FollowFriday'
max_chars = 140 - prepend.size - append.size
until str.size <= max_chars do
  p str.slice!(0, str.rindex(" ", max_chars))
  str.lstrip! #get rid of the leading space
end
p str unless str.empty?
于 2013-04-19T22:41:04.053 に答える
1

私はこれを利用reduceします:

string = %w[example1 example2 example3 example4 example5 example6 example7 example8 example9 example10 example11 example12 example13 example14 example15 example16 example17 example18 example19 example20]
prepend = 'Check out these cool people:'
append = '#FollowFriday'

# Extra -1 is for the space before `append`
max_content_length = 140 - prepend.length - append.length - 1

content_strings = string.reduce([""]) { |result, target|
  result.push("") if result[-1].length + target.length + 2 > max_content_length
  result[-1] += " @#{target}"

  result
}

tweets = content_strings.map { |s| "#{prepend}#{s} #{append}" }

これは次のようになります。

"Check out these cool people: @example1 @example2 @example3 @example4 @example5 @example6 @example7 @example8 @example9 #FollowFriday"
"Check out these cool people: @example10 @example11 @example12 @example13 @example14 @example15 @example16 @example17 #FollowFriday"
"Check out these cool people: @example18 @example19 @example20 #FollowFriday"
于 2013-04-19T21:56:40.117 に答える