I’m trying to come up with a good algorithm to create an representation of a right handed DNA string with major and minor grooves using the dash character, for an arbitrary number of characters.
This is what I currently have, using 776 #‘s:
######### ##########
######### ##########
######### ##########
######### ##########
########## ##########
########## ##########
###### ##########
## ##########
########## #
########## #####
########## #########
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
########### ##########
######### ##########
##### ##########
# ##########
########## ###
########## #######
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
########## ##########
####### ##########
#### #########
######### #
########## ###
########### #######
but the helix doesn’t align perfectly when I manually try to repeat the helix via copy/pasting.
A solution that has has the same width as the example above but also has the basepair crossbonds (like in this image or in the scarf pattern below), is also acceptable.

The key to this question is to recognize that you can represent each strand on the helix as a combination of sine waves – one for the periodic portion, and one for the “depth” into the page. Once you’ve parameterized the problem this way, you can control every aspect of your helix. The example below uses
*and#to show the different strands to illustrate the point. If you choose values for the wavelength that do not commensurate with integer values you’ll get less then optimal results – but now you can play with inputs to find what you consider the most aesthetically pleasing representation.These values give: