An A czy An An?

21

W języku angielskim istnieje zabawna i prosta różnica między ani a: używasz, angdy słowo zaczyna się od dźwięku samogłoski, a agdy słowo zaczyna się od dźwięku spółgłoski.

Dla uproszczenia w tym wyzwaniu anpoprzedza słowo rozpoczynające się od samogłoski ( aeiou) i asłowo rozpoczynające się spółgłoską.

Wejście

Ciąg zawierający tylko drukowane znaki ASCII, [?]występujący w miejscach, w których należy wstawić anlub a. [?]zawsze pojawi się przed słowem. Możesz założyć, że zdanie będzie poprawne gramatycznie i sformatowane jak zwykle.

Wynik

Łańcuch wejściowy [?]zastąpiony odpowiednim słowem ( anlub a). Musisz się martwić o wielkie litery!

Kiedy kapitalizować

Wielkie słowo należy wpisać wielką literą, jeśli nie jest poprzedzone żadnymi znakami (jest to pierwsze na wejściu) lub jeśli poprzedzone jest jednym z .?!następujących po nim spacją.

Przykłady

Input: Hello, this is [?] world!
Output: Hello, this is a world!

Input: How about we build [?] big building. It will have [?] orange banana hanging out of [?] window.
Output: How about we build a big building. It will have an orange banana hanging out of a window.

Input: [?] giant en le sky.
Output: A giant en le sky.

Input: [?] yarn ball? [?] big one!
Output: A yarn ball? A big one!

Input: [?] hour ago I met [?] European.
Output: A hour ago I met an European.

Input: Hey sir [Richard], how 'bout [?] cat?
Output: Hey sir [Richard], how 'bout a cat?

To jest , więc wygrywa najkrótszy kod w bajtach!

Daniel
źródło
Ok dzięki. Czy możemy założyć, że żadne dane wejściowe nie będą zawierać spacji między [?]słowem a słowem?
DJMcMayhem
8
Czy a / an musi być pisane dużymi literami na środku zdania, gdy pojawia się na początku zdania? („To jest [?] Test. [?] Test.”) Jeśli tak, to jaką interpunkcją może zakończyć zdanie? Co ze zdaniami w cudzysłowie lub nawiasach? Lub skróty, które kończą się kropką („Np. [?] Wpisz taki tekst”)? Reguły wielkich liter mają wiele dziwnych przypadków specjalnych, więc proszę bardzo jasno powiedzieć, co nasze programy robią lub nie muszą obsługiwać.
DLosc
1
Czy mógłbyś wyjaśnić, kiedy kapitalizować? Pierwsza postać?
DJMcMayhem
31
Powinieneś dodać przypadek testowy, [?] hour ago I met [?] European.aby wszyscy się skrzywdzili.
Martin Ender
1
Teraz musimy mieć[?] hour ago I met [?] horse.
zlewkę

Odpowiedzi:

6

V , 41 bajtów

ÍãÛ?Ý ¨[aeiou]©/an
ÍÛ?Ý/a
Í^aü[.!?] a/A

Wypróbuj online! , które wygodnie można również wykorzystać do weryfikacji wszystkich przypadków testowych bez dodatkowej liczby bajtów.

Wykorzystuje to V „Regex Compression”. Używa wielu znaków niedrukowalnych, więc oto zrzut heksowy:

0000000: cde3 db3f dd85 20a8 5b61 6569 6f75 5da9  ...?.. .[aeiou].
0000010: 2f61 6e0a cddb 3fdd 2f61 0acd 5e61 fc5b  /an...?./a..^a.[
0000020: 2e21 3f5d 2093 612f 41                   .!?] .a/A
DJMcMayhem
źródło
Niestety, PO powiedział: „Ty nie musisz się martwić o kapitalizacji!” (moje podkreślenie).
El'endia Starman
1
@ El'endiaStarman Och, źle to odczytałem. Mogę to naprawić, ale nie mam pojęcia, co kapitalizować, ponieważ OP nie określił.
DJMcMayhem
@ El'endiaStarman Naprawiono teraz.
DJMcMayhem
7

Perl, 48 bajtów

Zapisano 1 bajt z powodu Ton Hospel .

#!perl -p
s;\[\?];A.n x$'=~/^ [aeiou]/i^$"x/[^.?!] \G/;eg

Licząc shebang jako jeden, dane wejściowe są pobierane ze standardowego wejścia.

Wyjaśnienie

#!perl -p               # for each line of input, set $_, auto-print result

s;                      # begin regex substitution, with delimiter ;
\[\?]                   # match [?] literally, and replace with:
;
A.n x$'=~/^ [aeiou]/i   # 'A', concatenate with 'n' if post-match ($')
                        #   matches space followed by a vowel
