##################################
#                                #
# Last modified 2018/04/20       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import string
import math
import random	

def HammDist(a,b):
 
    Ham = 0

    for i in range(len(a)):
        if a[i] != b[i]:
            Ham += 1
    
    return Ham

def run():

    if len(sys.argv) < 3:
        print 'usage: python %s number length minHammingDistance [-GC min max] [-noStartT] [-noEndT]' % sys.argv[0]
        sys.exit(1)

    N = int(sys.argv[1])
    L = int(sys.argv[2])
    minHallowed = int(sys.argv[3])

    doNoEndT = False
    if '-noEndT' in sys.argv:
        doNoEndT = True
#        print 'will exclude barcodes with T at the end'

    doNoStartT = False
    if '-noStartT' in sys.argv:
        doNoStartT = True

    doGC = False
    if '-GC' in sys.argv:
        doGC = True
        minGC = float(sys.argv[sys.argv.index('-GC') + 1])
        maxGC = float(sys.argv[sys.argv.index('-GC') + 2])

    alphabet = 'ACGT'

    barcodes = []

    while len(barcodes) < N:
        B = ''
        for i in range(L):
            B += random.choice(alphabet)
        if doGC:
            GC = (B.count('C') + B.count('C'))/(L + 0.0)
            if GC < minGC or GC > maxGC:
                continue
        if doNoEndT:
            if B.endswith('T'):
                continue
        if doNoStartT:
            if B.startswith('T'):
                continue
        if len(barcodes) == 0:
            barcodes.append(B)
            continue
        minH = L
        for Bb in barcodes:
            H = HammDist(B,Bb)
            if H < minHallowed:
                continue
        barcodes.append(B)

    for B in barcodes:
        print B

run()
