Kısaltma yapmak


24

Amaç

Amacınız bir girişi kısaltmasına dönüştüren bir program yapmaktır. Girişinizde yalnızca harf ve boşluk olması sağlandı. Giriş, kelimeler arasında tam olarak bir boşluk bırakacaktır. Girişin kısaltmasını yazmalısınız.

kurallar

  • Kodunuz harf duyarlı olması (örneğin olamaz foove Fooaynıdır)
  • Kodunuz, aşağıdaki kelimeleri görmezden gelmeli ve onları kısaltmasın: and or by of
  • Sen olamaz kelimeler tümü küçük olduğunu varsayalım.
  • Çıktı, karakterler arasında ayrım olmadan tamamen büyük harfle yazılmalıdır.
  • Takip eden bir yeni satır kabul edildi, ancak gerekli değil.
  • Dil bir kısaltma fonksiyonu yerleşiğini varsa, olabilir değil kullanabilirsiniz.

Örnekler

(girişler / çıkışlar gruplandırılmış)

United States of America
USA

Light Amplification by Stimulation of Emitted Radiation
LASER

united states of america
USA

Jordan Of the World
JTW

puanlama

Bu bir mücadelesidir, bu yüzden en kısa kod kazanır.

Liderler Sıralaması

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>


2 test davası ekledim.
Aplet123

