英语到外国人翻译


18

简报

外星人已经定居在地球上,而且很奇怪,他们的字母和我们的字母完全一样。他们的语言也与我们的语言非常相似,但有一些非常独特且易于计算的差异。

挑战

取一个字符串并输出等效的外语。翻译工作如下:

用相应的词交换单词中的所有元音:

  Vowel |   With
--------+--------
   a    |   obo
   e    |   unu
   i    |   ini
   o    |   api
   u    |   iki

您也可以编写其他翻译器来翻译Alien-> English,但是这是可选的。

例子

Input: Shaun
Output: Shoboikin

Input: Java
Output: Jobovobo

Input: Hello, World!
Output: Hunullapi, Wapirld!

如果元音大写,则第一个字母大写。

Input: Alan
Output: Obolobon

Input: Australia
Output: Oboikistroboliniobo

规则

  • 适用标准漏洞
  • 必须适用于包含新行的文本
  • 您可以编写函数,lambda或完整程序

    Capingrobotikilobotiniapins会破坏thunu runuvunursunu trobonslobotapir!


我不确定您可能还会写其他翻译器来翻译Alien-> English应该是什么意思。我们可以编写反向翻译器而不是常规翻译器吗?
丹尼斯

4
也许只有我一个人,但是对我来说,在这个意义上没有这个意思。无论如何,如果它不是实际任务的一部分,我不确定这是什么规则
丹尼斯

@Dennis您的文字有点虚伪,但我对其进行了编辑以使其更加清晰。
肖恩·怀德(Shaun Wild)

2
为什么要求换行?我认为这是没有必要的,也没有增加挑战的要点。
阿德南

1
输入可以包含任何ASCII字符还是仅包含一个子集。例如,输入中是否会有数字?
莱利2016年

Answers:


14

Haskell,100 91字节

(>>= \x->last$[x]:[y|(z:y)<-words"aobo eunu iini oapi uiki AObo EUnu IIni OApi UIki",z==x])

5
Hoboskunull肯定
JK。

12

TI-Basic,173 + 59 + 148 = 380字节

希望外星人使用TI-83 / 84计算器;)

主程序,173字节

奖金:根据您想要的是普通翻译器还是反向翻译器,保留第二行或第三行。

