Um A, ou um An?


21

Em inglês, há a diferença simples e divertida entre ane a: você usa anquando precede uma palavra que começa com um som de vogal e aquando a palavra começa com um som consoante.

Por uma questão de simplicidade neste desafio, anprecede uma palavra que começa com uma vogal ( aeiou) e aprecede uma palavra que começa com uma consoante.

Entrada

Uma sequência que compreende apenas caracteres ASCII imprimíveis e [?]aparece em locais onde você deve optar por inserir anou a. [?]sempre aparecerá antes de uma palavra. Você pode assumir que a sentença será gramaticalmente correta e formatada como normal.

Saída

A sequência de entrada foi [?]substituída pela palavra apropriada ( anou a). Você precisa se preocupar com letras maiúsculas!

Quando Capitalizar

Coloque uma letra em maiúscula se for precedida por nenhum caractere (é o primeiro na entrada) ou se for precedida por um dos .?!seguido por um espaço.

Exemplos

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?

Isso é , então o código mais curto em bytes vence!


OK obrigado. Podemos assumir que nenhuma entrada terá espaços extras entre [?]a palavra e a?
DJMcMayhem

8
A / a precisa ser maiúsculo no meio da entrada quando chega no início de uma frase? ("Este é o teste [?]. [?].") Se sim, com que pontuação pode terminar uma frase? E as frases entre aspas ou parênteses? Ou abreviações que terminam em um período ("Por exemplo, [?] Entrada como esta")? As regras de capitalização têm muitos casos especiais estranhos; portanto, seja muito explícito sobre o que nossos programas fazem ou não precisam lidar.
DLosc 15/09/16

1
Você poderia esclarecer quando capitalizar? O primeiro personagem?
DJMcMayhem

31
Você deve adicionar o caso de teste [?] hour ago I met [?] European.apenas para fazer todo mundo se encolher.
Martin Ender

1
Agora devemos ter[?] hour ago I met [?] horse.
copo

Respostas:


6

V , 41 bytes

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

Experimente online! , que também pode ser usado convenientemente para verificar todos os casos de teste sem contagem de bytes extra.

Isso tira proveito da "Regex Compression" de V. Ele usa muitos caracteres não imprimíveis, então aqui está um 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

Infelizmente, OP disse: "Você não precisa se preocupar com a capitalização!" (ênfase minha).
El'endia Starman 15/09/16

1
@ El'endiaStarman Oh, eu não entendi direito. Eu posso consertar, mas não tenho idéia do que capitalizar, pois o OP não especificou.
DJMcMayhem

@ El'endiaStarman Corrigido agora.
DJMcMayhem

7

Perl, 48 bytes

Guardado 1 byte devido a Ton Hospel .

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

Contando o shebang como um, a entrada é obtida de stdin.

Explicação

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

Uso da amostra

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

2
Você poderia explicar isso, por favor?
Sudee 15/09/16

1
/[.?!]/Falta suporte para capitalização depois de espaço seguido
Ton Hospel 15/09/16

1
@TonHospel Há 10 horas, o problema não mencionou isso.
Primo 15/09

2
Ok, mudar as especificações rapidamente é tão injusto. PS: Adoro usar \Gpara voltar atrás. PPS, um pouco mais curto:s;\[\?];A.n x$'=~/^ [aeiou]/^$"x/[^.?!] \G/;eg
Ton Hospel 15/09/16

1
@sudee atualizado para incluir explicação.
Primo

7

Ruby, 78 72 bytes

->s{s.gsub(/(^|\. )?\K\[\?\]( [aeiou])?/i){"anAn"[$1?2:0,$2?2:1]+"#$2"}}
  • Guardado 6 bytes graças a @Jordan

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

2
"anAn"[...]é realmente inteligente. Can🏻 Você pode salvar alguns bytes pulando o interior 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);}

Eu gosto de soluções mais completas de tempos em tempos ...
mas devo admitir que isso é um pouco exagerado, embora nem esteja concluído.

Salve no arquivo, execute com php <filename>a entrada de STDIN.

casos de teste

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!

demolir

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

3
Voto a favor da "falta de banana"! LOL
MonkeyZeus 15/09/16

@MonkeyZeus: Try[?][?][?]s [?]lert!
Titus

