모음을 기억하십시오!


25

입력

인쇄 가능한 ASCII 문자의 문자열 (예 :

This is an example string.

산출

모음 ( BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz)이 뒤 따르지 않는 모든 자음 ( ) 마다 그 AEIOUaeiou앞에 마지막 모음을 소문자로 추가하십시오.
첫 번째 모음 앞의 자음은 그대로 유지됩니다 .

Thisi isi ana examapale seterinigi.

테스트 사례

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!

채점

이것이 이므로 각 언어에서 가장 낮은 바이트 수의 응답이 이깁니다 (응답은 허용되지 않음).


따라서 삽입 된 모음은 항상 소문자 여야하고 텍스트는 대문자와 소문자 여야합니까?
Outgolfer Erik

출력이 목록 / 배열의 형태 일 수 있습니까?
Nathan Dimmer 2016

@EriktheOutgolfer 네, 소문자가 필요한 대문자는 원하지 않았지만 인접한 문자를 확인해야한다면 문제가 너무 복잡했을 것입니다.
wastl

11
건강한 아이들을 먹어보십시오 A pnm bnn!
Stewie Griffin

4
다른 사람이 "어떻게 이탈리아어"제목에 어딘가에 가야한다고 생각합니까?
Artelius 2018 년

답변:


14

레티 나 , 48 바이트

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

온라인으로 사용해보십시오! 설명 : lookahead는 모음 다음에 모음이없는 지점을 검색하는 반면 lookbehind는 바로 앞 자음과 이전 모음을 검색 한 다음 소문자로 삽입합니다.


8

자바 스크립트 (ES6) 108 105 바이트

(@Shaggy 덕분에 3 바이트가 절약되었습니다.)

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

모음 또는 다음 모음이없는 자음을 검색합니다 .

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

모음은에 따라 제외되므로 자음을 명시 적으로 검색 할 필요가 없습니다 /[aeiou]|....

모음은에 저장되며 v다음 모음이없는 자음이 v삽입되었습니다.

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

( r[1]존재하는 경우 자음과 모음이 아닌 일치 항목에 일치합니다.)

아무것도 변경되지 않으면 입력을 반환합니다. 그렇지 않으면 교체 된 문자열을 반복합니다.


1
이것은 더 좋습니다. 정말 정규식을 볼 필요
루이스 펠리페 드 예수님 무 노즈

+1 스마트 아이디어는 맵을 통해 교체 + 가입
Downgoat

당신의 재귀없이 (거의) 작동하는 버전을 기반으로합니다 : s=>s.replace(/[aeiou][^a-z]*([a-z](?![aeiou]))+/gi,s=>s.replace(/(?!^)./g,a=>a+s[0].toLowerCase()))그래도 편지가 아닌 일련의 문제에는 문제가없는 것 같습니다
Downgoat

재귀는 확실히 여기서 일을 단순화합니다.
Rick Hitchcock 2016

(s+=' ')몇 바이트를 절약해야합니다.
얽히고 설킨


4

표준 ML , 225 223 바이트

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;

온라인으로 사용해보십시오!

덜 골프 :

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;

온라인으로 사용해보십시오!


와우, ML 골프는 정말 재미있어 보인다! 나는 변수 이름을 좋아 it하고 사용합니다 $.
Lynn

@Lynn 나는 얼마 전에 식별자 이름 바꾸기에 대한 팁을 썼고 그것에 대해서도 작성 하려고 계획 it했지만 아직 그렇게하지는 못했습니다.
Laikoni


4

펄 5, 68 67 59 바이트

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

다음은의 유용성에 대한 훌륭한 예입니다. \KDom Hastings가 지적하기 전에이 기능에 대해 몰랐습니다.

을 사용하여 올바른 동작을 얻을 수 없었 s///g으므로 실제 루프가 필요한 것 같습니다. (look-behind 어설 션을 올바르게 사용하면 명시 적으로 작동하지 while않을 수도 있지만 찾지 못했습니다.)


좋은 접근 방식! 더 나은 것을 얻을 수 없었지만 6 바이트를 줄였습니다. 온라인으로 사용해보십시오!
Dom Hastings

1
@DomHastings : [aeiou])변수 를 고려하여 더 짧아짐 (58 바이트 이하) : 온라인으로 사용해보십시오!
ShadowRanger 2016 년

3

자바 스크립트 ES6, 115 바이트

@ETHProductions 덕분에 8 바이트 절약

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

나는 골프를 치는 과정에서 이것을 더 팽창 시켰지만 O_o도 버그를 수정합니다.

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 촬영 완전히 최대한 빨리, 문자를 종료 고정 잊어
Downgoat

