문자열을 해당 Rövarspråket로 변환


15

로 바르스 프라우 켓

Rövarspråket 은 Astrid Lindgren의 Kalle Blomkvist에 관한 책에서 스웨덴 어린이들이 한 단어 게임입니다.

기본 규칙은 다음과 같습니다 (Wikipedia).

  • 모든 자음 (발음이 아닌 철자 문제)이 두 배가되고 그 사이에 o가 삽입됩니다.
  • 모음은 그대로 남아 있습니다.

몇 가지 예 :

  • "hello"-> "hohelollolo"
  • "Min svävare är full med ål"-> "MoMinon sosvovävovarore 및 fofulollol momedod ålol"

스웨덴어 자음은 영어와 동일하므로 스웨덴어 및 영어 항목 모두에서 작동합니다.

이 경우 문자 "y"는 대부분의 경우 자음으로 간주됩니다.


당신의 작업 :

함수 또는 stdin을 통해 입력 된 스웨덴어 문자열을 Rövarspråket로 변환하는 프로그램을 작성하십시오. 바이트 단위의 최단 답변이 승리합니다!


@ MartinBüttner 내 질문을 더 명확히했습니다-스웨덴어와 함께 작동해야합니다 (스웨덴어 단어 게임이므로).
James Williams

알파벳순의 의미는 무엇입니까?
Optimizer

@Optimizer 알파벳 문자로만 구성된 문자열입니다. 죄송합니다, 심하게 말 했어요, 편집하겠습니다
James Williams

3
우리는 문자가 아닌 것을 어떻게 취급해야합니까? 두 번째 예에서는 최소한 공백이 표시됩니다.
nimi

2
참고로 : 'Y'는 스웨덴어 모음으로 간주됩니다
leo

답변:


14

망막 , 14 + 5 = 19 바이트

Retina는 기본적으로 가능한 한 적은 오버 헤드로 .NET 정규식 언어입니다. 이 프로그램의 코드는 두 개의 파일로 구성됩니다.

i`[b-z-[eiou]]
$0o$0

STDIN의 입력을 읽고 출력을 STDOUT에 인쇄합니다.

당신이 파일을 호출하는 경우 pattern.rgxreplacement.rpl, 프로그램 단지 등을 실행할 수 있습니다

echo "hello" | ./Retina pattern.rgx replacement.rpl

설명

이것은 매우 간단하지만 어쨌든 (주로 Retina의 작동 방식에 대한) 설명을 추가하겠습니다. Retina가 2 개의 파일로 호출 된 경우 첫 번째 파일은 정규식이고 두 번째 파일은 패턴 인 "대체 모드"에서 자동으로 작동하는 것으로 간주됩니다.

RegexOptions정규식과 `구성 문자열 을 앞에 추가하여 Retina를 구성 할 수 있습니다 ( 및 기타 옵션 포함) . 이 경우 i에는 대소 문자를 구분하지 않는 정규 정규식 수정 자 만 제공합니다 .

정규 표현식 자체는 .NET의 문자 클래스 빼기를 사용하여 ASCII 범위의 자음과 일치시킵니다. 그런 다음 교체 o는 중간에 사이에 있는 일치 항목을 두 번 다시 씁니다 .


당신은 누락 a당신의 모음 문자 클래스를?
Brian Gordon

3
@BrianGordon 아니요,에서 캐릭터 클래스를 시작하고 b있기 때문에 빼지 않아도됩니다 a.
Martin Ender

2
흥미롭게도, 전에는 중첩 된 빼기 문자 범위를 본 적이 없습니다. 그것은 단지 .NET 것입니까?
Steve Bennett

두 파일 사이의 구분을 위해 하나 이상의 문자를 계산해야한다고 생각합니다. 그것은 다른 언어의 세미콜론이나 줄 바꿈 일 것입니다. 이 언어에서 캐릭터가 어디에서 왔는지 까다롭게하려면 파일 이름 사이의 공백입니다.
Sparr

@Sparr 예, 지금은 정책이지만 해당 정책은이 과제 / 답변보다 최신입니다. 참고로 (실제로 타임 스탬프를 살펴보면 이 답변으로 인해 정책을 추진 했지만 사이트 전체에 이와 같은 규칙을 적용하는 것은 의미가 없습니다.)
Martin Ender

