Still learning Nim and was trying to solve this problem: Write a function that combines two lists by alternatingly taking elements, e.g. [a,b,c], [1,2,3] → [a,1,b,2,c,3].
I came up with this:
let
numberList = [1, 2, 3]
letterList = ["a", "b", "c"]
var counter = 0
proc convertToString[I] (list: array[I, int]): array[I, string] =
for letter in list:
result[counter] = $letter
counter += 1
var convertedList = convertToString(numberList)
counter = 0
proc alternate[I1, I2: static[int], string](firstList: array[I1, string], secoundList: array[I2, string]): array[I1 + I2, string] =
for letter in firstList:
result[counter] = letter
counter += 2
counter = 1
for number in secoundList:
result[counter] = number
counter += 2
counter = 0
echo alternate(letterList, convertedList)
Is there a better way to solve this problem?
Maybe not the best way or a way that meets any constraints, but a way. :)
import sequtils
var s: seq[string]
for (v1,v2) in zip([1,2,3], ["a","b","c"]):
s.add($v1)
s.add(v2)
echo s
if to use seq as input lists:
let
numberList = @[1, 2, 3]
letterList = @["a", "b", "c"]
proc mix(a: seq[int], b:seq[string]): seq[string] =
for item in zip(map(a, proc(x:int):string = $x), b):
result &= @[item[0], item[1]]
assert mix(numberList, letterList) == @["1", "a", "2", "b", "3", "c"]
Here's a generic version that can also take uneven arrays/seqs:
proc alternateCombine[T1, T2](arr1: openArray[T1], arr2: openArray[T2]): seq[string] =
var place = 0
while place < max(arr1.len, arr2.len):
if place < arr1.len:
result.add($arr1[place])
if place < arr2.len:
result.add($arr2[place])
place += 1
proc main() =
let numberList = [1, 2, 3, 4]
let letterList = ["a", "b", "c"]
echo alternateCombine(numberList, letterList)
main()
Prints:
@["1", "a", "2", "b", "3", "c", "4"]
If you want to keep the types, you need some sort of wrapper object to hold them. Json is pretty good at that:
import json
let
numberList = [1, 2, 3]
letterList = ["a", "b", "c"]
var
finalList = newJArray()
for i in 0 ..< numberList.len:
finalList.add(newJInt(numberList[i]))
finalList.add(newJString(letterList[i]))
echo finalList