A mı, yoksa An mı?


21

İngilizce, orada eğlenceli ve tek farkı, anve a: Kullanmak ansesli harf sesi ile başlayan bir kelime önceki zaman ve akelime ünsüz ses ile başladığında.

Bu meydan okumada basitlik uğruna, ansesli harf ( aeiou) aile başlayan ve ünsüz ile başlayan bir sözcükten önce gelir.

Giriş

Bir dize ile, sadece yazdırılabilir ASCII karakterleri içeren [?]Eklemek seçmelisiniz yerlerde görünüyor anya a. [?]her zaman bir sözcükten önce görünür. Cümlenin dilbilgisi açısından doğru ve normal şekilde biçimlendirileceğini varsayabilirsiniz.

Çıktı

Girilen dize [?], uygun sözcük ( anveya a) ile değiştirilir . Büyük harf kullanımı konusunda endişelenmeniz gerekiyor!

Ne Zaman Büyük Harf Kullanmalı

Öncesinde hiç karakter yoksa (girdideki ilk harfse) veya öncesinde .?!boşluk varsa, bir sözcüğü büyük harfle yaz .

Örnekler

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?

Bu , bayt en kısa kod kazanır!


Tamam teşekkürler. Hiçbir girdinin [?]ve kelimesi arasında fazladan boşluk olmayacağını varsayabilir miyiz ?
DJMcMayhem

8
Bir cümlenin başlangıcında girişin ortasında büyük / küçük harf kullanımı var mı? ("Bu [?] Testi. [?] Testi.") Öyleyse, bir cümle hangi noktalama işaretiyle bitebilir? Tırnak işaretleri veya parantez içindeki cümleler ne olacak? Veya bir süre ile biten kısaltmalar ("Örneğin [?] Bu şekilde girdi")? Büyük / küçük harf kullanım kurallarının birçok garip özel durumu vardır, bu yüzden lütfen programlarımızın ne yaptığını veya işlemesi gerekmediğini çok açık olun.
DLosc

1
Ne zaman büyük harf kullanacağınızı açıklığa kavuşturabilir misiniz? İlk karakter?
DJMcMayhem

31
[?] hour ago I met [?] European.Herkesi kandırmak için test senaryosunu eklemelisiniz .
Martin Ender

1
Şimdi sahip olmalıyız[?] hour ago I met [?] horse.
beher

Yanıtlar:


6

V , 41 bayt

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

Çevrimiçi deneyin! Ayrıca, fazladan bayt sayısı olmadan tüm test durumlarını doğrulamak için de kullanılabilir.

Bu, V'nin "Regex Sıkıştırma" sından yararlanır. Birçok yazdırılamaz karakter kullanıyor, bu yüzden burada bir hexdump var:

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

Ne yazık ki, OP "Dedin mi büyük harf kullanımı konusunda endişe zorunda!" (benimkini vurgulayın).
El'endia Starman

1
@ El'endiaStarman Oh, bunu yanlış okudum. Düzeltebilirim, ama OP belirtmediği için ne büyük harf kullanacağım hakkında hiçbir fikrim yok.
DJMcMayhem

@ El'endiaStarman Şimdi düzeltildi.
DJMcMayhem

7

Perl, 48 bayt

Ton Hospel nedeniyle 1 bayt kaydedildi .

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

Mesele bir olarak sayılır, girdi stdin'den alınır.

açıklama

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

Örnek Kullanımı

$ 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
Bunu açıklayabilir misiniz lütfen?
sudee

1
/[.?!]/Ardından boşluk bırakıldıktan sonra büyük harf kullanımı desteği
Ton Hospel

1
@TonHospel 10 saat önce, sorun bundan hiç bahsetmedi.
primo

2
Peki, teknik özellikleri anında değiştirmek çok haksızlık. PS: Ben \Gbackwarsds gitmek için kullanmayı seviyorum . PPS, biraz daha kısa:s;\[\?];A.n x$'=~/^ [aeiou]/^$"x/[^.?!] \G/;eg
Ton Hospel

1
@sudee açıklama içerecek şekilde güncellendi.
primo

