私のエスペラントを解析してください!


21

有名な構築言語エスペラント語はラテンアルファベットを使用します(詳細については、リンクされたウィキペディアのページを参照してください)。ただし、アクセント付きの文字がいくつかあります:ŭ、ŭ、accent、ĵ、ŝ、およびŭ。(C曲折曲、G曲曲曲、H曲曲曲、J曲曲、S曲曲、およびU字。)当然、これらの文字は入力が非常に困難です。この質問でも、Unicodeセレクターで文字を検索する必要がありました。このため、文字「x」を使用する規則が電子使用のために開発されました。たとえば、「cxu」は「ĉu」に使用されます。(注:文字「x」はエスペラントのアルファベットでは通常使用されません。」

しかし、私は言語純粋主義者です!この*空中引用* xナンセンスは私を殺している!これを修正するためのプログラムが必要です。できればできるだけ短くして、できるだけ早く端末に入力できるようにしてください。

チャレンジ

あなたの使命は、x-conventionを使用して一連のエスペラントを取り、それを実際のエスペラントに変換することです。

実際には、以下をマップする必要があります。

cx: ĉ
gx: ĝ
hx: ĥ
jx: ĵ
sx: ŝ
ux: ŭ
Cx: Ĉ
Gx: Ĝ
Hx: Ĥ
Jx: Ĵ
Sx: Ŝ
Ux: Ŭ

他のすべての印刷可能なASCII文字は受け入れられ、変更されません。Unicodeは便利ですが、必須ではありません。

入力および出力は、言語に適した任意の形式にすることができます。がんばろう!

テストケース

"input" : "output"
_____________
"gxi estas varma" : "ĝi estas varma"
"Cxu sxi sxatas katojn aux hundojn?" : "Ĉu ŝi ŝatas katojn aŭ hundojn?"
"Uxcxsxabcd(hxSx)efg{};" : "Ŭĉŝabcd(ĥŜ)efg{};"
"qwertyuiop" : "qwertyuiop"
" " : " "
"" : ""
"x" : "x"
"xc" : "xc"
"xcx" : "xĉ"
"cxx" : "ĉx"

得点

これはです。回答は、言語のデフォルトエンコーディングの最小バイト数によってスコア付けされます。

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

頑張って、楽しんで、改善を提案してください!

明確化:

  • あなただけの印刷可能な ASCII文字を心配する必要があります。

  • 正しい出力のよう見える文字のみを出力する必要があります。はい、これは標準文字にアクセントを付けることができることを意味します。


ここでのASCIIは、20-7Eの印刷可能文字、00-7F、または何を意味しますか?
-user202729

すべての印刷可能なもの。
OldBunny2800

注:文字と修飾子のアクセントを使用できるという説明を追加しました。
OldBunny2800

5
サーカムフレックスの組み合わせは0302 ̂であり、ブレーブの組み合わせは0306 ̆です。
-user202729

^それぞれがTIOカウントとしてUTF8の2バイトを使用します
-user202729

回答:


9

QuadR、65バイト

.x
3::⍵M'ĉĝĥĵŝŭĈĜĤĴŜŬ'['cghjsuCGHJSU'⍳⊃⍵M]

オンラインでお試しください!

.x 「x」が後に続く任意の文字を置き換えます

3::⍵M エラーのインデックスを作成する際に、試合を返す無修正
 今すぐ試してみてください
'ĉĝĥĵŝŭĈĜĤĴŜŬ'[... ] と、この文字列のインデックス
  ⍵M 試合の
   最初の文字の
   インデックス
  'cghjsuCGHJSU' この文字列で

これは、Dyalog APL暗黙関数と同等です。

'.x'R{3::⍵.Match'ĉĝĥĵŝŭĈĜĤĴŜŬ'['cghjsuCGHJSU'⍳⊃⍵.Match]}

いい答えだ!+1
OldBunny2800

ここでバイトがどのようにカウントされるかわかりません。straightRの簡単な使用は短くありませんか?('cghjsuCGHJSU',¨'x')⎕r(,¨'ĉĝĥĵŝŭĈĜĤĴŜŬ')
-ngn

@ngnそうですが、投稿する前にバッテリーが切れました。
アダム

6

網膜、27バイト

iT`x`̂`[cghjs]x
iT`x`̆`ux

オンラインでお試しください!

このプログラムは、2つの音訳で構成されています。コード内で文字を結合しているため、これはあまりレンダリングされません。最初の行は実際にはに似ているはずです。iT`x`^`[cghjs]xここで^は、文字を結合する曲折アクセントを表します。これが言っているのは、の文字の後にあるときはいつでも、aへの入力内のすべてのsを文字変換するTiいびきをかく)べきだということです。x^[cghjs]


注:TIOはこのコードを25バイトとして誤って測定します。実際、このRetinaプログラムはUTF-8エンコードを使用し(他のプログラムはUTF-32またはISO 8859-1を使用できます)、存在する2つの結合文字はそれぞれ2バイトのコストがかかります。


5

C、 173  154バイト

17バイトを節約してくれた@Colera Suに感謝します!

p,c,i;f(char*s){for(char*l="cghjsuCGHJSU";p=*s;~c&&putchar(p))for(c=*++s,i=0;c=='x'&&l[i];++i)l[i]-p||write(1,"ĉĝĥĵŝŭĈĜĤĴŜŬ"+i*2,2,c=-1,++s);}

オンラインでお試しください!

説明:

p,c,i;
f(char*s)
{
    // The outer loop and an array of characters that are modified by a trailing 'x'.
    // The array/string is used for getting the index for the accented character later.
    for (char*l="cghjsuCGHJSU";

                                // Store the current character of the input string in 'p'.
                                // If it is '\0', the loop terminates.
                                p=*s;

                                      // The last statement in the loop.
                                      // If 'c==-1', it outputs the char stored in 'p'. 
                                      ~c&&putchar(p))

        // Store the character following 'p' in 'c' and increment the string pointer.
        for(c=*++s, i=0;

                        // If 'c' is not the letter 'x', the inner loop terminates
                        // immediately. Otherwise it loops through the characters of
                        // string 'l'.
                        c=='x'&&l[i]; ++i)

            // If the character stored in 'p' is found inside the string 'l'...
            l[i]-p ||

                      // ...then print the accented character corresponding to 'p'.
                      // 'i' is the index of 'p' in 'l', and, because the characters
                      // with accents are two bytes each, the index is multiplied by 2.
                      write(1,"ĉĝĥĵŝŭĈĜĤĴŜŬ"+i*2,2,

                      // Finally set 'c' to -1 so that the non-accented character doesn't
                      // get printed too, and increment the string pointer so that the
                      // letter 'x' doesn't get printed either.
                                                    c=-1, ++s);
}

いいね!説明をお願いできますか?
OldBunny2800

おそらく、代わりにリテラルのヌルバイトを使用できます\0か?
-user202729

(ただし、残念ながらTIOでは機能しません)
-user202729

を使用write(1,"..."+i*2,2)して、17バイトを節約できます。オンラインでお試しください!
コレラSu

5

Python 3、81バイト

lambda s,T="cĉgĝhĥjĵsŝuŭ":eval("s"+".replace('%sx',%r)"*12%(*T+T.upper(),))

オンラインでお試しください!

文字列を生成して評価します。

s.replace('cx','ĉ').replace('gx','ĝ').replace('hx','ĥ').replace('jx','ĵ').replace('sx','ŝ').replace('ux','ŭ').replace('Cx','Ĉ').replace('Gx','Ĝ').replace('Hx','Ĥ').replace('Jx','Ĵ').replace('Sx','Ŝ').replace('Ux','Ŭ')

Erik the Outgolferはバイトを節約しました。


@EriktheOutgolferいいね、ありがとう!
-xnor

3

///、75バイト

/,/\/\///>/x\,/c>ĉ,g>ĝ,h>ĥ,j>ĵ,s>ŝ,u>ŭ,C>Ĉ,G>Ĝ,H>Ĥ,J>Ĵ,S>Ŝ,U>Ŭ/

注:OPリクエストはすべての印刷可能文字を処理する必要があるため、選択した「特殊文字」は印刷可能であってはなりません。そこで、の代わりにタブと改行を選択しましたが、バイトカウントやコード機能は変わりません。コードは次のようになります。

/
/\/\/// /x\
/c  ĉ
g   ĝ
h   ĥ
j   ĵ
s   ŝ
u   ŭ
C   Ĉ
G   Ĝ
H   Ĥ
J   Ĵ
S   Ŝ
U   Ŭ/

ただし、入力にはタブまたは改行を含めることはできません。

オンラインでお試しください!

///入力を取得できないため、コードの後に​​入力する必要があります。

とても簡単です。///各文字を特別に処理する必要があるため、短くすることはできません。

説明:

/,/\/\//       Replace all `,` in the code by `//`
               (two slashes are represented as two backslash-ed slashes)
/>/x\,         (in original code) becomes
/>/x\//        (because `,` is replaced by `//`) - replace all occurence of 
               `>` by `x/`.
/cx/ĉ//gx/ĝ//hx/ĥ//jx/ĵ//sx/ŝ//ux/ŭ//Cx/Ĉ//Gx/Ĝ//Hx/Ĥ//Jx/Ĵ//Sx/Ŝ//Ux/Ŭ/
               ^ The remaining part of the code should look like this.
               Straightforward replacement.

3

Python 3、95バイト

f=lambda x,v="cĉgĝhĥjĵsŝuŭCĈGĜHĤJĴSŜUŬ":v and f(x.replace(v[0]+"x",v[1]),v[2:])or x

オンラインでお試しください!

WhatToDoのおかげで-10バイト
Colera Suのおかげで-1バイト



@ user507295オハイオ州のアイデア。ありがとう!
ハイパーニュートリノ

and-orトリックを使用して1バイトを保存:オンラインで試してみてください!
コレラSu

@ColeraSuああクール、ありがとう。なぜそのトリックがDを
消したの

@HyperNeutrino私はそのトリックについて知らなかったからです。ごめんなさい!
WhatToDo



1

JavaScript(ES6)、92バイト

s=>[..."cghjsuCGHJSU"].reduce((a,v,i)=>a.split(v+"x").join("ĉĝĥĵŝŭĈĜĤĴŜŬ"[i]),s)

オンラインでお試しください!

コンストラクターが大量のバイトを使用するため、ここで推奨される分割-結合メソッドを使用してバイト数を減らしnew RegExp(/*blah*/)ます。

比較:

Original: a.replace(new RegExp(v+"x", "g"), "ĉĝĥĵŝŭĈĜĤĴŜŬ"[i])
New     : a.split(v+"x").join("ĉĝĥĵŝŭĈĜĤĴŜŬ"[i])

短く、結合アクセントアプローチ(63バイト)ですが、いくつかのアーティファクトが表示されます。

s=>s.replace(/([cghjs])x/gi," ̂$1").replace(/(u)x/gi," ̌$1");

脚注:63バイトのソリューションには、出力に影響する可能性のあるアーティファクトがあるため、92バイトの回答を要求しています。


1

APL(Dyalog Unicode)、57バイト

匿名の暗黙関数。使用法:

  1. 文字列のプレフィックス関数。これは文字列を音訳します。

  2. 文字列のリストのプレフィックス関数。これは文字列を音訳します。

  3. 入力ファイルのタイ番号を右引数、出力ファイルのタイ番号を左引数とする中置関数。これにより、入力ファイルの音訳されたコンテンツが出力ファイルに入力されます。

('cghjsuCGHJSU',¨'x')⎕R(,¨'ĉĝĥĵŝŭĈĜĤĴŜŬ')

(... )⎕R(... ) PCRE R eplace

'cghjsuCGHJSU' これらの手紙

,¨'x' それぞれの後にxが続きます

 …と…

,¨'ĉĝĥĵŝŭĈĜĤĴŜŬ' 文字列としてのこれらの文字のそれぞれ

オンラインでお試しください!


1

J64 63バイト

rplc((_2]\'ĉĝĥĵŝŭĈĜĤĴŜŬ');~"1'cghjsuCGHJSU',.'x')"0

使い方:

_2]\私は、他の文字列の形状に適合させるために12行の列に文字列「ĉĝĥĵŝŭĈĜĤĴŜŬ」を再配置します。

