A, atau An?

21

Dalam bahasa Inggris, ada perbedaan yang menyenangkan dan sederhana antara andan a: Anda gunakan ansaat mendahului kata yang dimulai dengan bunyi vokal, dan aketika kata itu dimulai dengan bunyi konsonan.

Demi kesederhanaan dalam tantangan ini, anmendahului kata yang dimulai dengan vokal ( aeiou), dan amendahului kata yang dimulai dengan konsonan.

Memasukkan

String yang hanya terdiri dari karakter ASCII yang dapat dicetak, dengan [?]muncul di tempat-tempat di mana Anda harus memilih untuk memasukkan anatau a. [?]akan selalu muncul sebelum kata. Anda dapat mengasumsikan bahwa kalimat tersebut akan benar secara tata bahasa dan diformat seperti biasa.

Keluaran

String input dengan [?]diganti dengan kata yang sesuai ( anatau a). Anda harus khawatir tentang penggunaan huruf besar!

Kapan Melakukan Kapitalisasi

Kapitalkan kata jika didahului dengan tidak ada karakter (adalah yang pertama di input) atau jika didahului oleh salah satu .?!diikuti oleh spasi.

Contohnya

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?

Ini adalah , jadi kode terpendek dalam byte menang!

Daniel
sumber
Ok terima kasih. Bisakah kita menganggap tidak ada input yang akan memiliki ruang ekstra antara kata [?]dan?
DJMcMayhem
8
Apakah a / a harus dikapitalisasi di tengah input ketika datang di awal kalimat? ("Ini adalah tes [?]. [?] Tes.") Jika demikian, tanda baca apa yang dapat diakhiri dengan kalimat? Bagaimana dengan kalimat dalam tanda kutip atau tanda kurung? Atau singkatan yang berakhir pada suatu periode ("Misalnya input [?] Seperti ini")? Aturan huruf kapital memiliki banyak kasus khusus yang aneh, jadi harap sangat eksplisit tentang apa yang harus atau tidak perlu ditangani oleh program kami.
DLosc
1
Bisakah Anda mengklarifikasi kapan harus menggunakan huruf besar? Karakter pertama?
DJMcMayhem
31
Anda harus menambahkan test case [?] hour ago I met [?] European.hanya untuk membuat semua orang merasa ngeri.
Martin Ender
1
Sekarang kita harus punya[?] hour ago I met [?] horse.
gelas

Jawaban:

6

V , 41 byte

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

Cobalah online! , yang dengan mudah juga dapat digunakan untuk memverifikasi semua kasus uji tanpa jumlah byte tambahan.

Ini mengambil keuntungan dari "Regex Compression" V. Ini menggunakan banyak karakter yang tidak patut dicetak, jadi di sini ada 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
sumber
Sayangnya, OP mengatakan, "Anda benar - benar harus khawatir tentang kapitalisasi!" (penekanan milikku).
El'endia Starman
1
@ El'endiaStarman Oh saya salah membaca itu. Saya dapat memperbaikinya, tetapi saya tidak tahu apa yang harus dikapitalisasi, karena OP tidak menentukan.
DJMcMayhem
@ El'endiaStarman Diperbaiki sekarang.
DJMcMayhem
7

Perl, 48 byte

Disimpan 1 byte karena Ton Hospel .

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

Menghitung shebang sebagai satu, input diambil dari stdin.

Penjelasan

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

Contoh Penggunaan

$ 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
sumber
2
Bisakah Anda menjelaskan ini?
sudee
1
Dukungan untuk kapitalisasi setelah /[.?!]/diikuti oleh ruang tidak ada
Ton Hospel
1
@TonHospel 10 jam yang lalu, masalahnya tidak menyebutkan hal ini.
primo
2
Ok, mengubah spek dengan cepat sangat tidak adil. PS: Saya suka menggunakan \Gbackwarsds. PPS, sedikit lebih pendek:s;\[\?];A.n x$'=~/^ [aeiou]/^$"x/[^.?!] \G/;eg
Ton Hospel
1
@sudee diperbarui untuk menyertakan penjelasan.
Primo
7

