簡単な説明
エイリアンは地球に定住しました。奇妙なことに、彼らのアルファベットは私たちのものとまったく同じです。彼らの言語も私たちの言語と非常に似ていますが、いくつかの非常に明確で計算しやすい違いがあります。
チャレンジ
文字列を取り、エイリアンの言語に相当するものを出力します。翻訳はそのように機能します:
単語内のすべての母語を対応するものと交換します:
Vowel | With --------+-------- a | obo e | unu i | ini o | api u | iki
エイリアンを翻訳する別の翻訳者を作成することもできます->英語、ただしこれはオプションです。
例
Input: Shaun Output: Shoboikin Input: Java Output: Jobovobo Input: Hello, World! Output: Hunullapi, Wapirld!
母語が大文字の場合は、最初の母語を大文字にします手紙..
Input: Alan Output: Obolobon Input: Australia Output: Oboikistroboliniobo
ルール
- 標準の抜け穴が適用されます
- 新しいものを含むテキストで機能する必要があります行
-
関数、ラムダ、または完全なプログラムのいずれかを記述できます
Capingrobotikilobotiniapins apin wrinitining thunu runuvunursunu trobonslobotapir!
コメント
- I ‘何がわからないエイリアンを翻訳する別の翻訳者を書くこともできます->英語は意味するはずです。通常のトランスレータの代わりにリバーストランスレータを作成できますか?
- 多分’は私だけですが、’ここでまたがこの意味を持っていることは私には明らかではありません。とにかく、’が実際の一部ではない場合、これがルールであるかどうかわかりません’タスク。
- @Dennis You ‘少し罰則がありますが、’編集して作成しましたより明確に。
- なぜ改行が必要なのですか?私の意見では、これは不要であり、’チャレンジの要点に何も追加しません。
- 入力にASCII文字を含めることはできますか、それともサブセットのみを含めることができますか。たとえば、入力に数字が含まれることはありますか?
回答
Haskell、 100 91バイト
(>>= \x->last$[x]:[y|(z:y)<-words"aobo eunu iini oapi uiki AObo EUnu IIni OApi UIki",z==x])
コメント
- Hoboskunullは確かに
回答
TI-基本、173 + 59 + 148 = 380バイト
エイリアンがTIを使用することを願っています- 83/84計算機;)
メインプログラム、173バイト
ボーナス:通常のトランスレータとリバーストランスレータのどちらが必要かによって、2行目または3行目を保持します。
"("+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これらのプログラムのバイト数が多い理由の1つは、sub(
、inString(
、length(
が原因です。 、およびすべての小文字はそれぞれ2バイトです…
コメント
- あなたは
prgmR
とprgmQ
を1回入れますか? - はい、@ ByteCommanderをキャッチしていただきありがとうございます:)
回答
Perl、56バイト
-p
の+1が含まれます
STDINに入力を与える
alien.pl
:
#!/usr/bin/perl -p s%\w%"`"&$&|("A\x0fboE\x15nuI\x09niO\x01piU\x09ki"=~/\u$&\K.../,$&)%eg
図のように機能し、ただし、\xXX
エスケープを実際の文字に置き換えて、要求されたスコアを取得します
コメント
- +1エイリアンのアバターのためだけに賛成。冗談ですが、解決策も素晴らしいです。
- イエス・キリスト..最高のPerl、女性と男性。
回答
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,
コメント
- これはnewlinesを含む入力で機能しますか?
- @Jordanそうです。 sedは”一度に1行”を読み取ります。したがって、最初の改行まですべてを処理し、それを印刷し、改行を印刷してから、さらにテキストがある場合は最初からやり直します。
- もちろんです。 👍🏻
- @Jordanこれを書いたときは’のルールではありませんでしたが、とにかく機能することになりました。
回答
Python、 99 95 93バイト
lambda s:"".join(("ouiaiOUIAI bnnpkbnnpk ouiiiouiii"+c)["aeiouAEIOU".find(c)::11] for c in s)
非常に簡単です。母音リストで各文字を見つけたインデックスを取得し、それを使用して必要な3文字をプルします。見つからない場合、.find()
は-1
を返すため、文字列の最後に現在の文字を貼り付けるだけです。スペースが必要なので、文字"a"
には、追加されたc
は含まれません。翻訳された母音は、文字順にグループ化されます(すべての翻訳の最初の文字、2番目、3番目)。
コメント
- うわー、素晴らしい創造的なアプローチ。 ‘感動しました:)
-
["aeiouAEIOU".find(c)::11] for
のスペースを削除できます
回答
05AB1E 、 28 27 20バイト
žÀ.•₅%~≠#ùÛãú•3ôD™«‡
Unuxplobonobotiniapin
žÀ # the string "aeiouAEIOU" .•₅%~≠#ùÛãú• # the string "obounuiniapiiki" 3ô # split in pieces of 3 D™« # concatenate with a title-case copy ‡ # transliterate
コメント
- Ini lapivunu gapilfining!
- @BasicallyAlanTuring:頭の中でそれを翻訳するには時間がかかりすぎました。逆翻訳者が必要だと思います:P
- 頑張ってください、’難しいことではありません:P
- 怖い、と思いますゴルフが大好きだと書いてあります。
- ‘質問を変更したため、回答が無効になりました。これは新しい行で機能する必要があります
回答
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]);
回答
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)
ここに、より適切にフォーマットされたバージョンがあります:
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)
最も興味深い部分は、l
に保存されている文字を検索しようとする{ ... }.get(l.lower(), l)
です。辞書で小文字であり、翻訳されたバージョン(見つかった場合)を返すか、元の文字を返します。
および[str, str.capitalize][ord(l) < 91]( ... )
は、元の文字が大文字であるかどうかを確認します( ASCIIコードポイントが91未満)、文字を引数としてstr()
関数を呼び出すか(大文字でない場合は何もしません)、またはstr.capitalize()
関数(引数文字列の最初の文字を変換します大文字に変換します。
回答
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による回答と@ASCIIのみのおかげで-8に基づいています
ゴルフバージョンが少ない
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;}
- 多分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]));}
- 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]);}
回答
バッチ、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で入力を行います。文字ごとに処理すると、大文字と小文字が区別されるという便利さがあります。
コメント
- バッチはすべてにとって最悪のツールです、isn ‘そうですか? (まあ、少なくともTI-Basicに勝っています:)ちなみに、バッチでコードゴルフを見るのはいいですね!
回答
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
回答
C、167バイト
I本当に「Cをコーディングするときに常にメイン機能を実行するという私の習慣を壊したくありませんでしたが、これはメインを備えたバージョンよりも大幅に短いので、私は欲しいものを綴る別の手紙を手に入れました!
ゴルフ
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には特別なことがあり、どれほど恐ろしいことがありますかポインタなどを使用してください。
コメント
- 151バイト
- @ceilingcat I ‘自分で答えを投稿すると言います。 ‘は、独自の答えに値するほど十分に分岐しています。 🙂
回答
網膜 、60バイト
バイト数はISO8859-1エンコーディングを想定しています。
[A-Z] »$& T`L`l i ini u iki e unu a ·b· o api · o T`»l`_L`».
回答
Javascript(ES6)、 94 93 92バイト
s=>s.replace(/[aeiou]/gi,c=>"OUIAIouiai"[n="AEIOUaeiou".search(c)]+"bnnpk"[n%=5]+"ouiii"[n])
edc65のおかげで1バイト節約できました
Neilのおかげで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 size=80 oninput="translate()" value="Hello, World!"><br><input size=80 disabled>
コメント
-
.indexOf
と.search
の戻り値を確認するには、ividの代わりに~
を使用します= “7da1d54fb0”>
s=>s.replace(/[aeiou]/gi,c=>"ouiaiOUIAI"[n="aeiouAEIOU".indexOf(c)]+"bnnpk"[n%=5]+"ouiii"[n])
がまだ93バイトでした。 。ただし、c
が母音であることがわかっているため、indexOf
divの代わりにsearch
を使用できるようになりました。 >バイトを節約するために!回答
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;}
unolfed:
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; }
回答
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
回答
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
をケースチェックと一緒に使用してより短いプログラムを取得できるかどうかわからない。
回答
C178バイト
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);}
コメント
- 153バイト
- @ceilingcat & cは、数値をbyte1 byte2 byte3として保存すれば問題ありません…たとえば、255をff 00 00 00としてメモリに保存しますが、255のもう一方のエンディアンがある場合00 00 00 ffがあり、void文字列を出力します…
回答
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";
をforループに入れると、1バイト節約できます - 144バイト
回答
C#、 133 ストライク> 121バイト
s=>{int i;return string.Concat(s.Select(c=>(i ="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));}
編集()
ありがとうございます:)私は実際にこのオーバーロードを知っていますが、これを書くときにどういうわけか完全に忘れてしまいました。
s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));
コメント
-
Select(char, int)
オーバーロードを使用できるため、’を宣言する必要はありませんi
そしてすべてを1行にまとめることができます。s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));
回答
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へようこそ!
- @MartinEnder、’予期しない…しかし、ありがとうございます:)
-
(c=getchar())!= EOF
は~(c=getchar())
- 143バイトになる可能性があります
回答
Swift 2.2196バイト
¯\ _(ツ)_ /¯
ゴルフ
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);}
unGolfed
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 = [
必要ですか? - 遊び場アプリでは、’割り当ての間にスペースを入れないと、エラーが発生し、スペースを追加するように指示されます。 。スウィフトはおそらくゴルフをするのに最悪の言語の1つですが、試してみるのは楽しいだろうと思いました。
- そして興味深いことに’変数をクロージャーに割り当てていたときにエラーが発生しました。したがって、肩をすくめる男
- ええ私もそれに気づきました。そのため、’混乱しました。
回答
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
回答
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
の値で変更された文字に続けて、テーブル;母音が見つからなかった場合は、元の文字と空の文字列を出力します。
コメント
回答
ルビー、 102 ストライク> 93 91 88 78バイト
gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}
説明:
ruby -pe "gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}"
のような行を実行し、次のタイプ、たとえばAustralia
を出力します。Oboikistroboliniobo
。
これは非常に簡単です。すべての母音を、(b)の3倍の、置き換えられる母音のインデックスに基づいた部分文字列に置き換えます。翻訳文字列の次の3文字。
コメント
- 先頭と末尾の引用符(および入力に引用符がある場合は内部エスケープ)が疑われます)出力でこれが不適格になる可能性があります。とにかく、
b
を正規表現に追加します(/[#{b=...}/
)。 - スペース
p $*
は不要だと思います -
-p
フラグを使用して、追加のバイトを保存します。ruby -pe 'gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}'
- 78 + 2を数えます(
-pe
)。どうやって71を取得しますか? - @NotthatCharlesこの場合、実行に必要な文字は本当に重要ですか? ‘数えませんでした。
回答
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を見つけたと思う-基本的な答えはここにあります!
とにかく、入力は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の小文字は2バイトです。 eseach。