• SatyrSack@feddit.org
    link
    fedilink
    English
    arrow-up
    3
    ·
    edit-2
    30 minutes ago

    For fun, I just ported it to Python

    source
    from random import random
    from math import floor
    
    strings_start = [
      "B",
      "Br",
      "C",
      "Ch",
      "F",
      "Fr",
      "G",
      "Gr",
      "K",
      "J",
      "L",
      "M",
      "N",
      "P",
      "Pr",
      "R",
      "S",
      "Sh",
      "Sn",
      "St",
      "T",
      "Tr",
      "W",
      "Z"
    ]
    strings_connective = [
      "c",
      "l",
      "ll",
      "m",
      "n",
      "p",
      "r",
      "s",
      "t",
      "rt",
      "tch",
      "ts"
    ]
    strings_end = [
      "a",
      "ers",
      "ie",
      "ley",
      "o"
    ]
    strings_vowel = [
      "a",
      "e",
      "i",
      "o",
      "u"
    ]
    strings_expletive = [
      'bitch',
      'cock',
      'cum',
      'fuck',
      'goock',
      'gook',
      'kike',
      'nigg',
      'pusie',
      'puss',
      'rape',
      'sex',
      'shit',
      'taboo',
      'trann',
      'willy'
    ]
    dictionary_vowel_1 = {
      "a": [
        "bell",
        "bella",
        "bo",
        "boo",
        "nie",
        "s"
      ],
      "e": [
        "",
        "ll",
        "llo",
        "o"
      ],
      "i": [
        "a",
        "bo",
        "ba",
        "ca",
        "ck",
        "co",
        "e",
        "la",
        "lo",
        "mi"
        "na",
        "no",
        "ni",
        "o",
        "que",
        "ta",
        "to",
        "zor",
      ],
      "o": [
        "da",
        "dy",
        "la",
        "lo",
        "mo",
        "nie",
        "ny",
        "o",
        "ra",
        "s",
        "ver",
        "ze"
      ],
      "u": [
        "",
        "mo",
        "rt",
        "s"
      ]
    }
    dictionary_vowel_2 = {
      "a": [
        "-bell",
        "bo",
        "boo",
        "ck",
        "ishe",
        "lbert",
        "nny",
        "rk",
        "sh",
        "sko",
        "sper",
        "trina"
      ],
      "e": [
        "cardo",
        "ffe",
        "lla",
        "llo",
        "ppa",
        "ppo",
        "rnard",
        "tch",
        "x"
      ],
      "i": [
        "ana",
        "card",
        "cky",
        "lbert",
        "lbo",
        "llard",
        "lly",
        "msy",
        "nana",
        "nano",
        "ne",
        "nnie",
        "nono",
        "nsy",
        "rda",
        "rdo",
        "sh",
        "skers",
      ],
      "o": [
        "-mo",
        "cco",
        "do",
        "la",
        "llo",
        "ma",
        "na",
        "nie",
        "ng",
        "ngus",
        "ny",
        "ra",
        "ver",
        "z",
        "ze",
        "zzy"
      ],
      "u": [
        "bba",
        "bbie",
        "cky",
        "ffy",
        "mby",
        "mbo",
        "mbus",
        "ngus",
        "rt",
        "ssie",
        "s"
      ]
    }
    
    def random_num(num_1, num_2 = None):
      return floor(random() * num_1) if num_2 == None else floor(random() * (num_2 - num_1)) + num_1
    
    def random_name():
      num = random_num(3, 6)
    
      # Get start of string
      output_name = strings_start[random_num(len(strings_start) - 1)]
      
      # Add some chars from array 2 or array 3
      for index in range(num):
        if index % 2 == 0:
          output_name += strings_vowel[random_num(len(strings_vowel))]
        else:
          output_name += strings_connective[random_num(len(strings_connective))]
    
        # Stop if greater than the number
        if len(output_name) >= num:
          break
      
      last_letter = output_name[-1]
    
      # if last letter is not a vowel and 50% chance, add some letters
      if random() < 0.5 and (last_letter not in strings_vowel):
        output_name += strings_end[random_num(len(strings_end))]
    
      # otherwise if the last letter is a vowel
      elif last_letter in strings_vowel:
        # if 80 percent chance
        if random() < 0.8:
          last_letter = output_name[-1]
    
          # if it's short add something from voweldict2
          if len(output_name) <= 3:
            value_max = len(dictionary_vowel_2[last_letter]) - 1
            suffix = dictionary_vowel_2[last_letter][random_num(value_max)]
          # if it's long add something from voweldict1
          else:
            value_max = len(dictionary_vowel_1[last_letter]) - 1
            suffix = dictionary_vowel_1[last_letter][random_num(value_max)]
    
          output_name += suffix
      # otherwise add a vowel
      else:
        output_name += strings_vowel[random_num(len(strings_vowel))]
    
      # from end of the output_name, every character
      inserted = 0
      for index in reversed(range(1, len(output_name))):
        index -= inserted
        
        # if the target letter and the letter two indices back are both vowels
        if output_name[index] in strings_vowel and output_name[index - 2] in strings_vowel:
          # find the letter in between and add a letter to it
          # so "noco" turns into "nocko" etc
          char_target = output_name[index - 1]
          match char_target:
            case 'c' | 'r':
              output_name = output_name[0:index] + 'k' + output_name[index]
              inserted += 1
            case 'l':
              output_name = output_name[0:index] + 'n' + output_name[index]
              inserted += 1
    
      # small percent chance of doubling the string if its shourt. a la ka-ka
      if len(output_name) <= 3 and random() < 0.1:
        output_name += output_name if random() < 0.5 else '-' + output_name
    
      # maybe add an m, p, or b, if there's an e at the end
      if len(output_name) <= 2 and output_name[-1] == 'e':
        output_name += 'm' if random() < 0.3 else 'p' if random() < 0.5 else 'b'
      
      # if generated name contains an expletive, try again
      for expletive in strings_expletive:
        if expletive in output_name.lower():
          output_name = random_name()
          break
    
      return output_name
      
    if __name__ == '__main__':
      print(random_name())