Rubi, 78 72 byte

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

Tidak disatukan

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
sumber
2
"anAn"[...]sangat pintar. 👍🏻 Anda dapat menyimpan beberapa byte dengan melompati bagian dalam sub:s.gsub(/(^|\. )?\K\[\?\] ([aeiou])?/i){"anAn"[$1?2:0,$2?2:1]+" #$2"}
Jordan
6

PHP, 207 byte

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

Saya suka solusi yang lebih lengkap dari waktu ke waktu ...
tetapi saya harus mengakui bahwa ini sedikit berlebihan, meskipun sama sekali tidak selesai.

Simpan ke file, jalankan php <filename>dengan input dari STDIN.

uji kasus

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!

kerusakan

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
sumber
3
Suara positif untuk "kekurangan pisang"! LOL
MonkeyZeus
@MonkeyZeus: Coba[?][?][?]s [?]lert!
Titus
Yang bisa saya bayangkan adalah Donkey Kong yang patah hati kuatir tentang kekurangan itu sekarang :(
MonkeyZeus
5

Minkolang 0,15 , 75 byte

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

Coba di sini!

Penjelasan

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

Perhatikan bahwa karena Minkolang adalah toroidal, ketika penghitung program bergerak dari tepi kanan, ia muncul kembali di sebelah kiri. Tentu saja golf, tetapi karena saya harus menambahkan 21 byte karena spek, saya mungkin tidak mencoba.

El'endia Starman
sumber
6
Apakah saya satu-satunya yang ingin bermain seperti setelah membaca penjelasan itu?
Magic Octopus Mm
3

JavaScript (ES6), 90 86 87 85

Edit sekali lagi karena spek kapitalisasi telah berubah (lebih masuk akal sekarang)

Edit lagi 1 byte save thx @Huntro

Edit 2 byte lagi untuk mengelola tanda kutip dan sejenisnya, seperti yang ditunjukkan oleh IsmaelMiguel (bahkan jika saya tidak tahu apakah itu diminta oleh op). Perhatikan bahwa sebelumnya saya telah menghitung 86 byte tetapi jumlahnya 85

Mencoba mengikuti aturan kapitalisasi yang dinyatakan dalam acara komentar jika tidak lengkap (setidaknya)

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

Uji

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
sumber
Tidak seharusnya [?][?]memberi Ana? Dan bukankah seharusnya [?][?] a.menghasilkan Ana a.?
Ismael Miguel
@IsmaelMiguel Saya tidak mengerti persis apa yang Anda maksud, tapi bagaimanapun[?] will always appear before a word. You can assume that the sentence will be grammatically correct and formatted like normal.
edc65
Mengerti, tetapi kode Anda memberikan hasil yang aneh untuk [?] "[?]".( An "A", tanda kutip tidak relevan) dan untuk [?] "A".(berfungsi dengan baik untuk [?] A.).
Ismael Miguel
@IsmaelMiguel [?] "[?]"bukan input yang valid. [?] will always appear before a word dan "[?]" bukan sebuah kata.
edc65
2
Melarikan diri dari yang kedua ]tidak perlu. /(\w )?\[\?](\W*.)/g
Huntro
2

Batch, 136 byte

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

Mengambil garis input pada STDIN.

Neil
sumber
2

PHP, 100 92 byte

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

Dimungkinkan untuk golf lebih jauh dari ekspresi reguler.

Memberi pemberitahuan tentang konstanta yang tidak ditentukan tetapi masih berfungsi.

Sunting: 8 byte disimpan berkat Primo

pengguna59178
sumber
Mungkin juga memungkinkan untuk menurunkan array pengganti Anda [n,A,a]dengan menggunakan pernyataan melihat-lihat ( \Kdan (?= )).
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='')

Memasukkan :

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

Keluaran:

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

Versi 123 Bytes - Ini tidak menangani aturan huruf besar.

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

Ide itu!

