An A, hay An An?


21

Trong tiếng Anh, có sự khác biệt thú vị và đơn giản giữa ana: bạn sử dụng ankhi đứng trước một từ bắt đầu bằng âm nguyên âm và akhi từ bắt đầu bằng âm phụ âm.

Để đơn giản trong thử thách này, hãy đặt antrước một từ bắt đầu bằng nguyên âm ( aeiou) và atrước một từ bắt đầu bằng một phụ âm.

Đầu vào

Một chuỗi chỉ bao gồm các ký tự ASCII có thể in được, [?]xuất hiện ở những nơi bạn phải chọn để chèn anhoặc a. [?]sẽ luôn xuất hiện trước một từ. Bạn có thể cho rằng câu sẽ đúng ngữ pháp và được định dạng như bình thường.

Đầu ra

Chuỗi đầu vào được [?]thay thế bằng từ thích hợp ( anhoặc a). Bạn phải lo lắng về vốn hóa!

Khi nào nên viết hoa

Viết hoa một từ nếu nó đứng trước không có ký tự (là từ đầu tiên trong đầu vào) hoặc nếu nó đứng trước một từ được .?!theo sau bởi khoảng trắng.

Ví dụ

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?

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


Được rồi cảm ơn. Chúng ta có thể cho rằng không có đầu vào sẽ có thêm khoảng trắng giữa từ [?]và từ?
DJMcMayhem

8
Có phải a / an phải được viết hoa ở giữa đầu vào khi nó ở đầu câu không? ("Đây là bài kiểm tra [?]. [?].") Nếu vậy, câu có thể kết thúc bằng câu nào? Điều gì về câu trong dấu ngoặc kép hoặc dấu ngoặc đơn? Hoặc các chữ viết tắt kết thúc trong một khoảng thời gian ("Ví dụ [?] Đầu vào như thế này")? Quy tắc viết hoa có rất nhiều trường hợp đặc biệt kỳ lạ, vì vậy vui lòng nói rõ về những gì chương trình của chúng tôi làm hoặc không cần xử lý.
DLosc

1
Bạn có thể vui lòng làm rõ khi nào nên viết hoa? Nhân vật đầu tiên?
DJMcMayhem

31
Bạn nên thêm trường hợp thử nghiệm [?] hour ago I met [?] European.chỉ để làm cho tất cả mọi người co rúm lại.
Martin Ender

1
Bây giờ chúng ta phải có[?] hour ago I met [?] horse.
cốc

Câu trả lời:


6

V , 41 byte

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

Hãy thử trực tuyến! , thuận tiện cũng có thể được sử dụng để xác minh tất cả các trường hợp thử nghiệm không có số byte bổ sung.

Điều này tận dụng lợi thế của "Regex nén". Nó sử dụng rất nhiều ký tự không thể in được, vì vậy đây là một 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

Thật không may, OP nói "Bạn làm phải lo lắng về viết hoa!" (nhấn mạnh của tôi).
El'endia Starman

1
@ El'endiaStarman Oh tôi đã đọc sai điều đó. Tôi có thể sửa nó, nhưng tôi không biết phải viết hoa gì, vì OP không chỉ định.
DJMcMayhem

@ El'endiaStarman Đã sửa.
DJMcMayhem

7

Perl, 48 byte

Đã lưu 1 byte do TonMedel .

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

Đếm shebang là một, đầu vào được lấy từ stdin.

Giải trình

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

Sử dụng mẫu

$ 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
Bạn có thể giải thích điều này, xin vui lòng?
sudee

1
Hỗ trợ viết hoa sau khi /[.?!]/bị mất khoảng trống
TonMedel

1
@TonH rửa cách đây 10 giờ, vấn đề không đề cập đến điều này.
Primo

2
Ok, thay đổi thông số kỹ thuật trên bay là không công bằng. PS: Tôi thích sử dụng \Gđể đi backwarsds. PPS, ngắn hơn một chút:s;\[\?];A.n x$'=~/^ [aeiou]/^$"x/[^.?!] \G/;eg
TonMedel

1
@sudee cập nhật để bao gồm giải thích.
primo