^$"x/[^.?!] \G/         # if the match is preceded by /[^.?!] /, xor with a space
                        #   this will change An -> an

;eg                     # regex options eval, global

Przykładowe użycie

$ echo Hello, this is [?] world! | perl a-an.pl
Hello, this is a world!

$ echo How about we build [?] big building. It will have [?] orange banana hanging out of [?] window. | perl a-an.pl
How about we build a big building. It will have an orange banana hanging out of a window.

$ echo [?] giant en le sky. [?] yarn ball? | perl a-an.pl
A giant en le sky. A yarn ball?

$ echo [?] hour ago I met [?] European. | perl a-an.pl
A hour ago I met an European.
primo
źródło
2
Czy mógłbyś to wyjaśnić?
sudee
1
/[.?!]/Brakuje obsługi wielkich liter, po których następuje spacja
Ton Hospel,
1
@TonHospel 10 godzin temu problem nie wspomniał o tym.
primo
2
Ok, zmiana specyfikacji w locie jest tak niesprawiedliwa. PS: Uwielbiam używać \Gbackwarsds. PPS, nieco krótszy:s;\[\?];A.n x$'=~/^ [aeiou]/^$"x/[^.?!] \G/;eg
Ton Hospel 15.09.16
1
@sudee zaktualizowano o wyjaśnienia.
primo
7

Rubinowy, 78 72 bajtów

->s{s.gsub(/(^|\. )?\K\[\?\]( [aeiou])?/i){"anAn"[$1?2:0,$2?2:1]+"#$2"}}
  • Zaoszczędź 6 bajtów dzięki @Jordan

Nie golfił

def f(s)
    s.gsub(/(^|\. )?\[\?\]( [aeiou])?/i) do |m|
        capitalize = $1
        vowel = $2
        replacement = if vowel then
            capitalize ? "An" : "an"
        else
            capitalize ? "A" : "a"
        end
        m.sub('[?]', replacement)
    end
end
sudee
źródło
2
"anAn"[...]jest naprawdę sprytny. 👍🏻 Możesz zaoszczędzić kilka bajtów, pomijając wewnętrzny sub:s.gsub(/(^|\. )?\K\[\?\] ([aeiou])?/i){"anAn"[$1?2:0,$2?2:1]+" #$2"}
Jordan
6

PHP, 207 bajtów

foreach(explode("[?]",$s)as$i=>$b){$r=Aa[$k=0|!strstr(".!?",''==($c=trim($a))?".":$c[strlen($c)-1])].n[!preg_match("#^['\"´`\s]*([aeiou]|$)#i",$d=trim($b))];echo$i?$r.$b:$b;$a=$i?''==$d?a:$b:(''==$d?".":a);}

Od czasu do czasu lubię bardziej kompletne rozwiązania ...
ale muszę przyznać, że to trochę przesada, choć wcale nie jest skończona.

Zapisz do pliku, uruchom php <filename> z wejściem STDIN.

przypadki testowe

How about we build [?] big building ... with [?] orange banana hanging out of [?] window.
=>  How about we build a big building ... with an orange banana hanging out of a window.

Hello, this is [?] world!               =>  Hello, this is a world!
Should I use [?] '[?]' or [?] '[?]'?    =>  Should I use an 'an' or an 'a'?
[?] elephant in [?] swimsuit.           =>  An elephant in a swimsuit.

How I met your moth[?].                 =>  How I met your motha.
b[?][?][?] short[?]ge!                  =>  banana shortage!

awaria