12

유닉스 KSH 사용 27 28 32 27 바이트 (또는 sed 명령으로 만 계산한다면 21)

다른 사람들의 제안에 감사합니다 :) 감사합니다.

.. 나는 이것에 도착했다 :

sed 's/[^AEIOUÅÄÖ ]/&o&/ig'

(공백 및 스웨덴어 문자에 허용됨)

echo "hello" | sed 's/[BCDFGHJ-NP-TV-Z]/&o&/ig'
hohelollolo
echo "HELLO" | sed 's/[BCDFGHJ-NP-TV-Z]/&o&/ig'
HoHELoLLoLO
echo "QuIcKlY Now" | sed 's/[BCDFGHJ-NP-TV-Z]/&o&/ig'
QoQuIcocKoKlolYoY NoNowow

4
또한 귀하의 답변이 sed프로그램 이라고 주장하는 것이 가능하며 작은 따옴표 사이의 바이트
Digital Trauma

1
s/[^AEIOU]/&o&/ig작동하는 것 같습니다. 적어도 한 마디로 ... 공백도 제외해야합니다.
Digital Trauma

1
bash는 중요하지 않지만 sed 프로그램이 작은 따옴표 안에있는 한
Digital Trauma

1
또한 스웨덴 모음에 대한 조심 ö, å등 -이 필요도 제외. 자음의 화이트리스트를 사용하는 것이 좋습니다.s/[BCDFGHJ-NP-TV-Z]/&o&/ig
Digital Trauma

2
나는 그것을 'sed'로 만들고 "s / [^ AEIOUÅÄÖ] / & o & / ig"를 사용하는데, 스웨덴어 모음과 공백은 25 바이트입니다.
swstephe

7

CJam, 32 30 바이트

q{_eu'[,66>"EIOU"-#)g{'o1$}*}/

STDIN에서 읽고 STDOUT으로 인쇄하는 전체 프로그램입니다. 임의의 유니 코드 입력에 작동하며 다음 42자를 자음으로 처리합니다.

BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz

여기에서 테스트하십시오.

설명

q                              "Slurp STDIN.";
 {                          }/ "For each character...";
  _eu                          "Duplicate and convert to upper case.";
     '[,66>                    "Get a string from B to Z using range and slice.";
           "EIOU"-             "Remove the remaining four vowels.";
                  #            "Find the position of the character in this string or
                                -1 if the character can't be found.";
                   )g          "Increment, take signum, which gives 1 for consonants, 
                                and 0 otherwise.";
                     {    }*   "Repeat this block that many times, i.e. do nothing for
                                non-consonants.";
                      'o       "Push an 'o'.";
                        1$     "Copy the current character.";

5

자바 스크립트, 59 57 55 44 바이트

s=>s.replace(/(?![eiou])[b-z]/gi,"$&o$&")

기능도 수용 가능하다는 점을 상기시켜 준 Masterzagh와 캡처하지 않은 역 참조에 관한 정규식 팁에 감사드립니다!

입 / 출력이있는 더 긴 버전 :

alert(prompt().replace(/(?![eiou])[b-z]/gi,"$&o$&"));

문자열을 입력하라는 프롬프트 상자를 표시 한 다음 Rövarspråket 출력을 포함하는 대화 상자를 표시합니다. 코드는 정규식을 사용하여 자음을 두 배로 늘리고을 삽입 o합니다.


"함수 또는 stdin을 통해 입력 된 스웨덴어 문자열을 변환하는 프로그램을 작성하십시오."s=>alert(s.replace(/(?![eiou])([b-z])/gi,"$1o$1"));

그리고 출력하라는 메시지가 표시되지 않았으므로 경고도 필요하지 않습니다.

한 가지 더, 당신은 캡처하지 않고 역 참조 할 수 있습니다 . 기본적으로 do 는 현재 일치를 의미 s=>s.replace(/(?![eiou])[b-z]/gi,"$&o$&")하므로 $&문자를 캡처하는 괄호를 제거 할 수 있으며 마지막에 세미콜론을 제거하여 다른 바이트를 절약 할 수 있습니다.

@Masterzagh 다시 한 번 감사합니다!
ProgramFOX

4

Mathematica, 84 73 72 바이트