7

Yakut, 78 72 bayt

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

Ungolfed

def f(s)
    s.gsub(/(^|\. )?\[\?\]( [aeiou])?/i) do |m|
        capitalize = $1
        vowel = $2
        replacement = if vowel then
            capitalize ? "An" : "an"
        else
            capitalize ? "A" : "a"
        end
        m.sub('[?]', replacement)
    end
end

2
"anAn"[...]gerçekten zekidir. The🏻 İç kısmı atlayarak birkaç bayt tasarruf edebilirsiniz sub:s.gsub(/(^|\. )?\K\[\?\] ([aeiou])?/i){"anAn"[$1?2:0,$2?2:1]+" #$2"}
Ürdün

6

PHP, 207 bayt

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

Zaman zaman daha eksiksiz çözümlerden hoşlanıyorum ...
ama itiraf etmeliyim ki, bitmiş olmasa da, bunun biraz aşırı olduğunu.

Dosyaya kaydedin php <filename>, STDIN girişiyle çalıştırın .

test senaryoları

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!

Yıkmak

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
"Banana shortage" için oy verin! LOL
MonkeyZeus

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

Hayal edebileceğim tek şey kalbi kırılmış bir Donkey Kong şu anda
sıkıntıdan

5

Minkolang 0.15 , 75 bayt

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

Burada deneyin!

açıklama

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

Minkolang toroidal olduğu için, program sayacı sağ kenardan uzaklaştığında, solda tekrar belirir. Kesinlikle golf yapılabilir, ancak spec nedeniyle 21 bayt eklemek zorunda kaldım, ben denemeyebilir.


6
Bu açıklamayı okuduktan sonra heyecan oyununa gitmek isteyen tek kişi ben miyim?
Sihirli Ahtapot Urn

3

JavaScript (ES6), 90 86 87 85

Büyük harf kullanımı spesifikasyonu değiştikçe bir kez daha düzenleyin (şimdi daha mantıklı)

Tekrar düzenle 1 byte save thx @Huntro

Düzenleme daha 2 tırnak ve yönetmek için bayt (o op tarafından talep eğer bilmiyorum bile) IsmaelMiguel tarafından belirttiği gibi, gibi. Daha önce 86 bayt saydığımı, ancak 85

Tamamlanmamışsa yorumlar etkinliğinde belirtilen büyük harf kullanım kuralına uymaya çalışmak (en azından)

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

Ölçek

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>


Gerekmiyor [?][?]vermek Ana? Ve [?][?] a.üretmemelisin Ana a.?
Ismael Miguel

@IsmaelMiguel Ne demek istediğini tam olarak anlamıyorum, ama yine de[?] will always appear before a word. You can assume that the sentence will be grammatically correct and formatted like normal.
edc65

Anladım, ancak kodunuz [?] "[?]".( An "A"tırnak işaretleri ilgisiz) ve [?] "A".(için iyi çalışıyor ) için garip sonuçlar veriyor [?] A..
Ismael Miguel

@IsmaelMiguel [?] "[?]"geçerli bir girdi değil. [?] will always appear before a word ve "[?]" bir kelime değildir.
edc65

2
İkincinin kaçmasına ]gerek yok. /(\w )?\[\?](\W*.)/g
Huntro

2

Toplu, 136 bayt

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

STDIN üzerine bir satır girdi alır.


2

PHP, 100 92 bayt

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

Düzenli ifadeleri daha da golf oynamak mümkün oldu.

Tanımlanmamış bir sabit hakkında bir bildirim verir, ancak yine de çalışır.

Düzenleme: primo sayesinde 8 bayt kaydedildi


Ayrıca, [n,A,a]etrafındaki iddiaları ( \Kve (?= )) kullanarak yeni dizinizi almanız da mümkün olmalıdır .
primo

2

Python 3.5.1, 153 147 124 Bayt

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

Giriş:

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

Çıktı :

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

123 Bayt sürümü - Büyük / küçük harf kuralını işlemez.

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

Boşver!


