Lembre-se dos vogais!

25

Entrada

Uma sequência de caracteres ASCII imprimíveis, por exemplo:

This is an example string.

Saída

Para cada consoante ( BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz) que não é seguida por uma vogal ( AEIOUaeiou), adicione a última vogal antes dela, em minúsculas.
As consoantes antes da primeira vogal são deixadas como estão :

Thisi isi ana examapale seterinigi.

Casos de teste

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!

Pontuação

Como se trata de , a resposta com a menor contagem de bytes em cada idioma vence (nenhuma resposta será aceita).

wastl
fonte
Portanto, as vogais inseridas devem sempre ser minúsculas, enquanto o texto pode estar em maiúsculas e minúsculas?
Erik the Outgolfer
A saída pode estar na forma de uma lista / matriz?
Nathan Dimmer
@EriktheOutgolfer Sim, eu não queria maiúscula onde precisamos minúsculas, mas teria demasiado complicada o desafio, se um tinha para verificar o caso de letras adjacentes
Wastl
11
Coma crianças saudáveis, tente A pnm bnn!
Stewie Griffin
4
Alguém mais acha que "Como os italianos" precisam entrar no título em algum lugar?
Artelius

Respostas:

14

Retina , 48 bytes

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

Experimente online! Explicação: O lookahead procura um ponto não seguido por uma vogal, enquanto o lookbehind procura uma consoante imediatamente anterior e uma vogal anterior, que é inserida em letras minúsculas.

Neil
fonte
8

JavaScript (ES6), 108 105 bytes

(Economizou 3 bytes graças a @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

Pesquisa vogais ou consoantes sem a seguinte vogal:

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

(Não precisamos procurar consoantes explicitamente, porque as vogais são excluídas com base no /[aeiou]|... .)

As vogais são armazenadas ve as consoantes sem a seguinte vogal foram vinseridas:

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

(Se r[1]existir, combinamos uma consoante mais uma vogal.)

Se nada foi alterado, retornamos a entrada. Caso contrário, recuaremos na string substituída.

Rick Hitchcock
fonte
1
Isto é ainda melhor. Eu realmente preciso olhar para o regex
Luis felipe De jesus Munoz
+1 idéia inteligente para usar substituir sobre o mapa + juntar
Downgoat
Baseado de vocês uma versão (quase) a trabalhar sem recursão: s=>s.replace(/[aeiou][^a-z]*([a-z](?![aeiou]))+/gi,s=>s.replace(/(?!^)./g,a=>a+s[0].toLowerCase()))Eu não posso parece ter problemas com sequências de não-cartas embora
Downgoat
A recursão certamente simplifica as coisas aqui.
Rick Hitchcock
(s+=' ')deve salvar alguns bytes.
Shaggy
5

Python 2 , 134 119 bytes

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

Experimente online!

EDIT: 15 bytes thx para Lynn

Chas Brown
fonte
Eu brinquei um pouco com isso por 119 bytes .
Lynn
@ Lynn: Ame o <vowels>.count.
quer
4

ML padrão , 225 223 bytes

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;

Experimente online!

Menos golfe:

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;

Experimente online!

Laikoni
fonte
uau, o golfe ML parece realmente interessante! Eu amo ite o uso do $nome da variável.
Lynn
@ Lynn Eu escrevi uma dica sobre renomear identificadores há algum tempo e planejava escrever uma sobre isso ittambém, mas ainda não consegui fazer isso.
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

Experimente online!

KernelPanic
fonte
Serei honesto, meu objetivo aqui é apenas tentar vencer o perl por alguns bytes. Vamos ver se contém :)
KernelPanic
4

Perl 5, 68 67 59 bytes

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

Aqui está um ótimo exemplo da utilidade de \K, e eu não posso acreditar que não sabia sobre esse recurso antes de Dom Hastings apontá-lo.

Eu não consegui obter o comportamento certo apenas usando s///g, então um loop real parece necessário. (É possível que o uso correto de uma declaração de look-behind possa funcionar sem uma explicação explícita while- mas eu não a encontrei.)

caixa de pão
fonte
Boa abordagem! Não conseguiu encontrar nada melhor, mas conseguiu obter 6 bytes de desconto: Experimente online!
Dom Hastings
1
@ DomHastings: Ainda mais curto (até 58 bytes) considerando [aeiou])a variável: Experimente on-line!
ShadowRanger
3

JavaScript ES6, 115 bytes

