hello, can you tell me how to make a better function that performs line feeds by spaces, than what I did with my natural science education, i, j, l and += 1 ?
function feed_lines(str::String, l::Int)
chars = collect(str)
i = findfirst(' ', str)
j = 1
for (index, char) in pairs(chars)
if char == ' '
i = index
end
if j > l
chars[i] = '\n'
j = index - i
end
j += 1
end
return join(chars)
end
although it seems not so bad
Could you explain what is the role of integer l
?
In my limited understanding the following seems to produce similar results:
feed_lines2(str::String) = join(split(str),"\n")
1 Like
this is line length, if line length > l then replace last space (which < l) to â\nâ
Could you provide a minimum working example (MWE) to illustrate what it is supposed to do?
sure
julia> function feed_lines(str::String, l::Int)
chars = collect(str)
i = findfirst(' ', str)
j = 1
for (index, char) in pairs(chars)
if char == ' '
i = index
end
if j > l
chars[i] = '\n'
j = index - i
end
j += 1
end
return join(chars)
end
feed_lines (generic function with 1 method)
julia> feed_lines("""hello, can you tell me how to make a better function that performs line feeds by spaces, than what I did with my natural science education, i, j, l and += 1 ?""", 30) |> println
hello, can you tell me how to
make a better function that
performs line feeds by spaces,
than what I did with my
natural science education, i,
j, l and += 1 ?
1 Like
Just an idea (not quite doing what you ask for):
julia> join(join.(Iterators.partition(s, 30) |> collect, ""), "\n") |> println
hello, can you tell me how to
make a better function that pe
rforms line feeds by spaces, t
han what I did with my natural
science education, i, j, l an
d += 1 ?
where s
is your example string.
(Do we have an efficient âword iteratorâ somewhere?)
2 Likes
This is rather compact:
julia> function feed_lines2(str, l)
line_breaks = findnext.(' ', str, l:l:length(str))
join([i in line_breaks ? '\n' : c for (i,c) in pairs(str)])
end
feed_lines2 (generic function with 1 method)
julia> feed_lines2("""hello, can you tell me how to make a better function that performs line feeds by spaces, than what I did with my natural science education, i, j, l and += 1 ?""", 30) |> println
hello, can you tell me how to
make a better function that performs
line feeds by spaces, than
what I did with my natural
science education, i, j, l and
+= 1 ?
However, I think it will be (a bit) less efficient than your variant.
2 Likes
A version that uses SubString
and also returns the number of rows printed:
function feed_lines3(str, n)
ix = [1; findall(' ', str); length(str)]
j1 = zero(ix)
j2 = zero(ix)
nr = 1
j1[1] = 1
for i in 2:length(ix)
if ix[i] - j1[nr] > n
j2[nr] = ix[i-1]
nr += 1
j1[nr] = ix[i-1] + 1
elseif i == length(ix)
j2[nr] = ix[end]
end
end
join(SubString.(str, view(j1,1:nr), view(j2,1:nr)), "\n"), nr
end
println(feed_lines3(str, 30)[1])
# result:
hello, can you tell me how to
make a better function that
performs line feeds by spaces,
than what I did with my
natural science education, i,
j, l and += 1 ?
This version should be further optimized, as only one j
array seems necessary.
2 Likes
FWIW, a simpler alternative and a bit faster:
function feed_lines4(str, n)
ix = [1; findall(' ', str); length(str)]
nx = length(ix)
j = 1;
s2 = ""
for i in 2:nx
if ix[i] - j > n
s2 = s2 * view(str,j:ix[i-1]) * "\n"
j = ix[i-1] + 1
elseif i == nx
s2 = s2 * view(str,j:ix[nx]) * "\n"
end
end
return s2
end
println(feed_lines4(str,30))
# result:
hello, can you tell me how to
make a better function that
performs line feeds by spaces,
than what I did with my
natural science education, i,
j, l and += 1 ?
@stevengj, the TextWrap.jl
package although more general seems for the OP example to be slower than the above solutions (maybe ~3x
when comparing using @time run multiple times).