7

Ruby, 78 72 byte

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

Ung dung

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"[...]thực sự thông minh Bạn có thể lưu một vài byte bằng cách bỏ qua phần bên trong 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);}

Thỉnh thoảng tôi thích các giải pháp hoàn thiện hơn ...
nhưng tôi phải thừa nhận rằng điều này hơi quá mức, mặc dù nó không hoàn thành.

Lưu vào tập tin, chạy với php <filename> với đầu vào từ STDIN.

trường hợp kiểm tra

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!

phá vỡ

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
Upvote cho "thiếu chuối"! LOL
MonkeyZeus

@MonkeyZeus: Thử[?][?][?]s [?]lert!
Tít

Tất cả những gì tôi có thể tưởng tượng là một Donkey Kong đau khổ lo lắng về sự thiếu hụt hiện tại :(
MonkeyZeus

5

Chồn 0,15 , 75 byte

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

Hãy thử nó ở đây!

Giải trình

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

Lưu ý rằng vì Minkolang là hình xuyến, khi bộ đếm chương trình di chuyển ra khỏi cạnh phải, nó sẽ xuất hiện lại ở bên trái. Chắc chắn là có thể chơi được, nhưng vì tôi phải thêm 21 byte vì thông số kỹ thuật, tôi có thể không thử.


6
Tôi có phải là người duy nhất muốn đi chơi exceb sau khi đọc lời giải thích đó không?
Bạch tuộc ma thuật Urn

3

JavaScript (ES6), 90 86 87 85

Chỉnh sửa một lần nữa khi thông số viết hoa đã thay đổi (hợp lý hơn bây giờ)

Chỉnh sửa lại 1 byte lưu thx @Huntro

Chỉnh sửa thêm 2 byte để quản lý dấu ngoặc kép và tương tự, như được chỉ ra bởi IsmaelMiguel (ngay cả khi tôi không biết nếu nó được yêu cầu bởi op). Lưu ý rằng trước đây tôi đã đếm 86 byte nhưng chúng là 85

Cố gắng tuân theo quy tắc viết hoa được nêu trong sự kiện bình luận nếu nó không đầy đủ (ít nhất)

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

Kiểm tra

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>


Có nên [?][?]cho Anakhông? Và không nên [?][?] a.sản xuất Ana a.?
Ismael Miguel

@IsmaelMiguel Tôi không hiểu chính xác ý bạn là gì, nhưng dù sao đi nữa[?] will always appear before a word. You can assume that the sentence will be grammatically correct and formatted like normal.
edc65

Có nó, nhưng mã của bạn đang cho kết quả kỳ lạ cho [?] "[?]".( An "A", các trích dẫn là không liên quan) và cho [?] "A".(nó hoạt động tốt cho [?] A.).
Ismael Miguel

@IsmaelMiguel [?] "[?]"không phải là đầu vào hợp lệ. [?] will always appear before a word và "[?]" không phải là một từ.
edc65

2
Việc trốn thoát thứ hai ]là không cần thiết. /(\w )?\[\?](\W*.)/g
Huntro

2

Mẻ, 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%

Có một dòng đầu vào trên STDIN.


2

PHP, 100 92 byte

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

Nó có thể tiếp tục chơi golf các biểu thức thông thường.

Đưa ra một thông báo về một hằng số không xác định nhưng vẫn hoạt động.

Chỉnh sửa: 8 byte được lưu nhờ vào primo


Cũng có thể đưa mảng thay thế của bạn xuống [n,A,a]bằng cách sử dụng các xác nhận nhìn xung quanh ( \K(?= )).
primo

2

Python 3.5.1, 153 147 124 byte

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

Đầu vào :

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

Đầu ra:

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

Phiên bản 123 Byte - Điều này không xử lý quy tắc viết hoa.

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

Nghĩa là nó!


1
Chào mừng đến với Codegolf. Bạn có thể sử dụng ;và đánh gôn nó.
ABcDexter

1
m.start() fornên m.start()for, s[i+2] in 'aeiouAEIOU'nên s[i+2]in'aeiouAEIOU'. Một cạo -3 byte dễ dàng do khoảng trắng.
Erik the Outgolfer

