¿Una A o una An?

21

En inglés, está la diversión y diferencia simple entre any a: se usa ancuando precede una palabra que comienza con un sonido de vocal y acuando la palabra comienza con un sonido de consonante.

En aras de la simplicidad en este desafío, an precede a una palabra que comienza con una vocal ( aeiou), y aprecede a una palabra que comienza con una consonante.

Entrada

Una cadena que comprende solo caracteres ASCII imprimibles, que [?]aparecen en lugares donde debe elegir insertaran o a. [?]siempre aparecerá antes de una palabra. Puede suponer que la oración será gramaticalmente correcta y tendrá el formato normal.

Salida

La cadena de entrada se [?]reemplaza con la palabra apropiada (an o a). ¡Tienes que preocuparte por la capitalización!

Cuando capitalizar

Escriba con mayúscula una palabra si no está precedida por ningún carácter (es el primero en la entrada) o si está precedida por uno .?!seguido de un espacio.

Ejemplos

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?

Este es el , por lo que gana el código más corto en bytes.

Daniel
fuente
OK gracias. ¿Podemos suponer que ninguna entrada tendrá espacios adicionales entre [?]la palabra y la palabra?
DJMcMayhem
8
¿A / an tiene que estar en mayúscula en el medio de la entrada cuando viene al comienzo de una oración? ("Esta es la prueba [?]. [?] Prueba"). Si es así, ¿con qué puntuación puede terminar una oración? ¿Qué pasa con las oraciones entre comillas o paréntesis? ¿O las abreviaturas que terminan en un punto ("Ej. [?] Entrada como esta")? Las reglas de capitalización tienen muchos casos especiales extraños, así que sea muy explícito sobre lo que nuestros programas hacen o no necesitan manejar.
DLosc
1
¿Podría aclarar cuándo capitalizar? El primer personaje?
DJMcMayhem
31
Debe agregar el caso de prueba [?] hour ago I met [?] European.solo para hacer que todos se avergüencen.
Martin Ender
1
Ahora debemos tener[?] hour ago I met [?] horse.
vaso de precipitados

Respuestas:

6

V , 41 bytes

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

Pruébalo en línea! , que convenientemente también se puede utilizar para verificar todos los casos de prueba sin recuento de bytes adicional.

Esto aprovecha la "Compresión de expresiones regulares" de V. Utiliza muchos caracteres no imprimibles, así que aquí hay 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
fuente
Por desgracia, OP dicho "Usted no tiene que preocuparse por la capitalización!" (énfasis mío).
El'endia Starman
1
@ El'endiaStarman Oh, leí mal eso. Puedo arreglarlo, pero no tengo idea de qué capitalizar, ya que OP no especificó.
DJMcMayhem
@ El'endiaStarman Corregido ahora.
DJMcMayhem
7

Perl, 48 bytes

Guardado 1 byte debido a Ton Hospel .

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

Contando el shebang como uno, la entrada se toma de stdin.

Explicación

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

$ 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
fuente
2
¿Podría explicar esto, por favor?
sudee
1
/[.?!]/Falta el apoyo a la capitalización después de que haya espacio
Ton Hospel
1
@TonHospel Hace 10 horas, el problema no mencionaba esto.
primo
2
Ok, cambiar las especificaciones sobre la marcha es muy injusto. PD: Me encanta usar \Gpara retroceder. PPS, un poco más corto:s;\[\?];A.n x$'=~/^ [aeiou]/^$"x/[^.?!] \G/;eg
Ton Hospel
1
@sudee actualizado para incluir la explicación.
primo
7

Ruby, 78 72 bytes

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

Sin 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
fuente
2
"anAn"[...]Es realmente inteligente. 👍🏻 Puede guardar algunos bytes omitiendo el 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);}

Me gustan las soluciones más completas de vez en cuando ...
pero debo admitir que esto es un poco exagerado, aunque no está del todo terminado.

Guardar en archivo, ejecutar php <filename>con entrada de STDIN.

Casos de prueba

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!