1
Codegolf'a hoş geldiniz. Kullanabilir ;ve golf oynayabilirsiniz .
ABcDexter

1
m.start() forolmalı m.start()for, s[i+2] in 'aeiouAEIOU'olmalı s[i+2]in'aeiouAEIOU'. Boşluk nedeniyle -3 baytlık kolay bir tıraş.
Outgolfer Erik

1
('an','a')[s[i+2]in'aeiouAEIOU']ters çevrilirse, bunu 'a'+'n'*(s[i+2]in'aeiouAEIOU')düzeltmek ve 2 bayt kaydetmek için kullanabilirsiniz . Burada golf için birçok ipucu bulabilirsiniz .
Rod

1
Bu topluluk, kaç kişinin yeni gelenlere yardım etmek ve golf ipuçları vermek istediğini görmek çok güzel!
'

1
Vay canına enumerate(). Teşekkürler @chepner.
Gurupad Mamadapur

2

Java, 180 178 bayt

Buradaki ilk yazım , Kevin Cruijssen yazısının bir kısmını kullandım, ancak farklı bir yaklaşımla, onun sayesinde biraz daha fazla azaltmama yardımcı oldu!

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

İşte çözülmemiş:

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

Ve sonuç

Basit bir açıklama, ben her bulmak için özyinelemeli bir yaklaşım kullanın [?].

Duyarsız vaka ile maçları kullanmanın bir yolunu bulamadım (mümkün olduğundan emin değilim).

178bayt: Martin Ender'a teşekkürler!


1
PPCG'ye Hoşgeldiniz! ]Regex'inizden kaçmanız gerektiğini düşünmüyorum .
Martin Ender

Haklısın, sadece açılış yeterli, teşekkürler
AxelH

2

05AB1E , 38 36 35 bayt

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

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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
İçinde küçük bir hata var. Her kelimeyi bir "an" dan sonra büyük harflerle yazıyor. Örneğin "[?] Turuncu", "Turuncu" olur. ]Sonra görünüyor::
Dorian

@Dorian Woops .. Bunu }daha sonra kaldırdım çünkü bir bayt kurtaracağını düşündüm, ama gerçekten [?] voweldavalar için başarısız olduğu için haklısın .. Bana bildirdiğiniz için teşekkürler!
Kevin Cruijssen

1

C #, 204 235 bayt

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

Ungolfed tam programı:

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

Bunun iyileştirilebileceğinden eminim, özellikle Regex kısmı, ama şu anda hiçbir şey düşünemiyorum.


ithalat olmadan çalışıyor mu?
kedi

Hata! Normal ifadeyi içe aktarmayı eklemeyi unuttum.
Yodle

1
Golfçü kodu herhangi bir biçimde olduğu gibi çalışmalıdır - normal ifade içe aktarma olmadan çalışmazsa, normal ifade içe aktarma işlemi de golf koduna girmelidir
cat

Tamam teşekkürler. Hala tam olarak nasıl cevap verileceğini ütülemek. Sayı ve cevap şimdi System.Text.RegularExpressions içerir.
Yodle

Bu şimdi iyi görünüyor. :) Ayrıca Code Golf Meta ve SSS etiketini de kontrol edebilirsiniz .
kedi

1

Java 7, 239 214 213 bayt

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

Test edilmemiş ve test durumları:

Burada deneyin.

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

Çıktı:

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!

Özyinelemeli bir çözüm kullanmayı denedim, sizden sonra 2 byte daha fazla
bitirdim

@AxelH Belki ideone'de yayınlayıp buraya bağlayabilir misiniz? Birlikte golf için bir şeyler bulabiliriz. ;)
Kevin Cruijssen

İşte ideone.com/z7hlVi , normal ifadeyiisEmpty kullanmaktan daha iyi bir yaklaşım buldum ^$. Ben 202 ile bitirmek inanıyorum;)
AxelH

@AxelH Ah güzel. Hmm, 202 yerine 195 bayt sayıyorum? Btw, üçlü bir if-else ile doğrudan dönüş yaparak 180'e golf oynayabilirsiniz: 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;}Kesinlikle benim döngü cevabımdan daha kısa. :)
Kevin Cruijssen

