Your goal is to make a program that converts an input to its acronym. Your input is guaranteed to have only letters and spaces. The input will have exactly one space between words. You must output the acronym of the input.


  • Your code cannot be case-sensitive(e.g. foo and Foo are the same)
  • Your code must ignore the following words and not put them in the acronym: and or by of
  • You cannot assume that the words are all lowercase.
  • The output must be entirely capitalised, with no separation between characters.
  • A trailing newline is accepted but not necessary.
  • If your language has an acronym function builtin, you may not use it.


(inputs/outputs grouped)

United States of America

Light Amplification by Stimulation of Emitted Radiation

united states of america

Jordan Of the World


This is a challenge so the shortest code wins.


var QUESTION_ID=75448,OVERRIDE_USER=8478;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>

  • \$\begingroup\$ I have added 2 test cases. \$\endgroup\$ – Aplet123 Mar 13 '16 at 12:05
  • 1
    \$\begingroup\$ @Aplet123 Are you sure that's what you want? Because if that's the case, the challenge boils down to removing spaces and lower case letters. (E.g. 4 bytes in Retina: T` l) \$\endgroup\$ – Martin Ender Mar 13 '16 at 12:17
  • 5
    \$\begingroup\$ Bit too late to change it, but you'd generally also expect words like "a", "an", "the", "for", "to", etc. to be removed. \$\endgroup\$ – Darrel Hoffman Mar 13 '16 at 14:58
  • 3
    \$\begingroup\$ This is setting aside the fact that USA is not an acronym, it's an abbreviation? NASA is an acronym because you say the word "nasa". If you spell out the letters, it isn't an acronym. \$\endgroup\$ – corsiKa Mar 13 '16 at 17:25
  • 1
    \$\begingroup\$ Can we assume the input will always have a non-empty output? \$\endgroup\$ – Downgoat Mar 13 '16 at 17:34

40 Answers 40


Pyth, 25 21 20 bytes


Try it here!

Thanks to @Jakube for saving one byte!


shM-crz1dc4."@YK½¼  # z = input

     rz1               # convert input to uppercase
    c   d              # split input on spaces
         c4."@YK½¼     # create a list of the words from a packed string which shall be ignored
   -                   # filter those words out
 hM                    # only take the first letter of all words
s                      # join them into one string

The packed string becomes ANDBYOROF

  • \$\begingroup\$ A little string packing trick: ."@YK½¼ saves one byte over "ANDORBYOF. It's basically @ANDBYOROF packed. \$\endgroup\$ – Jakube Mar 13 '16 at 14:05
  • \$\begingroup\$ Dang, the non-ascii-chars got deleted. Just pack @ANDBYOROF and see what you get. \$\endgroup\$ – Jakube Mar 13 '16 at 14:07
  • \$\begingroup\$ @Jakube Thanks! Tried to pack it before, but always ended up with the same length or longer. \$\endgroup\$ – Denker Mar 13 '16 at 14:26

Jelly, 21 20 bytes


Try it online!

(-1 thanks to @Dennis.)

,“°ɲịĊs°gɗ»              Pair input with the string "OR OF by AND"
           ṣ€⁶           Split both by spaces
              Œu         Uppercase
                ḟ/       Reduce filter (removing ignored words from input)
                  Ḣ€     Keep first letters of remaining words

Jelly's dictionary is a bit weird in that it has AND in uppercase yet by in lowercase...


Retina, 29 31 36 bytes


Intended newline at the end.

Thanks to Martin Büttner for saving 5 bytes

Try it online

T`l`L                  # Replace lowercase with uppercase
 |(AND|OR|BY|OF)\b|\B. # Regex match, it doesn't matter if we match 'AND' in SHAND
                       #   since the 'SH' will still become 'S' or am I missing something?
                       # Replace with nothing
  • \$\begingroup\$ I'm unfamiliar with retina. What does T`l`L do? \$\endgroup\$ – Cyoce Mar 14 '16 at 6:59
  • \$\begingroup\$ @Cyoce See update with explanation \$\endgroup\$ – andlrc Mar 14 '16 at 12:58

JavaScript (ES6), 56 bytes

Saved a byte thanks to @edc65.

s=>s.toUpperCase().replace(/\B.| |(AND|O[RF]|BY)\b/g,"")


The code is self explanatory, I'll just explain the regex:

\B.          // Matches any character (`.`), that's not the start of a word
|            // Matches spaces
|(...)\b     // Matches all the words that should be ignored

It removed all of these matched characers and uppercases the word

  • 1
    \$\begingroup\$ putting .toUpperCase() before the regexp you could avoid the i flag \$\endgroup\$ – edc65 Mar 14 '16 at 7:44
  • \$\begingroup\$ @edc65 smart idea, thanks! \$\endgroup\$ – Downgoat Mar 15 '16 at 0:21
  • \$\begingroup\$ Pretty sure the parens are not needed here \$\endgroup\$ – Shaun H Mar 15 '16 at 20:29

JavaScript, 61 64 66 63 bytes

a=>a.toUpperCase().replace(/(AND|O[FR]|BY|(\w)\w+)( |$)/g,"$2")

It uses a Regular Expression to find get words that aren't from the list: and, or, of, by, and captures the first letter. It then capitalizes the resulting string of letters.

EDIT: 64 Bytes - Fixed for words start with of,or,by,and

EDIT: 66 Bytes - Fixed to check all words including last word.

EDIT: 63 Bytes - Saved 3 Bytes thanks to @edc65 and @Cyoce!

  • \$\begingroup\$ Doesn't work for Foo Offline Bar \$\endgroup\$ – Downgoat Mar 13 '16 at 17:27
  • \$\begingroup\$ General consensus is you don't need to assign the function to a variable. \$\endgroup\$ – Cyoce Mar 14 '16 at 6:17
  • \$\begingroup\$ putting .toUpperCase() before the regexp you could avoid the i flag \$\endgroup\$ – edc65 Mar 14 '16 at 7:44

vim, 46

gUU:s/ /\r/g<cr>:g/\vAND|OR|OF|BY/d<cr>:%s/.\zs.*\n<cr>
gUU                      make line uppercase
:s/ /\r/g<cr>            replace all spaces with newlines
:g/\vAND|OR|OF|BY/d<cr>  remove unwanted words
:%s/.\zs.*\n<cr>         remove all non-initial characters and newlines

I particularly like that last bit. The first . in the regex matches the first character of the line. Then we use \zs to start the "actually-being-replaced" part, effectively not replacing the initial character. .* matches the rest of the line, and \n matches the trailing newline. Since we don't specify a replace string, vim simply removes everything in the match, leaving only initials.

  • \$\begingroup\$ vim is a programming language \$\endgroup\$ – CousinCocaine Mar 23 '16 at 20:36

CJam, 28 24 22 bytes


Try it online. Thanks to Sp3000 for pointing out a bug and suggesting a fix, and to Dennis for saving 4 6(!) bytes.


qeuS/  e# Convert the input to uppercase and split on spaces
"AOBONRYFD"4/z  e# Push the array of short words. See more below
-      e# Remove each short word from the input words
:c     e# Cast the remaining words to characters, which is a
       e# shorter way of taking the first letter

Dennis suggested this trick for shortening the word list: Splitting AOBONRYFD into chunks of four, we get


Transposing columns into rows with the z operator, we get the proper words!


Julia, 72 63 61 55 bytes


This is an anonymous function that accepts a string and returns a string. To call it, assign it to a variable.

We convert the string to uppercase, select each match of the regular expression \b(?!AND|OR|OF|BY)\S as an array, and join it into a string.

Saved 8 bytes thanks to Dennis!


Perl, 32 bytes

say uc=~/\b(?!AND|OR|OF|BY)\S/g

+1 byte for the -n flag.

Algorithm stolen from @AlexA's Julia answer.


Ruby, 45 43 bytes


This is a lambda function that accepts a string and returns a string. To call it, assign it to a variable and do f.call(input).

It uses the same approach as my Julia answer, namely convert to uppercase, get matches of the regular expression \b(?!AND|OR|OF|BY)\S, and join into a string.

Try it here

Saved 2 bytes thanks to manatwork!

  • 3
    \$\begingroup\$ .join*''. By the way, no need to assign it to anything to call it. Just pass it the arguments as subscript: ->s{s.upcase.scan(/\b(?!AND|OR|OF|BY)\S/)*''}['United States of America'] \$\endgroup\$ – manatwork Mar 13 '16 at 16:37
  • \$\begingroup\$ @manatwork Oh nice, thanks! \$\endgroup\$ – Alex A. Mar 13 '16 at 17:13

PHP, 92 bytes

First attempt at code golf.

foreach(explode(" ",str_replace(["AND","OR","BY","OF"],"",strtoupper($s)))as$x){echo$x[0];}

The variable $s is the phrase to be converted: $s = "United States of America".

Requires PHP 5.4 or above for short array syntax to work.

  • \$\begingroup\$ Just FYI, code-golfs are scored in bytes unless otherwise noted, and you can use just a # at the beginning of the line to make a header. \$\endgroup\$ – cat Mar 15 '16 at 0:19
  • 2
    \$\begingroup\$ There's a problem. Using $s requires register_globals, but that has been removed from PHP since 5.4, so your answer cannot work as you require 5.4 for short array syntax. You need to get the input string as an argument ($argv, a function argument or similar). \$\endgroup\$ – aross Mar 15 '16 at 14:52

Bash + GNU coreutils, 103 76 bytes

for i in ${@^^};do grep -qE '\b(AND|OR|BY|OF)\b'<<<$i||echo -n ${i:0:1};done

Run with

./codegolf.sh Light Amplification BY Stimulation of Emitted Radiationofo

either with single argument quoted or with multiple arguments.

(I distorted the last word to contain of).

60 bytes

Thanks to @manatwork.

for i in ${@^^};{ [[ $i = @(AND|OR|BY|OF) ]]||printf %c $i;}
  • \$\begingroup\$ Sorry, but that awk call looks horrible. What about replacing it with ${@^^}? \$\endgroup\$ – manatwork Mar 15 '16 at 11:29
  • \$\begingroup\$ @manatwork, good point, didnot think of that... \$\endgroup\$ – rexkogitans Mar 15 '16 at 11:36
  • \$\begingroup\$ Looks much better. Now please replace the grep call with [[ $i = @(AND|OR|BY|OF) ]]. ;) And with that you can also remove the “ + GNU coreutils” part from the post header. \$\endgroup\$ – manatwork Mar 15 '16 at 11:37
  • \$\begingroup\$ One more thing: you could replace the echo with printf. Furthermore you can apply Digital Trauma's brace tip too. (More in Tips for golfing in Bash.) for i in ${@^^};{ [[ $i = @(AND|OR|BY|OF) ]]||printf %c $i;} \$\endgroup\$ – manatwork Mar 15 '16 at 11:45
  • \$\begingroup\$ I was looking for the bash notation similar to grep's \b but couldnot find it... And I did not know that do...done can be replace by curly braces. \$\endgroup\$ – rexkogitans Mar 15 '16 at 12:01

JavaScript, 104 85 bytes

Saved 19 bytes thanks to @Aplet123.

Splits the string by spaces then checks if it is the words of, or, and, or by. If it is, it ignores it, otherwise it takes the first letter of it. It then joins the array and makes the string uppercase.

a=_=>_.split` `.map(v=>/\b(o(f|r)|and|by)\b/i.test(v)?"":v[0]).join("").toUpperCase()


function a(_) {
       _ = _.split` `; //Split on spaces
       _ = _.map(function(v){return new RegExp("\b(o(f|r)|and|by)\b","i").test(v)}); //Check if the banned words are in the result
       _ = _.join(""); //Join it into a string
       _ = _.toUpperCase(); //Convert it to uppercase
  • \$\begingroup\$ Why is there a backtick at the end? It causes an error and is not intended to be there. You should probably remove the backtick. \$\endgroup\$ – Aplet123 Mar 13 '16 at 15:20
  • \$\begingroup\$ Also, you don't need var. We don't worry about polluting the global scope in code golf :P \$\endgroup\$ – NinjaBearMonkey Mar 13 '16 at 15:24
  • \$\begingroup\$ It does not work. If you look at the examples the input ` united states of america ` it gives the output ` usa ` not ` USA ` \$\endgroup\$ – Aplet123 Mar 13 '16 at 15:27
  • \$\begingroup\$ Yeah, I noticed that. Stupid super long built-in function names. \$\endgroup\$ – clamchowder314 Mar 13 '16 at 15:30
  • \$\begingroup\$ You can set Z to _.map(v=>/o(f|r)|and|by/.test(v)?"":v[0]) instead of "". You can remove your _.forEach(p=>Z+=p[0].toUpperCase()); line and replace your return Z line with return Z.join("").toUpperCase() \$\endgroup\$ – Aplet123 Mar 13 '16 at 15:37

MATL, 34 27 bytes

1 byte fewer thanks to @AandN


Try it online!

Xk                  % convert to uppercase
Yb                  % split by spaces. Gives a cell array of input words
'AND OR BY OF'      % ignored words separated by spaces
Yb                  % split by spaces. Gives a cell array of ignored words
X-                  % setdiff: remove ignored words (result is stable)
c                   % convert to 2D char array, padding words with spaces
1Z)                 % take first column
!                   % transpose into a row
  • 1
    \$\begingroup\$ Maybe this works with 33 bytes? XkYb{'OF' 'AND' 'OR' 'BY'}X-c1Z)! \$\endgroup\$ – Adnan Mar 13 '16 at 12:35

05AB1E, 33 32 28 bytes



Uses CP-1252 encoding.


Python, 81 bytes

lambda s:''.join(c[0]for c in s.upper().split()if c not in'AND OF OR BY'.split())

Haskell, 100 99 98 82 75 bytes

I am quite sure it can be shortened a lot more as I still suck at using $,. etc. so I keep using () insted=)

Thanks @nimi for your help magic!

import Data.Char
x=[h!!0|h<-w$toUpper<$>x,notElem h$w"OF BY OR AND"]


*Main> a "united states by america"
  • \$\begingroup\$ Oh, that . composition operator looks quite intuitive. I am just never sure what is evaluated in what order. \$\endgroup\$ – flawr Mar 13 '16 at 19:34
  • \$\begingroup\$ chapter 6 of Learn you a Haskell for Great Good! has a good introduction to function application with $ and composition with .. \$\endgroup\$ – nimi Mar 13 '16 at 21:07
  • 1
    \$\begingroup\$ Switching back to non-pointfree and a list comprehension is even shorter: a x=[h!!0|h<-w$toUpper<$>x,notElem h$w"OF BY OR AND"]. \$\endgroup\$ – nimi Mar 13 '16 at 22:06
  • \$\begingroup\$ Now this is definitely over my head, I'm going to have to learn quicker=) \$\endgroup\$ – flawr Mar 15 '16 at 9:55

Python, 103 96 bytes

This is my first attempt at code golf, and this could probably be golfed a lot more. Thanks to DenkerAffe for saving seven characters.

lambda x:"".join([x[0]for y in x.split(" ") if y.lower() not in ['and','or','of','by']]).upper()

It takes the input, turns it into a list of words and takes their first letter if it's not one of the forbidden words, then turns everything to uppercase.

  • 2
    \$\begingroup\$ It was trying to execute the input. In Python 3 that doesn't happen. (I think it saves 2 bytes to switch to Python 3 (-4 for input vs raw_input, +2 for print("".join..) vs print"".join..) Also no space between a symbol and a keyword. \$\endgroup\$ – CalculatorFeline Mar 13 '16 at 19:03
  • \$\begingroup\$ Or you just go with a lambda which gets the input as argument. This is always allowed here if the challenge doesn't forbid it explicitly. \$\endgroup\$ – Denker Mar 14 '16 at 3:39
  • \$\begingroup\$ @CatsAreFluffy It might help to switch to Python 3, but I highly prefer Python 2 over it because who likes parentheses anyways? \$\endgroup\$ – mriklojn Mar 14 '16 at 20:59
  • \$\begingroup\$ You can save the lower() when you uppercase the input first, before you do anything. Your filter list then becomes ['AND','OR',...]., but the rest would stay the same. You can also drop some whitespaces behind braces. x[0]for ... is completly valid in Python. \$\endgroup\$ – Denker Mar 14 '16 at 23:20
  • \$\begingroup\$ Remove spaces between symbols and keywords(it works) \$\endgroup\$ – CalculatorFeline Apr 2 '16 at 18:55

JavaScript, 80 72 55 53 bytes


function a(t){t=t.toUpperCase();t=t.replace(/AND|OR|BY|OF|\B.| |/g,"");return t}

function a(t){return t.toUpperCase().replace(/AND|OR|BY|OF|\B.| |/g,"")}

I just read about arrow functions and realized I could shorten this up even more.

a=t=>t.toUpperCase().replace(/AND|OR|BY|OF|\B.| |/g,"")

According to this, you don't count the assignment in the length, so -2 bytes.

t=>t.toUpperCase().replace(/AND|OR|BY|OF|\B.| |/g,"")

This is my first golf, so it's not very good.


PHP, 68 61 58 bytes

Uses ISO-8859-1 encoding.


Run like this (-d added for aesthetics only):

php -d error_reporting=30709 -r 'for(;$w=$argv[++$x];)stripos(_AND_OR_BY_OF,$w)||print$w&ß; echo"\n";' united states oF america


// Iterate over the CLI arguments (words).
for(;$w = $argv[++$x];)
    // Check if the word is one of the excluded words by substring index.
    // The check is case insensitive.
    stripos("_AND_OR_BY_OF", $w) ||
        // Print the word, converting to uppercase and getting only the
        // first char by using bitwise AND.
        print $w & "ß";
  • Saved 7 bytes by using bitwise AND instead of using ucwords.
  • Saved 3 bytes by using ISO-8859-1 encoding and using ß (binary 11011111) for binary AND instead of a negated space (binary 00100000).

R, 77 75 bytes


Try it online!

-1 byte thanks to Dominic van Essen changing the indexing.

Reads from stdin. Takes the words, converts them to uppercase, removes those that are excluded from acronyms, extracts the first character from each, and prints them to the stdout.

  • \$\begingroup\$ 76 bytes...? \$\endgroup\$ – Dominic van Essen 2 days ago
  • \$\begingroup\$ @DominicvanEssen very nice! And another byte down by setting w inline. \$\endgroup\$ – Giuseppe 2 days ago

Mathematica, 132 117 bytes


15 bytes saved thanks to @CatsAreFluffy.

  • \$\begingroup\$ 1arg StringSplit defaults to splitting on whitespace (-5bytes) \$\endgroup\$ – CalculatorFeline Mar 13 '16 at 16:07
  • 1
    \$\begingroup\$ Also you can replace the word list with "of"|"and"|"or"|"by". Also {"a","b","c"}<>""==StringJoin[{"a","b","c"}]. One last thing: Characters automatically maps over lists. \$\endgroup\$ – CalculatorFeline Mar 13 '16 at 16:11
  • 1
    \$\begingroup\$ The leaderboard would prefer that you put a comma after Mathematica. Also you're welcome :) \$\endgroup\$ – CalculatorFeline Mar 13 '16 at 16:20

PowerShell, 81 Bytes

(-join($args[0].Split(" ")|?{$_-notmatch"^(and|or|by|of)$"}|%{$_[0]})).ToUpper()


Split on the spaces creating an array. Drop the offending members. Pull the first character and join together. Use ToUpper() on the resulting string.

  • \$\begingroup\$ Realized that would match Anderson and drop it. Added 4 bytes \$\endgroup\$ – Matt Mar 14 '16 at 1:50

Lua, 122 Bytes

I would have love to use a pattern to get rid of the banned words, but sadly, lua isn't made to match groups of characters... So I had to use a for loop instead, which is much more expensive.

s=arg[1]for k,v in next,{"of","and","by","or"}do


s=arg[1]                               -- initialise s with the argument
for k,v in next,{"of","and","by","or"} -- iterate over the array of banned words
    s=s:gsub(v,"")                     -- replace the occurences of v by 
end                                    --   an empty string
print(s:gsub("(%a)%a+",                -- replace words (separated by spaces)
              string.upper)            -- by their first letter capitalised
         :gsub("%s","")                -- replace spaces with empty strings
                       .."")           -- concatenate to prevent the number of 
                                       -- substitutions to be shown

Factor, 175 bytes

I learned a lot by writing this.

USING: strings ascii sets splitting kernel sequences math.ranges ;
>lower " " split [ { "and" "or" "by" "of" } in? not ] filter [ first dup [a,b] >string ] map "" join >upper 

As a word:

USING: strings ascii sets splitting kernel sequences math.ranges ;

: >initialism ( str -- str )
  >lower " " split                            ! string.lower.split(" ")
  [ { "and" "or" "by" "of" } in? not ] filter ! word in { } ?
  [ first dup [a,b] >string ]          map    ! word[0]
  "" join >upper ;                            ! "".join.upper

Unit tests:

USING: tools.test mk-initialism ;
IN: mk-initialism.tests

{ "LASER" } [ "Light Amplification by Stimulation of Emitted Radiation" >initialism ] unit-test
{ "USA"   } [ "United States OF Americaof" >initialism ]                              unit-test
{ "USA"   } [ "united states and america" >initialism ]                               unit-test
{ "JTW"   } [ "Jordan Of the World" >initialism ]                                     unit-test



Lua, 113 112 93 bytes

arg[1]:upper():gsub("%w+",function(w)io.write(("AND OR BY OF"):find(w)and""or w:sub(0,1))end)
  • \$\begingroup\$ Wow, totally forgot the existence of %w! That's a great one! \$\endgroup\$ – Katenkyo Mar 16 '16 at 7:37
  • \$\begingroup\$ Katenkyo: Well, this would also work with %a; %a matches letters, and %w matches letters and numbers. The main thing is using a custom function in gsub. \$\endgroup\$ – Trebuchette Mar 16 '16 at 17:02
  • \$\begingroup\$ Yeah, I see that it is easier to remove AND OR BY OF when selecting words... I used no custom function because they cost a lot, so I though gsub("(%a)%a+",string.upper) after removing them would have been better \$\endgroup\$ – Katenkyo Mar 17 '16 at 7:22

C#, 134 bytes


class P{static void Main(string[] a){foreach (var s in a){if(!"AND OR BY OF".Contains(s.ToUpper())){Console.Write(s.ToUpper()[0]);}}}}


class P
    static void Main(string[] a)
        foreach (var s in a)
            if (!"AND OR BY OF".Contains(s.ToUpper()))

Execute from command line

75448.exe Light Amplification by Stimulation of Emitted Radiation


75448.exe united states of america



Husk, 19 18 bytes


Try it online!

-1 byte from Dominic Van Essen.

  • \$\begingroup\$ 18 bytes by using an uppercase string of words to avoid (and searching for a permutation that compresses well...) \$\endgroup\$ – Dominic van Essen 2 days ago

Zsh, 46 45 bytes

for i;echo -n ${${${i:u}:#(AND|OR|BY|OF)}[1]}

Try it online!

-1 thanks to @roblogic


for i;echo -n ${${${i:u}:#(AND|OR|BY|OF)}[1]}
for i;                                          # for each word in the input
                  ${i  }                        # take that word
                     :u                         # capitalised
                          (AND|OR|BY|OF)        # if it matches one of these words
                ${      :#              }       # replace it with an empty string
              ${                         [1]}   # take the first character
      echo -n                                   # and print with no newline
  • \$\begingroup\$ Very nice. -1 byte using ${i:u} instead of ${(U)i} \$\endgroup\$ – roblogic yesterday

Stax, 16 12 bytes


Run and debug it


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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