Gurupad Mamadapur
sumber
1
Selamat datang di Codegolf. Anda bisa menggunakannya ;dan bermain golf.
ABcDexter
1
m.start() forseharusnya m.start()for, s[i+2] in 'aeiouAEIOU'harus s[i+2]in'aeiouAEIOU'. Mencukur -3-byte yang mudah karena spasi.
Erik the Outgolfer
1
('an','a')[s[i+2]in'aeiouAEIOU']terbalik, Anda bisa menggunakannya 'a'+'n'*(s[i+2]in'aeiouAEIOU')untuk memperbaikinya dan menyimpan 2 byte. Di sini Anda dapat menemukan banyak tips untuk bermain golf .
Rod
1
Komunitas ini sangat indah, melihat berapa banyak orang yang bersedia membantu pendatang baru dan memberikan tips bermain golf!
yo '
1
Wow enumerate()itu keren. Terima kasih @ chepner.
Gurupad Mamadapur
2

Java, 180 178 byte

Posting pertama saya di sini, saya memang menggunakan bagian dari posting Kevin Cruijssen tetapi dan dengan pendekatan yang berbeda, dia membantu saya mengurangi sedikit lebih banyak, terima kasih padanya!

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

Ini dia ungolfed:

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

Dan hasilnya

Penjelasan sederhana, saya menggunakan pendekatan rekursif untuk menemukan setiap [?].

Saya tidak bisa menemukan cara untuk menggunakan korek api dengan case tidak sensitif (tidak yakin itu mungkin).

178bytes: Terima kasih kepada Martin Ender!

AxelH
sumber
1
Selamat datang di PPCG! Saya tidak berpikir Anda perlu melarikan diri ]di regex Anda.
Martin Ender
Anda benar, hanya yang pertama saja sudah cukup, terima kasih
AxelH
2

05AB1E , 38 36 35 byte

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

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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
sumber
1
Ada sedikit bug di dalamnya. Ini mengkapitalisasi setiap kata setelah "an". Misalnya "[?] Oranye" menjadi "oranye". Tampaknya bekerja, jika Anda menambahkan ]setelah::
Dorian
@Dorian Woops .. Saya menghapusnya }nanti karena saya pikir itu akan menghemat satu byte, tetapi Anda memang benar bahwa ia gagal untuk [?] vowelkasus - kasus .. Terima kasih telah memberi tahu saya!
Kevin Cruijssen
1

C #, 204 235 byte

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

Program lengkap tidak digabungkan:

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

Saya yakin ini bisa diperbaiki, terutama bagian Regex, tetapi tidak bisa memikirkan apa pun sekarang.

Yodle
sumber
apakah itu bekerja tanpa impor?
kucing
Ups, lupa untuk memasukkan impor regex dalam hitungan.
Yodle
1
Kode golf harus dijalankan apa adanya dalam format apa pun - jika tidak berjalan tanpa impor regex, maka impor regex juga harus masuk dalam kode golf
cat
Oke terima kasih. Masih mencari tahu bagaimana menjawab. Hitungan dan jawabannya termasuk System.Text.RegularExpressions sekarang.
Yodle
Ini terlihat bagus sekarang. :) Anda juga dapat melihat Code Golf Meta dan tag faq di sana.
kucing
1

Java 7, 239 214 213 byte

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

Kasus yang tidak disatukan & uji:

Coba di sini.

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

Keluaran:

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
sumber
Saya mencoba menggunakan solusi rekursif, saya berakhir dengan 2 byte lebih dari Anda :( perlu peningkatan mungkin .. tapi karena saya menggunakan regex Anda, saya tidak suka mempostingnya.
AxelH
@AxelH Bisakah Anda mempostingnya di ideone dan tautan di sini? Bersama-sama kita mungkin menemukan sesuatu untuk golf. ;)
Kevin Cruijssen
Ini dia ideone.com/z7hlVi , saya memang menemukan pendekatan yang lebih baik daripada isEmptymenggunakan regex ^$. Saya yakin saya berakhir dengan 202;)
AxelH
@AxelH Ah bagus. Hmm, saya hitung 195 byte, bukan 202? Btw, Anda bisa memasukkan golf ke 180 dengan melakukan pengembalian langsung dengan ternary jika- 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;}selain itu : Jadi pasti lebih pendek dari pada loop-answer saya. :)
Kevin Cruijssen
Oh ya, saya berhasil meletakkan blok if di satu baris di akhir, lupa untuk menggantinya. Terima kasih;
AxelH
1