foreach(explode("[?]",$s)as$i=>$b)
{
    $r=
        // lookbehind: uppercase if the end of a sentence precedes
        Aa[$k=0|!strstr(".!?",''==($c=trim($a))?".":$c[strlen($c)-1])]
        .
        // lookahead: append "n" if a vowel follows (consider quote characters blank)
        n[!preg_match("#^['\"´`\s]*([aeiou]|$)#i",$d=trim($b))]
    ;
    // output replacement and this part
    echo$i?$r.$b:$b;
    // prepare previous part for next iteration
    $a=$i               // this part was NOT the first:
        ?   ''==$d
            ? a             // if empty -> a word ($r from the previous iteration)
            : $b            // default: $b
        :  (''==$d      // this WAS the first part:
            ? "."           // if empty: end of a sentence (= uppercase next $r)
            : a             // else not
        )
    ;
    // golfed down to `$a=!$i^''==$d?a:($i?$b:".");`
}
Tytus
źródło
3
Głosowanie za „brak bananów”! LOL
MonkeyZeus
@MonkeyZeus: Try[?][?][?]s [?]lert!
Titus
Wszystko, co mogę sobie wyobrazić, to załamany Donkey Kong martwiący się teraz niedoborem :(
MonkeyZeus
5

Minkolang 0,15 , 75 bajtów

od4&r$O."]?["30$Z3&00w4X"Aa"I2-"Aa ."40$Z,*2&$rxr$O" aeiou"od0Z1=3&"n"r5X$r

Wypróbuj tutaj!

Wyjaśnienie

od                                                                    Take character from input and duplicate (0 if input is empty)
  4&                                                                  Pop top of stack; jump 4 spaces if not 0
    r$O.                                                              Reverse stack, output whole stack as characters, and stop.

    "]?["                                                             Push "[?]" on the stack
         30$Z                                                         Pop the top 3 items and count its occurrences in the stack
              3&                                                      Pop top of stack; jump 3 spaces if not 0
                00w                                                   Wormhole to (0,0) in the code box

                3X                                                    Dump the top 3 items of stack
                  "Aa"                                                Push "aA"
                      I2-                                             Push the length of stack minus 2
                         "Aa ."40$Z,                                  Push ". aA" and count its occurrences, negating the result
                                    *                                 Multiply the top two items of the stack
                                     2&$r                             Pop top of stack and swap the top two items if 0
                                         x                            Dump top of stack
                                          r                           Reverse stack
                                           $O                         Output whole stack as characters
                                             " aeiou"                 Push a space and the vowels
                                                     od               Take a character from input and duplicate
                                                       0Z             Pop top of stack and count its occurrences in the stack (either 1 or 2)
                                                         1=           1 if equal to 1, 0 otherwise
                                                           3&         Pop top of stack; jump 3 spaces if not 0
                                                             "n"      Push "n" if top of stack is 0

                                                             r        Reverse stack
                                                              5X      Dump top five items of stack
                                                                $r    Swap top two items of stack

Zauważ, że ponieważ Minkolang jest toroidalny, kiedy licznik programu przesuwa się poza prawą krawędź, pojawia się ponownie po lewej. Z pewnością gra w golfa, ale ponieważ musiałem dodać 21 bajtów ze względu na specyfikację, nie mogę spróbować.

El'endia Starman
źródło
6
Czy jestem jedynym, który po przeczytaniu tego wyjaśnienia chce grać w excitebike?
Magic Octopus Urn
3

JavaScript (ES6), 90 86 87 85

Edytuj jeszcze raz gdy zmieniła się specyfikacja wielkich liter (teraz bardziej sensowna)

Edytuj ponownie 1-bajtowy zapis thx @Huntro

Edytować 2 dodatkowe bajty, aby zarządzać cytatami i tym podobne, jak wskazał IsmaelMiguel (nawet jeśli nie wiem, czy jest to wymagane przez operację). Zauważ, że wcześniej liczyłem 86 bajtów, ale były to 85

Próba przestrzegania reguły wielkich liter podanej w zdarzeniu komentarza, jeśli jest niekompletna (przynajmniej)

x=>x.replace(/([^!?.] )?\[\?](\W*.)/g,(a,b,c)=>(b?b+'a':'A')+(/[aeiou]/i.test(c)?'n'+c:c))

Test

f=x=>x.replace(/([^!?.] )?\[\?](\W*.)/g,(a,b,c)=>(b?b+'a':'A')+(/[aeiou]/i.test(c)?'n'+c:c))

function go() {
  var i=I.value, o=f(i)
  O.innerHTML = '<i>'+i+'</i>\n<b>'+o+'</b>\n\n'+O.innerHTML 
}

go()
#I { width:80% }
<input value='How about we build [?] big building. It will have [?] orange banana hanging out of [?] window.' id=I><button onclick='go()'>GO</button><pre id=O></pre>

edc65
źródło
Nie powinienem [?][?]dawać Ana? A nie powinien [?][?] a.produkować Ana a.?
Ismael Miguel
@ IsmaelMiguel Nie rozumiem dokładnie, co masz na myśli, ale w każdym razie[?] will always appear before a word. You can assume that the sentence will be grammatically correct and formatted like normal.
edc65
Rozumiem, ale twój kod daje dziwne wyniki dla [?] "[?]".( An "A", cytaty nie mają znaczenia) i dla [?] "A".(działa dobrze dla [?] A.).
Ismael Miguel
@ IsmaelMiguel [?] "[?]"nie jest poprawnym wejściem. [?] will always appear before a word a „[?]” nie jest słowem.
edc65
2
Ucieczka z drugiego ]nie jest potrzebna. /(\w )?\[\?](\W*.)/g
Huntro
2

Partia, 136 bajtów

@set/ps=
@for %%v in (a e i o u)do @call set s=%%s:[?] %%v=an %%v%%
@set s=%s:[?]=a%
@if %s:~0,1%==a set s=A%s:~1%
@echo %s:. a=. A%

Pobiera wiersz danych wejściowych STDIN.

Neil
źródło
2

