¡Recuerda el voto!


25

Entrada

Una cadena de caracteres ASCII imprimibles, por ejemplo:

This is an example string.

Salida

Para cada consonante ( BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz) que no sea seguida por una vocal ( AEIOUaeiou), agregue la última vocal anterior, en minúsculas.
Las consonantes antes de la primera vocal se dejan como están :

Thisi isi ana examapale seterinigi.

Casos de prueba

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!

Tanteo

Como se trata de , la respuesta con el recuento de bytes más bajo en cada idioma gana (no se aceptará ninguna respuesta).


Entonces, ¿las vocales insertadas deben estar siempre en minúsculas, mientras que el texto puede estar en mayúsculas y minúsculas?
Erik the Outgolfer

¿La salida puede tener la forma de una lista / matriz?
Nathan Dimmer

@EriktheOutgolfer Sí, no quería mayúsculas donde necesitamos minúsculas, pero habría complicado demasiado el desafío si hubiera que verificar el caso de las letras adyacentes
era el

11
¡Come niños sanos, inténtalo A pnm bnn!
Stewie Griffin

44
¿Alguien más piensa que "Cómo los italianos" deben ir en algún lugar del título?
Artelius

Respuestas:


14

Retina , 48 bytes

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

Pruébalo en línea! Explicación: la búsqueda anticipada busca un punto no seguido de una vocal, mientras que la búsqueda posterior busca una consonante inmediatamente anterior y una vocal anterior, que luego se inserta en minúsculas.


8

JavaScript (ES6), 108105 bytes

(Guardado 3 bytes gracias 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

Busca vocales o consonantes sin vocal siguiente:

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

(No necesitamos buscar consonantes explícitamente, porque las vocales se excluyen en función del /[aeiou]|....)

Las vocales se almacenan vy se han vinsertado consonantes sin vocal siguiente :

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

(Si r[1]existe, hemos encontrado una consonante más no vocal).

Si no se ha cambiado nada, devolvemos la entrada. De lo contrario, recurrimos en la cadena reemplazada.


1
Esto es aun mejor. Realmente necesito mirar regex
Luis felipe De jesus Munoz

+1 idea inteligente para usar reemplazar sobre mapa + unirse
Downgoat

Basado en la suya, una versión (casi) funcional sin recursividad: s=>s.replace(/[aeiou][^a-z]*([a-z](?![aeiou]))+/gi,s=>s.replace(/(?!^)./g,a=>a+s[0].toLowerCase()))aunque parece que no puedo tener problemas con las secuencias de no letras
Downgoat

La recursión ciertamente simplifica las cosas aquí.
Rick Hitchcock

(s+=' ')debería guardar algunos bytes.
Shaggy


4

ML estándar , 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;

Pruébalo en línea!

Menos golfizado:

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;

Pruébalo en línea!


wow, ML golf se ve muy interesante! Me encanta ity el uso del $nombre de la variable.
Lynn

@Lynn Escribí un consejo sobre el cambio de nombre del identificador hace algún tiempo y planeé escribir uno ittambién, pero aún no he podido hacerlo.
Laikoni


4

Perl 5, 68 67 59 bytes

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

Aquí hay un gran ejemplo de la utilidad de \K, y no puedo creer que no supiera sobre esta característica antes de que Dom Hastings lo señalara.

No he podido obtener el comportamiento correcto con solo usarlo s///g, por lo que parece necesario un bucle real. (Es posible que el uso correcto de una afirmación retrospectiva funcione sin un explícito while, pero no lo he encontrado).


Buen enfoque! No pude encontrar nada mejor, pero logré obtener 6 bytes de descuento: ¡ Pruébelo en línea!
Dom Hastings

1
@DomHastings: incluso más corto (hasta 58 bytes) factorizando [aeiou])a variable: ¡ Pruébelo en línea!
ShadowRanger

3

JavaScript ES6, 115 bytes

Ahorra 8 bytes gracias 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``