,. 「cghjsuCGHJSU」文字列の各文字に「x」を追加し、12行2列の配列を作成します

;~"1' 上記のボックス化されたペアのリストを作成し、「1-ランク1-各行に適用します。

┌──┬──┐
│cx│ĉ │
├──┼──┤
│gx│ĝ │
├──┼──┤
│hx│ĥ │
├──┼──┤
│jx│ĵ │
├──┼──┤
│sx│ŝ │
├──┼──┤
│ux│ŭ │
├──┼──┤
│Cx│Ĉ │
├──┼──┤
│Gx│Ĝ │
├──┼──┤
│Hx│Ĥ │
├──┼──┤
│Jx│Ĵ │
├──┼──┤
│Sx│Ŝ │
├──┼──┤
│Ux│Ŭ │
└──┴──┘

rplc これらのボックス化された項目を使用して、ペアからの左のボックス化された項目の各オカレンスを右の項目と置き換えます。

オンラインでお試しください!


1

Befunge、2x48 +1 = 99バイト

>~:1+!#@_:"x"-v>$ 11p0"cghjsuCGHJSU"1\ >\31p11g-v
^ # #, : ++$\ _^#1"x"0*4!-"u"g11*"ʊ"!\_^#!:\*g13<

やってみて(TIOはBefungeについて非常に奇妙であり、それに取り組むためのソリューションを得ることができませんでした)