PHP, 100 92 bajtów

<?=preg_filter(["/\[\?]\K(?= [aeiou])/i","/([.?!] |^)\K\[\?]/","/\[\?]/"],[n,A,a],$argv[1]);

Możliwe było dalsze golfa wyrażeń regularnych.

Informuje o niezdefiniowanej stałej, ale nadal działa.

Edycja: 8 bajtów zapisanych dzięki primo

użytkownik59178
źródło
Powinno być również możliwe zredukowanie tablicy zastępczej [n,A,a]za pomocą asercji ( \Ki (?= )).
primo
2

Python 3.5.1, 153 147 124 bajtów

*s,=input().replace('[?]','*');print(*[('a','A')[i<1or s[i-2]in'.?!']+'n'*(s[i+2]in 'aeiouAEIOU')if c=='*'else c for i,c in enumerate(s)],sep='')

Wejście :

[?] apple [?] day keeps the doctor away. [?] lie.

Wynik :

An apple a day keeps the doctor away. A lie.

Wersja 123 bajtów - nie obsługuje reguły wielkich liter.

s=list(input().replace('[?]','*'));print(*['a'+'n'*(s[i+2]in 'aeiouAEIOU')if c=='*'else c for i,c in enumerate(s)],sep='')

Ideone to!

Gurupad Mamadapur
źródło
1
Witamy w Codegolf. Możesz go użyć ;i zagrać w golfa.
ABcDexter,
1
m.start() forpowinny być m.start()for,s[i+2] in 'aeiouAEIOU' powinno być s[i+2]in'aeiouAEIOU'. Łatwe golenie o długości 3 bajtów dzięki spacji.
Erik the Outgolfer,
1
('an','a')[s[i+2]in'aeiouAEIOU']jest odwrócony, możesz to 'a'+'n'*(s[i+2]in'aeiouAEIOU')naprawić i zapisać 2 bajty. Tutaj znajdziesz wiele wskazówek dotyczących golfa .
Rod
1
Ta społeczność jest taka urocza, widząc, ile osób jest gotowych pomóc nowicjuszowi i udzielić wskazówek dotyczących gry w golfa!
yo „
1
Wow enumerate()jest spoko. Dzięki @chepner.
Gurupad Mamadapur
2

Java, 180 178 bajtów

Mój pierwszy post tutaj wykorzystałem część postu Kevina Cruijssena, ale dzięki innemu podejściu pomógł mi to zmniejszyć, dzięki niemu!

String c(String s){String x[]=s.split("\\[\\?]",2),r=x[0];return x.length>1?r+(r.matches("(.+[.!?] )|(^)$")?"A":"a")+("aeiouAEIOU".contains(""+x[1].charAt(1))?"n":"")+c(x[1]):r;}

Tutaj nie jest golfem:

static String c(String s) {
        String x[] = s.split("\\[\\?\\]", 2), r = x[0];
        return x.length > 1 ? r + (r.matches("(.+[.!?] )|(^)$") ? "A" : "a")
                + ("aeiouAEIOU".contains("" + x[1].charAt(1)) ? "n" : "") + c(x[1]) : r;
    }

I wynik

Proste wyjaśnienie: używam rekurencyjnego approch, aby znaleźć każdy [?].

Nie mogłem znaleźć sposobu na użycie zapałek bez rozróżniania wielkości liter (nie jestem pewien, czy jest to możliwe).

178 bajtów: Dzięki Martin Ender!

AxelH
źródło
1
Witamy w PPCG! Nie sądzę, że musisz uciec przed ]wyrażeniem regularnym.
Martin Ender
Masz rację, wystarczy tylko pierwszy, dzięki
AxelH
2

05AB1E , 38 36 35 bajtów

2FžNžM‚NèSðì…[?]©ìDu«D®'a'nN׫::}.ª

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

2F            # Loop 2 times:
  žN          #  Push consonants "bcdfghjklmnpqrstvwxyz"
  žM          #  Push vowels "aeiou"
             #  Pair them together into a list
     Nè       #  And use the loop-index to index into this pair
  S           #  Convert this string to a list of characters
   ðì         #  Prepend a space in front of each character
     …[?]     #  Push string "[?]
         ©    #  Store it in variable `®` (without popping)
          ì   #  And prepend it in front of each string in the list as well
  }D          #  Then duplicate the list
    u         #  Uppercase the characters in the copy
     «        #  And merge the two lists together
              #   i.e. for the vowel-iteration we'd have ["[?] a","[?] e","[?] i","[?] o",
              #    "[?] u","[?] A","[?] E","[?] I","[?] O","[?] U"]
   D          #  Duplicate it
    ®         #  Push "[?]" from variable `®`
     'a      '#  Push "a"
       'n    '#  Push "n"
         N×   #  Repeated the 0-based index amount of times (so either "" or "n")
           «  #  And append it to the "a"
    :         #  Replace all "[?]" with "an"/"a" in the duplicated list
     :        #  And then replace all values of the lists in the (implicit) input-string
 }.ª          #  After the loop: sentence-capitalize everything (which fortunately retains
              #  capitalized words in the middle of sentences, like the "European" testcase)
              # (and after the loop the result is output implicitly)