Tudo o que posso imaginar é um Donkey Kong de coração partido preocupado com a escassez agora :(
MonkeyZeus

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

Experimente aqui!

Explicação

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

Observe que, como o Minkolang é toroidal, quando o contador de programas se move para fora da borda direita, ele reaparece à esquerda. Certamente jogável, mas como tive que adicionar 21 bytes por causa das especificações, talvez não tente.


6
Eu sou o único que quer jogar excitebike depois de ler essa explicação?
Magic Octopus Urn

3

JavaScript (ES6), 90 86 87 85

Edite mais uma vez, pois as especificações para letras maiúsculas mudaram (mais sensato agora)

Edite novamente 1 byte save thx @Huntro

Editar mais 2 bytes para gerenciar cotações e coisas do gênero, como apontado por IsmaelMiguel (mesmo que eu não saiba se foi solicitado pelo op). Note que anteriormente eu tinha contado 86 bytes, mas eles eram 85

Tentando seguir a regra de capitalização declarada no evento de comentários, se estiver incompleta (pelo menos)

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

Teste

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>


Não deveria [?][?]dar Ana? E não deveria [?][?] a.produzir Ana a.?
Ismael Miguel

@IsmaelMiguel Eu não entendo exatamente o que você quer dizer, mas de qualquer maneira[?] will always appear before a word. You can assume that the sentence will be grammatically correct and formatted like normal.
edc65

Entendi, mas seu código está dando resultados estranhos para [?] "[?]".( An "A", as aspas são irrelevantes) e para [?] "A".(funciona bem para [?] A.).
Ismael Miguel

@IsmaelMiguel [?] "[?]"não é uma entrada válida. [?] will always appear before a word e "[?]" não é uma palavra.
Edc65

2
A fuga do segundo ]não é necessária. /(\w )?\[\?](\W*.)/g
Huntro 15/09/16

2

Lote, 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%

Toma uma linha de entrada no STDIN.


2

PHP, 100 92 bytes

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

Foi possível aprimorar ainda mais as expressões regulares.

Avisa sobre uma constante indefinida, mas ainda funciona.

Edit: 8 bytes salvos graças ao primo


Também deve ser possível obter sua matriz de substituição [n,A,a]usando asserções de pesquisa ( \Ke (?= )).
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='')

Entrada :

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

Saída:

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

Versão de 123 bytes - Isso não trata da regra de capitalização.

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!


1
Bem-vindo ao Codegolf. Você pode usar ;e jogar golfe.
ABCDexter 15/09/16

1
m.start() fordeveria ser m.start()for, s[i+2] in 'aeiouAEIOU'deveria ser s[i+2]in'aeiouAEIOU'. Um barbear fácil de 3 bytes devido ao espaço em branco.
Erik the Outgolfer

1
('an','a')[s[i+2]in'aeiouAEIOU']está invertido, você pode usar 'a'+'n'*(s[i+2]in'aeiouAEIOU')para corrigir isso e salvar 2 bytes. Aqui você pode encontrar muitas dicas para jogar golfe .
Rod

1
Esta comunidade é tão adorável, vendo quantas pessoas estão dispostas a ajudar um iniciante e fornecer dicas de golfe!
yo

1
Uau enumerate()é legal. Obrigado @chepner.
Gurupad Mamadapur 15/09/16

2

Java, 180 178 bytes

Meu primeiro post aqui, usei uma parte do post de Kevin Cruijssen, mas, com uma abordagem diferente, ele me ajudou a reduzir um pouco mais, graças a ele!

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

Aqui está não destruído:

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

E o resultado

Uma explicação simples, uso uma abordagem recursiva para encontrar todas [?].

Não consegui encontrar uma maneira de usar as correspondências com maiúsculas e minúsculas (não sei se é possível).

178bytes: Obrigado a Martin Ender!


1
Bem-vindo ao PPCG! Eu não acho que você precisa escapar do ]seu regex.
Martin Ender

Você está certo, apenas a abertura é enought, graças
AxelH

2

05AB1E , 38 36 35 bytes

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

Experimente online ou verifique todos os casos de teste .

Explicação:

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)

1
Há um pequeno bug nele. Coloca em maiúscula cada palavra após um "an". Por exemplo, "[?] Laranja" se torna "uma laranja". Parece funcionar, se você adicionar um ]após o::
Dorian

@Dorian Woops .. Eu removi isso }mais tarde porque achei que economizaria um byte, mas você está certo de que ele falha nos [?] vowelcasos .. Obrigado por me avisar!
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("[?]","");}

Programa completo não destruído:

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

Tenho certeza de que isso poderia ser melhorado, especialmente a parte Regex, mas não consigo pensar em nada no momento.


funciona sem as importações?
cat

Opa, esqueceu de incluir a importação de regex na contagem.
Yodle 15/09/16

1
O código golfed deve ser executado como está em qualquer formato - se ele não for executado sem a importação regex, então a importação regex deve ir no código golfed também
cat

