Ünlüleri hatırla!


25

Giriş

Örneğin, yazdırılabilir bir ASCII karakter dizisi:

This is an example string.

Çıktı

BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyzBir ünlü ( AEIOUaeiou) tarafından takip edilmeyen her ünsüz ( ) için, önceki küçük harfleri küçük harfle ekleyin.
İlk ünlüden önce ünsüzler olduğu gibi bırakılır :

Thisi isi ana examapale seterinigi.

Test durumları

AN EXAMPLE WITH A LOT UPPERCASE (plus some lowercase)
=> ANa EXAMaPaLE WITiHi A LOTo UPuPEReCASE (pelusu some lowerecase)

And here comes a **TEST** case with 10% symbols/numbers(#)!
=> Anada here comese a **TESeTe** case witihi 10% siyimiboloso/numuberese(#)!

This is an example string.
=> Thisi isi ana examapale seterinigi.

abcdefghijklmnopqrstuvwxyz
=> abacadefegehijikiliminopoqorosotuvuwuxuyuzu

A pnm bnn
=> A panama banana

Tell me if you need more test cases!
=> Telele me ifi you neede more tesete casese!

puanlama

Bu , her dilde en düşük bayt sayısına sahip cevap kazanır (cevap kabul edilmez).


Öyleyse, metin hem büyük hem de küçük harf olabilirken, eklenen sesli harfler her zaman küçük harf olmalı mı?
Outgolfer Erik,

Çıktı bir liste / dizi biçiminde olabilir mi?
Nathan Dimmer,

Bir komşu küçük harf kontrol etmek olsaydı biz küçük harfe gerek nereye @EriktheOutgolfer Evet, büyük harfli istemiyordum ama meydan overcomplicated olurdu
Wastl

11
Sağlıklı çocuklar yiyin, deneyin A pnm bnn!
Stewie Griffin,

4
"İtalyanların" unvanın bir yere girmesi gerektiğini düşünen başka biri var mı?
Artelius

Yanıtlar:


14

Retina , 48 bayt

i`(?<=([aeiou]).*?[^\W\d_aeiou])(?![aeiou])
$l$1

Çevrimiçi deneyin! Açıklama: Göz alıcı bir sesli harf tarafından takip edilmeyen bir noktayı arar, göz alıcı ise hemen önce bir ünsüz ve bir önceki küçük harf arar, daha sonra küçük harfle eklenir.


8

JavaScript (ES6), 108 105 bayt

(@Shaggy sayesinde 3 bayt kaydedildi.)

f=s=>(t=(s+=' ').replace(/[aeiou]|[a-z][^aeiou]/ig,r=>r[1]?r[0]+v.toLowerCase()+r[1]:v=r,v=''))!=s?f(t):s

Ünlüleri veya hiç sesli harf olmadan ünsüzleri arar :

/[aeiou]|[a-z][^aeiou]/ig

(Ünsüzleri açıkça aramamıza gerek yok çünkü ünlüler buna göre dışlanır /[aeiou]|....)

Ünlüler saklanır vve aşağıdaki ünlü olmayan ünsüzler veklenir:

r[1]?r[0]+v.toLowerCase()+r[1]:v=r

(Varsa r[1], ünsüz ve ünlü olmayan harflerle eşleştik.)

Hiçbir şey değişmediyse, girişi döndürürüz. Aksi takdirde, değiştirilen dizgede nüksederiz.


1
Bu daha iyi. Gerçekten
regex'e

+1 akıllı harita üzerinde yerine kullanmak için akıllı fikir + katılmak
Downgoat

Sizinkinize dayanarak (neredeyse) özyinelemeden çalışan bir sürüm: s=>s.replace(/[aeiou][^a-z]*([a-z](?![aeiou]))+/gi,s=>s.replace(/(?!^)./g,a=>a+s[0].toLowerCase()))Harf olmayan dizilerin sıralanmasıyla ilgili sorunlarım var gibi görünmüyor
Downgoat

Özyineleme kesinlikle burada işleri kolaylaştırıyor.
Rick Hitchcock

(s+=' ')birkaç bayt kaydetmelisiniz.
Shaggy,


4

Standart ML , 225 223 bayt

str o Char.toLower;fun?c=String.isSubstring(it c)"aeiou"fun g(x,l)$d=(fn l=>if Char.isAlpha$andalso not(?d)then if? $then(it$,l)else(x,l^x)else(x,l))(l^str$)fun f$(c::d::r)=f(g$c d)(d::r)|f$[c]= #2(g$c c);f("","")o explode;

Çevrimiçi deneyin!

Daha az golf oynadı:

val lower = str o Char.toLower

fun isVowel c = String.isSubstring (lower c) "aeiou"

(* c is the current char, d is the next char, x is the last vowel and l the accumulator 
   for the resulting string *)
fun g (x,l) c d = 
    if Char.isAlpha c andalso not (isVowel d)
    then if isVowel c 
         then (lower c, l^str c)
         else (x, l^str c^x)
    else (x, l^str c)

fun f t (c::d::r) = f (g t c d) (d::r)
  | f t [c] = #2(g t c #"d")

val h = f ("","") o explode;

Çevrimiçi deneyin!


vay, ML golf gerçekten ilginç görünüyor! Değişken adının itkullanımını seviyorum $.
Lynn

@Lynn Bir süre önce yeniden adlandıran tanımlayıcı hakkında bir ipucu yazdım ve bir tane itde yazmayı planladım , ancak henüz bunu yapmadım.
Laikoni


4

Perl 5, 68 67 59 bayt

perl -pe '$v="[aeiou])";1while s/($v[^a-z]*[b-z]\K(?<!$v(?!$v/\L$1/i'

İşte kullanışlılığın harika bir örneği \Kve Dom Hastings belirtmeden önce bu özelliği bilmediğime inanamıyorum.

Sadece kullanarak doğru davranışı alamadım s///g, bu yüzden gerçek bir döngü gerekli görünüyor. (Geriye doğru bakma iddiasının doğru kullanımı açıkça belirtilmeden işe yarayabilir while- ama bulamadım.)


Güzel yaklaşım! Daha iyi bir şey bulamadı, ancak 6 bayt çıkarmayı başardı: Çevrimiçi deneyin!
Dom Hastings

1
@DomHastings: [aeiou])Değişkene faktoring yaparak daha da kısa (58 byte'a kadar) : Çevrimiçi deneyin!
ShadowRanger

3

JavaScript ES6, 115 bayt

@ETHProductions sayesinde 8 bayt kazandırır

s=>[x="",...s].map((i,j)=>(r=/[aeiou]/i).test(i)?x=i:/[a-z]/i.test(i)&&!r.test(s[j]||1)?i+x.toLowerCase():i).join``

Bunu daha çok golf oynatma sürecinde şişirmeyi başardım ama O bir hatayı da düzeltti

s=>[x="",...s].map(             // Create a new array with x storing last vowel
                                // This also offsets indexes by one so rel to original str refers to next char
   (i,j)=>                      // Going through each char...
      (r=/[aeiou]/i).test(i)?   // If it's vowel, store it in x
          x=i:
      /[a-z]/i.test(i)          // If a letter (thats not a vowel excluded by above)
         &&!r.test(s[j]||1)?    // Test if next char is *not* vowel
         i+x.toLowerCase():i    // If it isn't, then add the most recent vowel after
    ).join``                    // Combine back to string

@RickHitchcock oh ateş tamamen biten char,
unutmadan

1
@RickHitchcock tamam düzeltildi
Downgoat

Ah, evet golf için teşekkürler @ETHproductions
Downgoat

3

JavaScript, 88 82 Bayt

Tek bir düzenli ifadeyle yapılır:

Orijinal Sürüm (88 Bayt):

s=>s.replace(/(?<=([aeiou]).*?(?![aeiou])[a-z])(?=[^aeiou]|$)/gi,(_,c)=>c.toLowerCase())

Neil'in düzenli ifadesine baktıktan sonra Güncellenmiş Sürüm (82 Bayt) :

s=>s.replace(/(?<=([aeiou]).*?[^\W\d_aeiou])(?![aeiou])/gi,(_,c)=>c.toLowerCase())

var tests = {
  "AN EXAMPLE WITH A LOT UPPERCASE (plus some lowercase)":
    "ANa EXAMaPaLE WITiHi A LOTo UPuPEReCASE (pelusu some lowerecase)",
  "And here comes a **TEST** case with 10% symbols/numbers(#)!":
    "Anada here comese a **TESeTe** case witihi 10% siyimiboloso/numuberese(#)!",
  "This is an example string.":
     "Thisi isi ana examapale seterinigi.",
  "abcdefghijklmnopqrstuvwxyz":
    "abacadefegehijikiliminopoqorosotuvuwuxuyuzu",
  "A pnm bnn":
     "A panama banana",
  "Tell me if you need more test cases!":
     "Telele me ifi you neede more tesete casese!"
};

for ( test in tests )
{
  var result = (s=>s.replace(/(?<=([aeiou]).*?[^\W\d_aeiou])(?![aeiou])/gi,(_,c)=>c.toLowerCase()))(test);
  console.log( result === tests[test], result );
}


3

Japt -P , 28 bayt

ó@\ctX ©\VtYÃËè\v ?P=D:D¬qPv

Çevrimiçi deneyin!

Ambalajsız ve Nasıl Çalışır?

UóXY{\ctX &&\VtY} mD{Dè\v ?P=D:Dq qPv

UóXY{           }  Split the string between any two chars that don't satisfy...
     \ctX &&\VtY     The first char is a consonant and the second is a non-vowel
mD{                And map...
   Dè\v              If this item is a vowel...
       ?P=D            Assign it to P and return as-is
           :Dq qPv     Otherwise, split the item into chars and join with P lowercased
                       (P starts with "", so beginning consonants are not affected)

-P                 Join with ""

óFonksiyon regexes her türlü üzerinde kazanır.


Güzel olan, beni yendi: D.
Magic Octopus Urn

Güzel bitti - Bununla beynimde ciddi beyin ağrısı oluştu!
Shaggy,


2

Perl 6 ,  75 73 71  69 bayt

{({S:i/.*(<[aeiou]>).*<-[\W\d_aeiou]><()><![aeiou]>/$0.lc()/}...*eq*).tail}

Dene

{({S:i{.*(<[aeiou]>).*<-[\W\d_aeiou]><()><![aeiou]>}=$0.lc}...*eq*).tail}

Dene

{({S:i{.*(<[aeiou]>).*<:L-[_aeiou]><()><![aeiou]>}=$0.lc}...*eq*).tail}

Dene

{({S:i{.*(<[aeiou]>).*<:L-[_aeiou]><(<![aeiou]>}=$0.lc}...*eq*).tail}

Dene

Expanded:

{  # bare block lambda with implicit parameter $_

  (
    # generate a sequence

    {  # code block used to generate the values

      S               # substitute (not in-place)
      :i              # :ignorecase
      {

          .*              # start at end of string

          ( <[aeiou]> )   # store the previous vowel in $0

          .*

          <:L - [_aeiou]> # letter other than a vowel

          <(              # ignore everything before this

                          # this is where `$0.lc` gets inserted

          # )>            # ignore everything after this

          <![aeiou]>      # not a vowel (zero width lookahead)

      } = $0.lc       # replace with lowercase of the earlier vowel
    }

    ...    # keep generating until:

    * eq * # there are two equal strings (no changes)

  ).tail   # get the last value
}

2

Python 3 , 125 bayt

lambda s,v='[^aeiouAEIOU':sub(f'(?<={v}\W\d])(?={v}]|$)',lambda m:sub(f'{v}]','',s[:m.end()])[-1:].lower(),s)
from re import*

Çevrimiçi deneyin!

Python 3.6 (ab) kullanımı için bize izin verir f-dizeleri ucuza (bir (dört daha fazla karakter ters regex karakter sınıfının başlangıcı kurtardı ve) ünlülerin bizim setini yeniden fsonra her dize üzerinde öneki, {v}yerine, gerektiği gibi '+v+'birleştirme ile ihtiyacınız olacak veya [^aeiouAEIOUkelimenin tam anlamıyla eklemek isteyeceksiniz.

Hiçbir karakterle eşleşmeyen regex, yalnızca bir konum, normal regex'lerin gerektirdiği örtüşmeyen eşleşmelerle ilgili sorunları önler ve eşleşmenin herhangi bir bölümünü geri gönderme ihtiyacını ortadan kaldırır; eşleşen nesneyi kullandığımız tek şey, önceki sesli harfleri bulmak için kullandığımız dilim dizinine ulaşmaktır.

Kısmen golf oynadı, şöyle bir şey olurdu:

import re

def get_last_vowel(string):
    '''
    Returns the lowercase version of the last vowel in a string if
    the string contains any vowels, otherwise, return the empty string
    '''
    try:
        *restvowels, lastvowel = re.sub(r'[^aeiouAEIOU]', '', string)
    except ValueError:
        lastvowel = ''  # No vowels in string
    return lastvowel.lower()

def rememebere_tehe_vowelese(string):
    '''Inserts the lowercased last vowel seen after any consonant not followed by a vowel'''
    return re.sub(r'(?<=[^aeiouAEIOU\W\d])(?=[^aeiouAEIOU]|$)',
                  lambda match: get_last_vowel(string[:match.end()]),
                  string)

2

TSQL, 500 bayt

 CREATE TABLE i (i CHAR(999)); INSERT i VALUES ('The rain in Spain stays mainly in the plain')
 DECLARE @w CHAR(999)=(SELECT i FROM i),@r VARCHAR(999)='';WITH d(n,c,i,q)AS(SELECT n,SUBSTRING(@w,n,1),CHARINDEX(SUBSTRING(@w,n,1),'AEIOUaeiou'),CHARINDEX(SUBSTRING(@w,n,1),'BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz')FROM(SELECT DISTINCT number n FROM master..[spt_values]WHERE number BETWEEN 1 AND LEN(@w))D)SELECT @r=@r+f.c+LOWER(COALESCE(CASE WHEN f.q<>0 AND COALESCE(d2.i,0)=0 THEN SUBSTRING(@w,(SELECT MAX(n)FROM d WHERE i<>0 AND n<f.n),1)END,''))FROM d f LEFT JOIN d d2 ON f.n=d2.n-1 SELECT @r

Tablo girişi için kullanılır


2
Girişin belirli bir değişkende bulunduğunu varsayarsak genellikle izin verilmez . Bunun yerine bir fonksiyon olarak uyarlanabilir mi?
Laikoni

@Laikoni çözümü verilen kurallara uyacak şekilde güncellendi
Jan Drozen

2

SWI-Prolog, 593 bayt

a(S,D):-atom_chars(S,D).
g(_,[],_,-1).
g(E,[E|_],R,R).
g(E,[_|T],I,R):-N is I+1,g(E,T,N,R).
c(A,E):-g(E,A,0,R),R > -1.
v(X):-a('AEIOUaeiou',X).
c(X):-a('BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz',X).
d([_],_,R,R).
d([H|T],_,I,R):-v(V),c(V,H),!,d(T,H,I,[H|R]).
d([H,N|T],V,I,R):-c(C),c(C,H),v(W),c(W,N),!,d([N|T],V,I,[H|R]).
d([H,N|T],V,I,R):-c(C),c(C,H),v(W),\+c(W,N),string_lower(V,LV),!,d([N|T],V,I,[LV,H|R]).
d([H|T],V,I,R):-!,d(T,V,I,[H|R]).
r([],Z,Z).
r([H|T],Z,A):-r(T,Z,[H|A]).
r(S,D):-r(S,D,[]).
m(X,R):-a(X,O),r(O,P),r([''|P],Q),d(Q,'',I,[]),r(I,J,[]),atomic_list_concat(J,R).

Yalnızca yerleşik yüklemlerde kullanılır (regex veya liste düzenleme kitaplığı olmadan).

Kullanımı:

?- m('A pnm bnn').
'A panama banana'
true .

2

Haskell , 142 130 bayt

""&
import Data.Char
v=(`elem`"aeiouAEIOU")
s&(x:y:z)|v y=x:s&(y:z)
s&(x:y)|v x=x:[toLower x]&y|isAlpha x=x:s++s&y|1>0=x:s&y
_&x=x

Çevrimiçi deneyin!

İlki ""&, (&)daha sonra tanımlanmış olan fonksiyonun kısmi bir uygulamasıdır ve TIO'nun baytları saymalarını sağlayacak şekilde garip bir şekilde yerleştirilir ""&, ancak tam bir programda bunu adlandırılmış herhangi bir değere atamak için gereken baytları saymaz.


Daha az golf oynadı:

import Data.Char (isAlpha, toLower)

vowel :: Char -> Bool
vowel = (`elem`"aeiouAEIOU")

replace :: String -> String
replace = go "" -- start by carrying no extra vowel
  where go _ "" = ""
        -- special case for "anything followed by vowel" so later cases can ignore next character
        go s (x:y:more) | vowel y = x : go s (y:more)
        go s (x:xs) | vowel x = x : go [toLower x] xs -- update the vowel we're carrying
                    | isAlpha x = x : s ++ go s xs -- non-vowel letter not followed by a vowel
                    | otherwise = x : go s xs -- some non-letter junk, just include it and carry on

Bunu özyineleme yerine bir katla daha net yapmanın bir yolu olmalı, ama çözemedim.


İşte fvücutta görünmeyen bir başlığın tanımlanmasının çok kesin bir yolu : Çevrimiçi deneyin!
Laikoni

Gereksiz iki boşluk var v = (ve gbir infix operatörü olarak tanımlayabilirsiniz .
Laikoni

Temel kasanın g _""=""son konumuna getirilmesi bir bayt kazandırır: g _ x=x(Laikoni'nin önerdiği gibi sonlandırmaya geçerseniz iki bayt).
nimi

Sözleşmelerimize göre ""&, bir işlev haline getirmek için etrafa parantez eklemeniz gerekir .
Laikoni

1

05AB1E , 34 bayt

vyžMylåil©1V}žPylåžM¹N>èå_Y&&i®«}J

Çevrimiçi deneyin!


Bunu geri alıyorum, bu canavarlığın sadece 3 baytını tıraş edebiliyorum ... Sanırım booleni tıraş edebilirim ama 3 vaka olmalı. Ünlüler için 1. Ünsüzler için 1. 1 rakam / sembol olduğu durumda.


v                                 # For each...
 y                                # Push current element.
  žM                              # Push lower-case vowels (aeiou).
    ylå                           # Lower-case current element is vowel?
       i©1V}                      # If so, put it in register, set Y to 1.
            žP                    # Push lower-case consonants (b...z)
              ylå                 # Is current char a consonant?
                 žM¹N>èå_         # Push vowels again, is input[N+1] NOT a vowel? 
                         Y        # Did we ever set Y as 1?
                          &&      # All 3 previous conditions true?
                            i®«}  # Concat the current vowel to the current char.
                                J # Join the whole stack.
                                  # '}' isn't needed here, b/c it's implied.
                                  # Implicit return.

0

Powershell, 104 bayt

Neil'in düzenli ifadesine dayanarak .

[regex]::Replace($args,'(?i)(?<=([aeiou]).*?[^\W\d_aeiou])(?![aeiou])',{"$($args.Groups[1])".ToLower()})

olarak kaydet get-rememebere.ps1. Test için komut dosyası:

$test = @"
AN EXAMPLE WITH A LOT UPPERCASE (plus some lowercase)
And here comes a **TEST** case with 10% symbols/numbers(#)!
This is an example string.
abcdefghijklmnopqrstuvwxyz
A pnm bnn
Tell me if you need more test cases!
"@

$expected = @"
ANa EXAMaPaLE WITiHi A LOTo UPuPEReCASE (pelusu some lowerecase)
Anada here comese a **TESeTe** case witihi 10% siyimiboloso/numuberese(#)!
Thisi isi ana examapale seterinigi.
abacadefegehijikiliminopoqorosotuvuwuxuyuzu
A panama banana
Telele me ifi you neede more tesete casese!
"@

$result = .\get-rememebere.ps1 $test
$result -eq $expected
$result

1
Bu sadece bir pasaj değil mi? Yani, powershell'de giriş var, bu yüzden girişin olduğunu kabul edemezsiniz $t. İlgili meta gönderim: codegolf.meta.stackexchange.com/a/8731/78123
wastl

0

Kırmızı , 276 bayt

func[s][v: charset t:"AEIOUaeiou"c: charset 
u:"BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz"b:
parse s[collect[any keep[thru c opt v]keep thru end]]p:""foreach
c b[either find t e: last c: to-string c[p: e][parse c[any[copy p v
| skip]]if find u e[append c lowercase p]]prin c]]

Çevrimiçi deneyin!

Okunabilir:

f: func [ s ] [
   v: charset t: "AEIOUaeiou"
   c: charset u: "BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz"
   b: parse s [
       collect [ any keep [ thru c opt v ]
       keep thru end ]
   ]
   p: "" 
   foreach c b [
       e: last c: to-string c
       either find t e [ p: e ][
           parse c [ any [ copy p v | skip ] ]
           if find u e [ append c lowercase p ]
       ]
       prin c
   ]
]

0

Yabasic , 180 bayt

STDIN'den giriş alan ve STDOUT'a çıkış yapan tam bir program

Line Input""s$
x$="AEIOUaeiou"
For i=1To Len(s$)
c$=Mid$(s$,i,1)
?c$;
If InStr(x$,c$)Then
v$=c$
Else
a=Asc(Upper$(c$))
If a>64And a<91And!InStr(x$,Mid$(s$,i+1,1))Then?v$;Fi
Fi
Next

Çevrimiçi deneyin!

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.