Ein A oder ein An?

21

Im Englischen gibt es den lustigen und einfachen Unterschied zwischen anund a: Sie verwenden, anwenn Sie einem Wort vorangehen, das mit einem Vokalton abeginnt , und wenn das Wort mit einem Konsonantenton beginnt.

Der Einfachheit halber wird bei dieser Herausforderung anein Wort vorangestellt, das mit einem Vokal ( aeiou) beginnt , und aein Wort, das mit einem Konsonanten beginnt.

Eingang

Eine Zeichenfolge, die nur druckbare ASCII-Zeichen enthält und [?]an Stellen angezeigt wird, an denen Sie anoder einfügen müssen a. [?]wird immer vor einem Wort stehen. Sie können davon ausgehen, dass der Satz grammatikalisch korrekt und normal formatiert ist.

Ausgabe

Die Eingabezeichenfolge wird [?]durch das entsprechende Wort ( anoder a) ersetzt. Sie müssen sich um die Großschreibung sorgen!

Wann man kapitalisiert

Schreiben Sie ein Wort in Großbuchstaben, wenn vor ihm keine Zeichen stehen (es ist das erste in der Eingabe) oder wenn vor ihm eines von .?!gefolgt von einem Leerzeichen steht.

Beispiele

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?

Das ist , also gewinnt der kürzeste Code in Bytes!

Daniel
quelle
OK danke. Können wir davon ausgehen, dass keine Eingaben zusätzliche Leerzeichen zwischen dem [?]und dem Wort enthalten?
DJMcMayhem
8
Muss ein / eine in der Mitte der Eingabe großgeschrieben werden, wenn es am Anfang eines Satzes steht? ("Dies ist ein [?] Test. [?] Test.") Wenn ja, mit welcher Interpunktion kann ein Satz enden? Was ist mit Sätzen in Anführungszeichen oder Klammern? Oder Abkürzungen, die in einem Punkt enden ("zB [?] Wie folgt eingeben")? Großschreibungsregeln haben viele seltsame Sonderfälle. Seien Sie also sehr genau darüber, was unsere Programme tun oder nicht tun müssen.
DLosc
1
Könnten Sie bitte klären, wann Sie Kapital schlagen sollen? Das erste Zeichen?
DJMcMayhem
31
Sie sollten den Testfall hinzufügen [?] hour ago I met [?] European., um alle zu erschrecken.
Martin Ender
1
Jetzt müssen wir haben[?] hour ago I met [?] horse.
Becher

Antworten:

6

V , 41 Bytes

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

Probieren Sie es online! , mit dem bequemerweise auch alle Testfälle ohne zusätzliche Byteanzahl überprüft werden können.

Dies nutzt die "Regex-Komprimierung" von V aus. Es werden viele nicht druckbare Zeichen verwendet, daher hier ein Hexdump:

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
quelle
Leider sagte OP „Sie haben zu Sorgen über Kapitalisierung haben!“ (Hervorhebung von mir).
El'endia Starman
1
@ El'endiaStarman Oh, das habe ich falsch verstanden. Ich kann es reparieren, aber ich habe keine Ahnung, was ich kapitalisieren soll, da OP nicht spezifiziert hat.
DJMcMayhem
@ El'endiaStarman Jetzt behoben.
DJMcMayhem
7

Perl, 48 Bytes

1 Byte aufgrund von Ton Hospel gespeichert .

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

Zählt man den Shebang als einen, wird die Eingabe von stdin übernommen.

Erläuterung

#!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

Beispielnutzung

$ 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
quelle
2
Könnten Sie das bitte erklären?
Sonntag,
1
Unterstützung für die Großschreibung nach /[.?!]/dem Leerzeichen fehlt
Ton Hospel
1
@TonHospel Vor 10 Stunden hat das Problem keine Erwähnung gefunden.
Primo
2
Ok, das Ändern der Spezifikation im laufenden Betrieb ist so unfair. PS: Ich liebe \Ges, Backwarsds zu benutzen. PPS, etwas kürzer:s;\[\?];A.n x$'=~/^ [aeiou]/^$"x/[^.?!] \G/;eg
Ton Hospel
1
@sudee wurde aktualisiert und enthält nun eine Erklärung.
Primo
7

Ruby, 78 72 Bytes

->s{s.gsub(/(^|\. )?\K\[\?\]( [aeiou])?/i){"anAn"[$1?2:0,$2?2:1]+"#$2"}}

