2

異なる言語が配列を結合できる方法に興味がありますが、単一の結合文字列を使用するのではなく、特定の間隔で異なる結合文字列を使用します。

例(架空の言語):

Array.modJoin([mod, char], ...)
e.g. [1,2,3,4,5].modJoin( [1, ","], [2, ":"] )

引数が modulo と join char を含む配列またはオブジェクトを指定する場合、実装は modulo のどの順序が優先されるか (最新のもの) をチェックし、join char を適用します。([mod,char] が mod の昇順で提供されている必要があります)

すなわち

if (index % (nth mod) == 0) 
  append (join char) 
  continue to next index 
else 
  (nth mod)-- repeat

when complete join with ""

たとえば、私は Ruby で次のことを思いつきましたが、より優れた、より洗練された方法が存在すると思われます。それが私が見たいものです。

#Create test Array 
#9472 - 9727 as HTML Entities (unicode box chars)
range       = (9472..9727).to_a.map{|u| "&##{u};" }  

mod と join char のリストがあると仮定すると、リストが進むにつれて mod の値が増加することを規定する必要があります。

mod_joins   = [{m:1, c:",", m:12, c:"<br/>"]

今すぐ処理rangeしますmod_joins

processed = range.each_with_index.map { |e, i| 
  m = nil
  mods.reverse_each {|j|
    m = j and break if i % j[:m] == 0
  }
  # use the lowest mod for index 0
  m = mods[0] if i == 0 
  m = nil ? e : "#{e}#{m[:c]}"
}

#output the result string
puts processed.join ""

,これから、インデックスが 12 モジュロでない限り、によって区切られた htmlEntities のリストが得られます。<br/>

したがって、主に Haskell、F#、Common Lisp (Scheme、Clojure) などの関数型言語でこれをよりエレガントに行う方法に興味がありますが、リスト内包表記拡張機能を持つ汎用言語でこれを実現するクールな方法にも興味があります。 Linq、Ruby、Python、さらには Perl を使用した C# として。

4

2 に答える 2

1

これは、Python で書かれた純粋関数型のバージョンです。他の言語にも簡単に適応できると確信しています。

import itertools

def calcsep(num, sepspecs):
  '''
    num: current character position
    sepspecs: dict containing modulus:separator entries
  '''
  mods = reversed(sorted(sepspecs))
  return sepspecs[next(x for x in mods if num % x == 0)]

vector = [str(x) for x in range(12)]

result = [y for ix, el in enumerate(vector)
            for y in (calcsep(ix, {1:'.', 3:',', 5:';'}), el)]

print ''.join(itertools.islice(result, 1, None))
于 2012-12-21T03:53:09.860 に答える
1

これは、Ruby でのよりシンプルで読みやすいソリューションです。

array = (9472..9727).map{|u|"&##{u};"}
array.each_slice(12).collect{|each|each.join(",")}.join("<br/>")

または一般的な場合

module Enumerable   
  def fancy_join(instructions)
    return self.join if instructions.empty?
    separator = instructions.delete(mod = instructions.keys.max)
    self.each_slice(mod).collect{|each|each.fancy_join(instructions.dup)}.join(separator)
  end
end

range = (9472..9727).map{|u|"&##{u};"}
instructions = {1=>",",12=>"<br/>"}

puts array.fancy_join(instructions)    
于 2012-12-21T05:24:38.857 に答える