Descompostura

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
fuente
3
¡Votación a favor de la "escasez de plátano"! LOL
MonkeyZeus
@MonkeyZeus: Probar[?][?][?]s [?]lert!
Titus
Todo lo que puedo imaginar es un Donkey Kong desconsolado preocupado por la escasez ahora :(
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

Pruébalo aquí!

Explicación

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

Tenga en cuenta que debido a que Minkolang es toroidal, cuando el contador del programa se mueve del borde derecho, vuelve a aparecer a la izquierda. Ciertamente golfable, pero debido a que tuve que agregar 21 bytes debido a las especificaciones, no puedo intentarlo.

El'endia Starman
fuente
66
¿Soy el único que quiere jugar excitebike después de leer esa explicación?
Urna de pulpo mágico
3

JavaScript (ES6), 90 86 87 85

Edite una vez más, ya que la especificación para la capitalización ha cambiado (ahora más sensato)

Editar de nuevo 1 byte guardar thx @Huntro

Edite 2 bytes más para administrar las cotizaciones y similares, como lo señaló IsmaelMiguel (incluso si no sé si es solicitado por op). Tenga en cuenta que anteriormente había contado 86 bytes pero eran 85

Intentar seguir la regla de mayúsculas establecida en el evento de comentarios si está incompleta (al menos)

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

Prueba

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
fuente
No debería [?][?]dar Ana? ¿Y no debería [?][?] a.producir Ana a.?
Ismael Miguel
@IsmaelMiguel No entiendo exactamente lo que quieres decir, pero de todos modos[?] will always appear before a word. You can assume that the sentence will be grammatically correct and formatted like normal.
edc65
Lo tengo, pero su código está dando resultados extraños para [?] "[?]".( An "A", las comillas son irrelevantes) y para [?] "A".(funciona bien para [?] A.).
Ismael Miguel
@IsmaelMiguel [?] "[?]"no es una entrada válida. [?] will always appear before a word y "[?]" no es una palabra.
edc65
2
El escape de segundo ]no es necesario. /(\w )?\[\?](\W*.)/g
Huntro
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 una línea de entrada en STDIN.

Neil
fuente
2

PHP, 100 92 bytes

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

Era posible seguir desarrollando las expresiones regulares.

Da un aviso sobre una constante indefinida pero aún funciona.

Editar: 8 bytes guardados gracias a primo

usuario59178
fuente
También debería ser posible obtener su matriz de reemplazo [n,A,a]utilizando afirmaciones de búsqueda ( \Ky (?= )).
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.

Salida:

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

Versión de 123 bytes: esto no maneja la regla de mayúsculas.

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
fuente
1
Bienvenido a Codegolf. Podrías usarlo ;y jugar golf.
ABcDexter
1
m.start() fordebería ser m.start()for, s[i+2] in 'aeiouAEIOU'debería ser s[i+2]in'aeiouAEIOU'. Un afeitado fácil de 3 bytes debido al espacio en blanco.
Erik the Outgolfer
1
('an','a')[s[i+2]in'aeiouAEIOU']está invertido, podría usar'a'+'n'*(s[i+2]in'aeiouAEIOU') para arreglar eso y guardar 2 bytes. Aquí puede encontrar muchos consejos para jugar golf .
Rod
1
¡Esta comunidad es encantadora, viendo cuántas personas están dispuestas a ayudar a un recién llegado y proporcionar consejos de golf!
yo '
1
Wow enumerate()es genial Gracias @chepner.
Gurupad Mamadapur
2

Java, 180 178 bytes

En mi primera publicación aquí, utilicé una parte de la publicación de Kevin Cruijssen, pero con un enfoque diferente, me ayudó a reducir un poco más, ¡gracias a él!

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

Aquí no tiene 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;
    }

Y el resultado

Una explicación simple, uso un enfoque recursivo para encontrar cada [?].

No pude encontrar una manera de usar las coincidencias con mayúsculas y minúsculas (no estoy seguro de que sea posible).

178bytes: ¡Gracias a Martin Ender!

AxelH
fuente
1
Bienvenido a PPCG! No creo que necesites escapar ]de tu expresión regular.
Martin Ender
Tienes razón, solo la apertura es suficiente, gracias
AxelH
2

05AB1E , 38 36 35 bytes

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

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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
fuente
1
Hay un pequeño error en él. Capitaliza cada palabra después de un "an". Por ejemplo, "[?] Naranja" se convierte en "una naranja". Parece funcionar, si agrega un ]después de la::
Dorian
@Dorian Woops ... Lo eliminé }más tarde porque pensé que ahorraría un byte, pero tienes razón en que falla en los [?] vowelcasos ... ¡Gracias por hacérmelo saber!
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 sin 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("[?]", "");
    }
}

Estoy seguro de que esto podría mejorarse, especialmente la parte de Regex, pero no puedo pensar en nada en este momento.

Yodle
fuente
funciona sin las importaciones?
gato
Vaya, olvidé incluir la importación de expresiones regulares en el recuento.
Yodle
1
El código de golf debe ejecutarse tal cual en cualquier formato: si no se ejecuta sin la importación de expresiones regulares, entonces la importación de expresiones regulares debe ir también en el código de golf
gato
Bien gracias. Todavía planificando exactamente cómo responder. El recuento y la respuesta incluyen System.Text.RegularExpressions ahora.
Yodle
Esto se ve bien ahora. :) También puede consultar Code Golf Meta y la etiqueta de preguntas frecuentes allí.
gato
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];}

