Un A ou un An?

21

En anglais, il y a la différence amusante et simple entre anet a: vous utilisez anlorsque vous faites précéder un mot commençant par un son de voyelle, et alorsque le mot commence par un son de consonne.

Par souci de simplicité dans ce défi, anprécède un mot qui commence par une voyelle ( aeiou), et aprécède un mot qui commence par une consonne.

Contribution

Chaîne comprenant uniquement des caractères ASCII imprimables, [?]apparaissant aux endroits où vous devez choisir d'insérer anou a. [?]apparaîtra toujours avant un mot. Vous pouvez supposer que la phrase sera grammaticalement correcte et formatée comme d'habitude.

Production

La chaîne d'entrée est [?]remplacée par le mot approprié ( anou a). Vous devez vous soucier de la capitalisation!

Quand capitaliser

Mettez un mot en majuscule s'il n'est précédé d'aucun caractère (est le premier dans l'entrée) ou s'il est précédé d'un ou .?!suivi d'un espace.

Exemples

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?

C'est le , donc le code le plus court en octets gagne!

Daniel
la source
OK merci. Pouvons-nous supposer qu'aucune entrée n'aura d'espaces supplémentaires entre le [?]et le mot?
DJMcMayhem
8
Est-ce que a / an doit être mis en majuscule au milieu de l'entrée quand elle vient au début d'une phrase? ("Ceci est [?] Test. [?] Test.") Si oui, avec quelle ponctuation une phrase peut-elle se terminer? Qu'en est-il des phrases entre guillemets ou entre parenthèses? Ou des abréviations qui se terminent par une période ("Par exemple [?] Entrée comme celle-ci")? Les règles de capitalisation ont de nombreux cas spéciaux étranges, alors soyez très explicites sur ce que nos programmes font ou n'ont pas besoin de gérer.
DLosc
1
Pourriez-vous s'il vous plaît préciser quand capitaliser? Le premier personnage?
DJMcMayhem
31
Vous devez ajouter le cas de test [?] hour ago I met [?] European.juste pour faire grincer des dents tout le monde.
Martin Ender
1
Maintenant, nous devons avoir[?] hour ago I met [?] horse.
bécher

Réponses:

6

V , 41 octets

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

Essayez-le en ligne! , qui peut également être utilisé pour vérifier tous les cas de test sans nombre d'octets supplémentaire.

Cela profite de la «compression regex» de V. Il utilise beaucoup de caractères non imprimables, voici donc un 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
la source
Malheureusement, OP dit : « Vous ne devez vous préoccuper des majuscules! » (c'est moi qui souligne).
El'endia Starman
1
@ El'endiaStarman Oh j'ai mal lu ça. Je peux le réparer, mais je n'ai aucune idée de ce qu'il faut capitaliser, car OP n'a pas précisé.
DJMcMayhem
@ El'endiaStarman Fixé maintenant.
DJMcMayhem
7

Perl, 48 octets

1 octet enregistré en raison de Ton Hospel .

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

En comptant le shebang comme un, l'entrée provient de stdin.

Explication

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

Exemple d'utilisation

$ 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
la source
2
Pourriez-vous expliquer cela, s'il vous plaît?
sudee
1
Le support pour la capitalisation après /[.?!]/suivi de l'espace manque
Ton Hospel
1
@TonHospel Il y a 10 heures, le problème n'en faisait pas mention.
primo
2
Ok, changer les spécifications à la volée est tellement injuste. PS: J'adore utiliser \Gpour faire du backwarsds. PPS, un peu plus court:s;\[\?];A.n x$'=~/^ [aeiou]/^$"x/[^.?!] \G/;eg
Ton Hospel
1
@sudee mis à jour pour inclure une explication.
primo
7

Rubis, 78 72 octets

->s{s.gsub(/(^|\. )?\K\[\?\]( [aeiou])?/i){"anAn"[$1?2:0,$2?2:1]+"#$2"}}
  • 6 octets enregistrés grâce à @Jordan

Non golfé

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
la source
2
"anAn"[...]est vraiment intelligent. 👍🏻 Vous pouvez économiser quelques octets en sautant l'intérieur sub:s.gsub(/(^|\. )?\K\[\?\] ([aeiou])?/i){"anAn"[$1?2:0,$2?2:1]+" #$2"}
Jordan
6

PHP, 207 octets

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

J'aime de temps en temps des solutions plus complètes ...
mais je dois admettre que c'est un peu exagéré, même si ce n'est pas du tout fini.

Enregistrer dans un fichier, exécuter php <filename>avec l'entrée de STDIN.

cas de test

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!

panne

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
la source
3
Upvote pour "pénurie de bananes"! LOL
MonkeyZeus
@MonkeyZeus: Try[?][?][?]s [?]lert!
Titus
Tout ce que je peux imaginer, c'est un Donkey Kong au cœur brisé, inquiet de la pénurie maintenant :(
MonkeyZeus
5

Minkolang 0,15 , 75 octets

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

Essayez-le ici!

Explication

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

Notez que parce que Minkolang est toroïdal, lorsque le compteur de programmes se déplace hors du bord droit, il réapparaît sur la gauche. Certes golfable, mais parce que j'ai dû ajouter 21 octets à cause de la spécification, je ne peux pas essayer.

El'endia Starman
la source
6
Suis-je le seul à vouloir jouer à l'excitebike après avoir lu cette explication?
Urne de poulpe magique du
3

JavaScript (ES6), 90 86 87 85

Modifiez une fois de plus car la spécification pour la capitalisation a changé (plus sensible maintenant)

Modifier à nouveau 1 octet enregistrer thx @Huntro

Modifiez 2 octets supplémentaires pour gérer les citations et autres, comme l'a souligné IsmaelMiguel (même si je ne sais pas si c'est demandé par op). Notez qu'auparavant j'avais compté 86 octets mais ils étaient 85

