Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top


Create a program that will take an acronym as input, for example dftba, and generate some possible phrases that the acronym could stand for. You can use wordlist as word input. Inspired by


input: dftba
output: don't forget to be awesome


  • Your program can't generate the same phrase every time for the same acronym, there must be randomization
  • Input will be all lowercase
  • Post a few examples (input and output)
  • Any language is accepted
  • It's a , so most upvotes win!
share|improve this question
Please show an example output. – Mukul Kumar Mar 1 '14 at 17:37
@MukulKumar added it – TheDoctor Mar 1 '14 at 17:39
It needs to be meaningful ? or any combination? – Mukul Kumar Mar 1 '14 at 17:41
It does not need to be meaningful – TheDoctor Mar 1 '14 at 17:45
How many times is the user allowed to run the program? At some point the program can't but break rule #1. – Mr Lister Mar 3 '14 at 6:56

HTML, CSS, and JavaScript


<div id='word-shower'></div>
<div id='letter-container'></div>


.letter {
    border: 1px solid black;
    padding: 5px;

#word-shower {
    border-bottom: 3px solid blue;
    padding-bottom: 5px;


var acronym = 'dftba', $letters = $('#letter-container')
for (var i = 0; i < acronym.length; i++) {
    $letters.append($('<div>').text(acronym[i]).attr('class', 'letter'))

var $word = $('#word-shower')
setInterval(function() {
    $.getJSON('' + encodeURIComponent('') + '&callback=?', function(word) {
        word = word.contents.toLowerCase()
        $letters.children().each(function() {
            if (word[0] == this.innerText) {
                this.innerText = word
}, 1000)

Uses a random word generator and shows live results as it looks for words.

Here is a fiddle if you want to run it yourself.

Here's a GIF of the output:

animated output

share|improve this answer


Fetches a word list from wiktionary. Chooses a random word from that list that starts with the correct letter. Then uses Google suggest recursively to look for possible next words. Outputs a list of possibilities. If you re-run it with the same acronym, you will get different results.

import java.util.*;

public class Acronym {

    static List<List<String>> wordLists = new ArrayList<List<String>>();
    static {for(int i=0; i<26; i++) wordLists.add(new ArrayList<String>());}
    static String acro;

    public static void main(String[] args) throws Exception {
        acro = args[0].toLowerCase();

        //get a wordlist and put words into wordLists by first letter
        String s = "";
        URL url = new URL(s);
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            if(inputLine.contains("title")) {
                int start = inputLine.indexOf("title=\"");
                int end = inputLine.lastIndexOf("\">");
                if(start>=0 && end > start) { 
                    String word = inputLine.substring(start+7,end).toLowerCase();
                    if(!word.contains("'") && !word.contains(" ")) {
                        char firstChar = word.charAt(0);
                        if(firstChar >= 'a' && firstChar <='z') {

        //choose random word from wordlist starting with first letter of acronym
        Random rand = new Random();
        char firstChar = acro.charAt(0);
        List<String> firstList = wordLists.get(firstChar-'a');
        String firstWord = firstList.get(rand.nextInt(firstList.size()));



    static void getSuggestions(String input,int index) throws Exception {
        //ask googleSuggest for suggestions that start with search plus the next letter as marked by index
        String googleSuggest = "";
        String search = input + " " + acro.charAt(index);
        String searchSub = search.replaceAll(" ","%20");

        URL url = new URL(googleSuggest + searchSub);
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            String[] parts = inputLine.split("\"");
            for(String part : parts) {
                if(part.startsWith(search)) {
                    //now get suggestions for this part plus next letter in acro
                    if(index+1<acro.length()) {
                        String[] moreParts = part.split(" ");
                        getSuggestions(input + " " + moreParts[index],index+1);
                    else {
                        String[] moreParts = part.split(" ");
                        System.out.println(input + " " + moreParts[index]);

Sample output:

$ java -jar Acronym.jar ght
great harvest trek
great harvest tulsa
great harvest taylorsville
great harvest temecula
great harvest trek
great harvest twin
great harvest tempe
great harvest twin
great harvest turners
great harvest twitter
great horned toad
great horned toads
great horned tomato
great horned tomato
great horned turtle
great harvest trek
great harvest tulsa
great harvest taylorsville
great harvest temecula
great harvest trek
great harvest twin
great harvest tempe
great harvest twin
great harvest turners
great harvest twitter
great horned toad
great horned toads
great horned tomato
great horned tomato
great horned turtle
great harvest trek
great harvest tulsa
great harvest taylorsville
great harvest temecula
great harvest trek
great harvest twin
great harvest tempe
great harvest twin
great harvest turners
great harvest twitter
great horror thriller
great horror tv
great horror thriller
great horror titles
great horror tv
great holiday traditions
great holiday treats
great holiday toasts
great holiday tech
great holiday travel
great holiday treat
great holiday tips
great holiday treat
great holiday toys
great holiday tour
great harvest trek
great harvest tulsa
great harvest taylorsville
great harvest temecula
great harvest trek
great harvest twin
great harvest tempe
great harvest twin
great harvest turners
great harvest twitter
great horned toad
great horned toads
great horned tomato
great horned tomato
great horned turtle

Unfortunately, the Google suggest URL stopped working after a while - perhaps my IP was blacklisted by Google for mis-use?!

share|improve this answer


so ruby. many doge. wow.

Online Version

@prefix = %w[all amazingly best certainly crazily deadly extra ever few great highly incredibly jolly known loftily much many never no like only pretty quirkily really rich sweet such so total terribly utterly very whole xtreme yielding zippily]
@adjective = %w[appealing app apl attractive brave bold better basic common challenge c++ creative credit doge durable dare enticing entertain extreme fail fabulous few favourite giant gigantic google hello happy handy interesting in improve insane jazz joy j java known kind kiwi light laugh love lucky low more mesmerise majestic open overflow opinion opera python power point popular php practice quirk quit ruby read ready stunning stack scala task teaching talking tiny technology unexpected usual useful urban voice vibrant value word water wow where xi xanthic xylophone young yummy zebra zonk zen zoo]

def doge(input)
  wow = ""
  input.chars.each_slice(2) do |char1, char2|
    if char2 == nil
      wow << (@prefix + @adjective).sample(1)[0] + "."
    wow <<{|e| e[0] == char1}.sample(1)[0]
    wow << " "
    wow <<{|e| e[0] == char2}.sample(1)[0]
    wow << ". "

puts doge("dftba")
puts doge("asofiejgie")
puts doge("iglpquvi")


deadly favourite. terribly better. challenge.
all scala. only favourite. incredibly enticing. jolly giant. incredibly extreme. 
incredibly gigantic. loftily popular. quirkily usual. very interesting.
share|improve this answer
certainly light. ever voice. extra ready. extra stack. terribly attractive. never stunning. whole entertain. rich stunning. only favourite. amazingly ruby. – izabera Mar 1 '14 at 21:37
deadly fail. terribly brave. lucky. all scala. only few. incredibly entertain. jolly google. incredibly entertain. incredibly google. loftily python. quirkily unexpected. very improve. – Hosch250 Mar 1 '14 at 23:21


Some terms that commonly appear in acronyms.

terms = {"Abbreviated", "Accounting", "Acquisition", "Act", "Action", "Actions", "Activities", "Administrative", "Advisory", "Afloat", "Agency", "Agreement", "Air", "Aircraft", "Aligned", "Alternatives", "Analysis", "Anti-Surveillance", "Appropriation", "Approval", "Architecture", "Assessment", "Assistance", "Assistant", "Assurance", "Atlantic", "Authority", "Aviation", "Base", "Based", "Battlespace", "Board", "Breakdown", "Budget", "Budgeting", "Business", "Capabilities", "Capability", "Capital", "Capstone", "Category", "Center", "Centric", "Chairman", "Change", "Changes", "Chief", "Chief,", "Chiefs", "Closure", "College", "Combat", "Command", "Commandant", "Commander","Commander,", "Commanders", "Commerce", "Common", "Communications", "Communities", "Competency", "Competition", "Component", "Comptroller", "Computer", "Computers,", "Concept", "Conference", "Configuration", "Consolidated", "Consulting", "Contract", "Contracting", "Contracts", "Contractual", "Control", "Cooperative", "Corps", "Cost", "Council", "Counterintelligence", "Course", "Daily", "Data", "Date", "Decision", "Defense", "Deficiency", "Demonstration", "Department", "Depleting", "Deployment", "Depot", "Deputy", "Description", "Deskbook", "Determination", "Development", "Direct", "Directed", "Directive", "Directives", "Director", "Distributed", "Document", "Earned", "Electromagnetic", "Element", "Engagement", "Engineer", "Engineering", "Enterprise", "Environment", "Environmental", "Equipment", "Estimate", "Evaluation", "Evaluation)", "Exchange", "Execution", "Executive", "Expense", "Expert", "Exploration", "Externally", "Federal", "Final", "Financial", "Findings", "Fixed","Fleet", "Fleet;", "Flight", "Flying", "Followup", "Force", "Forces,", "Foreign", "Form", "Framework", "Full", "Function", "Functionality", "Fund", "Funding", "Furnished", "Future", "Government", "Ground", "Group", "Guidance", "Guide", "Handbook", "Handling,", "Hazardous", "Headquarters", "Health", "Human", "Identification", "Improvement", "Incentive", "Incentives", "Independent", "Individual", "Industrial", "Information", "Initial", "Initiation", "Initiative", "Institute", "Instruction", "Integrated", "Integration", "Intelligence", "Intensive", "Interdepartmental", "Interface", "Interference", "Internet", "Interoperability", "Interservice", "Inventory", "Investment", "Joint", "Justification", "Key", "Knowledge", "Lead", "Leader", "Leadership", "Line", "List", "Logistics", "Maintainability", "Maintenance", "Management", "Manager", "Manual", "Manufacturing", "Marine", "Master", "Material", "Materials", "Maturity", "Measurement", "Meeting", "Memorandum", "Milestone", "Milestones", "Military", "Minor", "Mission", "Model", "Modeling", "Modernization", "National", "Naval", "Navy", "Needs", "Network", "Networks", "Number", "Objectives", "Obligation", "Observation", "Occupational", "Offer", "Office", "Officer", "Operating", "Operational", "Operations", "Order", "Ordering", "Organization", "Oversight", "Ozone", "Pacific", "Package", "Packaging,", "Parameters", "Participating", "Parts", "Performance", "Personal", "Personnel", "Planning", "Planning,", "Plans", "Plant", "Point", "Policy", "Pollution", "Practice", "Preferred", "Prevention", "Price", "Primary", "Procedure", "Procedures", "Process", "Procurement", "Product", "Production", "Professional", "Program", "Programmatic", "Programming", "Project", "Proposal", "Protection", "Protocol", "Purchase", "Quadrennial", "Qualified", "Quality", "Rapid", "Rate", "Readiness", "Reconnaissance", "Regulation", "Regulations", "Reliability", "Relocation", "Repair", "Repairables", "Report", "Reporting", "Representative", "Request", "Requirement", "Requirements", "Requiring", "Requisition", "Requisitioning", "Research", "Research,", "Reserve", "Resources", "Responsibility", "Review", "Reviews", "Safety", "Sales", "Scale", "Secretary", "Secure", "Security", "Selection", "Senior", "Service", "Services", "Sharing", "Simulation", "Single", "Small", "Software", "Source", "Staff", "Standard", "Standardization", "Statement", "Status", "Storage,", "Strategy", "Streamlining", "Structure", "Submission", "Substance", "Summary", "Supplement", "Support", "Supportability", "Surveillance", "Survey", "System", "Systems", "Subsystem", "Tactical", "Target", "Targets", "Team", "Teams", "Technical", "Technology", "Test", "Tool", "Total", "Training", "Transportation", "Trouble", "Type", "Union", "Value", "Variable", "Warfare", "Weapon", "Work", "Working", "X-Ray", "Xenon", "Year", "Yesterday", "Zenith", "Zoology"};




Ten randomly generated candidates for the acronym ABC.

Table[Row[g["ABC"], "  "], {10}] // TableForm

Action Breakdown Corps
Accounting Budget Commerce
Air Budgeting Control
Acquisition Breakdown Computer
Action Budgeting Cost
Aligned Breakdown Common
Aligned Budgeting Course
Advisory Budgeting Capability
Aligned Battlespace Common
Anti-Surveillance Battlespace Comptroller


Table[Row[g["FMP"], "  "], {10}] // TableForm

Findings Manager Protocol
Final Manual Purchase
Flying Measurement Personnel
Full Manufacturing Plans
Form Measurement Programming
Financial Model Programmatic
Future Modernization Proposal
Financial Measurement Package
Form, Maintenance Planning
Full Modeling Programmatic


Table[Row[g["STM"], "  "], {10}] // TableForm

Standardization Total Modernization
Service Tactical Milestone
Surveillance Transportation Management
Subsystem Trouble Materials
Structure Test Military
Scale Test Materials
Strategy Tool Modernization
Small Technology Minor
Supportability Transportation Manufacturing Status Tool Management


Table[Row[g["CRPB"], "  "], {10}] // TableForm

Cooperative Regulation Protection Business
Commander Request Policy Base
Changes Repair Programming, Business
Closure Reviews Project Budget
Commerce Regulations Parameters Base
Contracts Rapid Price Base
College Relocation Practice Budgeting
Course Reporting Personnel Battlespace
Course Requirement Procedures Budget


Table[Row[g["SARDE"], "  "], {10}] // TableForm

Supplement Actions Requiring Directives Estimate
Scale Aligned Requirement Daily Estimate
Secretary Atlantic Requisitioning Director Expense
Software Action Review Direct Exploration
Support Act Readiness Defense Electromagnetic
Software Abbreviated Requirement Decision Exchange
Submission Assessment Requisition Description Executive
Streamlining Accounting Rate Depot Evaluation
Surveillance Assistant Requisitioning Depot Engagement
Survey Assistance Resources Deficiency Expense

share|improve this answer


This mostly produces nonsense, but occasionally it will produce something sensible, or something so silly as to be humourous.

Words are pulled from this JSON file (~2.2MB).

Program takes the acronym from the first command line argument, and supports an optional second argument which tells the program how many phrases to generate.

import std.file : readText;
import std.conv : to;
import std.json, std.random, std.string, std.stdio, std.algorithm, std.array, std.range;

void main( string[] args )
    if( args.length < 2 )

        ushort count = 1;

        if( args.length == 3 )
            count = args[2].to!ushort();

        auto phrases = args[1].toUpper().getPhrases( count );

        foreach( phrase; phrases )
    catch( Throwable th )

string[] getPhrases( string acronym, ushort count = 1 )
    assert( count > 0 );
    auto words = getWords();
    string[] phrases;

    foreach( _; 0 .. count )
        string[] phrase;

        foreach( chr; acronym )
            auto matchingWords = words.filter!( x => x[0] == chr ).array();
            auto word = matchingWords[uniform( 0, matchingWords.length )];
            phrase ~= word;

        phrases ~= phrase.join( " " );

    return phrases;

string[] getWords()
    auto text = "words.json".readText();
    auto json = text.parseJSON();
    string[] words;

    if( json.type != JSON_TYPE.ARRAY )
        throw new Exception( "Not an array." );

    foreach( item; json.array )
        if( item.type != JSON_TYPE.STRING )
            throw new Exception( "Not a string." );

        words ~= item.str.ucfirst();

    return words;

auto ucfirst( inout( char )[] str )
    if( str.length == 1 )
        return str.toUpper();

    auto first = [ str[0] ];
    auto tail  = str[1 .. $];

    return first.toUpper() ~ tail.toLower();


D:\Code\D\Acronym>dmd acronym.d

D:\Code\D\Acronym>acronym utf 5
Unchallenged Ticklebrush Frication
Unparalysed's Toilsomeness Fructose's
Umpiring Tableland Flimsily
Unctuousness Theseus Flawless
Umbrella's Tarts Formulated
share|improve this answer


for char in $(sed -E s/'(.)'/'\1 '/g <<<"$1");
    words=$(grep "^$char" /usr/share/dict/words)
    echo -ne "$word " 
echo -ne "\n"

So: $ bash dftba resulted in

deodorization fishgig telolecithal bashlyk anapsid
demicivilized foretell tonogram besmouch anthropoteleological
doer fightingly tubulostriato bruang amortize 

And: $ bash diy resulted in

decanically inarguable youthen
delomorphous isatin yen
distilling inhumorously yungan

Finally: $ bash rsvp

retzian sensitizer vestiarium pathognomonical
reaccustom schreiner vincibility poetizer
refractorily subspherical villagey planetule


My initial reaction? whelpless transportal fireling

share|improve this answer


So, this probably won't win any popularity contests, but I figured Python needed representation. This works in Python 3.3+. I borrowed @tony-h's json file of words (find it here). Basically, this code just takes the json list, and organizes all the words into a dictionary indexed on the letters of the alphabet. Then, whatever acronym is passed into the python application is used as an index into the dictionary. For each letter in the acronym, a random word is selected from all the words indexed under that letter. You can also provide a number of outputs desired, or if nothing is specified, 2 options will be generated.

The code (I saved it as

import argparse
import json
import string
from random import randrange

parser = argparse.ArgumentParser(description='Turn an acronym into a random phrase')
parser.add_argument('acronym', nargs=1)
args = parser.parse_args()

print('input: ' + acronym)


wordlist={c:[] for c in string.ascii_lowercase}
for word in allwords:

for i in range(0,args.iters):
    print('output:', end=" ")
    for char in acronym:
        print(wordlist[char.lower()][randrange(0,len(wordlist[char.lower()]))], end=" ")

Some sample outputs:

$ python abc
input: abc
output: athabaska bookish contraster
output: alcoholism bayonet's caparison


$ python gosplet 5
input: gosplet
output: greenware overemphasiser seasons potential leprosy escape tularaemia
output: generatrix objectless scaloppine postulant linearisations enforcedly textbook's
output: gutturalism oleg superstruct precedential lunation exclusion toxicologist
output: guppies overseen substances perennialises lungfish excisable tweed
output: grievously outage Sherman pythoness liveable epitaphise tremulant


$ python nsa 3
input: nsa
output: newsagent spookiness aperiodically
output: notecase shotbush apterygial
output: nonobjectivity sounded aligns
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.