Racket 451 byte (tanpa regex)

Ini jelas merupakan jawaban yang panjang tetapi menggantikan a dan a dengan huruf kapital juga:

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

Pengujian:

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

Keluaran:

"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 detail:

(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))
juga
sumber
Yay untuk Racket! Lihat juga Tips untuk bermain golf di Racket / Scheme
cat
Ini adalah bahasa yang sangat baik, meskipun tidak dimaksudkan untuk bermain golf.
rnso
1

J , 113 byte

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

Cobalah online!

Malu, malu!

Yunus
sumber
1

Retina , 66 60 byte

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

Cobalah online.

Penjelasan:

Lakukan pencarian case-insensitive untuk [?]diikuti oleh vokal atau konsonan, di mana vokal opsional disimpan dalam kelompok tangkapan 2, dan seluruh kecocokan dalam kelompok tangkapan 1:

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

Ganti ini dengan a, diikuti dengan panjang jumlah grup kedua n(jadi 0 atau 1 n), diikuti dengan huruf dari grup tangkap 1:

a$.2*n$1

Kemudian cocokkan adi awal string, atau setelah salah satu dari .?!spasi:

(^|[.?!] )a

Dan huruf besar A, tanpa menghapus karakter lain dari grup tangkap 1:

$1A
Kevin Cruijssen
sumber
1

Java (JDK) , 154 byte

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

Cobalah online!

Penjelasan:

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

C (gcc) , 225 207 202 201 byte

Berkat ceilingcat untuk -24 byte

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

Cobalah online!

girobuz
sumber
0

Groovy, 73 162 byte

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

sunting: sial, huruf besar semua rumit di sini

norganos
sumber
Apakah ini huruf besar pada awal kalimat?
Titus
nggak. Saya mengerti sekarang, bahwa deskripsi tantangan telah diubah untuk sementara ...
norganos
"Beri aku [?] Satu jam dengan pintu gudang terbuka [?]." Hancurkan
Magic Octopus Mm
deskripsi tantangan masih sepenuhnya tidak konsisten. pertama-tama dikatakan "Anda harus khawatir tentang kapitalisasi!" dan langsung setelah itu ada aturan untuk kapitalisasi
norganos
Itu konsisten. Anda harus khawatir tentang kapitalisasi (yaitu, Anda harus mengelolanya). Lalu itu menjelaskan bagaimana
edc65
0

C # 209 byte

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

Diformat

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

Perl 6 , 78 byte

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

Penjelasan:

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

Uji:

#! /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
sumber
Bisakah Anda menghapus ruang dari } $1pada akhirnya (membuatnya }$1)?
Cyoce
@Cyoce Ada cara untuk melakukan itu, tetapi menambah kompleksitas di tempat lain. {S:i:g/(^|<[.?!]>' ')?'[?]'(' '<[aeiou]>?)/{<a A>[?$0]~('n'x?~$1.substr(1))}$1/}
Brad Gilbert b2gills
Ok, saya tidak yakin bagaimana perl akan mengurai itu
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

Meskipun lua adalah bahasa yang buruk untuk bermain golf, saya merasa saya telah melakukannya dengan cukup baik.

ATaco
sumber
0

Pip , 62 55 54 50 byte

Mengambil string sebagai argumen baris perintah.

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

Cobalah online!

Penjelasan:

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

Racket (dengan regex) 228 byte

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

Pengujian:

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

Keluaran:

"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!"
juga
sumber
0

Python 3 , 104 103 byte

-1 byte, tidak terhapus ]

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

Cobalah online!

Mulai dengan mengganti semua kemunculan [?]dengan a,
Lalu mengganti semua adiikuti dengan vokal, dengan an.
Kemudian ganti semua apada awal input atau kalimat denganA .

Berasumsi bahwa [?]tidak akan pernah menyentuh kata lain, dan huruf kecil aseharusnya tidak pernah memulai kalimat.

Matthew Jensen
sumber