Kevin Cruijssen
źródło
1
Jest w tym mały błąd. Wielką literą jest każde słowo po „an”. Na przykład „[?] Pomarańczowy” staje się „pomarańczowy”. Wydaje się działać, jeśli dodasz ]po::
Dorian
@Dorian Woops .. Usunąłem to }później, ponieważ myślałem, że pozwoli to zaoszczędzić bajt, ale rzeczywiście masz rację, że nie powiedzie się w [?] vowelprzypadkach .. Dziękuję za poinformowanie mnie!
Kevin Cruijssen
1

C #, 204 235 bajtów

string n(string b){for(int i=0;i<b.Length;i++){if(b[i]=='['){var r="a";r=i==0||b[i-2]=='.'?"A":r;r=System.Text.RegularExpressions.Regex.IsMatch(b[i+4].ToString(),@"[aeiouAEIOU]")?r+"n":r;b=b.Insert(i+3,r);}}return b.Replace("[?]","");}

Pełny program bez golfa:

using System;

class a
{
    static void Main()
    {
        string s = Console.ReadLine();
        a c = new a();
        Console.WriteLine(c.n(s));
    }

    string n(string b)
    {
        for (int i = 0; i < b.Length; i++)
        {
            if (b[i] == '[')
            {
                var r = "a";
                r = i == 0 || b[i - 2] == '.' ? "A" : r;
                r = System.Text.RegularExpressions.Regex.IsMatch(b[i + 4].ToString(), @"[aeiouAEIOU]") ? r + "n" : r;
                b = b.Insert(i + 3, r);
            }
        }
        return b.Replace("[?]", "");
    }
}

Jestem pewien, że można to poprawić, zwłaszcza część Regex, ale nie mogę teraz o niczym myśleć.

Jodła
źródło
czy to działa bez importu?
kot
Ups, zapomniałem dołączyć import regex do liczby.
Yodle
1
Kod do gry w golfa powinien być uruchamiany bez względu na format - jeśli nie uruchomi się bez importu wyrażeń regularnych, importowanie wyrażeń regularnych również powinno się odbywać w kodzie golfowym
cat
Ok, dzięki. Wciąż ustalam dokładnie, jak odpowiedzieć. Liczba i odpowiedź obejmują teraz System.Text.RegularExpressions.
Yodle,
Teraz wygląda dobrze. :) Możesz również sprawdzić Code Golf Meta i tag faq .
kot
1

Java 7, 239 214 213 bajtów

String c(String s){String x[]=s.split("\\[\\?\\]"),r="";int i=0,l=x.length-1;for(;i<l;r+=x[i]+(x[i].length()<1|x[i].matches(".+[.!?] $")?65:'a')+("aeiouAEIOU".contains(x[++i].charAt(1)+"")?"n":""));return r+x[l];}

Przypadki bez golfa i testy:

Wypróbuj tutaj.

class M{
  static String c(String s){
    String x[] = s.split("\\[\\?\\]"),
           r = "";
    int i = 0,
        l = x.length - 1;
    for (; i < l; r += x[i]
                     + (x[i].length() < 1 | x[i].matches(".+[.!?] $") 
                        ? 65
                        : 'a')
                     + ("aeiouAEIOU".contains(x[++i].charAt(1)+"")
                        ? "n"
                        : ""));
    return r + x[l];
  }

  public static void main(String[] a){
    System.out.println(c("Hello, this is [?] world!"));
    System.out.println(c("How about we build [?] big building. It will have [?] orange banana hanging out of [?] window."));
    System.out.println(c("[?] giant en le sky."));
    System.out.println(c("[?] yarn ball? [?] big one!"));
    System.out.println(c("[?] hour ago I met [?] European. "));
    System.out.println(c("Hey sir [Richard], how 'bout [?] cat?"));
    System.out.println(c("[?] dog is barking. [?] cat is scared!"));
  }
}

Wynik:

