Remémorez les voyelles!

25

Contribution

Une chaîne de caractères ASCII imprimables, par exemple:

This is an example string.

Sortie

Pour chaque consonne ( BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz) qui n'est pas suivie d'une voyelle ( AEIOUaeiou), ajoutez la dernière voyelle avant, en minuscules.
Les consonnes avant la première voyelle sont laissées telles quelles :

Thisi isi ana examapale seterinigi.

Cas de test

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!

Notation

Comme il s'agit de , la réponse avec le nombre d'octets le plus bas dans chaque langue l' emporte (aucune réponse ne sera acceptée).

wastl
la source
Ainsi, les voyelles insérées doivent-elles toujours être en minuscules, alors que le texte peut être à la fois en majuscules et en minuscules?
Erik the Outgolfer
La sortie peut-elle être sous forme de liste / tableau?
Nathan Dimmer
@EriktheOutgolfer Oui, je ne voulais pas de majuscules là où nous avons besoin de minuscules, mais cela aurait compliqué le défi s'il fallait vérifier la casse des lettres adjacentes
wastl
11
Mangez des enfants en bonne santé, essayez A pnm bnn!
Stewie Griffin
4
Est-ce que quelqu'un d'autre pense que "Comment les Italiens" doivent aller quelque part dans le titre?
Artelius

Réponses:

14

Rétine , 48 octets

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

Essayez-le en ligne! Explication: l'antichambre recherche un point non suivi par une voyelle, tandis que l'antenne recherche une consonne immédiatement précédente et une voyelle précédente, qui est ensuite insérée en minuscules.

Neil
la source
8

JavaScript (ES6), 108 105 octets

