Ricorda la vocale!


25

Ingresso

Una stringa di caratteri ASCII stampabili, ad esempio:

This is an example string.

Produzione

Per ogni consonante ( BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz) che non è seguita da una vocale ( AEIOUaeiou) aggiungi l'ultima vocale prima di essa, in minuscolo.
Le consonanti prima della prima vocale vengono lasciate così come sono :

Thisi isi ana examapale seterinigi.

Casi 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!

punteggio

Dato che si tratta di , vince la risposta con il numero di byte più basso in ogni lingua (nessuna risposta verrà accettata).


Quindi, le vocali inserite dovrebbero essere sempre minuscole, mentre il testo potrebbe essere sia maiuscolo che minuscolo?
Erik the Outgolfer,

L'output può essere nella forma di un elenco / array?
Nathan Dimmer,

@EriktheOutgolfer Sì, non volevo maiuscole dove abbiamo bisogno di lettere minuscole, ma avrebbe complicato la sfida se si fosse dovuto controllare il caso delle lettere adiacenti
wastl

11
Mangia bambini sani, prova A pnm bnn!
Stewie Griffin,

4
Qualcun altro pensa che "How Italians" debba andare nel titolo da qualche parte?
Artelius

Risposte:


14

Retina , 48 byte

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

Provalo online! Spiegazione: Il lookahead cerca un punto non seguito da una vocale, mentre il lookbehind cerca una consonante immediatamente precedente e una vocale precedente, che viene quindi inserita in lettere minuscole.


8

JavaScript (ES6), 108 105 byte

(Salvato 3 byte grazie 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

Cerca vocali o consonanti senza vocale seguente:

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

(Non è necessario cercare esplicitamente le consonanti, poiché le vocali sono escluse in base al /[aeiou]|....)

Le vocali sono memorizzate ve sono state vinserite consonanti senza vocale seguente :

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

(Se r[1]esiste, abbiamo abbinato una consonante più non vocale.)

Se non è stato modificato nulla, restituiamo l'input. Altrimenti, ricerchiamo la stringa sostituita.


1
Questo è ancora meglio. Ho davvero bisogno di guardare regex
Luis felipe De jesus Munoz il

+1 idea intelligente da usare sostituisci sulla mappa + unisciti
Downgoat

Basato sulla tua versione (quasi) funzionante senza ricorsione: s=>s.replace(/[aeiou][^a-z]*([a-z](?![aeiou]))+/gi,s=>s.replace(/(?!^)./g,a=>a+s[0].toLowerCase()))non riesco però ad avere problemi con sequenze di non lettere
Downgoat,

La ricorsione semplifica sicuramente le cose qui.
Rick Hitchcock,

(s+=' ')dovrebbe salvare qualche byte.
Shaggy,


4

ML standard , 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;

Provalo online!

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

Provalo online!


wow, il golf ML sembra davvero interessante! Adoro ite l'uso del $nome della variabile.
Lynn,

@Lynn Ho scritto un suggerimento sulla rinominazione dell'identificatore qualche tempo fa e ho pianificato di scriverne uno anch'io it, ma non sono ancora riuscito a farlo.
Laikoni,


4

Perl 5, 68 67 59 byte

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

Ecco un ottimo esempio dell'utilità di \K, e non posso credere di non conoscere questa funzionalità prima che Dom Hastings lo segnalasse.

Non sono stato in grado di ottenere il comportamento giusto con il solo utilizzo s///g, quindi un ciclo reale sembra necessario. (È possibile che l'uso corretto di un'asserzione look-behind possa funzionare senza un esplicito while, ma non l'ho trovato.)


Bel approccio! Non sono riuscito a trovare niente di meglio, ma sono riuscito a ottenere 6 byte di sconto: provalo online!
Dom Hastings,

1
@DomHastings: ancora più breve (fino a 58 byte) prendendo [aeiou])in considerazione la variabile: provalo online!
ShadowRanger

3

JavaScript ES6, 115 byte

