将字符串转换为其等效的Rövarspråket


15

Rövarspråket

Rövarspråket是瑞典儿童玩的文字游戏,来自Astrid Lindgren撰写的有关Kalle Blomkvist的书籍。

基本规则如下(来自Wikipedia):

  • 每个辅音(拼写很重要,不是发音)都会加倍,并且在中间插入一个o。
  • 元音保持不变。

一些例子:

  • “你好”->“ hohelollolo”
  • “ Minsvävareärfull medål”->“ MoMinonsosvovävovaroreärorfofulollol momedodålol”

瑞典辅音与英文辅音相同,因此该程序应适用于瑞典语和英文条目。

在大多数情况下,字母“ y”在这种情况下被视为辅音。


你的任务:

编写一个程序,以将通过函数或通过stdin输入的一串瑞典字母转换为等效的Rövarspråket。以字节为单位的最短答案胜出!


@MartinBüttner进一步阐明了我的问题-它应该适用于瑞典语(因为这是瑞典语文字游戏)。
詹姆斯·威廉姆斯

字母项的含义是什么?
Optimizer

@Optimizer仅包含字母字符的字符串。抱歉,我措辞不好,我会编辑
James Williams

3
我们应该如何对待非字母?在第二个示例中至少显示空格。
nimi 2015年

2
顺带一提:“ Y”在瑞典语中被视为元音
leo

Answers:


14

视网膜,14 + 5 = 19字节

视网膜是一种本质上只是.NET正则表达式的语言,其开销尽可能小。该程序的代码包含两个文件:

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

这将读取STDIN上的输入,并将输出打印到STDOUT。

如果调用的文件pattern.rgxreplacement.rpl,您可以运行程序一样简单

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

说明

这非常简单,但是无论如何,我还是要添加一些解释(主要是关于视网膜的工作原理)。如果使用2个文件调用Retina,则会自动假定它在“替换模式”下运行,其中第一个文件是正则表达式,第二个文件是模式。