Hello, this is a world!
How about we build a big building. It will have an orange banana hanging out of a window.
A giant en le sky.
A yarn ball? A big one!
A hour ago I met an European. 
Hey sir [Richard], how 'bout a cat?
A dog is barking. A cat is scared!
Kevin Cruijssen
źródło
Próbowałem użyć rozwiązania rekurencyjnego, w końcu
otrzymałem
@AxelH Czy mógłbyś zamieścić go na ideone i link tutaj? Razem możemy znaleźć coś do gry w golfa. ;)
Kevin Cruijssen
Oto ideone.com/z7hlVi , znalazłem lepszą aplikację niż isEmptyużycie wyrażenia regularnego ^$. Myślę, że skończę z 202;)
AxelH
@AxelH Ah miło. Hmm, liczę 195 bajtów zamiast 202? Btw, możesz zagrać w golfa do 180, wykonując bezpośredni powrót z trójskładnikiem jeśli-inaczej: String c(String s){String x[]=s.split("\\[\\?\\]",2),r=x[0];return x.length>1?r+(r.matches("(.+[.!?] )|(^)$")?"A":"a")+("aeiouAEIOU".contains(""+x[1].charAt(1))?"n":"")+c(x[1]):r;}Tak zdecydowanie krótszy niż moja pętla. :)
Kevin Cruijssen
O tak, udało mi się umieścić blok if w jednej linii na końcu, zapomniałem go wymienić. Dzięki;
AxelH
1

Rakieta 451 bajtów (bez wyrażenia regularnego)

Jest to oczywiście długa odpowiedź, ale zastępuje również litery „a” wielką literą:

(define(lc sl item)(ormap(lambda(x)(equal? item x))sl))
(define(lr l i)(list-ref l i))(define(f str)(define sl(string-split str))
(for((i(length sl))#:when(equal?(lr sl i)"[?]"))(define o(if(lc(string->list"aeiouAEIOU")
(string-ref(lr sl(add1 i))0))#t #f))(define p(if(or(= i 0)(lc(string->list".!?")
(let((pr(lr sl(sub1 i))))(string-ref pr(sub1(string-length pr))))))#t #f))
(set! sl(list-set sl i(if o(if p"An""an")(if p"A""a")))))(string-join sl))

Testowanie:

(f "[?] giant en le [?] sky.")
(f "[?] yarn ball?")
(f "[?] hour ago I met [?] European. ")
(f "How about we build [?] big building. It will have [?] orange banana hanging out of [?] window.")
(f "Hello, this is [?] world!")

Wynik:

"A giant en le a sky."
"A yarn ball?"
"A hour ago I met an European."
"How about we build a big building. It will have an orange banana hanging out of a window."
"Hello, this is a world!"

Wersja szczegółowa:

(define(contains sl item)
  (ormap(lambda(x)(equal? item x))sl))

(define(lr l i)
  (list-ref l i))