1
@ Aplet123 İstediğinin bu olduğuna emin misin? Çünkü eğer durum buysa, meydan okuma boşlukları kaldırmak ve küçük harfleri azaltmaktan kaynaklanıyor. (Örneğin Retina'da 4 bayt:T` l )
Martin Ender

4
Bunu değiştirmek için biraz geç, ancak genellikle "a", "a", "", "," dan "a, vb. Gibi sözcüklerin kaldırılmasını beklersiniz.
Darrel Hoffman, 13.06

2
Bu ABD'nin bir kısaltma olmadığı gerçeğini bir kenara koyuyor, kısaltma mı? NASA bir kısaltma çünkü "nasa" kelimesini söylüyorsunuz. Eğer harfleri heceleyebilirseniz, bu bir kısaltma değildir.
corsiKa

1
Girişin her zaman boş olmayan bir çıktı alacağını varsayabilir miyiz?
Downgoat

Yanıtlar:


10

Pyth, 25 21 20 bayt

shM-crz1dc4."@YK½¼

Burada dene!

Bir bayt tasarrufu için @ Jakube'a teşekkürler!

açıklama

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

     rz1 # girişi büyük harfe dönüştür
    Boşluklarda cd # split girişi
         c4. "@ YK½¼ #, yok sayılacak bir dizgeden kelimelerin bir listesini oluşturur.
   - # bu kelimeleri filtrele
 hM # sadece tüm kelimelerin ilk harfini alır
s # onları bir dizgede birleştir

Paketlenmiş dize ANDBYOROF


Küçük bir ip paketleme numarası: ."@YK½¼Bir bayttan tasarruf sağlar "ANDORBYOF. Temelde @ANDBYOROFdoludur.
Jakube

Dang, ascii karakter olmayanlar silindi. Sadece toplan @ANDBYOROFve ne aldığını gör.
Jakube

@Jakube Teşekkürler! Daha önce paketlemeye çalıştım, ancak her zaman aynı uzunlukta veya daha uzun sürdü.
Denker

10

Jöle , 21 20 bayt

,“°ɲịĊs°gɗ»ṣ€⁶Œuḟ/Ḣ€

Çevrimiçi deneyin!

(@Dennis sayesinde -1.)

,“°ɲịĊ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'in sözlüğü, ANDbüyük harfli by, küçük harfli olması biraz garip ...


8

Retina, 29 31 36 bayt

T`l`L
 |(AND|OR|BY|OF)\b|\B.

Sonunda amaçlanan yeni satır.

5 bayt tasarruf için Martin Büttner'e teşekkürler

Çevrimiçi deneyin

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

Retinaya aşina değilim. Ne yapar T`l`L?
Cyoce

@Cyoce bakınız açıklama ile güncelleme
andlrc

6

JavaScript (ES6), 56 bayt

@ Edc65 sayesinde bir bayt kaydedildi.

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

açıklama

Kod kendini açıklayıcı, sadece regex'i açıklayacağım:

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

Tüm bu eşleşen karakterleri kaldırdı ve sözcüğü büyük harflerle yazdı.


1
Regexp önce .toUpperCase () koyarak ibayrak önleyebilirsiniz
edc65 14:16

@ edc65 akıllı bir fikir, teşekkürler!
Downgoat

Parens burada gerekli olmadığından kesinlikle eminim
Shaun H

5

JavaScript, 61 64 66 63 bayt

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

Listede olmayan kelimeleri bulmak için Normal İfade kullanır:, and, or, of, byve ilk harfi yakalar. Daha sonra ortaya çıkan harf dizesini büyük harf yapar.

EDIT: 64 Bayt - ile başlayan kelimeler için düzeltildiof,or,by,and

EDIT: 66 Bayt - Son kelime de dahil olmak üzere tüm kelimeleri kontrol etmek için düzeltildi.

EDIT: 63 Bayt - Kaydedilen 3 Bayt, @ edc65 ve @Cyoce !


İşe yaramazFoo Offline Bar
Downgoat

Genel fikir birliği, işlevi bir değişkene atamanıza gerek yoktur.
Cyoce

Regexp önce .toUpperCase () koyarak ibayrak önleyebilirsiniz
edc65 14:16

5

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

Özellikle bu son kısmı sevdim. İlk .regex satırın birinci karakterle eşleşir. Sonra kullandığımız \zsetkili "aslında-değiştiriliyor" bölümünü başlatmak için değil başlangıç karakterini değiştirerek. .*satırın geri kalanıyla \neşleşir ve sondaki yeni satırla eşleşir. Bir değiştirme dizesi belirtmediğimiz için, vim yalnızca baş harfleri bırakarak eşleşmedeki her şeyi kaldırır.


vimbir programlama dilidir
CousinCocaine 23:16

4

CJam, 28 24 22 bayt

qeuS/"AOBONRYFD"4/z-:c

Çevrimiçi deneyin . Sp3000'e bir hatayı işaret edip düzeltmeyi önerdiği için ve Dennis'e 4 6 (!) Bayt kurtardığı için teşekkür ederiz .

açıklama

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, kelime listesini kısaltmak için bu numarayı önerdi: AOBONRYFDDört parçaya bölerek,

AOBO
NRYF
D

zOperatör ile sütunların satırlara çevrilmesi , uygun kelimeleri elde ederiz!


4

Julia, 72 63 61 55 bayt

s->join(matchall(r"\b(?!AND|OR|OF|BY)\S",uppercase(s)))

Bu, bir dizgeyi kabul eden ve bir dize döndüren adsız bir işlevdir. Aramak için değişkene atayın.

Dize dönüştürüyoruz, uppercasenormal ifadenin her eşleşmesini \b(?!AND|OR|OF|BY)\Sbir dizi olarak seçiyoruz ve joinonu bir dizeye dönüştürüyoruz.

Dennis sayesinde 8 byte kurtarıldı!



3

Ruby, 45 43 bayt

->s{s.upcase.scan(/\b(?!AND|OR|OF|BY)\S/)*''}

Bu, bir dizgeyi kabul eden ve bir dize döndüren bir lambda işlevidir. Aramak için değişkene atayın ve yapın f.call(input).

Julia cevabımla aynı yaklaşımı kullanır , yani büyük harfe dönüştürün, normal ifadenin eşleşmelerini alın \b(?!AND|OR|OF|BY)\Sve bir dizeye katılın.

Burada dene

İnsan yapımı sayesinde 2 bayt kurtarıldı!


3
.join*''. Bu arada, onu çağırmak için hiçbir şeye atamanıza gerek yok. Sadece argüman olarak argümanları ->s{s.upcase.scan(/\b(?!AND|OR|OF|BY)\S/)*''}['United States of America']
iletin

@ manatwork Oh güzel, teşekkürler!
Alex A. 17:

3

PHP, 92 bayt

Kod golf'te ilk deneme.

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

Değişken $sdönüştürülecek deyimdir: $s = "United States of America".

Kısa dizi sözdiziminin çalışması için PHP 5.4 veya üstü gerekir.


Sadece FYI, kod golfleri bytesaksi belirtilmediği sürece puanlanır #ve satır başında sadece bir başlık kullanabilirsiniz.
kedi,

2
Bir sorun var. Kullanılması $sgerektirir register_globals, ama cevap kısa dizi sözdizimi için 5.4 değil çalışma gerektirebilir gibi böylece, 5.4 beri PHP kaldırıldı. Giriş dizesini bir argüman olarak almanız gerekir ( $argv, bir fonksiyon argümanı veya benzeri).
15.06

3

Bash + GNU coreutils, 103 76 bayt

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

İle koş

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

alıntı tek bir argümanla veya birden çok argümanla.

(Ben içerecek şekilde son sözü bozuk arasında ).


60 bayt

@ Manatwork sayesinde.

for i in ${@^^};{ [[ $i = @(AND|OR|BY|OF) ]]||printf %c $i;}

Üzgünüz, ama bu awkçağrı korkunç görünüyor. Ya onunla değiştirmeye ne dersin ${@^^}?
Manatwork

@manatwork, iyi bir noktaya, yani düşün farlılık ...
rexkogitans

Çok daha iyi görünüyor. Şimdi lütfen greparamayı değiştir [[ $i = @(AND|OR|BY|OF) ]]. ;) Ve bununla “+ GNU coreutils” kısmını yazı başlığından da çıkarabilirsiniz.
Manatwork

