Rememebere tehe vese!

25

Memasukkan

Sederetan karakter ASCII yang dapat dicetak, misalnya:

This is an example string.

Keluaran

Untuk setiap konsonan ( BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz) yang tidak diikuti oleh vokal ( AEIOUaeiou) tambahkan vokal terakhir sebelum itu, dalam huruf kecil.
Konsonan sebelum vokal pertama dibiarkan apa adanya :

Thisi isi ana examapale seterinigi.

Uji kasus

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!

Mencetak gol

Karena ini adalah , jawaban dengan byte-count terendah di setiap bahasa menang (tidak ada jawaban yang diterima).

wastl
sumber
Jadi, haruskah vokal yang dimasukkan selalu huruf kecil, sedangkan teksnya mungkin huruf besar dan kecil?
Erik the Outgolfer
Bisakah output dalam bentuk daftar / array?
Nathan Dimmer
@EriktheOutgolfer Ya, saya tidak ingin huruf besar di mana kita perlu huruf kecil, tapi itu akan terlalu rumit tantangannya jika kita harus memeriksa kasus surat yang berdekatan
wastl
11
Makanlah anak-anak yang sehat, cobalah A pnm bnn!
Stewie Griffin
4
Apakah ada orang lain yang berpikir "Bagaimana orang Italia" perlu masuk dalam suatu judul?
Artelius

Jawaban:

14

Retina , 48 byte

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

Cobalah online! Penjelasan: Lookahead mencari titik yang tidak diikuti oleh vokal, sedangkan lookbehind mencari konsonan yang sebelumnya mendahului dan vokal sebelumnya, yang kemudian dimasukkan dalam huruf kecil.

Neil
sumber
8

JavaScript (ES6), 108 105 byte

(Disimpan 3 byte berkat @Shaggy.)

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

Mencari vokal atau konsonan tanpa vokal berikut:

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

(Kami tidak perlu mencari konsonan secara eksplisit, karena vokal dikecualikan berdasarkan /[aeiou]|....)

Vokal disimpan v, dan konsonan tanpa vokal berikut telah vdimasukkan:

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

(Jika r[1]ada, kami telah mencocokkan dengan konsonan plus non-vokal.)

Jika tidak ada yang berubah, kami mengembalikan input. Kalau tidak, kita kambuh pada string yang diganti.

Rick Hitchcock
sumber
1
Ini bahkan lebih baik. Saya benar-benar perlu melihat regex
Luis felipe De jesus Munoz
+1 ide cerdas untuk digunakan ganti peta + bergabung
Downgoat
Berdasarkan versi Anda (hampir) yang berfungsi tanpa rekursi: s=>s.replace(/[aeiou][^a-z]*([a-z](?![aeiou]))+/gi,s=>s.replace(/(?!^)./g,a=>a+s[0].toLowerCase()))Sepertinya saya tidak dapat memiliki masalah dengan urutan non-huruf
Downgoat
Rekursi tentu menyederhanakan hal-hal di sini.
Rick Hitchcock
(s+=' ')harus menyimpan beberapa byte.
Shaggy
5

Python 2 , 134 119 byte

def f(s,v=''):u=s[:1];return s and u+v*(u.isalpha()-g(u)-g((s+u)[1]))+f(s[1:],[v,u.lower()][g(u)])
g='aeiouAEIOU'.count

Cobalah online!

EDIT: 15 byte thx ke Lynn

Chas Brown
sumber
Saya mengutak-atiknya sedikit untuk 119 byte .
Lynn
@ Lynn: Cinta itu <vowels>.count.
Chas Brown
4

Standar ML , 225 223 byte

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;

Cobalah online!

Kurang bermain golf:

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;

Cobalah online!

Laikoni
sumber
wah, golf ML terlihat sangat menarik! Saya suka itdan penggunaan $nama variabel.
Lynn
@Lynn Saya menulis tip tentang pengidentifikasian pengubahan nama beberapa waktu yang lalu dan berencana untuk menulis itjuga, tetapi belum sempat melakukannya.
Laikoni
4

sed 4.2.2 , 64 bytes

:
s/(([aeiou])[^a-z]*[b-df-hj-np-tv-z])([^aeiou]|$)/\1\l\2\3/I
t

Cobalah online!

KernelPanic
sumber
Saya akan jujur, tujuan saya di sini hanya untuk mencoba mengalahkan perl dengan beberapa byte. Mari kita lihat apakah ini berlaku :)
KernelPanic
4

Perl 5, 68 67 59 byte

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

Ini adalah contoh yang bagus tentang kegunaan dari \K, dan saya tidak percaya saya tidak tahu tentang fitur ini sebelum Dom Hastings menunjukkannya.

Saya belum bisa mendapatkan perilaku yang benar hanya dengan menggunakan s///g, jadi loop yang sebenarnya tampaknya perlu. (Mungkin saja bahwa penggunaan pernyataan balik yang tepat dapat bekerja tanpa eksplisit while- tetapi saya belum menemukannya.)

kotak roti
sumber
Pendekatan yang bagus! Tidak dapat menghasilkan sesuatu yang lebih baik, tetapi berhasil mendapatkan 6 byte: Cobalah secara online!
Dom Hastings
1
@DomHastings: Bahkan lebih pendek (hingga 58 byte) dengan memasukkan[aeiou]) faktor ke variabel: Cobalah online!
ShadowRanger
3

JavaScript ES6, 115 byte

Menghemat 8 byte berkat @ETHProductions

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``