(define(f str)
  (define sl(string-split str))
  (for((i(length sl))#:when(equal?(lr sl i)"[?]"))
    (define an   ; a or an
      (if(contains(string->list "aeiouAEIOU")
                  (string-ref(lr sl(add1 i))0))
         #t #f ))
    (define cap   ; capital or not
      (if(or(= i 0)(contains(string->list ".!?")
                            (let ((prev (lr sl(sub1 i)))) (string-ref prev
                                       (sub1(string-length prev))))))
         #t #f))
    (set! sl(list-set sl i (if an (if cap "An" "an" )
                                 (if cap "A" "a")))))
  (string-join sl))
rnso
źródło
Jest to doskonały język, choć nie jest przeznaczony do gry w golfa.
rnso
1

J , 113 bajtów

[:;:inv 3(0 2&{(((('aA'{~[)<@,'n'#~])~('.?!'e.~{:))~('AEIOUaeiou'e.~{.))&>/@[^:(<@'[?]'=])1{])\' 'cut' . '([,~,)]

Wypróbuj online!

Wstyd, wstyd!

Jonasz
źródło
1

Siatkówka , 66 60 bajtów

i`\[\?\]( ([aeiou]?)[a-z&&[^aeiou])
a$.2*n$1
(^|[.?!] )a
$1A

Wypróbuj online.

Wyjaśnienie:

Wykonaj wyszukiwanie bez rozróżniania wielkości liter, [?]a następnie samogłoskę lub spółgłoskę, gdzie opcjonalna samogłoska jest zapisywana w grupie przechwytywania 2, a całe dopasowanie w grupie przechwytywania 1:

i`\[\?\]( ([aeiou]?)[a-z&&[^aeiou])

Zastąp to ciągiem a, a następnie długością drugiej grupy n(czyli 0 lub 1 n), a następnie literą (-ami) grupy przechwytywania 1:

a$.2*n$1

Następnie dopasuj aalbo na początku łańcucha, albo po jednym z .?!plus spacji:

(^|[.?!] )a

I wielkie litery A, bez usuwania innych znaków z grupy przechwytywania 1:

$1A
Kevin Cruijssen
źródło
1

Java (JDK) , 154 bajtów

s->{String v="(?= [aeiou])",q="(?i)\\[\\?]",b="(?<=^|[?.!] )";return s.replaceAll(b+q+v,"An").replaceAll(q+v,"an").replaceAll(b+q,"A").replaceAll(q,"a");}

Wypróbuj online!

Wyjaśnienie:

s->{
    String v="(?= [aeiou])",          // matches being followed by a vowel
    q="(?i)\\[\\?]",                  // matches being a [?]
    b="(?<=^|[?.!] )";                // matches being preceded by a sentence beginning
    return s.replaceAll(b+q+v,"An")   // if beginning [?] vowel, you need "An"
        .replaceAll(q+v,"an")         // if           [?] vowel, you need "an"
        .replaceAll(b+q,"A")          // if beginning [?]      , you need "A"
        .replaceAll(q,"a");}          // if           [?]      , you need "a"
Avi
źródło
1

C (gcc) , 225 207 202 201 bajtów

Dzięki pułapowi cat na 24 bajty

#define P strcpy(f+d,index("!?.",i[c-2])+!c?
c;d;v(i,g,f)char*i,*g,*f;{for(d=0;i[c];c++,d++)strcmp("[?]",memcpy(g,i+c,3))?f[d]=i[c]:(index("aeiouAEIOU",i[c+4])?P"An ":"an "),d++:P"A ":"a "),d++,c+=3);}

Wypróbuj online!

girobuz
źródło
0

Groovy, 73 162 bajtów

def a(s){s.replaceAll(/(?i)(?:(.)?( )?)\[\?\] (.)/){r->"${r[1]?:''}${r[2]?:''}${'.?!'.contains(r[1]?:'.')?'A':'a'}${'aAeEiIoOuU'.contains(r[3])?'n':''} ${r[3]}"}}

edytuj: cholera, wielkie litery całkowicie skomplikowały wszystko tutaj

norganos
źródło
Czy to się zaczyna na początku zdania?
Tytus
nie. Widzę teraz, że opis wyzwania został w międzyczasie zmieniony ...
norganos
„Daj mi [?] Godzinę przy [?] Otwartych drzwiach piwnicy.” Łamie
Magic Octopus Urn
opis wyzwania wciąż jest całkowicie niespójny. najpierw mówi „Musisz się martwić o wielkie litery!” a zaraz potem są zasady dotyczące wielkich liter
norganos
To jest konsekwentne. Musisz się martwić o wielkie litery (to znaczy, musisz nim zarządzać). Następnie wyjaśnia, w jaki sposób
edc65
0

C # 209 bajtów

string A(string b){var s=b.Split(new[]{"[?]"},0);return s.Skip(1).Aggregate(s[0],(x,y)=>x+(x==""||(x.Last()==' '&&".?!".Contains(x.Trim().Last()))?"A":"a")+("AEIOUaeiou".Contains(y.Trim().First())?"n":"")+y);}

Sformatowany

string A(string b)
{
    var s = b.Split(new[] { "[?]" }, 0);
    return s.Skip(1).Aggregate(s[0], (x, y) => x + (x == "" || (x.Last() == ' ' && ".?!".Contains(x.Trim().Last())) ? "A" : "a") + ("AEIOUaeiou".Contains(y.Trim().First()) ? "n" : "") + y);
}
Grax32
źródło
0

Perl 6 , 78 bajtów

{S:i:g/(^|<[.?!]>' ')?'[?] '(<[aeiou]>?)/{$0 xx?$0}{<a A>[?$0]}{'n'x?~$1} $1/}

Wyjaśnienie:

{
  S
    :ignorecase
    :global
  /
    ( # $0
    | ^             # beginning of line
    | <[.?!]> ' '   # or one of [.?!] followed by a space
    ) ?             # optionally ( $0 will be Nil if it doesn't match )

    '[?] '          # the thing to replace ( with trailing space )

    ( # $1
      <[aeiou]> ?   # optional vowel ( $1 will be '' if it doesn't match )
    )

  /{
    $0 xx ?$0      # list repeat $0 if $0
                   # ( so that it doesn't produce an error )
  }{
    < a A >[ ?$0 ] # 'A' if $0 exists, otherwise 'a'
  }{
    'n' x ?~$1     # 'n' if $1 isn't empty
                   # 「~」 turns the Match into a Str
                   # 「?」 turns that Str into a Bool
                   # 「x」 string repeat the left side by the amount of the right

  # a space and the vowel we may have borrowed
  } $1/
}

Test:

#! /usr/bin/env perl6
use v6.c;
use Test;

my &code = {S:i:g/(^|<[.?!]>' ')?'[?] '(<[aeiou]>?)/{<a A>[?$0]~('n'x?~$1)} $1/}

my @tests = (
  'Hello, this is [?] world!'
  => 'Hello, this is a world!',

  'How about we build [?] big building. It will have [?] orange banana hanging out of [?] window.'
  => 'How about we build a big building. It will have an orange banana hanging out of a window.',

  '[?] giant en le sky.'
  => 'A giant en le sky.',

  '[?] yarn ball?'
  => 'A yarn ball?',

  '[?] hour ago I met [?] European.'
  => 'A hour ago I met an European.',

  "Hey sir [Richard], how 'bout [?] cat?"
  => "Hey sir [Richard], how 'bout a cat?",
);

plan +@tests;

for @tests -> $_ ( :key($input), :value($expected) ) {
  is code($input), $expected, $input.perl;
}
1..6
ok 1 - "Hello, this is a world!"
ok 2 - "How about we build a big building. It will have an orange banana hanging out of a window."
ok 3 - "A giant en le sky."
ok 4 - "A yarn ball?"
ok 5 - "A hour ago I met an European."
ok 6 - "Hey sir [Richard], how 'bout a cat?"
Brad Gilbert b2gills
źródło
Czy możesz usunąć spację } $1na końcu (czyniąc ją }$1)?
Cyoce
@Cyoce Jest na to sposób, ale powoduje to większą złożoność w innych miejscach. {S:i:g/(^|<[.?!]>' ')?'[?]'(' '<[aeiou]>?)/{<a A>[?$0]~('n'x?~$1.substr(1))}$1/}
Brad Gilbert b2gills,
Ok, nie byłem pewien, jak perl to przeanalizuje
Cyoce
0

Lua, 131 bajtów.

function(s)return s:gsub("%[%?%](%s*.)",function(a)return"a"..(a:find("[AEIOUaeiou]")and"n"or"")..a end):gsub("^.",string.upper)end

Chociaż lua jest okropnym językiem do gry w golfa, czuję się całkiem nieźle.

ATaco
źródło
0

Pip , 62 55 54 50 bajtów

Bierze ciąg jako argument wiersza polecenia.

aR-`([^.?!] )?\[\?]( [^aeiou])?`{[b"aA"@!b'nX!cc]}

Wypróbuj online!

Wyjaśnienie:

a                                                   Cmdline argument
 R                                                  Replace...
  -`                           `                    The following regex (case-insensitive):
    ([^.?!] )?                                      Group 1: not end-of-sentence (nil if it doesn't match)
              \[\?]                                 [?]
                   ( [^aeiou])?                     Group 2: not vowel (nil if there is a vowel)
                                {                }  ... with this callback function (b = grp1, c = grp2):
                                 [              ]   List (concatenated when cast to string) of:
                                  b                 Group 1
                                   "aA"@!b          "a" if group 1 matched, else "A"
                                          'nX!c     "n" if group 2 didn't match, else ""
                                               c    Group 2
DLosc
źródło
0

Rakieta (z wyrażeniem regularnym) 228 bajtów

(define(r a b c)(regexp-replace* a b c))
(define(f s)
(set! s(r #rx"[a-zA-Z ]\\[\\?\\] (?=[aeiouAEIOU])"s" an "))
(set! s(r #rx"[a-zA-Z ]\\[\\?\\]"s" a"))
(set! s(r #rx"\\[\\?\\] (?=[aeiouAEIOU])"s"An "))
(r #rx"\\[\\?\\]"s"A"))

Testowanie:

(f "[?] giant en le [?] sky.")
(f "[?] yarn ball?")
(f "[?] apple?")
(f "[?] hour ago I met [?] European. ")
(f "How about we build [?] big building. It will have [?] orange banana hanging out of [?] window.")
(f "Hello, this is [?] world!")

Wynik:

"A giant en le a sky."
"A yarn ball?"
"An apple?"
"A hour ago I met an European. "
"How about we build a big building. It will have an orange banana hanging out of a window."
"Hello, this is a world!"
rnso
źródło
0

Python 3 , 104 103 bajty

-1 bajtów, nieskalowany ]

lambda s:r('(^|[.?!] )a',r'\1A',r('a( [aeiouAEIOU])',r'an\1',r('\[\?]','a',s)));from re import sub as r

Wypróbuj online!

Rozpoczyna poprzez zastąpienie wszystkich wystąpień [?]z a,
następnie zastępuje wszystkie anastępuje samogłoska, z an.
Następnie zamienia wszystko ana początku wprowadzania lub zdania na A.

Zakłada, że [?]nigdy nie dotknie innego słowa i że małe litery anigdy nie powinny zaczynać zdania.

Matthew Jensen
źródło
0

PowerShell , 124 bajty

zainspirowany odpowiedzią Avi na Javę .

$args-replace(($b='(?<=^|[?.!] )')+($q='\[\?]')+($v='(?= [aeiou])')),'An'-replace"$q$v",'an'-replace"$b$q",'A'-replace$q,'a'

Wypróbuj online!

mazzy
źródło