Bir şey daha: echoile değiştirebilirsiniz printf. Ayrıca uygulayabilirsiniz Dijital Travma 'ın bağ ucu da. (Daha fazlası Bash'de golffor i in ${@^^};{ [[ $i = @(AND|OR|BY|OF) ]]||printf %c $i;}
oynamak

Ben benzer bash gösterimde arıyordu grep 'ın \bama yapamayanlar bulmak ... Ve ben bilmiyordum do...doneküme parantezleri tarafından yerine edilebilir.
rexkogitans, 15.03

3

JavaScript, 104 85 bayt

@ Aplet123 sayesinde 19 bayt kaydedildi .

Dizeyi boşluklara böler ve sonra veya, ve, veya kelimeleri olup olmadığını kontrol eder. Eğer öyleyse, onu görmezden gelir, aksi takdirde ilk harfini alır. Daha sonra diziye katılır ve dizgeyi büyük harf yapar.

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

Ungolfed:

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
};

Neden sonunda bir backtick var? Bir hataya neden olur ve orada olması amaçlanmamıştır. Muhtemelen backtick'i çıkarmalısınız.
Aplet123

Ayrıca, ihtiyacın yok var. Kod
golfünde

İşe yaramıyor. Örneklere bakarsanız, “Amerika Birleşik Devletleri” girişini verir, ABD’yi değil ABD’yi verir
Aplet123

Evet, farkettim. Aptal süper uzun yerleşik fonksiyon isimleri.
istiridye314

Bunun _.map(v=>/o(f|r)|and|by/.test(v)?"":v[0]) yerine Z'yi ayarlayabilirsiniz "". Eğer kaldırabilir _.forEach(p=>Z+=p[0].toUpperCase());hattı ve yerini return Zsatırı return Z.join("").toUpperCase()
Aplet123

3

MATL , 34 27 bayt

@AandN sayesinde 1 bayt daha az

KkYb'OF AND OR BY'YbX-c1Z)!

Çevrimiçi deneyin!

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
Maybe this works with 33 bytes? XkYb{'OF' 'AND' 'OR' 'BY'}X-c1Z)!
Adnan

2

05AB1E, 33 32 28 bytes

Code:

‘€ƒ€—€‚€‹‘ð¡)Uuð¡)vXyQO>iy¬?