Ungolfed

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
quelle
2
"anAn"[...]ist wirklich schlau. 👍🏻 Sie können ein paar Bytes sparen, indem Sie das Innere überspringen sub:s.gsub(/(^|\. )?\K\[\?\] ([aeiou])?/i){"anAn"[$1?2:0,$2?2:1]+" #$2"}
Jordan
6

PHP, 207 Bytes

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

Ich mag Lösungen, die von Zeit zu Zeit vollständiger sind ...
aber ich muss zugeben, dass dies ein wenig übertrieben ist, obwohl es überhaupt nicht fertig ist.

In Datei speichern, php <filename>mit Eingabe von STDIN ausführen.

Testfälle

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!

Nervenzusammenbruch

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:".");`
}
Titus
quelle
3
Upvote für "Bananenmangel"! LOL
MonkeyZeus
@MonkeyZeus: Try[?][?][?]s [?]lert!
Titus
Alles, was ich mir vorstellen kann, ist ein Esel mit
gebrochenem Herzen,
5

Minkolang 0,15 , 75 Bytes

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

Probieren Sie es hier aus!

Erläuterung

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

Da Minkolang torisch ist, wird der Programmzähler links wieder angezeigt, wenn er sich vom rechten Rand wegbewegt. Sicherlich golffähig, aber da ich wegen der Spezifikation 21 Bytes hinzufügen musste, darf ich es nicht versuchen.

El'endia Starman
quelle
6
Bin ich der einzige, der nach dem Lesen dieser Erklärung mit dem Excitebike spielen möchte?
Magic Octopus Urn
3

JavaScript (ES6), 90 86 87 85

Bearbeiten Sie erneut, da sich die Spezifikation für die Großschreibung geändert hat (jetzt sinnvoller).

Bearbeite noch einmal 1 Byte und speichere das @Huntro

Bearbeiten Sie 2 weitere Bytes, um Anführungszeichen und ähnliches zu verwalten, wie von IsmaelMiguel hervorgehoben (auch wenn ich nicht weiß, ob es von op angefordert wird). Beachten Sie, dass ich vorher 86 Bytes gezählt hatte, diese aber 85 waren

Versuch, die im Kommentarereignis angegebene Großschreibungsregel zu befolgen, wenn sie (mindestens) unvollständig ist

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

Prüfung

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
quelle
Sollte nicht [?][?]geben Ana? Und sollte nicht [?][?] a.produzieren Ana a.?
Ismael Miguel
@ IsmaelMiguel Ich verstehe nicht genau, was du meinst, aber trotzdem[?] will always appear before a word. You can assume that the sentence will be grammatically correct and formatted like normal.
edc65
Verstanden, aber Ihr Code liefert seltsame Ergebnisse für [?] "[?]".( An "A"die Anführungszeichen sind irrelevant) und für [?] "A".(es funktioniert gut für [?] A.).
Ismael Miguel
@IsmaelMiguel [?] "[?]"ist keine gültige Eingabe. [?] will always appear before a word und "[?]" ist kein Wort.
Edc65
2
Das Entkommen von Sekunden ]ist nicht nötig. /(\w )?\[\?](\W*.)/g
Huntro
2

Batch, 136 Bytes

@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%

Übernimmt eine Eingabezeile für STDIN.

Neil
quelle
2

PHP, 100 92 Bytes

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

Die regulären Ausdrücke konnten weiter golfen werden.

Gibt einen Hinweis über eine undefinierte Konstante aus, funktioniert aber weiterhin.

Edit: 8 Bytes gespeichert dank Primo

user59178
quelle
Es sollte auch möglich sein, Ihr Ersatz-Array [n,A,a]mithilfe von Look-Around-Assertions ( \Kund (?= )) auf den neuesten Stand zu bringen .
Primo
2

Python 3.5.1, 153 147 124 Bytes

*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='')

Eingabe:

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

Ausgabe :

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

123-Byte-Version - Dies behandelt keine Großschreibung.

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

Ideone es!

Gurupad Mamadapur
quelle
1
Willkommen bei Codegolf. Sie könnten es benutzen ;und Golf spielen.
ABcDexter
1
m.start() forsollte sein m.start()for, s[i+2] in 'aeiouAEIOU'sollte sein s[i+2]in'aeiouAEIOU'. Eine einfache 3-Byte-Rasur aufgrund von Leerzeichen.
Erik der Outgolfer
1
('an','a')[s[i+2]in'aeiouAEIOU']invertiert ist, können Sie dies 'a'+'n'*(s[i+2]in'aeiouAEIOU')beheben und 2 Bytes sparen. Hier finden Sie viele Tipps zum Golfen .
Rod
1
Diese Community ist so nett, zu sehen, wie viele Leute bereit sind, einem Neuling zu helfen und Golftipps zu geben!
Du
1
Wow enumerate()ist cool. Danke @chepner.
Gurupad Mamadapur
2

Java, 180 178 Bytes

Mein erster Beitrag hier, ich habe einen Teil des Beitrags von Kevin Cruijssen verwendet, aber mit einer anderen Herangehensweise hat er mir geholfen, das ein bisschen mehr zu reduzieren, dank ihm!

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

Hier ist es ungolfed:

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

Und das Ergebnis

Eine einfache Erklärung, ich benutze einen rekursiven Ansatz, um jeden zu finden [?].

Ich konnte keine Möglichkeit finden, die Übereinstimmungen mit Groß- und Kleinschreibung zu verwenden (nicht sicher, ob dies möglich ist).

178bytes: Danke an Martin Ender!

AxelH
quelle
1
Willkommen bei PPCG! Ich glaube nicht, dass Sie ]dem Regex entkommen müssen.
Martin Ender
Sie haben recht, nur der erste ist genug, danke
AxelH
2

05AB1E , 38 36 35 Bytes

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

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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
quelle
1
Da ist ein kleiner Fehler drin. Jedes Wort wird nach einem "an" großgeschrieben. Zum Beispiel wird "[?] Orange" zu "Orange". Scheint zu funktionieren, wenn Sie einen ]nach dem::
Dorian
@Dorian Woops .. Ich habe das }später entfernt, weil ich dachte, es würde ein Byte sparen, aber Sie haben in der Tat Recht, dass es für [?] vowelFälle fehlschlägt .. Danke, dass Sie mich informiert haben!
Kevin Cruijssen
1

C # 204 235 Bytes

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("[?]","");}

Ungolfed volles Programm:

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("[?]", "");
    }
}

Ich bin sicher, dass dies verbessert werden könnte, insbesondere der Regex-Teil, aber mir fällt momentan nichts ein.

Jodler
quelle
geht das ohne importe?
Katze
Hoppla, habe vergessen, den Regex-Import in die Zählung aufzunehmen.
Yodle
1
Der Golf-Code sollte so wie er ist in jedem Format ausgeführt werden - wenn er nicht ohne den Regex-Import ausgeführt wird, sollte der Regex-Import auch im Golf-Code ausgeführt werden
cat
Okay danke. Immer noch genau ausbügeln, wie man antwortet. Die Zählung und die Antwort umfassen jetzt System.Text.RegularExpressions.
Yodle
Das sieht jetzt gut aus. :) Sie können sich dort auch Code Golf Meta und den FAQ- Tag ansehen .
Katze
1

Java 7, 239 214 213 Bytes

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

Ungolfed & Testfälle:

Probieren Sie es hier aus.

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!"));
  }
}

Ausgabe:

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
quelle
Ich habe versucht, eine rekursive Lösung zu verwenden.
regulären Ausdruck verwende, poste
@AxelH Könntest du es vielleicht auf ideone posten und hier verlinken? Gemeinsam könnten wir etwas zum Golfen entdecken. ;)
Kevin Cruijssen
Hier ist es ideone.com/z7hlVi , ich habe einen besseren Ansatz gefunden, als isEmptydie Regex zu verwenden ^$. Ich glaube, ich
lande
@AxelH Ah schön. Hmm, ich zähle 195 Bytes statt 202? Übrigens können Sie es bis 180 spielen, indem Sie eine direkte Rückkehr mit einem ternären if-else machen: 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;}Also definitiv kürzer als meine Schleifenantwort. :)
Kevin Cruijssen
Oh ja, ich schaffe es, den if-Block am Ende in eine Zeile zu setzen, habe vergessen, ihn zu ersetzen. Vielen Dank;
AxelH
1

Schläger 451 Bytes (ohne Regex)

Es ist natürlich eine lange Antwort, aber es ersetzt a und a mit Großschreibung auch:

(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))

Testen:

(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!")

Ausgabe:

"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!"

Ausführliche Version:

(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
quelle
Yay für Schläger! Siehe auch Tipps zum Golfen in Racket / Schema
Katze
Es ist eine ausgezeichnete Sprache, obwohl sie nicht zum Golfen gedacht ist.
RNSO
1

J , 113 Bytes

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

Probieren Sie es online!

Schande, Schande!

Jona
quelle
1

Retina , 66 60 Bytes

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

Probieren Sie es online aus.

Erläuterung:

Führen Sie eine Suche ohne Berücksichtigung der Groß- / Kleinschreibung durch, [?]gefolgt von einem Vokal oder Konsonanten, wobei der optionale Vokal in Erfassungsgruppe 2 und die gesamte Übereinstimmung in Erfassungsgruppe 1 gespeichert wird:

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

Ersetzen Sie dies durch ein a, gefolgt von der Länge der zweiten Gruppenmenge von n(also entweder 0 oder 1 n), gefolgt von den Buchstaben der Eroberungsgruppe 1:

a$.2*n$1

Dann passen Sie aentweder am Anfang der Zeichenkette oder nach einem der beiden .?!Pluszeichen ein an:

(^|[.?!] )a

Und das A in Großbuchstaben, ohne die anderen Zeichen der Erfassungsgruppe 1 zu entfernen:

$1A
Kevin Cruijssen
quelle
1

Java (JDK) , 154 Byte

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

Probieren Sie es online!

Erläuterung:

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
quelle
1

C (GCC) , 225 207 202 201 Bytes

Vielen Dank an Ceilingcat für -24 Bytes

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

Probieren Sie es online!

girobuz
quelle
0

Stark, 73 162 Bytes

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

edit: verdammt, die kapitalisierung hat hier alles total kompliziert

norganos
quelle
Kommt das am Anfang eines Satzes zur Geltung?
Titus
Nee. Ich sehe jetzt, dass die Herausforderungsbeschreibung in der Zwischenzeit geändert wurde ...
norganos
"Gib mir [?] Stunde mit [?] Offener Kellertür." Bricht
Magic Octopus Urn
Die Beschreibung der Herausforderung ist immer noch völlig inkonsistent. zuerst heißt es: "Sie müssen sich um die Großschreibung sorgen!" und direkt danach gibt es die Regeln für die Großschreibung
norganos
Es ist konsequent. Sie müssen sich um die Großschreibung kümmern (das heißt, Sie müssen sie verwalten). Dann wird erklärt, wie
edc65
0

C # 209 Bytes

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

Formatiert

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
quelle
0

Perl 6 , 78 Bytes

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

Erläuterung:

{
  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/
}

Prüfung:

#! /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
quelle
Kannst du ein Leerzeichen } $1am Ende entfernen (machen }$1)?
Cyoce
@Cyoce Es gibt eine Möglichkeit, dies zu tun, aber es erhöht die Komplexität an anderer Stelle. {S:i:g/(^|<[.?!]>' ')?'[?]'(' '<[aeiou]>?)/{<a A>[?$0]~('n'x?~$1.substr(1))}$1/}
Brad Gilbert b2gills
Ok, ich war mir nicht sicher, wie Perl das analysieren würde
Cyoce
0

Lua, 131 Bytes.

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

Obwohl Lua eine schreckliche Sprache für das Golfen ist, habe ich das Gefühl, dass ich es ziemlich gut gemacht habe.

Ein Taco
quelle
0

Pip , 62 55 54 50 Bytes

Nimmt die Zeichenfolge als Befehlszeilenargument.

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

Probieren Sie es online!

Erläuterung:

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
quelle
0

Schläger (mit Regex) 228 Bytes

(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"))

Testen:

(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!")

Ausgabe:

"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
quelle
0

Python 3 , 104 103 Bytes

-1 Byte, ohne Flucht ]

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

Probieren Sie es online!

Startet durch alle Vorkommen zu ersetzen , [?]mit a,
Dann werden alle ersetzt adurch einen Vokal folgt, mit an.
Dann ersetzt allesa zu Beginn der Eingabe oder einen Satz mit A.

Es wird davon ausgegangen, dass [?]niemals ein anderes Wort berührt wird und dass Kleinbuchstaben aniemals einen Satz beginnen sollten.

Matthew Jensen
quelle