文字列を対応するRövarspråketに変換します


15

Rövarspråket

Rövarspråketは、アストリッド・リンドグレンによるKalle Blomkvistに関する本からのスウェーデンの子供たちが演じる単語ゲームです。

基本的なルールは次のとおりです(Wikipediaより):

  • すべての子音(発音ではなくスペルの問題)が2倍になり、その間にoが挿入されます。
  • 母音はそのまま残されます。

いくつかの例:

  • 「hello」->「hohelollolo」
  • "Minsvävareärfull medål"-> "MoMinonsosvovävovaroreärorfofulollol momedodålol"

スウェーデン語の子音は英語のものと同じなので、プログラムはスウェーデン語と英語の両方のエントリで動作するはずです。

この場合、文字「y」は子音と見なされます-ほとんどの場合そうです。


あなたのタスク:

関数またはstdinを介して入力されたスウェーデン語の文字列を、同等のRövarspråketに変換するプログラムを作成します。バイト単位の最短回答が勝ちます!


@MartinBüttnerは私の質問をさらに明確にしました-スウェーデン語で動作するはずです(スウェーデン語の単語ゲームなので)。
ジェームズウィリアムズ

アルファベット順のエントリの意味は何ですか?
オプティマイザー

@Optimizerアルファベットのみの文字列。申し訳ありませんが、私はそれをひどく言いました、編集します
ジェームズウィリアムズ

3
非文字をどのように扱うべきですか?2番目の例では、少なくともスペースが表示されます。
nimi

2
サイドノートでは:「Y」のスウェーデン語の母音と考えられている
LEO

回答:


14

網膜、14 + 5 = 19バイト

Retinaは、本質的に.NET正規表現であり、オーバーヘッドを最小限に抑えた言語です。このプログラムのコードは、2つのファイルで構成されています。

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

これにより、STDINの入力が読み取られ、出力がSTDOUTに出力されます。

ファイルpattern.rgxとを呼び出すとreplacement.rpl、次のようにプログラムを実行できます。

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

説明

これは非常に簡単ですが、とにかく説明を追加します(主にRetinaの動作について)。Retinaが2つのファイルで呼び出された場合、最初のファイルが正規表現で、2番目のファイルがパターンである「置換モード」で動作すると自動的に想定されます。

RetinaはRegexOptions、正規表現`の前に構成文字列を追加することで構成できます(これには他のオプションも含まれます)。この場合、私はそれを与えるだけですiケース非感受性のための通常の正規表現修飾子です。

正規表現自体に関しては、.NETの文字クラス減算を使用して、ASCII範囲の子音と一致します。次に、置換はo、間に2回だけマッチを書き戻します。


a母音文字クラスにが欠けていますか?
ブライアンゴードン

3
@BrianGordonいいえ、文字クラスを開始しているbので、減算する必要はありませんa
マーティンエンダー

2
興味深いことに、入れ子になった減法的な文字範囲を見たことはありません。それは単なる.NETのものですか?
スティーブベネット

2つのファイルを区切るには、少なくとも1文字をカウントする必要があると思います。別の言語ではセミコロンまたは改行になります。この言語で文字がどこから来たのかを気にしたければ、それはファイル名の間のスペースです。
スパー

@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少なくとも一つの言葉のために...あなたにもスペースを除外する必要があります。..仕事に思える
デジタルトラウマ

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に出力する完全なプログラムです。任意の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出力を含むダイアログを表示します。コードは正規表現を使用して子音を2倍にし、を挿入しoます。


「関数またはstdinを介して入力されたスウェーデン語の文字列を変換するプログラムを作成する」ことができますs=>alert(s.replace(/(?![eiou])([b-z])/gi,"$1o$1"));

また、出力を求められなかったため、アラートも必要ありません。

もう1つ、キャプチャせずに後方参照できます。基本的には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ゴルフを
始めたばかり

@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を受け取り、を返します。したがって、最終結果は、それぞれの子音が2つの「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からの確認を待っています。


編集: MartinBüttnerのおかげで2バイト保存されました!


3

Haskell、81バイト

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

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

高価ななしで子音のリストを巧みに作成することはできませんimport。小文字にチェックする文字を回すだけでも、大文字と小文字の両方の子音をリストするよりも多くのバイトが必要です。



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母音とはまだ一致しませんか?
アレックスA.

@AlexA。私はすでに問題に気づきました。これはゼロ文字修正(\sto \W)でした。
PhiNotPi

+1、このサイトで見たPerlコードの最も徹底的な説明。
ズガルブ

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グローバル変数はゼロで初期化されます。ローカル変数はスタック上にあり、初期化されません。stackoverflow.com/questions/3553559/…を参照してください。 デフォルトの型がintでない変数と、printfがcharで機能するため、コードにエンディアンの問題がある可能性があります。明日確認します。
ジェリーエレミヤ

はい、デフォルトの初期化を理解しています。私はちょうど、このコードcはまったく宣言されていないので、コンパイルれないことをうまく指摘しようとしていましたout.c:2:18: error: ‘c’ undeclared (first use in this function)
wjl

@wjlコンパイラに依存すると思います。Cを選択すると、ideone.com ideone.com/s7M5mZでコンパイルおよび実行されます。違いは何ですか?
ジェリージェレミア

ideoneのコンパイラのバグのように見えます。c[2];main#defineセミコロンで終わらないために必要な)間の改行を修正すると、GCCに同様のエラーが発生します。とにかく、大したが、それはまだ楽しいコード-ゴルフませんが、あなたが実際に)=この有効C.を作るために、いくつかのより多くの文字を必要とするかもしれない
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"に設定しなかったのか不思議に思われるかもしれません。動作するはずのすべてが、バッチで動作するわけではありません。スクリプトは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つの文字を削除し、1つの文字を別の文字に置き換えることにより、4ビットを節約できます。
ジャクベ



1

Python、61

文字クラスの結合や減算を機能させることができなかったため、Pythonにその機能があるとは思わない。代わりに負の先読みを使用する必要がありました。

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

ここで実行:http : //repl.it/fQ5

逆へのリンク:https : //codegolf.stackexchange.com/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

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

0

R、45文字

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

単純な正規表現。stdinから読み取ります。(引数名の部分一致のおかげで)のi=Tignore.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、2つの置換の間に挿入します。悲しいことに、書き込み(つまり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}()引数{}が1つしかない場合は必要ありません。コードが1行しかない場合は不要です。また、1行で何かが返される場合は、戻る必要はありません。

そして、私は言うのを忘れました。関数を作成するように要求するだけの問題を解決するために、名前を付ける必要はありません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.