Risparmia 8 byte grazie 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``

Sono riuscito a gonfiarlo di più nel processo di golf O_o ma risolve anche 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 sparare totalmente dimenticato di finire char, aggiustarsi al più presto
Downgoat

1
@RickHitchcock ok fixed
Downgoat

Ah, sì grazie per il golf @ETHproductions
Downgoat

3

JavaScript, 88 82 byte

Fatto con una singola espressione regolare:

Versione originale (88 byte):

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

Versione aggiornata (82 byte) dopo aver visto l'espressione regolare di 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 byte

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

Provalo online!

Disimballato e come funziona

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 ófunzione vince su qualsiasi tipo di regex.


Bello, mi hai battuto: D.
Magic Octopus Urn

Ben fatto - mi sono procurato un forte mal di testa con questo!
Shaggy,


2

Perl 6 ,  75 73 71  69 byte

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

Provalo

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

Provalo

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

Provalo

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

Provalo

Allargato:

{  # 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 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*

Provalo online!

Python 3.6 ci consente di (ab) usare f-string per riutilizzare il nostro set di vocali (e per altri quattro caratteri salvati, l'inizio di una classe di caratteri regex invertiti) a buon mercato (un fprefisso su ogni stringa, quindi {v}secondo necessità, invece che '+v+'avresti bisogno con la concatenazione o la [^aeiouAEIOUinseriresti letteralmente.

La regex che non corrisponde a nessun carattere, ma solo una posizione, evita problemi con le corrispondenze non sovrapposte richieste dalle normali regex e rimuove la necessità di fare riferimento a qualsiasi parte della corrispondenza; tutto ciò per cui usiamo l'oggetto match è per ottenere l'indice di slice che usiamo per trovare la vocale precedente.

Parzialmente decodificato, sarebbe qualcosa del tipo:

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

La tabella iviene utilizzata per l' input


2
Supponendo che l'input sia presente in una determinata variabile non è generalmente consentito . Può essere adattato per essere invece una funzione?
Laikoni,

La soluzione di @Laikoni è stata aggiornata per corrispondere alle regole fornite
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).

Utilizzato solo predicati incorporati (senza regex o elenco che manipola la libreria).

Uso:

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

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

Provalo online!

L'iniziale ""&è un'applicazione parziale della (&)funzione definita in seguito, ed è posizionata in modo così strano per fare in modo che TIO conteggi i byte in""& , ma non i byte che, in un programma completo, sarebbero necessari per assegnarli a qualsiasi valore denominato.


Meno 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

Dovrebbe esserci davvero un modo per farlo in modo più conciso con una piega anziché con una ricorsione, ma non sono riuscito a capirlo.


Ecco un modo molto confuso di definire un'intestazione tale da fnon apparire nel corpo: provalo online!
Laikoni,

Ci sono due spazi non necessari in v = (e puoi definire gcome operatore infix .
Laikoni,

Mettendo il caso base g _""=""nell'ultima posizione si salva un byte: g _ x=x(due byte se si passa all'infisso come suggerisce Laikoni).
nimi,

Secondo le nostre convenzioni dovresti aggiungere parentesi ""&per renderla una funzione.
Laikoni,

1

05AB1E , 34 byte

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

Provalo online!


Riprendo che posso solo radere 3 byte da questa mostruosità ... Penso che potrei radere il booleano, ma DEVONO esserci 3 casi. 1 per vocali. 1 per consonanti. 1 nel caso in cui esista una cifra / simbolo.


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 byte

basato sull'espressione regolare di Neil .

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

salvalo come get-rememebere.ps1. Script per test:

$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
Non è solo uno snippet? Voglio dire, PowerShell ha input, quindi non puoi supporre che l'input sia presente $t. Meta post pertinente: codegolf.meta.stackexchange.com/a/8731/78123
wastl

0

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

Provalo online!

Leggibile:

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 byte

Un programma completo che accetta input da STDIN e invia 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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.