Saya telah berhasil mengembang ini lebih dalam proses golf itu O_o tetapi juga memperbaiki bug

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
Downgoat
sumber
@RickHitchcock oh menembak benar-benar lupa tentang mengakhiri char, memperbaiki secepatnya
Downgoat
1
@RickHitchcock ok diperbaiki
Downgoat
Ah, ya, terima kasih untuk produk golf @ETHproducts
Downgoat
3

JavaScript, 88 82 Bytes

Selesai dengan satu ekspresi reguler:

Versi Asli (88 Bytes):

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

Versi Diperbarui (82 Bytes) setelah melihat ekspresi reguler Neil :

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

MT0
sumber
3

Japt -P , 28 byte

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

Cobalah online!

Dibongkar & Cara kerjanya

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

The óFungsi menang atas segala jenis regexes.

Bubbler
sumber
Bagus sekali, kalahkan aku: D.
Guci Gurita Ajaib
Bagus sekali - saya membuat diri saya sakit otak parah dengan yang satu ini!
Shaggy
2

JavaScript (Node.js) , 146 143 132 127 125 byte

(a,v="")=>[...a].map((b,i)=>(w=/[aeiou]/i).test(b)&&(v=b)?b:w.test(a[i+1]||b)||!b.match(/[a-z]/i)?b:b+v.toLowerCase()).join``

Cobalah online!

Luis felipe De jesus Munoz
sumber
2

Perl 6 ,  75 73 71  69 byte

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

Cobalah

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

Cobalah

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

Cobalah

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

Cobalah

Diperluas:

{  # 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
}
Brad Gilbert b2gills
sumber
2

Python 3 , 125 byte

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

Cobalah online!

Python 3.6 memungkinkan kita untuk (ab) menggunakan f-string untuk menggunakan kembali set vokal kita (dan untuk empat karakter yang disimpan, awal kelas karakter regex terbalik) dengan murah ( fawalan pada setiap string, kemudian {v}sesuai kebutuhan, alih-alih '+v+'Anda akan perlu dengan penggabungan, atau [^aeiouAEIOUAnda akan menyisipkan secara harfiah.

Regex yang tidak cocok dengan karakter, hanya posisi, menghindari masalah dengan pertandingan non-tumpang tindih yang dibutuhkan regex normal, dan menghilangkan kebutuhan untuk mereferensi setiap bagian dari pertandingan; semua yang kita gunakan objek pencocokan adalah untuk mendapatkan indeks slice yang kita gunakan untuk menemukan vokal sebelumnya.

Sebagian de-golf, itu akan menjadi seperti:

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)
ShadowRanger
sumber
2

TSQL, 500 byte

 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

Tabel idigunakan untuk input

Jan Drozen
sumber
2
Mengasumsikan input yang ada pada variabel tertentu umumnya tidak diperbolehkan . Bisakah ini diadaptasi menjadi fungsi saja?
Laikoni
Solusi @Laikoni diperbarui agar sesuai dengan aturan yang diberikan
Jan Drozen
2

SWI-Prolog, 593 byte

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

Hanya digunakan predikat bawaan (tanpa regex atau pustaka manipulasi daftar).

Pemakaian:

?- m('A pnm bnn').
'A panama banana'
true .
Jan Drozen
sumber
2

Haskell , 142 130 byte

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

Cobalah online!

Inisial ""&adalah aplikasi parsial dari (&)fungsi yang didefinisikan kemudian, dan ditempatkan sangat aneh untuk membuat TIO menghitung byte ""&, tetapi tidak menghitung byte yang, dalam program penuh, akan diperlukan untuk menetapkannya ke nilai apa pun yang disebutkan.


Kurang bermain golf:

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

Seharusnya ada cara untuk melakukan ini lebih ringkas dengan lipatan alih-alih rekursi, tetapi saya tidak bisa mengetahuinya.

amalloy
sumber
Berikut ini cara mendefinisikan header yang sangat ftidak menarik di tubuh: Cobalah secara online!
Laikoni
Ada dua ruang yang tidak perlu di v = (dan Anda dapat mendefinisikan gsebagai operator infiks .
Laikoni
Menempatkan kasing g _""=""pada posisi terakhir menghemat satu byte: g _ x=x(dua byte jika Anda beralih ke infiks seperti yang disarankan Laikoni).
nimi
Sesuai konvensi kami, Anda perlu menambahkan tanda kurung di sekitar ""&untuk membuatnya berfungsi.
Laikoni
1

05AB1E , 34 byte

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

Cobalah online!


Saya mengambil kembali, saya hanya bisa mencukur 3 byte dari keburukan ini ... Saya pikir saya bisa mencukur boolean, tetapi harus ada 3 kasing. 1 untuk vokal. 1 untuk konsonan. 1 untuk huruf digit / simbol ada.


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.
Guci Gurita Ajaib
sumber
0

Powershell, 104 byte

berdasarkan ekspresi reguler Neil .

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

simpan sebagai get-rememebere.ps1. Script untuk pengujian:

$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
mazzy
sumber
1
Bukankah ini hanya cuplikan? Maksud saya, PowerShell memiliki input, jadi Anda tidak bisa menganggap input masuk $t. Posting meta yang relevan: codegolf.meta.stackexchange.com/a/8731/78123
wastl
0

Merah , 276 byte

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

Cobalah online!

Dapat dibaca:

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
   ]
]
Galen Ivanov
sumber
0

Yabasic , 180 byte

Program lengkap yang mengambil input dari STDIN dan output ke STDOUT

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

Cobalah online!

Taylor Scott
sumber