(Enregistré 3 octets grâce à @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

Recherche des voyelles ou des consonnes sans voyelle suivante:

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

(Nous n'avons pas besoin de rechercher explicitement les consonnes, car les voyelles sont exclues en fonction du /[aeiou]|....)

Les voyelles sont stockées dans v, et les consonnes sans voyelle suivante ont été vinsérées:

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

(S'il r[1]existe, nous avons apparié une consonne plus une non-voyelle.)

Si rien n'a été changé, nous renvoyons l'entrée. Sinon, nous récursions sur la chaîne remplacée.

Rick Hitchcock
la source
1
C'est encore mieux. J'ai vraiment besoin de regarder regex
Luis felipe De jesus Munoz
+1 idée intelligente à utiliser remplacer sur la carte + rejoindre
Downgoat
Basé sur le vôtre, une version (presque) fonctionnelle sans récursivité: s=>s.replace(/[aeiou][^a-z]*([a-z](?![aeiou]))+/gi,s=>s.replace(/(?!^)./g,a=>a+s[0].toLowerCase()))je ne peux pas avoir de problèmes avec les séquences de non-lettres
Downgoat
La récursivité simplifie certainement les choses ici.
Rick Hitchcock
(s+=' ')devrait économiser quelques octets.
Shaggy
5

Python 2 , 134 119 octets

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

Essayez-le en ligne!

EDIT: 15 octets thx à Lynn

Chas Brown
la source
Je l'ai tripoté un peu pendant 119 octets .
Lynn
@Lynn: J'adore le <vowels>.count.
Chas Brown
4

ML standard , 225 223 octets

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;

Essayez-le en ligne!

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

Essayez-le en ligne!

Laikoni
la source
wow, ML golf a l'air vraiment intéressant! J'adore itet l'utilisation du $nom de variable.
Lynn
@Lynn J'ai écrit un conseil sur le changement de nom de l'identifiant il y a quelque temps et je prévoyais d'en écrire un itégalement, mais je n'ai pas encore réussi à le faire.
Laikoni
4

sed 4.2.2 , 64 octets

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

Essayez-le en ligne!

KernelPanic
la source
Je vais être honnête, mon objectif ici est juste d'essayer de battre perl de quelques octets. Voyons voir si ça tient :)
KernelPanic
4

Perl 5, 68 67 59 octets

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

Voici un excellent exemple de l'utilité de \K, et je ne peux pas croire que je ne connaissais pas cette fonctionnalité avant que Dom Hastings ne le souligne.

Je n'ai pas pu obtenir le bon comportement en utilisant simplement s///g, donc une boucle réelle semble nécessaire. (Il est possible que la bonne utilisation d'une assertion de derrière puisse fonctionner sans explicite while- mais je ne l'ai pas trouvée.)

boite à pain
la source
Belle approche! Je n'ai pas pu trouver mieux, mais j'ai réussi à obtenir 6 octets de réduction: essayez-le en ligne!
Dom Hastings
1
@DomHastings: encore plus court (jusqu'à 58 octets) en prenant en compte la [aeiou])variable: essayez-le en ligne!
ShadowRanger
3

JavaScript ES6, 115 octets

Économise 8 octets grâce à @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``

J'ai réussi à le gonfler davantage dans le processus de golf O_o mais cela corrige également un 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
la source
@RickHitchcock oh shoot a totalement oublié de mettre fin à char, fixant dès que possible
Downgoat
1
@RickHitchcock ok fixed
Downgoat
Ah, oui merci pour le golf @ETHproductions
Downgoat
3

JavaScript, 88 82 octets

Fait avec une seule expression régulière:

Version originale (88 octets):

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

Version mise à jour (82 octets) après avoir regardé l'expression régulière 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
la source
3

Japt -P , 28 octets

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

Essayez-le en ligne!

Déballé et comment cela fonctionne

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 ófonction gagne sur tout type de regex.

Bubbler
la source
Joli, tu me bats: D.
Urne de poulpe magique du
Bien fait - je me suis donné un mal de cerveau sévère avec celui-ci!
Shaggy
2

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

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

Essayez-le en ligne!

Luis felipe De jesus Munoz
la source
2

Perl 6 ,  75 73 71  69 octets

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

Essayez-le

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

Essayez-le

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

Essayez-le

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

Essayez-le

Étendu:

{  # 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
la source
2

Python 3 , 125 octets

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

Essayez-le en ligne!

Python 3.6 nous permet (ab) d'utiliser des chaînes f pour réutiliser notre ensemble de voyelles (et pour quatre autres caractères enregistrés, le début d'une classe de caractères regex inversés) à moindre coût (un fpréfixe sur chaque chaîne, puis {v}au besoin, au lieu de la '+v+'vous auriez besoin avec concaténation, ou l' [^aeiouAEIOUinsérer littéralement.

Le regex qui ne correspond à aucun caractère, juste une position, évite les problèmes avec les correspondances qui ne se chevauchent pas, les regex habituels et supprime la nécessité de faire référence à n'importe quelle partie de la correspondance; tout ce que nous utilisons pour l'objet de correspondance est d'obtenir l'index de tranche que nous utilisons pour trouver la voyelle précédente.

Partiellement dé-golfé, ce serait quelque chose comme:

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
la source
2

TSQL, 500 octets

 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 table iest utilisée pour l' entrée

Jan Drozen
la source
2
En supposant que l'entrée soit présente dans une certaine variable n'est généralement pas autorisée . Peut-il être adapté pour être une fonction à la place?
Laikoni
La solution @Laikoni mise à jour pour correspondre aux règles données
Jan Drozen
2

SWI-Prolog, 593 octets

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

Utilisé uniquement des prédicats intégrés (sans regex ni bibliothèque de manipulation de liste).

Usage:

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

Haskell , 142 130 octets

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

Essayez-le en ligne!

L'initiale ""&est une application partielle de la (&)fonction définie plus tard, et est placée de manière si étrange pour que TIO compte les octets dans ""&, mais ne compte pas les octets qui, dans un programme complet, seraient nécessaires pour affecter cela à n'importe quelle valeur nommée.


Moins 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

Il devrait vraiment y avoir un moyen de le faire de manière plus concise avec un pli au lieu de la récursivité, mais je ne pouvais pas le comprendre.

amalloy
la source
Voici une façon très hacky de définir un en-tête tel qu'il fn'apparaisse pas dans le corps: Essayez-le en ligne!
Laikoni
Il y a deux espaces inutiles v = (et vous pouvez définir gun opérateur d'infixe .
Laikoni
Mettre le cas de base g _""=""en dernière position enregistre un octet: g _ x=x(deux octets si vous passez en infixe comme le suggère Laikoni).
nimi
Selon nos conventions, vous devez ajouter des parenthèses ""&pour en faire une fonction.
Laikoni
1

05AB1E , 34 octets

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

Essayez-le en ligne!


Je reprends cela, je ne peux que raser 3 octets de cette monstruosité ... Je pense que je pourrais raser le booléen, mais il DOIT y avoir 3 cas. 1 pour les voyelles. 1 pour les consonnes. 1 pour le cas où un chiffre / symbole existe.


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.
Urne de poulpe magique
la source
0

Powershell, 104 octets

basé sur l'expression régulière de Neil .

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

enregistrez-le sous get-rememebere.ps1. Script pour tester:

$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
la source
1
N'est-ce pas seulement un extrait? Je veux dire, PowerShell a une entrée, vous ne pouvez donc pas supposer que l'entrée est en $t. Meta
wastl
0

Rouge , 276 octets

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

Essayez-le en ligne!

Lisible:

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
la source
0

Yabasic , 180 octets

Un programme complet qui prend les entrées de STDIN et les sorties vers 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

Essayez-le en ligne!

Taylor Scott
la source