可以RegexOptions通过在正则表达式前加上`和配置字符串来配置Retina(包括和其他选项)。在这种情况下,我只给出它i是不区分大小写的常规正则表达式修饰符。

至于正则表达式本身,它使用.NET的字符类减法来匹配ASCII范围内的任何辅音。然后替换只是将匹配写回两次o,中间插入一个。


a在元音字符类中是否缺少?
Brian Gordon

3
@BrianGordon不,我是从中开始角色类的b,所以我不需要减法a
马丁·恩德

2
有趣的是,我从未见过嵌套的减法字符范围。那只是.NET的东西吗?
史蒂夫·本内特

我觉得您需要计算两个文件之间的分隔符至少一个字符。用另一种语言是分号或换行符。如果您想挑剔该语言的来源,则使用文件名之间的空格。
Sparr

@Sparr是的,这就是现在的策略,但是该策略比该挑战/答案要新。供参考(实际上,如果您查看时间戳记,您会发现我是因为这个答案而推行该政策的,但是追溯地在整个站点中应用这样的规则没有多大意义。)
Martin Ender

12

使用Unix 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程序,只算单引号之间的字节
数字创伤

1
s/[^AEIOU]/&o&/ig似乎有效..至少对于单个单词而言……您还需要排除空格
Digital Trauma

1
bash,尽管外壳无关紧要,但前提是您的sed程序用单引号引起来
Digital Trauma 2015年

1
同时还要注意瑞典元音öå等等-这些都需要排除了。可能会更好只使用辅音的白名单s/[BCDFGHJ-NP-TV-Z]/&o&/ig
数字创伤

2
我将其设置为“ sed”,并使用“ s / [^AEIOUÅÄÖ] /&o&/ ig”,它涵盖了瑞典语元音和25个字节的空格。
swstephe 2015年

7

CJam,32个 30字节

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

这是从STDIN读取并打印到STDOUT的完整程序。它适用于任意Unicode输入,并将以下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

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


“编写一个程序来转换通过功能或标准输入的瑞典字母字符串”,您可以做到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高尔夫来说仍然是新手...
LegionMammal978 2015年

@MartinBüttner仍会这样做,但由于一些通知而分心:P
LegionMammal978 2015年

4

朱莉娅,46 44字节

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

这将创建一个匿名函数,该函数接受单个字符串输入,并打印等效的Rövarspråket。要给它起个名字,例如f=t->...

除了逗号后的空格以外,这里实际上没有打过很多球replace()

在这里,我们在函数中使用3个参数replace():输入字符串,用于标识子字符串的正则表达式以及替换。Julia用表示正则表达式模式r"..."。最后加上i它使其不区分大小写。这个特殊的正则表达式匹配辅音。如果使用函数进行替换,则输出是应用于每个匹配子字符串的函数。我们在这里使用的函数需要一个字符串s并返回sos,因为*在Julia中执行了字符串连接。因此,最终结果是输入字符串,其中每个辅音都加倍了,并且之间有一个“ o”。

例子:

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的确认。


编辑:感谢MartinBüttner保存了2个字节!


3

Haskell,81个字节

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

用法:f "Hello there!"-> "HoHelollolo tothoherore!"

没有昂贵的imports,我不能巧妙地构造辅音列表。即使简单地列出大写和小写辅音,甚至将字母转为小写都需要更多的字节。


3

Java 8、45

用作lambda函数。使用正则表达式。

a->a.replaceAll("(?i)[b-z&&[^eiou]]","$0o$0")

试试这里


2

Perl,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。我已经注意到了问题。这是一个零字符定位点(\s\W)。
PhiNotPi 2015年

+1,我在此站点上看到的有关Perl代码的最详尽的解释。
Zgarb 2015年

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

C中的@wjl全局变量初始化为零。局部变量在堆栈上,并且没有初始化。请参阅stackoverflow.com/questions/3553559/… 类型没有默认设置为int的变量,由于printf可处理字符,因此代码可能存在字节序问题-我将在明天进行检查。
杰里·耶利米

是的,我了解默认初始化。我只是想很好地指出,由于c根本未声明该代码,因此无法编译,例如out.c:2:18: error: ‘c’ undeclared (first use in this function)
wjl 2015年

@wjl我想这取决于编译器。当您选择C时,它将在ideone.com ideone.com/s7M5mZ上编译并运行-知道有什么区别吗?
杰里·耶利米

看起来像ideone编译器的错误。如果您在两者之间固定换行符c[2];main(这#define是必需的,因为它不能以分号结尾),则会产生与GCC类似的错误。无论如何,没什么大不了的,它仍然是一个有趣的代码高尔夫球,但是您实际上可能还需要几个字符才能使此有效的C. =)
wjl

2

Windows Batch,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”,检查是否不相等需要打破循环。并非所有应该工作的东西都可以批量工作。该脚本处理1个单词的字符[如出现在键盘上一样]。运行脚本需要使用所有仍存在的空格和换行符。

Windows XP或更高版本。未经Windows 8及更高版本测试。


2

PowerShell-35字节

只是为了证明PowerShell有时也可以参加这些竞赛,并且使用正则表达式从MartinBüttner的Retina中偷偷地偷了出来:

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

接受来自stdin的字符串输入


1

Pyth-28个字节

这是明显的方式,它是通过使用逐个设置的差异来动态生成辅音列表的。

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

解释即将推出。

在这里尝试


您可以通过删除4个字符并用另一个替换一个字符来节省4位。
雅库布

1

片段10,30

gx"((?i)[b-z&&[^eiou]])""$1o$1

基本的正则表达式替换。




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

Golfscript,35个字节

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

期望输入在堆栈上。使用输入(50个字节):

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

与瑞典语å,ä和ö一起使用。


2
输入始终在GS上的堆栈中
优化器

0

Sed(在命令行上),28个字节

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

管道输入文字或直接输入文字。sed代码本身只有22个字节。


3
这也会复制空格和字符,例如ä
ProgramFOX 2015年

0

R,45个字符

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

简单的正则表达式。从stdin读取。i=T代表ignore.case=TRUE(由于参数名称的部分匹配),因此gsub不区分大小写。

用法:

> 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个字符,但在写入(即)内完成所有这些操作也会输出插入次数。相当于Lua

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

“ MoMinonsosvovävovaroreärorfofulollol momedodålol”


0

JavaScript的43

感谢@Masterzagh节省了函数语法。

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

JavaScript的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}()如果只有一个参数,而不是需要{},如果有只有一行的代码是不需要的。如果一行返回某些内容,也不需要返回。

我忘了说。您无需为其命名就可以解决只要求您创建函数的问题。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.