2016-03-23 13 views
0

Iはスイフトに次のコード再作成するためにエレガントな方法を描い問題が午前:分割ペアにワード

Pythonで(正確、簡潔、エレガント):

>>> def splits(word): 
...  return [(word[:i], word[i:]) for i in range(len(word) + 1)] 
... 
>>> splits("abc") 
[('', 'abc'), ('a', 'bc'), ('ab', 'c'), ('abc', '')] 

スウィフトInを(偽の重い側のビット):

func splits(word: String) -> [(String,String)] { 
    return word.characters.indices.map { 
     return (word[word.startIndex..<$0], word[$0..<word.endIndex]) 
    } 
} 

splits("abc") 

"[("", "abc"), ("a", "bc"), ("ab", "c")]" 

あなたが見ることができるように、スウィフトバージョンは目が欠落しています最後のペア。文字列のインデックスがマップクロージャの最後の文字を渡していないことを知っているなら、これをどのようにして(手動で最後のペアを追加するか)できますか?

EDIT:

私は答えからこれを適応:

func splits(word: String) -> [(String,String)] { 
    let chars = word.characters 
    return (0...chars.count).map { 
     (String(chars.dropFirst($0)),String(chars.dropLast(chars.count - $0))) 
    } 
} 
+1

ノートトンあなたのコードは、単語のペアの配列ではなく、*単一の文字列*を返します。 –

+0

入力内容に基づいて質問が更新されました。 – Laurent

答えて

1

もう1つの可能な解決策:

func splits(word: String) -> [(String, String)] { 

    return (0 ... word.characters.count).map { 
     (word.substringToIndex(word.startIndex.advancedBy($0)), 
      word.substringFromIndex(word.endIndex.advancedBy(-$0))) 
    } 
} 

splits("abc") 
// [("", "abc"), ("a", "bc"), ("ab", "c"), ("abc", "")] 
+0

素晴らしい! @マーティン:あなたは素晴らしいです! – Laurent

+1

輸入財団が必要ですのでご注意ください – user3441734

1

一つの可能​​な解決策

func splits(word: String) -> [(String,String)] { 
    var arr:[(String,String)] = [] 
    (0...word.characters.count).forEach { 
     arr.append((String(word.characters.dropFirst($0)),String(word.characters.dropLast(word.characters.count - $0)))) 
    } 
    return arr 
} 

let str = "abc" 
let arr = splits(str) 
print(arr) // [("abc", ""), ("bc", "a"), ("c", "ab"), ("", "abc")] 
+0

ポインタありがとう。私はキャラクター数を反復するあなたの「トリック」を使って、これに基づいて自分の機能を再構成しました。ありがとうございました。 – Laurent

関連する問題