Sin golf y casos de prueba:

Pruébalo aquí

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

Salida:

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
fuente
Intenté usar una solución recursiva, termino con 2 bytes más que tú :( quizás necesites mejorar ... pero como uso tu expresión regular, no me gusta publicarla.
AxelH
@AxelH ¿Podría publicarlo en ideone y vincularlo aquí? Juntos podemos ver algo para jugar golf. ;)
Kevin Cruijssen
Aquí está ideone.com/z7hlVi , encontré una mejor aproximación que isEmptyusar la expresión regular ^$. Creo que termino con 202;)
AxelH
@AxelH Ah bien. Hmm, cuento 195 bytes en lugar de 202? Por cierto, puedes jugar golf 180 haciendo un retorno directo con un ternario 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;}definitivamente más corto que mi respuesta de bucle. :)
Kevin Cruijssen
Oh sí, me las arreglé para poner el bloque if en una línea al final, olvidé reemplazarlo. Gracias;
AxelH
1

Raqueta 451 bytes (sin expresión regular)

Obviamente es una respuesta larga, pero reemplaza a y an con mayúsculas también:

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

Pruebas:

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

Salida:

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

Versión detallada:

(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
fuente
¡Yay por Racket! Ver también Consejos para jugar al golf en Racket / Scheme
gato
Es un lenguaje excelente, aunque no destinado al golf.
rnso
1

J , 113 bytes

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

Pruébalo en línea!

¡Qué vergüenza!

Jonás
fuente
1

Retina , 66 60 bytes

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

Pruébalo en línea.

Explicación:

Haga una búsqueda que no distinga entre mayúsculas y minúsculas para [?] seguida de una vocal o consonante, donde la vocal opcional se guarda en el grupo de captura 2 y la coincidencia completa en el grupo de captura 1:

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

Reemplace esto con un a, seguido de la longitud de la cantidad del segundo grupo de n(entonces 0 o 1n ), seguido de la letra (s) del grupo de captura 1:

a$.2*n$1

Luego haga coincidir un aal inicio de la cadena o después de .?!más de un espacio:

(^|[.?!] )a

Y en mayúscula que A, sin eliminar los otros caracteres del grupo de captura 1:

$1A
Kevin Cruijssen
fuente
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");}

Pruébalo en línea!

Explicación:

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

C (gcc) , 225 207 202 201 bytes

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

Pruébalo en línea!

girobuz
fuente
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: maldición, la capitalización complicó totalmente todo aquí

norganos
fuente
¿Esto capitaliza al comienzo de una oración?
Titus
no Ahora veo que la descripción del desafío ha cambiado mientras tanto ...
norganos
"Dame [?] Hora con [?] Puerta de bodega abierta". Rompe tu código: groovyconsole.appspot.com/edit/5159915056267264
Urna de pulpo mágico
La descripción del desafío todavía es completamente inconsistente. primero dice "¡Tienes que preocuparte por la capitalización!" y directamente después de eso están las reglas para la capitalización
norganos
Es consistente. Debe preocuparse por la capitalización (es decir, debe administrarla). Luego explica cómo
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);}

Formateado

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

Perl 6 , 78 bytes

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

Explicación:

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

Prueba:

#! /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
fuente
¿Puedes eliminar un espacio } $1al final (haciéndolo }$1)?
Cyoce
@Cyoce Hay una manera de hacerlo, pero agrega más complejidad en otros lugares. {S:i:g/(^|<[.?!]>' ')?'[?]'(' '<[aeiou]>?)/{<a A>[?$0]~('n'x?~$1.substr(1))}$1/}
Brad Gilbert b2gills
Ok, no estaba seguro de cómo Perl analizaría eso
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

Aunque lua es un lenguaje terrible para el golf, creo que lo he hecho bastante bien.

Un taco
fuente
0

Pip , 62 55 54 50 bytes

Toma la cadena como un argumento de línea de comandos.

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

Pruébalo en línea!

Explicación:

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

Raqueta (con expresiones regulares) 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"))

Pruebas:

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

Salida:

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

Pitón 3 , 104 103 bytes

-1 bytes, sin escape ]

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

Pruébalo en línea!

Comienza por reemplazar todas las ocurrencias de [?]con a,
Luego reemplaza todo aseguido por una vocal, con an.
Luego reemplaza todo aal comienzo de la entrada o una oración conA .

Asume que [?]nunca tocará otra palabra, y que las minúsculas anunca deben comenzar una oración.

Matthew Jensen
fuente