解析我的世界语!


21

世界著名的构造语言世界语使用拉丁字母(有关详细信息,请参见链接的维基百科页面)。但是,有些字符带有重音:characters,ĉ,ĥ,ĵ,ŝ和ŭ。(C抑扬音,g抑扬音,h抑扬音,j抑扬音,s抑扬音和超音。)自然地,这些字符很难键入。即使是这个问题,我也必须在Unicode选择器中搜索字符。因此,已经开发了使用字母“ x”的约定以用于电子用途。例如,“ cxu”用于“ĉu”。(注意:世界语字母通常不使用字母“ x”。”

但是,我是一个语言纯粹主义者!这个“空中报价” *胡说八道杀了我!我需要一个程序来解决此问题,最好尽可能短,以便可以尽快将其输入到我的终端中!

挑战

您的任务是使用x约定获取一串世界语,并将其转换为真实的世界语。

实际上,您必须映射:

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"

计分

这是。答案以该语言的默认编码中的最小字节数计分。

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

# Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以将旧分数保留在标题中,方法是将它们打掉。例如:

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

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

# 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 ̂,合并breve在0306 ̆
user202729

^每个占用UTF8中的2个字节作为TIO计数
user202729

Answers:


9

QuadR,65个字节

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

在线尝试!

.x 将任何字符后跟“ ​​x”替换为

3::⍵M 在索引错误,返回匹配未修改
 现在就来试试:
'ĉĝĥĵŝŭĈĜĤĴŜŬ'[... ] 索引此字符串
  ⍵M 匹配的
   第一个字母的
   指数
  'cghjsuCGHJSU' 在此字符串

这等效于Dyalog APL的默认功能:

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

好答案!+1
OldBunny2800 '17

我不确定这里如何计算字节数。straightforwardR的直接使用方法不是更短吗?('cghjsuCGHJSU',¨'x')⎕r(,¨'ĉĝĥĵŝŭĈĜĤĴŜŬ')
ngn

@ngn是的,但是我的电池没电了,才有机会发布它。
亚当

6

视网膜,27字节

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

在线尝试!

该程序由两个音译组成。由于代码中包含组合字符,因此渲染效果不太好,第一行实际上应类似于iT`x`^`[cghjs]x,其中^代表抑扬符重音组合字符。这就是说,只要输入中的所有s 跟随在中的任何字母,就应该将其T重新拼写(i忽略大小写)。x^[cghjs]


注意:TIO错误地将此代码测量为25个字节。实际上,此Retina程序使用UTF-8编码(其他程序可以使用UTF-32或ISO 8859-1),并且当前出现的两个组合字符每个花费2个字节。


5

C, 173154 字节

感谢@Colera Su节省了17个字节!

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 '17

可能您可以使用文字空字节代替\0
user202729

(但不幸的是,在TIO上不起作用)
user202729 '17

您可以write(1,"..."+i*2,2)用来保存17个字节。在线尝试!
Colera 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','Ŭ')

Outgolfer的Erik保存了一个字节。


@EriktheOutgolfer不错,谢谢!
xnor

3

///,75字节

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

注意:因为OP请求必须处理所有可打印字符,所以我选择的“特殊字符”一定不能打印。因此,我选择了tab和newline而不是,这不会改变我的字节数或代码功能。代码如下所示:

/
/\/\/// /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

在线尝试!

-10字节归功于WhatToDo
-1字节归功于Colera Su



@ user507295哦,聪明的主意。谢谢!
HyperNeutrino

使用and-or技巧保存一个字节:在线尝试!
Colera Su

@ColeraSu哦,太好了,谢谢。不知道为什么这个技巧消失了D:
HyperNeutrino

@HyperNeutrino因为我不知道那把戏。抱歉!
WhatToDo

2

视网膜,55字节

iT`CG\HJSUcg\hjsux`ĈĜĤĴŜŬĉĝĥĵŝŭ_`[cghjsux]x

在线尝试!非组合方法。如果不用于独立x测试用例,则可以保存字节。


1

Perl 5,101 +1(-p)= 102字节

%k=qw/c ĉ g ĝ h ĥ j ĵ s ŝ u ŭ C Ĉ G Ĝ H Ĥ J Ĵ S Ŝ U Ŭ/;$"=join"|",keys%k;s/($")x/$k{$1}/g

