Penerjemah Bahasa Inggris ke Bahasa Alien

18

Pengarahan

Alien telah menetap di bumi dan anehnya, alfabet mereka sama persis dengan kita. Bahasa mereka juga sangat mirip dengan bahasa kami dengan beberapa perbedaan yang sangat berbeda dan mudah dihitung.

Tantangan

Ambil string dan tampilkan bahasa asing yang setara. Terjemahan berfungsi seperti itu:

Tukar semua vokal dalam kata dengan yang sesuai:

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

Anda juga dapat menulis penerjemah lain untuk menerjemahkan Bahasa Inggris-> Bahasa Inggris, namun ini opsional.

Contohnya

Input: Shaun
Output: Shoboikin

Input: Java
Output: Jobovobo

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

Jika vokal dikapitalisasi maka Anda menggunakan huruf kapital pertama ..

Input: Alan
Output: Obolobon

Input: Australia
Output: Oboikistroboliniobo

Aturan

  • Celah standar berlaku
  • Harus berfungsi untuk teks yang berisi baris baru
  • Anda dapat menulis fungsi, lambda, atau program lengkap

    Capingrobotikilobotiniapins dan wrinitining thunu runuvunursunu trobonslobotapir!

Shaun Wild
sumber
Saya tidak yakin apa yang Anda maksudkan dengan penerjemah lain untuk menerjemahkan bahasa asing-> Bahasa Inggris yang seharusnya. Bisakah kita menulis penerjemah balik alih-alih yang biasa?
Dennis
4
Mungkin hanya saya, tetapi tidak jelas bagi saya yang juga membawa makna ini di sini. Bagaimanapun, saya tidak yakin bagaimana ini aturan jika itu bukan bagian dari tugas yang sebenarnya.
Dennis
@ Dennis Anda sedikit punudobontinic, tapi saya sudah mengeditnya untuk membuatnya lebih jelas.
Shaun Wild
2
Mengapa persyaratan untuk baris baru? Menurut pendapat saya, ini tidak perlu dan tidak menambahkan apa pun ke poin utama dari tantangan.
Adnan
1
Bisakah input berisi karakter ASCII atau hanya sebagian. Misalnya, apakah akan ada angka dalam input?
Riley

Jawaban:

14

Haskell, 100 91 byte

(>>= \x->last$[x]:[y|(z:y)<-words"aobo eunu iini oapi uiki AObo EUnu IIni OApi UIki",z==x])
Damien
sumber
5
Hoboskunull pasti
jk.
12

TI-Basic, 173 + 59 + 148 = 380 byte

Semoga alien menggunakan kalkulator TI-83/84;)

Program Utama, 173 byte

BONUS: Pertahankan baris kedua atau ketiga tergantung pada apakah Anda menginginkan penerjemah yang normal atau terbalik.

"("+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

Subprogram ( prgmQ), 59 byte:

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

Subprogram ( prgmR), 148 byte:

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 ~mewakili token 0x81dan @mewakili token 0x7F, pelajari lebih lanjut di sini .