He logrado inflar esto más en el proceso de jugar golf O_o pero también soluciona un error

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 disparar, se olvidó por completo de terminar char, arreglar lo antes posible
Downgoat

1
@RickHitchcock está bien arreglado
Downgoat

Ah, sí, gracias por el golf @ETHproductions
Downgoat

3

JavaScript, 88 82 bytes

Hecho con una sola expresión regular:

Versión original (88 bytes):

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

Versión actualizada (82 bytes) después de mirar la expresión 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 );
}


3

Japt -P , 28 bytes

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

Pruébalo en línea!

Desempaquetado y cómo 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 ""

La ófunción gana sobre cualquier tipo de expresiones regulares.


Buena, ya me ganaste: D.
Urna de pulpo mágico

Bien hecho, ¡me di un brainache severo con este!
Shaggy


2

Perl 6 ,  75 73 71  69 bytes

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

Intentalo

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

Intentalo

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

Intentalo

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

Intentalo

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
}

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*

Pruébalo en línea!

Python 3.6 nos permite (ab) usar cadenas f para reutilizar nuestro conjunto de vocales (y para cuatro caracteres más guardados, el comienzo de una clase de caracteres regex invertida) a bajo costo (un fprefijo en cada cadena, luego {v}según sea necesario, en lugar del'+v+' necesitarías con concatenación, o la [^aeiouAEIOUinsertarías literalmente.

La expresión regular que no coincide con ningún carácter, solo una posición, evita problemas con las coincidencias no superpuestas que requieren las expresiones regulares, y elimina la necesidad de hacer referencia a cualquier parte de la coincidencia; todo lo que usamos para el objeto de coincidencia es obtener el índice de corte que usamos para encontrar la vocal anterior.

Parcialmente fuera de golf, sería algo así 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)

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

La tabla ise usa para entrada


2
Asumir que la entrada esté presente en una determinada variable generalmente no está permitida . ¿Se puede adaptar esto para que sea una función?
Laikoni

Solución @Laikoni actualizada para que coincida con las reglas 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).

Solo se usaron predicados integrados (sin expresiones regulares ni biblioteca de manipulación de listas).

Uso:

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

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

Pruébalo en línea!

La inicial ""&es una aplicación parcial de la (&)función definida más adelante, y se coloca de manera extraña para que TIO cuente los bytes ""&, pero no cuente los bytes que, en un programa completo, serían necesarios para asignar eso a cualquier valor con nombre.


Menos golfizado:

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 debería haber una manera de hacer esto de manera más concisa con un pliegue en lugar de recurrencia, pero no pude resolverlo.


Aquí hay una manera muy hacky de definir un encabezado tal que fno aparezca en el cuerpo: ¡ Pruébelo en línea!
Laikoni

Hay dos espacios innecesarios en v = (y puede definir gcomo un operador infijo .
Laikoni

Poner el caso base g _""=""en la última posición guarda un byte: g _ x=x(dos bytes si cambia a infijo como sugiere Laikoni).
nimi

Según nuestras convenciones, necesitaría agregar paréntesis ""&para que sea una función.
Laikoni

1

05AB1E , 34 bytes

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

Pruébalo en línea!


Retiro eso. Solo puedo eliminar 3 bytes de esta monstruosidad ... Creo que podría reducir el valor booleano, pero DEBE haber 3 casos. 1 para vocales. 1 para consonantes. 1 para el caso de que exista un 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.

0

Powershell, 104 bytes

basado en la expresión regular de Neil .

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

guárdelo como get-rememebere.ps1. Guión para probar:

$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
¿No es esto solo un fragmento? Quiero decir, PowerShell tiene entrada, por lo que no puedes asumir que la entrada está adentro $t. Meta publicación relevante: codegolf.meta.stackexchange.com/a/8731/78123
wastl

0

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

Pruébalo en línea!

Legible:

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 bytes

Un programa completo que toma entradas de STDIN y salidas a 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

Pruébalo en línea!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.