1
('an','a')[s[i+2]in'aeiouAEIOU']bị đảo ngược, bạn có thể sử dụng 'a'+'n'*(s[i+2]in'aeiouAEIOU')để sửa lỗi đó và lưu 2 byte. Ở đây bạn có thể tìm thấy rất nhiều lời khuyên để chơi golf .
Rod

1
Cộng đồng này rất đáng yêu, nhìn thấy có bao nhiêu người sẵn sàng giúp đỡ một người mới và cung cấp các mẹo chơi golf!
yo '

1
Wow enumerate()thật tuyệt Cảm ơn @chepner.
Gurupad Mamadapur

2

Java, 180 178 byte

Bài đăng đầu tiên của tôi ở đây, tôi đã sử dụng một phần của bài đăng Kevin Cruijssen nhưng với một cách tiếp cận khác, anh ấy đã giúp tôi giảm thêm một chút vì vậy, nhờ anh ấy!

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 là vô căn cứ:

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

Và kết quả

Một lời giải thích đơn giản, tôi sử dụng một đệ quy đệ quy để tìm mọi [?].

Tôi không thể tìm ra cách sử dụng các trận đấu với trường hợp không nhạy cảm (không chắc là có thể).

178byte: Cảm ơn Martin Ender!


1
Chào mừng đến với PPCG! Tôi không nghĩ rằng bạn cần phải thoát khỏi ]regex của bạn.
Martin Ender

Bạn nói đúng, chỉ có phần mở đầu là đủ, cảm ơn
AxelH

2

05AB1E , 38 36 35 byte

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

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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
Có một lỗi nhỏ trong đó. Nó viết hoa mỗi từ sau một "an". Ví dụ: "[?] Orange" trở thành "Orange". Có vẻ như sẽ hoạt động, nếu bạn thêm ]vào sau::
Dorian

@Dorian Woops .. Tôi đã xóa nó }sau này vì tôi nghĩ rằng nó sẽ tiết kiệm được một byte, nhưng bạn thực sự đúng rằng nó thất bại trong [?] vowelcác trường hợp .. Cảm ơn vì đã cho tôi biết!
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("[?]","");}

Chương trình đầy đủ:

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

Tôi chắc chắn rằng điều này có thể được cải thiện, đặc biệt là phần Regex, nhưng không thể nghĩ ra bất cứ điều gì ngay bây giờ.


Nó hoạt động mà không cần nhập khẩu?
mèo

Rất tiếc, quên bao gồm nhập regex trong số đếm.
Yodle

1
Mã golf phải chạy như ở bất kỳ định dạng nào - nếu nó không chạy mà không nhập nhập regex, thì quá trình nhập regex cũng sẽ đi theo mã golf
mèo

Được rồi, cảm ơn. Vẫn ủi chính xác làm thế nào để trả lời. Số lượng và câu trả lời bao gồm System.Text.RegularExpressions ngay bây giờ.
Yodle

Điều này có vẻ tốt bây giờ. :) Bạn cũng có thể kiểm tra Code Golf Meta và thẻ faq ở đó.
con mèo

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

Các trường hợp bất ngờ & thử nghiệm:

Hãy thử nó ở đây.

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

Đầu ra:

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!

Tôi đã thử sử dụng một giải pháp đệ quy, tôi kết thúc với 2 byte nữa thì bạn :( cần phải cải thiện có thể .. nhưng vì tôi sử dụng regex của bạn, tôi không muốn đăng nó.
AxelH

@AxelH Có lẽ bạn có thể đăng nó trên ideone và liên kết ở đây? Cùng nhau chúng ta có thể phát hiện ra một cái gì đó để chơi gôn. ;)
Kevin Cruijssen

Đây là ideone.com/z7hlVi , tôi đã tìm thấy một sự chấp thuận tốt hơn so với isEmptyviệc sử dụng regex ^$. Tôi tin rằng tôi kết thúc với 202;)
AxelH