Economiza 8 bytes graças a @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``

Consegui inflar isso mais no processo de jogar O_o, mas também corrige um 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
fonte
@RickHitchcock oh disparar esqueci completamente sobre o término de carvão, fixando o mais cedo possível
Downgoat
1
@RickHitchcock ok fixado
Downgoat 6/06/18
Ah, sim, obrigado pelo golfe @ETHproductions
Downgoat
3

JavaScript, 88 82 bytes

Feito com uma única expressão regular:

Versão original (88 bytes):

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

Versão atualizada (82 bytes) após examinar a expressão regular de 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
fonte
3

Japonês -P , 28 bytes

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

Experimente online!

Descompactado e como funciona

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

A ófunção vence qualquer tipo de expressão regular.

Bubbler
fonte
Legal, você me venceu: D.
Magic Octopus Urn
Muito bem feito - eu me dei uma forte dor de cabeça com este!
Shaggy
2

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

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

Experimente online!

Luis felipe De jesus Munoz
fonte
2

Perl 6 ,  75 73 71  69 bytes

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

Tente

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

Tente

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

Tente

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

Tente

Expandido:

{  # 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
fonte
2

Python 3 , 125 bytes

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

Experimente online!

O Python 3.6 nos permite (ab) usar as strings f para reutilizar nosso conjunto de vogais (e por mais quatro caracteres salvos, o início de uma classe de caracteres regex invertida) mais barato (um fprefixo para cada string e, em seguida, {v}conforme necessário, em vez do '+v+'você precisaria com concatenação ou o[^aeiouAEIOU inseriria literalmente.

A regex que não corresponde a caracteres, apenas uma posição, evita problemas com as correspondências sem sobreposição exigidas pelas regexs normais e elimina a necessidade de referenciar novamente qualquer parte da correspondência; tudo o que usamos no objeto de correspondência é obter o índice de fatia que usamos para encontrar a vogal anterior.

Parcialmente de-golfe, seria algo como:

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
fonte
2

TSQL, 500 bytes

 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

A tabela ié usada para entrada

Jan Drozen
fonte
2
Presumir que a entrada esteja presente em uma determinada variável geralmente não é permitida . Isso pode ser adaptado para ser uma função?
Laikoni 7/06
Solução @Laikoni atualizado para coincidir com regras dadas
Jan Drozen
2

SWI-Prolog, 593 bytes

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

Utilizado apenas predicados internos (sem regex ou biblioteca de manipulação de listas).

Uso:

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

Haskell , 142 130 bytes

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

Experimente online!

A inicial ""&é uma aplicação parcial da (&)função definida posteriormente, e é colocada de maneira estranha para fazer o TIO contar os bytes em""& , mas não os bytes que, em um programa completo, seriam necessários para atribuir isso a qualquer valor nomeado.


Menos golfe:

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

Realmente deveria haver uma maneira de fazer isso de forma mais concisa com uma dobra em vez de recursão, mas não consegui descobrir.

amalloy
fonte
Aqui está uma maneira muito hacky de definir um cabeçalho que fnão apareça no corpo: Experimente online!
Laikoni
Existem dois espaços desnecessários v = (e você pode definir gcomo um operador de infixo .
Laikoni
Colocar o caso base g _""=""na última posição economiza um byte: g _ x=x(dois bytes se você alternar para o infixo, como sugere Laikoni).
nimi
De acordo com nossas convenções, você precisará adicionar parênteses ""&para torná-lo uma função.
Laikoni
1

05AB1E , 34 bytes

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

Experimente online!


Retiro que só consigo raspar 3 bytes dessa monstruosidade ... acho que poderia raspar o booleano, mas DEVE haver 3 casos. 1 para vogais. 1 para consoantes. 1 para o caso de existir um dígito / símbolo.


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.
Urna de polvo mágico
fonte
0

Powershell, 104 bytes

com base na expressão regular de Neil .

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

salve-o como get-rememebere.ps1. Script para teste:

$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
confuso
fonte
1
Isso não é apenas um trecho? Quero dizer, o PowerShell tem entrada, então você não pode assumir que a entrada está $t. Relevante pós meta: codegolf.meta.stackexchange.com/a/8731/78123
Wastl
0

Vermelho , 276 bytes

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

Experimente online!

Legível:

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

Yabasic , 180 bytes

Um programa completo que recebe entrada de STDIN e envia para 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

Experimente online!

Taylor Scott
fonte