使い方

>~:1+!@_

入力を取得し、終了かどうかを確認します。ある場合は、プログラムを終了します。

          "x"-v>
^ # #, : ++$\ _^

文字が「x」かどうかを確認します。そうでない場合は、キャラクターのコピーを保持して印刷します。

               >$ 11p0"cghjsuCGHJSU"1\

最後の文字を(1,1)に保存します。チェックするすべての文字をスタックに入れます。

                                       >\31p11g-v
                                      _^#!:\*g13<

最後の文字をスタック内のすべての値と比較します。

                 1"x"0*4!-"u"g11*"ʊ"!\

チェック(0または1)にʊ(Unicode値650)を掛けます。キャラクターがauであったかどうかを確認し(breveの場合)、そうであればスタックに4を追加します。最後に、xのascii値(100)も追加します。合計は、必要な場合は正しいアクセントになり、そうでない場合は「x」になります。

>~:1+!#@_  
^ # #, : ++$\ _^#

スタック内のすべての値を一緒に追加して印刷し、複製を保持します。次の入力に戻ってください。


1

R75 70バイト

function(s)gsub('([cghjs])x','\\1\U302',gsub('(u)x','\\1\U306',s,T),T)

オンラインでお試しください!

ジュゼッペのおかげで-5バイト

説明

  • gsub('(u)x','\\1\U306',s,T)s大文字または小文字の「u」が出現するたびに置き換えます(ignore.case=TRUE4番目の引数を使用してT)、「x」、「u」、breveのUnicodeの順に
  • gsub('([cghjs])x','\\1\U302',gsub('(u)x','\\1\U306',s,T),T):その結果を取得し、大文字または小文字のすべての出現を(ignore.case=TRUE4番目の引数を使用してT)「c」、「g」、「h」、「j」、または「s」の後に「x」を付けて置き換えます曲折アクセント記号のUnicodeが後に続く文字