PPS Bagian dari mengapa program ini memiliki jumlah byte tinggi adalah karena sub(, inString(, length(, dan semua huruf kecil dua byte masing-masing ...

Timtech
sumber
Saya pikir Anda campur aduk prgmRdan prgmQdi headline kode Anda sekali?
Byte Commander
Ya, terima kasih telah menangkap @ByteCommander :)
Timtech
8

Perl, 56 byte

Termasuk +1 untuk -p

Berikan masukan pada STDIN

alien.pl:

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

Bekerja seperti yang ditunjukkan, tetapi ganti \xXXlolos dengan karakter yang sebenarnya untuk mendapatkan skor yang diklaim

Ton Hospel
sumber
1
+1 Diperbaharui hanya untuk avatar Alien. Hanya bercanda, solusinya juga bagus.
Chaotic
1
Tuhan Yesus .. Perl yang terbaik, tuan-tuan dan nyonya-nyonya.
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,
Riley
sumber
Apakah ini berfungsi untuk input yang berisi baris baru?
Jordan
@ Jordan Tidak. sed membaca "satu baris pada suatu waktu". Jadi itu akan memproses semuanya hingga baris pertama, cetak itu, cetak baris baru, kemudian mulai lagi jika ada lebih banyak teks.
Riley
Ah, tentu saja. 👍🏻
Jordan
@ Jordan Itu bukan aturan ketika saya menulis ini, tapi akhirnya berhasil juga.
Riley
6

Python, 99 95 93 byte

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

Di ideone.com ...

Cukup mudah. Ambil saja indeks yang kita temukan masing-masing karakter di dalam daftar vokal dan gunakan untuk menarik tiga karakter yang kita butuhkan. Jika tidak ditemukan, .find()kembali -1jadi tempelkan karakter saat ini di akhir string. Spasi diperlukan agar huruf apa "a"pun tidak termasuk yang ditambahkan c. Vokal yang diterjemahkan dikelompokkan berdasarkan urutan huruf (huruf pertama dari setiap terjemahan, lalu yang kedua, kemudian yang ketiga).

SCB
sumber
Wow, pendekatan kreatif yang bagus. Saya terkesan :)
Byte Commander
1
Anda dapat menghapus ruang di["aeiouAEIOU".find(c)::11] for
acrolith
6

05AB1E , 28 27 20 byte

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

Cobalah online!

Unuxplobonobotiniapin

žÀ                    # the string "aeiouAEIOU"
  .•₅%~≠#ùÛãú•        # the string "obounuiniapiiki"
              3ô      # split in pieces of 3
                D™«   # concatenate with a title-case copy
                   ‡  # transliterate
Emigna
sumber
2
Ini lapivunu gapilfining!
Shaun Wild
@BasicallyAlanTuring: Butuh waktu terlalu lama untuk menerjemahkannya di kepala saya. Saya rasa saya perlu penerjemah terbalik: P
Emigna
2
Pergi untuk itu, tidak boleh terlalu sulit: P
Shaun Wild
Menakutkan, saya pikir dikatakan saya suka golf.
datagod
Saya telah mengubah pertanyaan saya yang membuat Anda menjawab tidak valid. Ini harus bekerja dengan baris baru
Shaun Wild
5

PHP, 91 Bytes

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

Python, 129 byte

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)

Lihat itu berjalan di ideone.com

Berikut versi yang diformat dengan lebih baik:

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)

Bagian yang paling menarik adalah { ... }.get(l.lower(), l)mencoba mencari huruf yang disimpan dalam huruf kecil lke dalam kamus dan mengembalikan versi terjemahan (jika ditemukan), atau huruf aslinya,
dan [str, str.capitalize][ord(l) < 91]( ... )yang memeriksa apakah huruf aslinya adalah huruf kapital ( Titik kode ASCII lebih rendah dari 91) dan kemudian memanggil str()fungsi dengan huruf sebagai argumen (jika bukan huruf kapital, tidak melakukan apa-apa) atau str.capitalize()fungsi (mengubah huruf pertama dari string argumen ke huruf besar).

Komandan Byte
sumber
5

C (gcc) , 150 141 136 134 byte

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;}

Cobalah online!

Berdasarkan jawaban oleh @algmyr dan -8 terima kasih hanya untuk @ ASCII

Versi kurang golf

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;
}
plafon
sumber
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
mungkin juga 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-only
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

Batch, 215 byte

@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

Mengambil input pada STDIN. Memproses karakter demi karakter memiliki kenyamanan menjadi case-sensitive.

Neil
sumber
Batch hanyalah alat terburuk untuk semuanya, bukan? (Yah, setidaknya Anda mengalahkan TI-Basic :) Senang melihat codegolf di Batch, omong-omong!
YoYoYonnY
4

Pyth, 42 byte

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

Program yang mengambil input pada STDIN dan mencetak hasilnya.

Cobalah online

Bagaimana itu bekerja