StringReplace[#,a:RegularExpression@"(?i)[BCDFGHJ-NP-TV-Z]":>a<>"o"<>a]&

설명:

  • RegularExpression@"(?i)[BCDFGHJ-NP-TV-Z]" 대소 문자를 구분하지 않고 모든 자음을 일치시키는 정규식입니다.
  • a:*..*:>a<>"o"<>a자음을에 바인딩하고 지연된 규칙을 그 a자체로 둘러싸 는 지연된 규칙을 만듭니다 .
  • 마지막으로 StringReplace[#,*..*]&인수의 모든 일치하는 문자에 해당 규칙을 적용하는 순수한 함수를 만듭니다.

@ MartinBüttner 감사합니다! Mathematica golfing에 아직 새로운
LegionMammal978

@ MartinBüttner 어쨌든 그렇게하려고했지만 몇 가지 알림으로 인해 산만 해졌습니다 : P
LegionMammal978

4

줄리아, 46 44 바이트

t->replace(t,r"(?![eiou])[b-z]"i,s->s*"o"*s)

이는 단일 문자열 입력을 가져와 Rövarspråket에 해당하는 익명 함수를 작성합니다. 호출하려면 이름을 지정하십시오 (예 :) f=t->....

에 쉼표 뒤에 공백이 아닌 다른 곳에서는 실제로 골프를 치고 있지 않습니다 replace().

여기서는 replace()함수에서 입력 문자열, 하위 문자열을 식별하기위한 정규식 및 대체의 3 가지 인수를 사용합니다 . Julia는로 정규 표현식 패턴을 나타냅니다 r"...". i끝에 추가 하면 대소 문자를 구분하지 않습니다. 이 특정 정규식은 자음과 일치합니다. 함수가 교체에 사용되는 경우 출력은 일치하는 각 하위 문자열에 적용된 함수입니다. 우리가 여기서 사용하는 함수는 Julia에서 문자열 연결을 수행 하므로 문자열을 가져 와서 s반환합니다 . 따라서 최종 결과는 각 자음이 "o"로 두 배가 된 입력 문자열입니다.sos*

예 :

julia> f("Min svävare är full med ål")
"MoMinon sosvovävovarore äror fofulollol momedod ålol"

julia> f("hello")
"hohelollolo"

julia> f("Rövarspråket")
"RoRövovarorsospoproråkoketot"

결과를 반환하지 않고 인쇄해야하는 경우 9 바이트 더 길어집니다. OP로부터 확인을 기다리는 중입니다.


편집 : Martin Büttner 덕분에 2 바이트가 절약되었습니다!


3

하스켈, 81 바이트

x n|elem n"bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"=[n,'o',n]|1<2=[n]
f=(>>=x)

사용법 : f "Hello there!"-> "HoHelollolo tothoherore!".

값 비싼 자음 목록을 영리하게 만들 수는 없습니다 import. 문자를 소문자로 바꾸어도 단순히 대문자와 소문자 자음을 모두 나열하는 것보다 더 많은 바이트가 필요합니다.



2

펄, 33 바이트

이 답변은 대부분 정규식 전용이며 I / O를 수행하기위한 소량의 추가 코드가 있습니다.

$_=<>;s/[^aeiou\W]/$&o$&/gi;print

Perl 정규 표현식을 사용한 지 오래되었습니다. 그래서 아마도 개선 될 수 있습니다.

$_=<>;                              This takes input from STDIN `<>` and stores
                                    it into the default variable $_
      s/          /     /gi;        This is a case-(i)nsentive, (g)lobal, 
                                    (s)ubstitution regex.  Since no other
                                    variable is specified, it is applied to
                                    the default variable $_.
        [^aeiou\W]                  This matches any single character that 
                                    is a consonant, by using a double-
                                    negative ^\W to match only alphanumeric 
                                    characters excluding vowels.  Accented 
                                    vowels are not considered alphanumeric 
                                    by Perl.
                   $&o$&            This forms the replacement.  $& contains the 
                                    match (the consonant), so this replaces each 
                                    consonant with two copies of itself with 
                                    an 'o' in between.
                            print   This prints the result.  With no arguments, 
                                    it prints $_ by default.

[^aeiou]여전히 å 및 다른 비 ASCII 모음과 일치 하지 않습니까?
Alex A.

@AlexA. 나는 이미 문제를 알아 차렸다. 0으로 수정되었습니다 ( \sto \W).
PhiNotPi

+1,이 사이트에서 본 펄 코드에 대한 가장 철저한 설명.
Zgarb

2

C (ideone.com 버전)-133

좋아, 이것은 크다. 그러나 C에는 정규 표현식이 없습니다. 더 짧게 만들 수있는 것이 있으면 알려주십시오.

#define x (*c<66||*c>90)&&(*c<98||*c>122)||strchr("EIOUeiou",*c)?"":
c[2];main(){while(0<(*c=getchar()))printf("%s%s%s",c,x"o",x c);}

지역 변수는 c어떻게 선언됩니까?
wjl

C의 @wjl 전역 변수는 0으로 초기화됩니다. 지역 변수는 스택에 있으며 초기화되지 않습니다. 참조 stackoverflow.com/questions/3553559/... 코드 엔디안 문제가있을 수 있습니다 int와 유형 기본 밖으로 문자에 printf와 작품 이후에 변수 - 나는 내일 확인합니다.
Jerry Jeremiah

예, 기본 초기화를 이해합니다. 난 그냥 잘이 코드가 있기 때문에 컴파일되지 않습니다 지적려고 c하지 않는 선언 예를 들어, 전혀 out.c:2:18: error: ‘c’ undeclared (first use in this function).
wjl

@ wjl 컴파일러에 따라 다릅니다. C를 선택할 때 ideone.com ideone.com/s7M5mZ 에서 컴파일하고 실행 합니다. 차이점은 무엇입니까?
Jerry Jeremiah

이데온 컴파일러의 버그처럼 보입니다. c[2];main( #define세미콜론으로 끝나지 않기 때문에 필요한) 사이에 줄 바꿈을 수정하면 GCC와 비슷한 오류가 발생합니다. 어쨌든, 큰 문제는 아니지만 여전히 재미있는 코드 골프이지만 실제로 이것을 유효하게 만들려면 몇 가지 문자가 더 필요할 수 있습니다. =)
wjl

2

Windows 배치, 235 바이트

@echo off
setlocal enabledelayedexpansion
set d=qwrtypsdfghjklzxcvbnm
set #=%1
:x
if defined # (
for /l %%i in (0,1,20)do (
set m=!d:~%%i,1!
if /i !m!==%#:~0,1% set g=!g!!m!o)
set g=!g!%#:~0,1%
set #=%#:~1%
goto x)
echo %g%

용법:

script.bat hello

산출:

hohelollolo

d를 "aoui"로 설정하지 않은 이유가 궁금 할 수도 있습니다. 같지 않은지 확인하려면 루프를 해제해야합니다. 작동 해야하는 모든 것이 일괄 적으로 작동하는 것은 아닙니다. 이 스크립트는 [단어에 나타나는대로] 한 단어의 문자를 처리합니다. 스크립트가 실행 되려면 여전히 존재하는 모든 공백과 줄 바꿈이 필요합니다.

Windows XP 이상이 필요합니다. Windows 8 이상에서는 테스트되지 않았습니다.


2

PowerShell-35 바이트

PowerShell이 ​​때때로 이것들과 경쟁 할 수 있음을 보여주기 위해 정규식을 사용하여 Martin Büttner의 Retina 답변에서 뻔뻔스럽게 도난당했습니다.

%{$_-replace'[b-z-[eiou]]','$0o$0'}

stdin에서 문자열 입력을받습니다.


1

Pyth-28 바이트

이것은 세트 단위의 차이를 사용하여 즉석에서 자음 목록을 생성함으로써 명백한 방식으로 작동합니다.

FNzpk+N?+\oN}rNZ-{G{"aeiou"k

곧 설명하겠습니다.

여기서 사용해보십시오 .


4 개의 문자를 제거하고 한 문자를 다른 문자로 바꾸면 4 비트를 절약 할 수 있습니다.
Jakube



1

파이썬, 61

작동 할 문자 클래스 조합 또는 뺄셈을 얻을 수 없으므로 Python에 해당 기능이 있다고 생각하지 않습니다. 대신 부정적 예측을 사용해야했습니다.

import re;f=lambda s:re.sub('(?i)(?![eiou])([b-z])',r'\1o\1',s)

여기에서 실행하십시오 : http://repl.it/fQ5

반대 링크 : /codegolf//a/48182/34718


1

K, 38 자

f:{,/(1+2*~(_x)in"aeiouåäö ")#'x,'"o"}

-1 f"Min svävare är full med ål";
MoMinon sosvovävovarore äror fofulollol momedod ålol

1

K, 31 바이트

,/{(x,"o",x;x)9>" aeiouåäö"?x}'

K에 정규 표현식이 없기 때문에 간단한 솔루션은 상당히 경쟁력이 있습니다. 무시 된 모음의 조회 테이블에서 각 문자가 발견되었는지 여부에 따라 "XoX"양식과 "X"양식 중에서 선택하고 결과 목록을 조인하십시오.

oK를 사용하여 브라우저에서 사용해 볼 수 있습니다 .

http://johnearnest.github.io/ok/index.html?run=%20%2C%2F%7B(x%2C%22o%22%2Cx%3Bx)9%3E%22%20aeiouåäö%22%3Fx%7D'%22Min%20svävare%20är%20full%20med%20ål%22

(불행히도 스택 오버플로로 인해 URL에 악센트 문자가 허용되지 않으므로 클릭 가능한 링크를 제공 할 수 없습니다)


0

골프 스크립트, 35 바이트

{."aeiouåäö\n "?-1={."o"\}{}if}%

입력이 스택에있을 것으로 예상합니다. 입력시 (50 바이트) :

"#{STDIN.gets}"{."aeiouåäö\n "?-1={."o"\}{}if}%

스웨덴어 å, ä 및 ö와 함께 작동합니다.


2
입력은 항상 GS에서 스택에 있습니다
Optimizer

0

Sed (명령 줄에서), 28 바이트

sed 's/\([^aeiou]\)/\1o\1/g'

텍스트를 파이프하거나 직접 입력하십시오. sed 코드 자체는 22 바이트입니다.


3
이것은 또한 공백과 같은 문자를 복제합니다 ä.
ProgramFOX

0

R, 45 자

gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)

간단한 정규식. stdin에서 읽습니다. 대소 문자를 구분하지 않는 ( 인수 이름의 부분 일치 덕분)을 i=T나타냅니다 .ignore.case=TRUEgsub

용법:

> gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)
Min svävare är full med ål
[1] "MoMinon sosvovävovarore äror fofulollol momedod ålol"
> gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)
hello
[1] "hohelollolo"
> gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)
hElLo
[1] "hohElolLoLo"


0

golflua, 36 바이트

B=I.r():g("[^aeiou%W ]","%1o%1")w(B)

간단한 패턴 일치 : stdin을 가져 와서 모음 %W이 아닌 문자 를 찾고 ( 영숫자가 아닌 문자를 처리 함) o두 개의 대체 문자 사이에 삽입 하십시오. 슬프게도, 쓰기 (즉, w(I.r():g(....))) 내 에서이 모든 작업을 수행하면 삽입 횟수도 출력되지만 3자를 절약했습니다. 루아에 해당하는 것은

line = io.read()
rovar = line:gsub("[^aeiou%W ]","%1o%1")
print(rovar)

0

REXX, 107 바이트

parse arg s
v='aeiouåäö '
o=
do until s=''
  parse var s l 2 s
  if verify(l,v)>0 then l=l'o'l
  o=o||l
  end
say o

"MoMinon sosvovävovarore äror fofulollol momedod ålol"


0

자바 스크립트 43

함수 구문을 저장해 준 @Masterzagh에게 감사합니다.

x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&")

자바 스크립트 62

function E(x){return x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&")}

함수는와 같은 익명의 화살표 함수 형태 일 수 있습니다 x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&"). 화살표 기능은 다음과 같이 작동합니다 name=(arg1, arg2)=>{code}. ()인수 {}가 하나만 있으면 필요하지 않으며 한 줄의 코드 만 있으면 필요하지 않습니다. 한 줄이 무언가를 반환하면 반환도 필요하지 않습니다.

그리고 나는 말을 잊었다. 함수를 만들도록 요청한 문제를 해결하기 위해 이름을 지정할 필요는 없습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.