命名ではなく引数の順序を使用すると、3バイト節約され、さらに2つが先頭のゼロを取り除き\U0302\U0306:をオンラインで試してください!
ジュゼッペ

@ジュゼッペ-素晴らしいアイデア、ありがとう!
duckmayr

1

QuadR、25バイト

分音記号版の組み合わせ。

ux
([cghjs])x
 ̆&
 ̂\1

i

オンラインでお試しください!

交換…

(u)x         u followed by x and
([cghjs])x   any of these letters followed by x 
 ̆\1          by a breve followed by the first group (the u) and
 ̂\1          a circumflex followed by the first group (the letter)

小文字私は nsensitively

次のDyalog APLコードと同等:

'(u)x' '([cghjs])x'R' ̆\1' ' ̂\1'

なぜこれは24バイトではなく28バイトなのですか?
エリックアウトゴルファー

@EriktheOutgolfer TIOのSBCSカウンターは私を混乱させました。一定。ありがとう。待って、それは私が勝つということですか?
アダム

ええと、27バイト(TIOからコピー)のように見えますが、ここからコピーすると24バイトになります。QuadRのエンコードとは何ですか?
エリックアウトゴルファー

@EriktheOutgolfer両方のリンクが私のFFQ / Win10で24を報告しています。QuadRは、Dyalog Classicまたは任意のUnicodeを使用します。
アダム