"("+Ans+")→Str1
"@a~obo@A~Obo@e~unu@E~Unu@i~ini@I~Ini@o~api@O~Api@u~iki@U~Iki@→Str2    <-- English to Alien
"@obo~a@Obo~A@unu~e@Unu~E@ini~i@Ini~I@api~o@Api~O@iki~u@Iki~U@→Str2    <-- Alien to English
For(I,2,length(Ans
If "@"=sub(Str2,I-1,1
Then
Str1+"~"+sub(Str2,I,inString(Str2,"@",I)-I
prgmQ
Ans→Str1
End
End

子程序(prgmQ),59个字节:

Ans→Str9
inString(Ans,"~
sub(Str9,Ans,length(Str9)-Ans+1→Str8
Str9
prgmR
Repeat Str9=Ans+Str8
Ans+Str8→Str9
prgmR
End

子程序(prgmR),148个字节:

Ans→Str0
inString(Ans,"~→Z
inString(Str0,"~",Ans+1→Y
inString(sub(Str0,1,Z-1),sub(Str0,Z+1,Ans-Z-1→X
sub(Str0,1,-1+inString(Str0,"~
If X
sub(Str0,1,X-1)+sub(Str0,Y+1,length(Str0)-Y)+sub(Str0,X+length(sub(Str0,Z+1,Y-Z-1)),Z-X-length(sub(Str0,Z+1,Y-Z-1

PS ~代表令牌0x81@代表令牌0x7F在此处了解更多信息

为什么这些节目具有很高的字节数PPS部分原因是sub(inString(length(,和所有的小写字母是两个字节每...


我认为您混在一起,prgmR并且prgmQ一次出现在代码标题中?
Byte Commander

是的,感谢您抓住了@ByteCommander :)
Timtech's

8

Perl,56个字节

包括+1的 -p

在STDIN上输入

alien.pl

#!/usr/bin/perl -p
s%\w%"`"&$&|("A\x0fboE\x15nuI\x09niO\x01piU\x09ki"=~/\u$&\K.../,$&)%eg

如图所示工作,但将\xXX转义符替换为实际角色以获得要求的分数


1
+1仅针对Alien头像进行了投票。开个玩笑,解决方案也不错。
混沌

1
耶稣基督。Perl处于最佳状态,女士们和男士们。
Priidu Neemre

6

sed 89

s,a,&b\n,gi
s,i,&n\r,gi
s,o,&p\r,gi
s,u,&k\r,gi
s,e,&n\f,gi
y,aeouAEOU\n\r\f,ouaiOUAIoiu,

这对于包含换行符的输入有效吗?
约旦

@乔丹。sed读取“每次一行”。因此它将处理所有内容,直到第一个换行符,然后打印,打印换行符,如果有更多文本,请重新开始。
莱利2013年

嗯当然了 👍🏻–
约旦

@Jordan当我写这篇文章时,这不是一个规则,但是无论如何它最终还是起作用了。
莱利

6

Python,99 95 93字节

lambda s:"".join(("ouiaiOUIAI bnnpkbnnpk ouiiiouiii"+c)["aeiouAEIOU".find(c)::11] for c in s)

在ideone.com上...

很简单 只需获取我们在元音列表中找到每个字符的索引,并使用它来提取我们需要的三个字符。如果找不到,则.find()返回,-1因此只需将当前字符粘贴在字符串的末尾即可。空格是必需的,因此任何字母"a"都不包含所加c。翻译的元音按字母顺序分组(每次翻译的第一个字母,然后是第二个,然后是第三个字母)。


哇,好创意的方法。我很感激:)
Byte Commander

1
您可以在["aeiouAEIOU".find(c)::11] for
acrolith

6

05AB1E28 27 20字节

žÀ.•₅%~≠#ùÛãú•3ôD™«‡

在线尝试!

非双性恋

žÀ                    # the string "aeiouAEIOU"
  .•₅%~≠#ùÛãú•        # the string "obounuiniapiiki"
              3ô      # split in pieces of 3
                D™«   # concatenate with a title-case copy
                   ‡  # transliterate

2
伊尼lapivunu gapilfining!
肖恩·怀德(Shaun Wild)

@BasicallyAlanTuring:花了我很长时间才把它翻译成我的脑海。我认为我需要一个反向翻译器:P
Emigna'Sep

2
努力吧,不应该太辛苦:P
肖恩·怀尔德

吓人,我认为它说我爱高尔夫。
datagod

我更改了我的问题,这使您的回答无效。这必须与新的行一起使用
Shaun Wild

5

PHP,91字节

<?=strtr($argv[1],[A=>Obo,E=>Unu,I=>Ini,O=>Api,U=>Iki,a=>obo,e=>unu,i=>ini,o=>api,u=>iki]);

5

Python,129个字节

lambda s:"".join([str,str.capitalize][ord(l)<91]({"a":"obo","e":"unu","i":"ini","o":"api","u":"iki"}.get(l.lower(),l))for l in s)

看到它在ideone.com上运行

这是格式更好的版本:

lambda s: \
    "".join(
        [str, str.capitalize][ord(l) < 91](
            {"a":"obo", "e":"unu", "i":"ini", "o":"api", "u":"iki"}
            .get(l.lower(), l)
        )
    for l in s)

最有趣的部分是{ ... }.get(l.lower(), l)尝试查找l在字典中转换为小写形式的字母,并返回翻译后的版本(如果找到)或原始字母,
然后[str, str.capitalize][ord(l) < 91]( ... )检查原始字母是否为大写字母( ASCII代码点低于91),然后调用str()以字母作为参数的函数(如果不是大写字母,则不执行任何操作)或str.capitalize()函数(将参数字符串的第一个字母转换为大写)。


5

C(GCC) 150个141 136 134字节

a;i;e(char*n){for(char*v=" AEIOUIAI",*t;i=*n++;printf(&a))t=index(v,i-i/96*32),a=t?t-v:0,a=a?v[a+3]|L" 潢畮楮楰楫"[a]<<8|i&32:i;}

在线尝试!

基于@algmyr的答案,-8归功于@ ASCII-only

少打高尔夫球

a;i;
e(char*n){
  for(char*v=" AEIOUIAI",*t;i=*n++;printf(&a))
    t=index(v,i-i/96*32),
    a=t?t-v:0,
    a=a?v[a+3]|L" 潢畮楮楰楫"[a]<<8|i&32:i;
}

149?a;l;i;e(char*n){for(char*v=" AEIOU",*t;i=*n++;printf("%c%c%c"+4*!a,(a?" OUIAI"[a]:i)|i&32," bnnpk"[a]," ouiii"[t=index(v,i-32*l),a=t?t-v:0]))l=i>96;}
仅使用ASCII码

也许还有149:a;l;i;e(char*n){for(char*v="AEIOU",*t;i=*n++;printf("%c%c%c"+4*!a,(a?" OUIAI"[a]:i)|i&32," bnnpk"[a]," ouiii"[t=index(v,i&95),a=t&&t-v<5?t-v+1:0]));}
仅限ASCII

144:a;l;i;e(char*n){for(char*v=" AEIOU",*t;i=*n++;)printf("%c%c%c"+4*!a,a?" OUIAI"[a]|i&32:i," bnnpk"[a]," ouiii"[t=index(v,i-i/96*32),a=t?t-v:0]);}
仅限ASCII

4

批处理,215字节

@echo off
set/pt=
set s=
:l
if "%t%"=="" echo(%s%&exit/b
set c=%t:~0,1%
for %%a in (obo.a unu.e ini.i api.o iki.u Obo.A Unu.E Ini.I Api.O Iki.U)do if .%c%==%%~xa set c=%%~na
set s=%s%%c%
set t=%t:~1%
goto l

在STDIN上输入。逐字符处理具有区分大小写的便利。


批处理只是所有工具中最糟糕的工具,不是吗?(好吧,至少您击败了TI-Basic :)顺便说一下,很高兴看到Batch的代码高尔夫球!
YoYoYonnY

4

Pyth,42个字节

#sXw"aeiouAEIOU"+Jc"obounuiniapiiki"3mrd3J

一个程序,在STDIN上接受输入并打印输出。

在线尝试

怎么运行的

#sXw"aeiouAEIOU"+Jc"obounuiniapiiki"3mrd3J  Program.
#                                           Loop until error statement:
   w                                         Get w, the next line of the input
                   "obounuiniapiiki"         Yield string literal "obounuiniapiiki"
                  c                 3        Split that into groups of three characters
                 J                           Assign that to J and yield J
                                     mrd3J   Map title case over J
                +                            Merge the lower and title groups
    "aeiouAEIOU"                             Yield string literal "aeiouAEIOU"
  X                                          Translate w from that to the three-character
                                             groups
 s                                           Concatenate that
                                             Implicitly print

4

C,167字节

我真的不想束手无策地习惯在编写C语言时总是执行主要函数,但是这比带有main的版本要短得多,这样我就得到了另一个字母来拼写我想要的内容!

打高尔夫球

a;l;i;e(char*n){for(;i=*n++;l=i>90,i-=32*l,a=!(i-65)+2*!(i-69)+3*!(i-73)+4*!(i-79)+5*!(i-85),printf(a?"%c%c%c":"%c",(a?"HOUIAI"[a]:i)+l*32,"ibnnpk"[a],"!ouiii"[a]));}

已评论

a;l;i;
e(char*n)
{
    for(;
        i = *n++;  /* Get char and advance */
        l = i>90,  /* Is lowercase? */
        i -= 32*l, /* Make uppercase */

        /* Is 1,2,3,4,5 depeding on the vowel and 0 for no vowel */
        a = !(i-65) + 2*!(i-69) + 3*!(i-73) + 4*!(i-79) + 5*!(i-85),

        printf(a?"%c%c%c":"%c",        /* Print 1 or 3 chars? */
               (a?"HOUIAI"[a]:i)+l*32, /* Print appropriate char+case */
                  "ibnnpk"[a],            /* Print appropriate char */
                  "!ouiii"[a]));          /* Print appropriate char */
}

关于C以及使用指针之类的东西有多可怕,有一些特别之处。



@ceilingcat我想说的就是自己发表答案。它的分歧足以应得自己的答案。:)
algmyr


3

Javascript(ES6),94 93 92字节

s=>s.replace(/[aeiou]/gi,c=>"OUIAIouiai"[n="AEIOUaeiou".search(c)]+"bnnpk"[n%=5]+"ouiii"[n])

由于edc65,
节省了1个字节由于尼尔,节省了1个字节

演示版

let f =
s=>s.replace(/[aeiou]/gi,c=>"OUIAIouiai"[n="AEIOUaeiou".search(c)]+"bnnpk"[n%=5]+"ouiii"[n])

function translate() {
  document.getElementById("o").value = f(document.getElementById("i").value);
}
translate();
<input id="i" size=80 oninput="translate()" value="Hello, World!"><br><input id="o" size=80 disabled>


1
要检查返回值.indexOf.search使用~,而不是<0
edc65

1
我看一下如果只更换元音会发生什么,我最初得到s=>s.replace(/[aeiou]/gi,c=>"ouiaiOUIAI"[n="aeiouAEIOU".indexOf(c)]+"bnnpk"[n%=5]+"ouiii"[n])的仍然是93字节。但是由于c现在被称为元音,因此您现在可以使用search而不是indexOf保存字节!
尼尔

@Neil-太好了!实际上,我尝试过两者,但没有考虑将它们组合在一起。
Arnauld

2

Java 8,172字节

String f(String s){String v="AEIOUaeiou",r="OboUnuIniApiIkiobounuiniapiiki",o="";for(char c:s.toCharArray()){int n=v.indexOf(c);o+=n>-1?r.substring(n*3,n*3+3):c;}return o;}

松散:

String f(String s){
    String v="AEIOUaeiou",r="OboUnuIniApiIkiobounuiniapiiki",o="";
    for(char c:s.toCharArray()){
        int n=v.indexOf(c);
        o+=n>-1?r.substring(n*3,n*3+3):c;
    }
    return o;
}

和外星人回到英语(171字节):

String g(String s){String[] v="AEIOUaeiou".split(""),r="Obo Unu Ini Api Iki obo unu ini api iki".split(" ");for(int i=0;i<v.length;i++)s=s.replaceAll(r[i],v[i]);return s;}

取消高尔夫:

String g(String s){
    String[] v="AEIOUaeiou".split(""),r="Obo Unu Ini Api Iki obo unu ini api iki".split(" ");
    for(int i=0;i<v.length;i++)s=s.replaceAll(r[i],v[i]);
    return s;
}

2

Tcl,75个字节

要转换的字符串在变量中s

string map {A Obo a obo E Unu e unu I Ini i ini O Api o api U Iki u iki} $s

2

Mathematica,128个字节

#~StringReplace~{"a"->"obo","A"->"Obo","e"->"unu","E"->"Unu","i"->"ini","I"->"Ini","o"->"api","O"->"Api","u"->"iki","U"->"Iki"}&

不确定是否可以通过IgnoreCase->True与案例检查一起使用来获得更短的程序。


2

C 178字节

char*p[256],*a="obo\0unu\0ini\0api\0iki\0Obo\0Unu\0Ini\0Api\0Iki",*b="aeiouAEIOU";main(c){for(c=0;b[c];++c)p[b[c]]=a+4*c;for(;(c=getchar())>0;)p[c]?printf("%s",p[c]):putchar(c);}


如果将数字保存为字节1字节2字节3 ... @ceilingcat&c就可以了...例如,内存中的255为ff 00 00 00,但如果另一字节为255,则我们有00 00 00 ff并输出空字符串...
RosLuP

2

C,163个 162 159字节

char*t="aeiou";n,k;q(char*x){for(;*x;n<0||(*x=t[n>1?n%2?0:2:n+3])&&k>90||(*x-=32),printf("%c%.2s",*x++,n<0?"":&"bonunipiki"[2*n]))n=strchr(t,tolower(k=*x))-t;}

char*t="aeiou";成环节省1个字节
穆库尔·库马尔


2

C#,133121字节

s=>{int i;return string.Concat(s.Select(c=>(i ="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));}

编辑(感谢milk

谢谢:)我实际上知道这个重载,但是在编写此载具时完全忘了它。

s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));

您可以使用Select(char, int)重载,因此您无需声明i即可将其全部放在一行中。s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));
牛奶

2

C,207个 202字节(感谢Cyoce)

#include <stdio.h>
#define r(c,t) case c:printf(t);continue;
int main(){int c;while(~(c=getchar())){switch(c){r('a',"obo")r('e',"unu")r('i',"ini")r('o',"api")r('u',"iki")default:putchar(c);}}return 0;}

1)我讨厌在任何类型的声明之前忽略类型

2)我真的不喜欢放置不可用的代码(没有main()函数)

用法:

c89 cg.c -o cg; echo "Testing" | ./cg

欢迎来到PPCG!
Martin Ender

@MartinEnder,这是出乎意料的……但是谢谢:)
Xdevelnet

(c=getchar())!= EOF可以成为~(c=getchar())
Cyoce


1

斯威夫特2.2 196字节

¯\ _(ツ)_ /¯

打高尔夫球

var r = ["a":"obo","e":"unu","i":"ini","o":"api","u":"iki"];var q={(s:String) in var o = "";for var i in s.lowercaseString.characters{o += r[String(i)] != nil ? r[String(i)]!:String(i)};print(o);}

松散

var r = ["a":"obo","e":"unu","i":"ini","o":"api","u":"iki"]
var q={(s:String) in
    var o = ""
    for var i in s.lowercaseString.characters {
        o += r[String(i)] != nil ? r[String(i)]!:String(i)
    }
    print(o)
}

是否var r = [需要空格?
Cyoce

是的,如果您未在作业之间放置空格,请在操场上应用程序中输入错误,并提示您添加空格。Swift可能是打高尔夫球最糟糕的语言之一,但我认为尝试尝试会很有趣。
Danwakeem

有趣的是,当我将变量分配给闭包时,它没有给我该错误。因此,耸耸肩的人
Danwakeem

是的,我也注意到了。这就是为什么我感到困惑。
Cyoce

0

Perl 6的 84  82个字节

{my%o=<a obo e unu i ini o api u iki>;S:i:g[<{%o.keys}>]=%o{$/.lc}.samecase($/~'a')}
{my%o=<a obo e unu i ini o api u iki>;S:i:g[<[aeiou]>]=%o{$/.lc}.samecase($/~'a')}

展开:

# bare block lambda with implicit parameter 「$_」
{
  # create the mapping
  my %v = <a obo e unu i ini o api u iki>;

  # replace vowels in 「$_」
  S
    :ignorecase
    :global
  [
    <[aeiou]>
  ]

  = # replace them with:

  %v{ $/.lc }
  # change it to be the same case as what was matched, and a lowercase letter
  .samecase( $/ ~ 'a' )
}

用法:

my &english-to-alien = {my%o=<a obo e unu i ini o api u iki>;S:i:g[<[aeiou]>]=%o{$/.lc}.samecase($/~'a')}

say english-to-alien 'Australia'; # Oboikistroboliniobo

0

C-192字节

(为清楚起见添加了换行符)

int c,j,b;main(){
char*f[]={"bo","nu","ni","pi","ki",""},
s[]={14,16,0,-14,-12};
while(c=getchar()){for(b=j=0;j<10;++j)
{if(c=="aeiouAEIOU"[j]){c+=s[j%=5];b=1;break;}}
printf("%c%s",c,f[b?j:5]);}}

只是查找表和布尔开关。

在元音表(字符串)中查找每个字母;如果找到,则根据表中的规则进行修改s。打印每个字符后跟一个字符串:如果找到了元音,则打印由中的值修改的字符,再打印s存储在表格中的其余音节f;如果找不到元音,请打印原始字符和空字符串。



0

Ruby,102 93 91 88 78字节

gsub(/[#{b='aeiouAEIOU'}]/){'obounuiniapiikiOboUnuIniApiIki'[b.index($&)*3,3]}

说明:

执行如下行,例如ruby -pe "gsub(/[#{b='aeiouAEIOU'}]/){'obounuiniapiikiOboUnuIniApiIki'[b.index($&)*3,3]}"next type,Australia它应该输出:Oboikistroboliniobo

这非常简单,根据(b)中要替换的元音的索引,子句3,翻译字符串中的下3个字符,用子字符串替换所有元音。


1
我怀疑输出中的前后引号(如果输入带有引号,则内部转义)可能会取消此资格。无论如何,您可以通过将的分配移动b到Regexp(/[#{b=...}/)中来节省两个字节。
乔丹

1
我认为空间p $*是不必要的
Cyoce

1
使用该-p标志保存其他字节。ruby -pe 'gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}'
价值墨水

我数了78 + 2(-pe)。你怎么得到71?
并非查尔斯(Charles)

@NotthatCharles在这种情况下执行所需的字符真的重要吗?我只是不算数。
Biketire

0

TI-BASIC,201个 197 195字节

Ans+" →Str1:"AEIOUaeiou→Str2:"OUIAIouiai→Str3:"bonunipiki→Str4:1→X:While X<length(Str1:inString(Str2,sub(Str1,X,1→A:5fPart(.2A→B:If A:sub(Str1,1,X-1)+sub(Str3,A,1)+sub(Str4,2B-1,2)+sub(Str1,X+1,length(Str1)-X→Str1:X+1+2(A>0→X:End:sub(Str1,1,length(Str1)-1

认为我会在这里找到另一个TI-BASIC答案!

无论如何,输入是中的英文字符串Ans
输出是翻译后的字符串。

例子:

"HE
HE
prgmCDGF1A
HUnu
"Hello
Hello
prgmCDGF1A
Hunullapi

说明:(
为便于阅读,添加了换行符。同一行中的多行将:在以下代码块中用表示。)

Ans+" →Str1                     ;append a space to the input string and store the result
                                ; in "Str1"
"AEIOUaeiou→Str2                ;store the upper- and lowercase vowels in "Str2"
"OUIAIouiai→Str3                ;store the beginning letter of each corresponding translated
                                ; vowel in "Str3"
"bonunipiki→Str4                ;store the remaining letters of each translated vowel
                                ; in "Str4"
1→X                             ;store 1 in "X"
While X<length(Str1             ;loop until all English letters have been checked
inString(Str2,sub(Str1,X,1→A    ;get the current letter and store its index in "Str2"
                                ; into "A"
5fPart(.2A→B                    ;get which translated vowel end should be used
                                ; B ranges from 1 to 5
If A                            ;if the current letter is a vowel
sub(Str1,1,X-1)                 ;extract the substring of the input before the
                                ; current letter
: +sub(Str3,A,1)                ;append the translated vowel start
: +sub(Str4,2B-1,2)             ;append the translated vowel end
: +sub(Str1,X+1,length(Str1)-X  ;append the remaining substring of the input
: →Str1                         ;store the result of these concatenations into "Str1"
X+1+2(A>0→X                     ;check if A>0 (if the current letter was a vowel)
                                ; if true, increment "X" by three
                                ; if false, increment "X" by one
End
sub(Str1,1,length(Str1)-1       ;remove the trailing space and store the result in "Ans"
                                ;implicit print of "Ans"

笔记:

  • TI-BASIC是一种标记化语言。字符数不等于字节数。

  • TI-BASIC中的小写字母每个为两个字节。

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.