#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
TheBikingViking
sumber
4

C, 167 byte

Saya benar-benar tidak ingin menghentikan kebiasaan saya untuk selalu melakukan fungsi-fungsi utama saat mengkode C, tetapi ini jauh lebih singkat daripada versi dengan main dan dengan cara ini saya mendapat surat lain untuk mengeja apa yang saya inginkan!

Golf

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]));}

Berkomentar

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 */
}

Ada sesuatu yang istimewa tentang C dan betapa mengerikannya Anda dengan pointer dan semacamnya.

algmyr
sumber
151 byte
ceilingcat
@ceilingcat saya akan mengatakan memposting jawaban Anda sendiri. Sudah cukup menyimpang sehingga pantas dijawab sendiri. :)
algmyr
3

Retina , 60 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

[A-Z]
»$&
T`L`l
i
ini
u
iki
e
unu
a
·b·
o
api
·
o
T`»l`_L`».

Cobalah online!

Martin Ender
sumber
3

Javascript (ES6), 94 93 92 byte

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

Disimpan 1 byte berkat edc65
1 byte disimpan berkat Neil

Demo

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>

Arnauld
sumber
1
Untuk memeriksa nilai balik .indexOfdan .searchmenggunakan ~alih-alih<0
edc65
1
Saya melihat untuk melihat apa yang akan terjadi jika Anda hanya mengganti vokal, dan saya awalnya mendapat s=>s.replace(/[aeiou]/gi,c=>"ouiaiOUIAI"[n="aeiouAEIOU".indexOf(c)]+"bnnpk"[n%=5]+"ouiii"[n])yang masih 93 byte. Tetapi karena csekarang dikenal sebagai vokal, Anda sekarang dapat menggunakan searchalih-alih indexOfmenghemat satu byte!
Neil
@Neil - Bagus! Saya mencoba keduanya, sebenarnya, tetapi tidak berpikir tentang menggabungkan mereka.
Arnauld
2

Java 8, 172 byte

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;}

ungolfed:

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;
}

Dan Alien kembali ke Bahasa Inggris (171 byte):

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;}

Tidak Disatukan:

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;
}
Al R
sumber
2

Tcl, 75 byte

String yang akan diterjemahkan ada dalam variabel s.

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

Mathematica, 128 byte

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

Tidak yakin apakah program yang lebih pendek dapat diperoleh dengan menggunakan IgnoreCase->Truebersama dengan pemeriksaan kasus.

u54112
sumber
2

C 178 byte

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);}
RosLuP
sumber
1
153 byte
ceilingcat
@ceilingcat & c bisa ok jika menyimpan nomor sebagai byte1 byte2 byte3 ... Misalnya 255 dalam memori sebagai ff 00 00 00 tetapi jika ada endian lain untuk 255 kami memiliki 00 00 00 ff dan mencetak string kosong ...
RosLuP
2

C, 163 162 159 byte

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;}
o79y
sumber
memasukkan char*t="aeiou";ke dalam untuk loop menghemat 1 byte
Mukul Kumar
144 byte
ceilingcat
2

C #, 133 121 byte

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

Edit (terima kasih kepada milk)

terima kasih :) Saya benar-benar tahu kelebihan ini tetapi entah bagaimana benar-benar lupa ketika menulis ini ..

s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));
Stefan
sumber
Anda dapat menggunakan Select(char, int)kelebihan sehingga Anda tidak perlu mendeklarasikan idan dapat menempatkan semuanya dalam satu baris. s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));
susu
2

C, 207 202 byte (terima kasih kepada 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) Saya benci menghilangkan tipe sebelum segala jenis deklarasi

2) Saya tidak terlalu suka menaruh kode yang tidak dapat digunakan (tanpa fungsi main ())

Pemakaian:

c89 cg.c -o cg; echo "Testing" | ./cg
Xdevelnet
sumber
Selamat datang di PPCG!
Martin Ender
@ MartinEnder, itu tidak terduga ... tapi terima kasih :)
Xdevelnet
(c=getchar())!= EOFdapat menjadi~(c=getchar())
Cyoce
143 byte
ceilingcat
1

Swift 2.219 byte

¯ \ _ (ツ) _ / ¯

Golf

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);}

tidak disatukan

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)
}
Danwakeem
sumber
Apakah ruang var r = [diperlukan?
Cyoce
Ya di aplikasi taman bermain jika Anda tidak memberi spasi di antara tugas yang memberi Anda kesalahan dan memberitahu Anda untuk menambahkan spasi. Swift mungkin adalah salah satu bahasa terburuk untuk bermain golf, tetapi saya pikir akan menyenangkan untuk mencoba.
Danwakeem
Dan itu menarik, itu tidak memberi saya kesalahan itu ketika saya menugaskan variabel untuk penutupan. Oleh karena itu pria yang mengangkat bahu
Danwakeem
ya saya perhatikan itu juga. Itu sebabnya saya bingung.
Cyoce
0

Perl 6 ,  84  82 byte

{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')}

Diperluas:

# 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' )
}

Pemakaian:

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
Brad Gilbert b2gills
sumber
0

C - 192 byte

(baris baru ditambahkan untuk kejelasan)

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]);}}

Hanya tabel pencarian dan saklar boolean.

Cari setiap huruf dalam tabel (string) vokal; jika ditemukan, maka modifikasi sesuai aturan dalam tabel s. Cetak setiap karakter diikuti oleh string: jika vokal ditemukan, cetak karakter yang diubah oleh nilai sdiikuti oleh sisa suku kata yang disimpan dalam tabel f; jika vokal tidak ditemukan, cetak karakter asli dan string kosong.

musarithmia
sumber
149 byte
ceilingcat
0

Ruby, 102 93 91 88 78 byte

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

Penjelasan:

Mengeksekusi baris seperti ruby -pe "gsub(/[#{b='aeiouAEIOU'}]/){'obounuiniapiikiOboUnuIniApiIki'[b.index($&)*3,3]}", jenis up berikutnya, misalnya, Australiaseharusnya keluaran: Oboikistroboliniobo.

Ini cukup mudah, ganti semua vokal dengan substring berdasarkan indeks vokal yang akan diganti di (b), kali 3 dan 3 karakter berikutnya dalam string terjemahan.

Biketire
sumber
1
Saya menduga tanda kutip terkemuka dan tertinggal (dan internal lolos jika input memiliki tanda kutip) dalam output mungkin mendiskualifikasi ini. Lagi pula, Anda dapat menyimpan dua byte dengan memindahkan penugasan bke dalam Regexp ( /[#{b=...}/).
Jordan
1
Saya pikir ruang p $*tidak perlu
Cyoce
1
Gunakan -pbendera untuk menyimpan byte tambahan. ruby -pe 'gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}'
Nilai Tinta
Saya menghitung 78 + 2 ( -pe). Bagaimana Anda mendapatkan 71?
Bukannya Charles
@NotthatCharles apakah karakter yang diperlukan untuk eksekusi benar-benar penting dalam kasus ini? Aku hanya tidak menghitungnya.
Biketire
0

TI-BASIC, 201 197 195 byte

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

Untuk berpikir bahwa saya akan menemukan jawaban TI-BASIC lain di sini!

Bagaimanapun, inputnya adalah string bahasa Inggris di Ans.
Outputnya adalah string yang diterjemahkan.

Contoh:

"HE
HE
prgmCDGF1A
HUnu
"Hello
Hello
prgmCDGF1A
Hunullapi

Penjelasan:
(Baris baru ditambahkan agar mudah dibaca. Beberapa baris dari baris yang sama akan dilambangkan dengan a :di blok kode berikut.)

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"

Catatan:

  • TI-BASIC adalah bahasa tokenized. Jumlah karakter tidak sama dengan jumlah byte.

  • Huruf kecil dalam TI-BASIC masing-masing adalah dua byte.

Tau
sumber