それは24バイトですか?
エリックアウトゴルファー

1

C、 145 144バイト

別のCアプローチ。サーカムフレックス/ breveが2バイトであるという事実を使用して、入力を上書きして戻ります。

Steadyboxのおかげで-1バイト。

i,t;f(char*s){for(t=1;*s;s++)if(*s^'x')for(i=12,t=1;i--;)t="cghjsuCGHJSU"[i]-*s?t:i*2;else t^1&&memcpy(s-1,"ĉĝĥĵŝŭĈĜĤĴŜŬ"+t,2),t=1;}

オンラインでお試しください!


1
t^1&&memcpy(s-1,"ĉĝĥĵŝŭĈĜĤĴŜŬ"+t,2),t=1;代わりにt^1?memcpy(s-1,"ĉĝĥĵŝŭĈĜĤĴŜŬ"+t,2),t=1:0;を使用すると、1バイト節約されます。オンラインでお試しください!
-Steadybox

1

Mathematica、81バイトまたは57バイト

StringReplace[RemoveDiacritics@#<>"x"->#&/@Characters@"ĉĝĥĵŝŭĈĜĤĴŜŬ"]

「x」と一緒に帽子のない文字が文字に置き換えられる置換ルールを適用します。

追加されたアクセント文字を使用した代替方法を次に示します。 StringReplace[{"ux"->"ŭ","Ux"->"Ŭ",c_~~"x":>c<>"̂"}]


1

Perl 5、49 + 2(-p -C)= 61 51バイト

s/[CGHJScghjs]\Kx/\x{0302}/g;s/[Uu]\Kx/\x{0306}/g

オンラインでお試しください!

Nahuel Fouilleulのおかげで10バイト節約


:7バイト節約することができますs/[CGHJScghjs]\Kx/\x{0302}/g;s/[Uu]\Kx/\x{0306}/g
ナウエルFouilleul

警告がある場合-Cとない場合でも動作するようです-CWide character in print
ナウエルフイユ

1
-C on its own (not followed by any number or option list), or the empty string "" for the PERL_UNICODE environment variable, has the same effect as -CSDL.
perlrun

0

CJam、51バイト

q"ĉĝĥĵŝŭĈĜĤĴŜŬ""cghjsuCGHJSU".{'x+@\/*}

オンラインでお試しください!

説明:

q                   Read input
"ĉĝĥĵŝŭĈĜĤĴŜŬ"      String literal
"cghjsuCGHJSU"      Another string literal
.{                  Iterate over the strings in parallel
  'x+                 Add an 'x to the normal character
  @                   Rotate to bring the input to the top of stack
  \                   Swap to bring the "cx" to the top
  /                   Split the input on instances of "cx"
  *                   Join the input on instances of the accented character
}

これは本当に39バイトですか?私は39文字を数えますが、CJamには特別なエンコーディングはないと思います。
-user202729

@ user202729(TIOは、何らかの理由で文字としてバイトを数えて)変更
Esolangingフルーツ

TIOは、すべてのゴルフ言語に特殊な文字コードページがあると考えており、すべての文字が正しいコードページにあるかどうかを気にしません。
user202729

0

sed、108バイト

s/cx/ĉ/g
s/gx/ĝ/g
s/hx/ĥ/g
s/jx/ĵ/g
s/sx/ŝ/g
s/ux/ŭ/g
s/Cx/Ĉ/g
s/Gx/Ĝ/g
s/Hx/Ĥ/g
s/Jx/Ĵ/g
s/Sx/Ŝ/g
s/Ux/Ŭ/g

`...`または、<pre><code>...</code></pre>または4インデントでコードとしてコードをフォーマットする必要があります。
-user202729

@ user202729私は明らかにそれを知っていました。Androidスマートフォンから送信していたので、正しくフォーマットしませんでした。
-iBug

2
これは119バイトの長さのようです。
エリックアウトゴルファー

0

PowerShell、58バイト

54文字であり、PowerShell ISEに保存すると、58バイトのUTF-8 + BOMになります。ブラウザではうまくレンダリングされません。

$args-replace'(?<=u)x','̆'-replace'(?<=[cghjs])x','̂'

正規表現は、xを@ user202729のコメントからの結合Unicode文字で置き換えます。

例えば

PS C:\> .\eo.ps1 "Cxu vi sxatas la cxapelliterojn? Mi ankaux."
Ĉu vi ŝatas la ĉapelliterojn? Mi ankaŭ.

0

Clojure、126 115バイト

-11バイト。置換マップを文字列のパーティションに変更します。

#(reduce(fn[a[f r]](clojure.string/replace a(str f\x)(str r)))%(partition 2"cĉgĝhĥjĵsŝuŭCĈGĜHĤJĴSŜUŬ")) 

検索する置換のマップと、それらを置換する対象のマップの削減。

置換マップを圧縮する方法をまだ開発中です。

(defn translate [^String esperanto]
  (reduce (fn [acc [f r]] (clojure.string/replace
                            acc ; Replace the translation so far by
                            (str f \x) ; adding a x after each character, search for it in the string,
                            (str r))) ; and replace it with a stringified accented char

          esperanto ; Before the reduction happens, the accumulator is the original string

          ; A list of [char-to-find what-to-replace-with] pairs
          (partition 2"cĉgĝhĥjĵsŝuŭCĈGĜHĤJĴSŜUŬ")))))


0

Scala、110バイト

退屈な正規表現ソリューション:

def?(s:String)="(.)x".r.replaceAllIn(s,m=>m.group(0)(0)+(if(m.group(0)(0).toUpper=='U')"\u0306"else"\u0302"))

古いScalaソリューション(116バイト)

def?(s:String)=s.foldLeft("")((r,c)=>if(c=='x')r.init+r.last+(if(r.last.toUpper=='U')"\u0306"else"\u0302")else r+c)

非ゴルフ

def?(s:String)=
  s.foldLeft("")((r,c)=>  // 'Fold' string with empty string as first result
    if(c=='x')            // If current character is x
      r.init+             // Take the every character from result but the last
        r.last+           // The last character from result and add
          (if(r.last.toUpper=='U')
            "\u0306"      // combining breve if 'u' or 'U'
          else"\u0302")   // combining circumflex in any other case
 else r+c                 // Otherwise return result + character
)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.