1
@RickHitchcock ok fixed
Downgoat

아, 그렇습니다 골프 @ETHproductions
Downgoat

3

자바 스크립트, 88 82 바이트

하나의 정규 표현식으로 완료하십시오.

원본 버전 (88 바이트) :

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

Neil의 정규 표현식을 본 후 업데이트 된 버전 (82 바이트) :

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

apt -P , 28 바이트

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

온라인으로 사용해보십시오!

포장 풀기 및 작동 방식

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

ó함수는 모든 종류의 정규 표현식보다 우선 합니다.


좋은 사람, 나중에 날 이겼어 : D.
Magic Octopus Urn

잘 했어-나는 이것으로 심한 두통을 겪었다!
얽히고 설킨


2

펄 6 ,  75 73 71  69 바이트

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

시도 해봐

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

시도 해봐

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

시도 해봐

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

시도 해봐

넓히는:

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

파이썬 3 , 125 바이트

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

온라인으로 사용해보십시오!

파이썬 3.6 (AB) 사용에 우리를 허용 F-문자열 싸게 (A (네 개 이상의 문자가 반전 된 정규식 문자 클래스의 시작 저장과) 모음의 우리의 세트를 재사용하는 f각 문자열에 접두사를, {v}의 대신에, 필요에 따라 '+v+'연결이 필요하거나 [^aeiouAEIOU문자 그대로 삽입 해야합니다 .

문자가없고 위치 만 일치하는 정규 표현식은 일반 정규 표현식이 필요로하는 겹치지 않는 일치 문제를 피하고 일치하는 부분을 역 참조 할 필요가 없습니다. match 객체를 사용하는 것은 이전 모음을 찾기 위해 사용하는 슬라이스 인덱스를 얻는 것입니다.

부분적으로 골프를 제거하면 다음과 같습니다.

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 바이트

 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

테이블 i입력에 사용됩니다


2
특정 변수에 입력이 있다고 가정하면 일반적으로 허용되지 않습니다 . 대신 함수로 사용할 수 있습니까?
Laikoni 2016 년

@Laikoni 솔루션은 주어진 규칙에 맞게 업데이트되었습니다
Jan Drozen

2

SWI- 프롤로그, 593 바이트

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

내장 술어 만 사용합니다 (정규식 또는 목록 조작 라이브러리 없음).

용법:

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

2

하스켈 , 142130 바이트

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

온라인으로 사용해보십시오!

이니셜 ""&(&)나중에 정의 된 함수를 부분적으로 적용한 것으로 TIO가에서 바이트를 계산하도록하기 위해 이상하게 배치 ""&되지만 전체 프로그램에서 이름을 지정한 값에 할당하는 데 필요한 바이트는 계산하지 않습니다.


덜 골프 :

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

재귀 대신 접기로 더 간결 하게이 작업을 수행 할 수있는 방법이 있어야하지만 알아낼 수 없었습니다.


f본문에 표시되지 않는 헤더를 정의하는 매우 해킹 된 방법은 다음과 같습니다 . 온라인에서 사용해보십시오!
Laikoni

두 개의 불필요한 공간이 있으며 v = (, 당신은 삽입 연산자g 로 정의 할 수 있습니다 .
Laikoni

기본 케이스 g _""=""를 마지막 위치에 g _ x=x놓으면 바이트가 저장 됩니다 (Laikoni가 제안한 것처럼 infix로 전환하면 2 바이트).
nimi

컨벤션에 따라 괄호를 추가 ""&하여 기능을 수행해야합니다.
Laikoni

1

05AB1E , 34 바이트

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

온라인으로 사용해보십시오!


나는이 괴물에서 3 바이트 만 면도 할 수 있다고 생각합니다. 부울을 줄일 수 있다고 생각하지만 3 가지 경우가 있어야합니다. 모음의 경우 1입니다. 자음의 경우 1입니다. 숫자 / 기호가 존재하는 경우 1입니다.


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

파워 쉘, 104 바이트

Neil의 정규 표현식을 기반 으로합니다 .

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

로 저장하십시오 get-rememebere.ps1. 테스트 스크립트 :

$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
이게 스 니펫 아닌가요? Powershell에 입력이 있으므로 입력이에 있다고 가정 할 수 없습니다 $t. 관련 메타 포스트 : codegolf.meta.stackexchange.com/a/8731/78123
wastl

0

빨강 , 276 바이트

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

온라인으로 사용해보십시오!

읽을 수있는 :

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 바이트

STDIN에서 입력을 받아 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

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.