Oh evet, if bloku sonunda bir satıra koymayı başardım, değiştirmeyi unuttum. Teşekkürler;
AxelH

1

Raket 451 bayt (normal ifade olmadan)

Açıkçası uzun bir cevap ama a ve a'nın yerine büyük harf kullanımı koyuyor:

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

Test yapmak:

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

Çıktı:

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

Ayrıntılı sürüm:

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

Raket için Yay! Ayrıca bkz Raket / Şemada golf için ipuçları
kedi

Golf için değil mükemmel bir dildir.
rnso

1

J , 113 bayt

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

Çevrimiçi deneyin!

Utanç, utanç!


1

Retina , 66 60 bayt

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

Çevrimiçi deneyin.

Açıklama:

[?]Bir sesli harf veya ünsüz harf için büyük / küçük harf duyarlı olmayan bir arama yapın , burada isteğe bağlı sesli harf yakalama grubu 2'ye kaydedilir ve tüm maç yakalama grubu 1'de kaydedilir:

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

aBunu bir ve ardından ikinci grup miktarının n(0 veya 1 n) uzunluğunun ardından yakalama grubu 1'in harfleri ile değiştirin:

a$.2*n$1

Ardından a, dizenin başlangıcında veya .?!boşluktan herhangi birinden sonra a ile eşleştirin :

(^|[.?!] )a

Ve yakalama grubu 1'in diğer karakterlerini kaldırmadan A'nın büyük harfleri:

$1A

1

Java (JDK) , 154 bayt

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

Çevrimiçi deneyin!

Açıklama:

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 bayt

-24 bayt için ceilingcat sayesinde

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

Çevrimiçi deneyin!


0

Gelenekselleşmiş, 73 162 bayt

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

edit: lanet olsun, büyük harf kullanımı burada her şeyi tamamen karmaşık


Bu bir cümlenin başında büyük harf kullanıyor mu?
Titus

Hayır. Görüyorum ki, meydan okuma açıklaması bu arada değişti ...
norganos

"Bana açık kiler kapısı ile [?] Saat ver." Kodunuzu kırar
Sihirli Ahtapot Urn

meydan okuma tanımı hala tamamen tutarsız. önce "Büyük harf kullanımı konusunda endişelenmeniz gerekiyor!" ve bundan hemen sonra büyük harf kullanımı için kurallar var
norganos

Tutarlı. Büyük harf kullanımı konusunda endişelenmelisiniz (yani, yönetmeniz gerekir). Sonra nasıl açıklar
edc65

0

C # 209 bayt

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

biçimlendirilmiş

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 bayt

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

Açıklama:

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

Ölçek:

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

} $1Sonunda bir boşluk kaldırabilir misin (onu }$1)?
Cyoce

@Cyoce Bunu yapmanın bir yolu var, ancak başka yerlerde daha fazla karmaşıklık ekliyor. {S:i:g/(^|<[.?!]>' ')?'[?]'(' '<[aeiou]>?)/{<a A>[?$0]~('n'x?~$1.substr(1))}$1/}
Brad Gilbert b2gills

Tamam,
perl'in

0

Lua, 131 Bayt.

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

Lua golf için korkunç bir dil olmasına rağmen, oldukça iyi yaptığımı hissediyorum.


0

Pip , 62 55 54 50 bayt

Dizeyi komut satırı bağımsız değişkeni olarak alır.

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

Çevrimiçi deneyin!

Açıklama:

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

Raket (normal rex ile) 228 bayt

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

Test yapmak:

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

Çıktı:

"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 , 104103 bayt

-1 bayt, boş ]

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

Çevrimiçi deneyin!

Tüm tekrarlarını değiştirerek başlatır [?]ile a,
sonra da bütün değiştirir aile sesli harfle takip an.
Sonra hepsini değiştirira giriş veya cümlenin başlangıcındaA .

[?]Asla başka bir kelimeye dokunmayacağını ve küçük aharfin asla bir cümle başlatmaması gerektiğini varsayar .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.