Essayer de suivre la règle de capitalisation énoncée dans l'événement de commentaires si elle est incomplète (au moins)

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

Tester

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
la source
Ne devrait pas [?][?]donner Ana? Et ne devrait pas [?][?] a.produire Ana a.?
Ismael Miguel
@IsmaelMiguel Je ne comprends pas exactement ce que vous voulez dire, mais de toute façon[?] will always appear before a word. You can assume that the sentence will be grammatically correct and formatted like normal.
edc65
J'ai compris, mais votre code donne des résultats étranges pour [?] "[?]".( An "A", les guillemets ne sont pas pertinents) et pour [?] "A".(cela fonctionne très bien pour [?] A.).
Ismael Miguel
@IsmaelMiguel [?] "[?]"n'est pas une entrée valide. [?] will always appear before a word et "[?]" n'est pas un mot.
edc65
2
L'échappée de seconde ]n'est pas nécessaire. /(\w )?\[\?](\W*.)/g
Huntro
2

Lot, 136 octets

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

Prend une ligne d'entrée sur STDIN.

Neil
la source
2

PHP, 100 92 octets

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

Il était possible d'approfondir le golf sur les expressions régulières.

Donne un avis sur une constante indéfinie mais fonctionne toujours.

Edit: 8 octets enregistrés grâce à primo

user59178
la source
Il devrait également être possible d'obtenir votre tableau de remplacement à l' [n,A,a]aide d'assertions de recherche ( \Ket (?= )).
primo
2

Python 3.5.1, 153 147 124 octets

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

Contribution :

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

Production :

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

Version 123 octets - Cela ne gère pas la règle de capitalisation.

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

Ideone it!

Gurupad Mamadapur
la source
1
Bienvenue chez Codegolf. Vous pouvez l'utiliser ;et jouer au golf.
ABcDexter
1
m.start() fordevrait être m.start()for, s[i+2] in 'aeiouAEIOU'devrait être s[i+2]in'aeiouAEIOU'. Un rasage facile de 3 octets grâce à l'espace blanc.
Erik the Outgolfer du
1
('an','a')[s[i+2]in'aeiouAEIOU']est inversé, vous pouvez utiliser 'a'+'n'*(s[i+2]in'aeiouAEIOU')pour corriger cela et enregistrer 2 octets. Vous trouverez ici de nombreux conseils pour jouer au golf .
Rod
1
Cette communauté est tellement belle, vu combien de personnes sont prêtes à aider un nouveau venu et à fournir des conseils de golf!
yo '
1
Wow, enumerate()c'est cool. Merci @chepner.
Gurupad Mamadapur
2

Java, 180 178 octets

Mon premier post ici, j'ai utilisé une partie du post de Kevin Cruijssen mais avec une approche différente, il m'a aidé à réduire un peu plus grâce à lui!

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

Ici, il n'est pas golfé:

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

Et le résultat

Une explication simple, j'utilise une approche récursive pour trouver tout [?].

Je n'ai pas trouvé de moyen d'utiliser les correspondances avec une casse insensible (pas sûr que ce soit possible).

178 octets: Merci à Martin Ender!

AxelH
la source
1
Bienvenue chez PPCG! Je ne pense pas que vous ayez besoin de vous échapper ]dans votre expression régulière.
Martin Ender
Vous avez raison, seule l'ouverture est suffisante, merci
AxelH
2

05AB1E , 38 36 35 octets

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

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

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
la source
1
Il y a un petit bug dedans. Il met en majuscule chaque mot après un "an". Par exemple, "[?] Orange" devient "une orange". Semble fonctionner, si vous ajoutez un ]après le::
Dorian
@ Dorian Woops .. J'ai supprimé cela }plus tard parce que je pensais que cela économiserait un octet, mais vous avez en effet raison que cela échoue pour les [?] vowelcas .. Merci de me le faire savoir!
Kevin Cruijssen
1

C #, 204 235 octets

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

Programme complet non golfé:

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

Je suis sûr que cela pourrait être amélioré, en particulier la partie Regex, mais je ne pense à rien pour le moment.