在线尝试!


1

JavaScript(ES6),92个字节

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

在线尝试!

这里推荐使用的split-join方法减少字节数,因为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");

脚注:我要求回答92个字节,因为63字节的解决方案包含可能会影响输出的工件。


1

APL(Dyalog Unicode),57字节

匿名默认功能。用途:

  1. 字符串的前缀函数。这会音译字符串。

  2. 字符串列表的前缀功能。这会音译字符串。

  3. 具有输入文件联系号作为右参数和输出文件联系号作为左参数的中缀函数。这将使用输入文件的音译内容填充输出文件。

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

(... )⎕R(... ) PCRE [R E放置

'cghjsuCGHJSU' 这些信件

,¨'x' 每个后跟一个x

 ……和……

,¨'ĉĝĥĵŝŭĈĜĤĴŜŬ' 这些字母分别作为字符串

在线尝试!


1

J64 63字节

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

怎么运行的:

使用_2]\I将字符串“ĉĝĥĵŝŭĈĜĤĴŜŬ”重新排列为12行的列,以适合其他字符串的形状。

,. 将'x'添加到'cghjsuCGHJSU'字符串的每个字符中,并形成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)乘以ʊ(统一码值650)。检查字符是否为au(对于简短字符),如果是,则将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个字节,感谢Giuseppe

说明

  • gsub('(u)x','\\1\U306',s,T)s每次出现大写或小写字母“ u”(ignore.case=TRUE通过第四个参数使用T)后跟“ x”,然后替换“ u”,然后用unicode替换
  • gsub('([cghjs])x','\\1\U302',gsub('(u)x','\\1\U306',s,T),T):获取该结果,并替换每次出现的大写或小写字母(ignore.case=TRUE通过第四个参数使用T)“ c”,“ g”,“ h”,“ j”或“ s”,后跟一个“ x”,字母后跟unicode的抑扬符

使用参数顺序,而不是命名节省3个字节,而在另外两个摆脱前导零的\U0302\U0306网上试试吧!
朱塞佩

@Giuseppe-好主意,谢谢!
Duckmayr

1

四核,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'

为什么是28个字节而不是24个字节?
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer TIO的SBCS计数器使我感到困惑。固定。谢谢。等等,这是否意味着我赢了?
亚当

呵呵,现在看起来好像是27个字节(从TIO复制),但是从这里复制时是24个字节。QuadR的编码是什么,正确的是什么?
Erik the Outgolfer

@EriktheOutgolfer两个链接在我的FFQ / Win10上报告24。QuadR使用Dyalog Classic或任何Unicode。
亚当

那么它是24个字节还是什么?
暴民埃里克(Erik the Outgolfer)'17年

1

C,145个 144字节

另一种C方法。通过使用circumflex / breve为2个字节的事实来覆盖输入来返回。

-1个字节,感谢Steadybox

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;保存一个字节。在线尝试!
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
Nahuel Fouilleul

似乎它也可以在有警告的-C情况下-C使用(Wide character in print
Nahuel Fouilleul

1
来自perlrun-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.
Nahuel Fouilleul

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 Fruit 2017年

因为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个字节长。
暴民埃里克(Erik the Outgolfer)'17年

0

PowerShell,58个字节

它是54个字符,并将其保存在PowerShell ISE中使其成为58字节的UTF-8 + BOM。它在浏览器中的渲染效果不佳:

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

regex将@ user202729注释中的Unicode字符替换为x。

例如

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

0

Clojure,126115字节

通过将替换映射更改为字符串的分区来获得-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

斯卡拉 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
)

0

JavaScript,35个字符,36个字节

s=>s.replace(/([cghjsu])x/gi,"$1̂")

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.