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


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.


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.


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


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!


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

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


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

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


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.


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

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
}

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)

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


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 .

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.


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.

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

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

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!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.