Yodle
la source
ça marche sans les importations?
cat
Oups, j'ai oublié d'inclure l'importation d'expressions régulières dans le décompte.
Yodle du
1
Le code golfé devrait s'exécuter tel quel dans n'importe quel format - s'il ne fonctionne pas sans l'importation regex, alors l'importation regex devrait également aller dans le code golfé
cat
D'accord merci. Toujours en train de savoir exactement comment répondre. Le nombre et la réponse incluent maintenant System.Text.RegularExpressions.
Yodle
Cela semble bien maintenant. :) Vous pouvez également consulter Code Golf Meta et la balise FAQ .
cat
1

Java 7, 239 214 213 octets

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

Cas non testés et testés:

Essayez-le ici.

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

Production:

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
la source
J'ai essayé d'utiliser une solution récursive, je me retrouve avec 2 octets de plus que vous :( besoin d'amélioration peut-être .. mais comme j'utilise votre regex, je n'aime pas le poster.
AxelH
@AxelH Pourriez-vous le poster sur ideone et le lier ici? Ensemble, nous pourrions repérer quelque chose au golf. ;)
Kevin Cruijssen
Voici ideone.com/z7hlVi , j'ai trouvé une meilleure approche que d' isEmptyutiliser l'expression régulière ^$. Je crois que je me retrouve avec 202;)
AxelH
@AxelH Ah bien. Hmm, je compte 195 octets au lieu de 202? Btw, vous pouvez jouer au golf à 180 en faisant un retour direct avec un ternaire if-else: 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;}donc certainement plus court que ma boucle de réponse. :)
Kevin Cruijssen
Oh ouais, j'ai réussi à mettre le bloc if sur une ligne à la fin, j'ai oublié de le remplacer. Merci;
AxelH
1

Raquette 451 octets (sans regex)

C'est évidemment une longue réponse mais elle remplace aussi un et un avec une majuscule:

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

Essai:

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

Production:

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

Version détaillée:

(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
la source
Ouais pour la raquette! Voir aussi Conseils pour jouer au golf en raquette / schéma
cat
C'est une excellente langue, mais pas destinée au golf.
rnso
1

J , 113 octets

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

Essayez-le en ligne!

Honte honte!

Jonas
la source
1

Rétine , 66 60 octets

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

Essayez-le en ligne.

Explication:

Effectuez une recherche insensible à la casse [?]suivie d'une voyelle ou d'une consonne, où la voyelle facultative est enregistrée dans le groupe de capture 2 et la correspondance entière dans le groupe de capture 1:

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

Remplacez-le par un a, suivi de la longueur du deuxième groupe n(donc soit 0 ou 1 n), suivi des lettres du groupe de capture 1:

a$.2*n$1

Faites ensuite correspondre un aau début de la chaîne ou après l'un des .?!plus un espace:

(^|[.?!] )a

Et en majuscule que A, sans supprimer les autres caractères du groupe de capture 1:

$1A
Kevin Cruijssen
la source
1

Java (JDK) , 154 octets

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

Essayez-le en ligne!

Explication:

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
la source
1

C (gcc) , 225 207 202 201 octets

Merci à plafondcat pour -24 octets

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

Essayez-le en ligne!

Girobuz
la source
0

Groovy, 73 162 octets

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

edit: putain, la capitalisation a totalement compliqué tout ici

norganos
la source
Cela capitalise-t-il au début d'une phrase?
Titus
Nan. Je vois maintenant que la description du défi a été modifiée entre-temps ...
norganos
"Donnez-moi [?] Heure avec [?] Porte de cave ouverte." Casse
Urne Magic Octopus
la description du défi est toujours complètement incohérente. il dit d'abord "Vous devez vous soucier de la capitalisation!" et juste après il y a les règles de capitalisation
norganos
C'est cohérent. Vous devez vous soucier de la capitalisation (c'est-à-dire que vous devez la gérer). Ensuite, il explique comment
edc65
0

C # 209 octets

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

Formaté

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
la source
0

Perl 6 , 78 octets

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

Explication:

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

Tester:

#! /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
la source
Pouvez-vous supprimer un espace } $1à la fin (en le faisant }$1)?
Cyoce
@Cyoce Il existe un moyen de le faire, mais cela ajoute plus de complexité ailleurs. {S:i:g/(^|<[.?!]>' ')?'[?]'(' '<[aeiou]>?)/{<a A>[?$0]~('n'x?~$1.substr(1))}$1/}
Brad Gilbert b2gills
Ok, je ne savais pas comment Perl analyserait ça
Cyoce
0

Lua, 131 octets.

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

Bien que lua soit une langue terrible pour le golf, je pense que j'ai assez bien réussi.

ATaco
la source
0

Pip , 62 55 54 50 octets

Prend la chaîne comme argument de ligne de commande.

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

Essayez-le en ligne!

Explication:

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
la source
0

Raquette (avec regex) 228 octets

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

Essai:

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

Production:

"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
la source
0

Python 3 , 104 103 octets

-1 octets, sans échappement ]

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

Essayez-le en ligne!

Commence par remplacer toutes les occurrences de [?]avec a,
puis remplace tout asuivi d'une voyelle, avec an.
Remplace ensuite tout aau début de l'entrée ou une phrase par A.

Suppose que [?]cela ne touchera jamais un autre mot et que les minuscules ane doivent jamais commencer une phrase.

Matthew Jensen
la source