Ok obrigado. Ainda resolvendo exatamente como responder. A contagem e a resposta incluem System.Text.RegularExpressions agora.
Yodle 16/09

Isso parece bom agora. :) Você também pode conferir o Code Golf Meta e a tag faq lá.
cat

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

Casos não testados e de teste:

Experimente aqui.

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

Saída:

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!

Eu tentei usar uma solução recursiva, eu acabo com 2 bytes mais, então você :( necessidade de melhoria talvez .. mas desde que eu use seu regex, eu não gosto de publicá-la.
AxelH

@AxelH Você poderia postá-lo em ideone e criar um link aqui? Juntos, podemos encontrar algo para jogar golfe. ;)
Kevin Cruijssen

Aqui está ideone.com/z7hlVi , achei uma abordagem melhor do que isEmptyusar o regex ^$. Eu acredito que eu acabar com 202;)
AxelH

@AxelH Ah nice. Hmm, conto 195 bytes em vez de 202? Btw, você pode chegar a 180 fazendo um retorno direto com um se-else ternário: 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;}definitivamente mais curto do que minha resposta em loop. :)
Kevin Cruijssen

Ah, sim, eu consigo colocar o bloco if em uma linha no final, esqueci de substituí-lo. Obrigado;
AxelH 17/09/16

1

Raquete 451 bytes (sem regex)

Obviamente, é uma resposta longa, mas também substitui ae por maiúscula:

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

Teste:

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

Saída:

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

Versão detalhada:

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

Yay para raquete! Veja também Dicas para jogar golfe em Racket / Scheme
cat

É uma linguagem excelente, embora não seja para golfe.
precisa saber é o seguinte

1

J , 113 bytes

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

Experimente online!

Que vergonha!


1

Retina , 66 60 bytes

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

Experimente online.

Explicação:

Faça uma pesquisa que não diferencia maiúsculas de minúsculas, [?]seguida por uma vogal ou consoante, em que a vogal opcional é salva no grupo de captura 2 e a correspondência inteira no grupo de captura 1:

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

Substitua por um a, seguido pelo comprimento da segunda quantidade de grupo de n(portanto, 0 ou 1 n), seguido pela (s) letra (s) do grupo de captura 1:

a$.2*n$1

Em seguida, combine um ano início da sequência ou depois de .?!mais um espaço:

(^|[.?!] )a

E maiúsculo que A, sem remover os outros caracteres do grupo de captura 1:

$1A

1

Java (JDK) , 154 bytes

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

Experimente online!

Explicação:

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"

1

C (gcc) , 225 207 202 201 bytes

Graças ao ceilingcat por -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);}

Experimente online!


0

Groovy, 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]}"}}

editar: caramba, a capitalização totalmente complicou tudo aqui


Capitaliza no início de uma frase?
Titus

Não. Vejo agora que a descrição do desafio foi alterada nesse meio tempo ...
norganos 15/09/16

"Dê-me [?] Hora com a porta da adega aberta." Quebra seu código: groovyconsole.appspot.com/edit/5159915056267264
Magic Octopus Urn

a descrição do desafio ainda é completamente inconsistente. primeiro diz "Você precisa se preocupar com letras maiúsculas!" e logo depois que existem as regras de capitalização
norganos

É consistente. Você precisa se preocupar com letras maiúsculas (ou seja, é necessário gerenciá-las). Em seguida, ele explica como
edc65

0

Bytes em C # 209

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

Formatado

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

0

Perl 6 , 78 bytes

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

Explicação:

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

Teste:

#! /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?"

Você pode remover um espaço } $1no final (criando }$1)?
Cyoce 16/09

@ Cyy Existe uma maneira de fazer isso, mas acrescenta mais complexidade em outros lugares. {S:i:g/(^|<[.?!]>' ')?'[?]'(' '<[aeiou]>?)/{<a A>[?$0]~('n'x?~$1.substr(1))}$1/}
Brad Gilbert b2gills

Ok, eu não tinha certeza de como perl iria analisar que
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

Embora a lua seja uma linguagem terrível para o golfe, sinto que me saí muito bem.


0

Pip , 62 55 54 50 bytes

Toma a cadeia de caracteres como um argumento de linha de comando.

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

Experimente online!

Explicação:

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

0

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

Teste:

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

Saída:

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

0

Python 3 , 104 103 bytes

-1 bytes, sem escape ]

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

Experimente online!

Inicia substituindo todas as ocorrências de [?]com a,
Em seguida , substitui tudo aseguido por uma vogal, por an.
Em seguida, substitui tudo ano início da entrada ou uma frase por A.

Assumes that [?] will never be touching another word, and that lower-case a should never begin a sentence.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.