Uses CP-1252 encoding.


2

Python, 81 bytes

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

2

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
w=words
x=[h!!0|h<-w$toUpper<$>x,notElem h$w"OF BY OR AND"]

Example:

*Main> a "united states by america"
"USA"

Oh, that . composition operator looks quite intuitive. I am just never sure what is evaluated in what order.
flawr

chapter 6 of Learn you a Haskell for Great Good! has a good introduction to function application with $ and composition with ..
nimi

1
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"].
nimi

Now this is definitely over my head, I'm going to have to learn quicker=)
flawr

2

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
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.
CalculatorFeline

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.
Denker

@CatsAreFluffy It might help to switch to Python 3, but I highly prefer Python 2 over it because who likes parentheses anyways?
mriklojn

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.
Denker

Remove spaces between symbols and keywords(it works)
CalculatorFeline

2

JavaScript, 80 72 55 53 bytes

Code

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.


2

PHP, 68 61 58 bytes

Uses ISO-8859-1 encoding.

for(;$w=$argv[++$x];)stripos(_AND_OR_BY_OF,$w)||print$w&ß;

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

Ungolfed:

// 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).

1

Mathematica, 132 117 bytes

ToUpperCase[First/@Characters@DeleteCases[StringDelete[StringSplit@#,"of"|"and"|"or"|"by",IgnoreCase->True],""]<>""]&

15 bytes saved thanks to @CatsAreFluffy.


1arg StringSplit defaults to splitting on whitespace (-5bytes)
CalculatorFeline

1
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.
CalculatorFeline

1
The leaderboard would prefer that you put a comma after Mathematica. Also you're welcome :)
CalculatorFeline

1

PowerShell, 81 Bytes

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

Explanation

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


Realized that would match Anderson and drop it. Added 4 bytes
Matt

1

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=s:gsub(v,"")end
print(s:gsub("(%a)%a+",string.upper):gsub("%s","").."")

Ungolfed

s=arg[1]                               -- initialise s with the argument
for k,v in next,{"of","and","by","or"} -- iterate over the array of banned words
do
    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

Hey! I also made a Lua submission, here: codegolf.stackexchange.com/a/75616/33183.
Trebuchette

1

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

Pass!


1

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)

Wow, totally forgot the existence of %w! That's a great one!
Katenkyo

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.
Trebuchette

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
Katenkyo

1

C#, 134 bytes

Golfed

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]);}}}}

Readable

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]);
            }
        }
    }
}

Execute from command line

75448.exe Light Amplification by Stimulation of Emitted Radiation

LASER

75448.exe united states of america

USA


0

IPOS - non competing, 27 bytes

uS`"AND|OR|BY|OF"ER`%S!h%S-

This works in the current version (v0.2) of the interpreter.

Example run

python IPOS.py -i "United States of America" uS`\"AND|OR|BY|OF\"ER`%S!h%S-
USA

The backslashes there are only for escaping of the quotes and are not needed for the program.

Explanation

u                  # Make the input uppercase
S                  # Push a space to the stack
`"AND|OR|BY|OF"ER` # Push a command to the stack, that replaces matches of the regex
                   # with an empty string
%                  # Split the uppercased input string on spaces, apply the command and
                   # join back on spaces. This removes the required words from the input.
S                  # Push a space to the stack
!h                 # Push a command that only selects the first character of a string
%                  # Split on spaces, apply the command and join back on spaces
S-                 # Remove the remaining spaces (forgot to make this usuable
                   # with regexes, would have saved me some bytes here :( )

0

bash / GNU coreutils, 60 bytes

sed -e's/\b'{and,o[rf],by}'\W*//Ig' -re's/(\w)\S* ?/\u\1/g'


0

Pylongolf2, 14 bytes (UTF-8)

c| l1╨3♀~

Pylongolf2 has many non-ASCII characters that count as 2 bytes.

c| l1╨3♀~
c         read input
 |        split by space (note the space after |)
   l1     substring(0, 1)
     ╨3   convert to uppercase
       ♀~ pop the array into the stack and print it.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.