@AxelH À đẹp quá. Hmm, tôi đếm 195 byte thay vì 202? Btw, bạn có thể đánh gôn tới 180 bằng cách quay lại trực tiếp với một 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;}câu trả lời if-other: Vì vậy, chắc chắn ngắn hơn câu trả lời vòng lặp của tôi. :)
Kevin Cruijssen

Ồ vâng, tôi quản lý để đặt khối if vào một dòng ở cuối, quên thay thế nó. Cảm ơn;
AxelH

1

Vợt 451 byte (không có regex)

Đây rõ ràng là một câu trả lời dài nhưng nó cũng thay thế a và viết hoa:

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

Kiểm tra:

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

Đầu ra:

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

Phiên bản chi tiết:

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


Đó là một ngôn ngữ tuyệt vời, mặc dù không có nghĩa là để chơi golf.
rnso


1

Võng mạc , 66 60 byte

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

Hãy thử trực tuyến.

Giải trình:

Thực hiện tìm kiếm không phân biệt chữ hoa [?]và theo sau là nguyên âm hoặc phụ âm, trong đó nguyên âm tùy chọn được lưu trong nhóm bắt giữ 2 và toàn bộ trận đấu trong nhóm bắt giữ 1:

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

Thay thế này bằng một a, theo sau là độ dài của số lượng nhóm thứ hai n(vì vậy 0 hoặc 1 n), theo sau là (các) chữ cái của nhóm chụp 1:

a$.2*n$1

Sau đó khớp với một aở đầu chuỗi hoặc sau một trong hai .?!dấu cách:

(^|[.?!] )a

Và viết hoa chữ A mà không loại bỏ các ký tự khác của nhóm chụp 1:

$1A

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

Hãy thử trực tuyến!

Giải trình:

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 byte

Nhờ trần nhà cho -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);}

Hãy thử trực tuyến!


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

chỉnh sửa: chết tiệt, viết hoa hoàn toàn phức tạp mọi thứ ở đây


Điều này có viết hoa ở đầu câu không?
Tít

không Tôi thấy bây giờ, mô tả thách thức đã được thay đổi trong thời gian đó ...
norganos

"Hãy cho tôi [?] Giờ với [?] Cửa hầm mở." Phá
Bạch tuộc ma thuật Urn

mô tả thách thức vẫn còn hoàn toàn không nhất quán. đầu tiên nó nói "Bạn phải lo lắng về vốn hóa!" và trực tiếp sau đó có các quy tắc viết hoa
norganos

Nó là nhất quán. Bạn phải lo lắng về vốn hóa (nghĩa là bạn cần quản lý nó). Sau đó, nó giải thích như thế nào
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);}

Định dạng

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 byte

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

Giải trình:

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

Kiểm tra:

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

Bạn có thể loại bỏ một khoảng trắng } $1ở cuối (làm cho nó }$1)?
Cyoce

@Cyoce Có một cách để làm điều đó, nhưng nó làm tăng thêm sự phức tạp ở nơi khác. {S:i:g/(^|<[.?!]>' ')?'[?]'(' '<[aeiou]>?)/{<a A>[?$0]~('n'x?~$1.substr(1))}$1/}
Brad Gilbert b2gills

Ok, tôi không chắc chắn làm thế nào perl sẽ phân tích điều đó
Cyoce

0

Lua, 131 byte.

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

Mặc dù lua là một ngôn ngữ tồi tệ để chơi golf, tôi cảm thấy tôi đã làm khá tốt.


0

Pip , 62 55 54 50 byte

Lấy chuỗi làm đối số dòng lệnh.

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

Hãy thử trực tuyến!

Giải trình:

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

Vợt (có 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"))

Kiểm tra:

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

Đầu ra:

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

-1 byte, không thoát ]

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

Hãy thử trực tuyến!

Bắt đầu bằng cách thay thế tất cả các lần xuất hiện [?]bằng a,
Sau đó thay thế tất cả atheo sau bằng một nguyên âm, với an.
Sau đó thay thế tất cảa khi bắt đầu nhập hoặc một câu bằngA .

Giả sử rằng [?]sẽ không bao giờ chạm vào một từ khác, và chữ thường đó asẽ không bao giờ bắt đầu một câu.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.