เครื่องมือแปลภาษาอังกฤษเป็นภาษาต่างประเทศ


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

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • ต้องทำงานกับข้อความที่มีบรรทัดใหม่
  • คุณสามารถเขียนฟังก์ชั่นแลมบ์ดาหรือโปรแกรมเต็มรูปแบบ

    Capingrobotikilobotiniapins apin wrinitining thunu runuvunursunu trobonslobotapir!


ฉันไม่แน่ใจว่าสิ่งที่คุณอาจเขียนนักแปลคนอื่นเพื่อแปล Alien-> ภาษาอังกฤษควรจะหมายถึง เราสามารถเขียนตัวแปลกลับแทนตัวแปลปกติได้หรือไม่?
Dennis

4
บางทีมันอาจจะเป็นเพียงฉัน แต่มันก็ไม่ชัดเจนกับผมว่ายังดำเนินความหมายนี้ได้ที่นี่ อย่างไรก็ตามฉันไม่แน่ใจว่านี่เป็นกฎอย่างไรถ้าไม่ใช่ส่วนหนึ่งของงานจริง
เดนนิส

@Dennis คุณเป็นคนน่าเบื่อเล็กน้อย แต่ฉันได้แก้ไขเพื่อให้ชัดเจนขึ้น
Shaun Wild

2
ทำไมต้องมีการขึ้นบรรทัดใหม่ ในความคิดของฉันมันไม่จำเป็นและไม่ได้เพิ่มอะไรเลยในประเด็นหลักของความท้าทาย
Adnan

1
อินพุตสามารถมีอักขระ ASCII ใด ๆ หรือเฉพาะเซ็ตย่อยเท่านั้น เช่นจะมีตัวเลขอยู่ในอินพุตหรือไม่
Riley

คำตอบ:



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

8

Perl, 56 ไบต์

รวม +1 สำหรับ -p

ให้อินพุตบน STDIN

alien.pl:

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

ทำงานตามที่แสดง แต่แทนที่\xXXEscape ด้วยอักขระจริงเพื่อรับคะแนนที่อ้างสิทธิ์


1
+1 โหวตให้กับรูปแทนคนต่างด้าวเท่านั้น แค่ล้อเล่นทางออกก็ดีเช่นกัน
วุ่นวาย

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,

สิ่งนี้ใช้งานได้กับอินพุตที่มีการขึ้นบรรทัดใหม่หรือไม่
Jordan

@ จอร์แดนมันทำ sed อ่าน "ทีละบรรทัด" ดังนั้นมันจะประมวลผลทุกอย่างจนถึง newline แรกพิมพ์ว่าพิมพ์ newline แล้วเริ่มใหม่หากมีข้อความมากขึ้น
Riley

อ่าแน่นอน 👍🏻
Jordan

@Jordan นั่นไม่ใช่กฎตอนที่ฉันเขียนสิ่งนี้ แต่มันก็ยังทำงานได้อยู่ดี
Riley

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

1
คุณสามารถลบช่องว่างใน["aeiouAEIOU".find(c)::11] for
acrolith

6

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

2
Ini lapivunu gapilfining!
Shaun Wild

@BasicallyAlanTuring: เอาฉันนานเกินไปที่จะแปลมันในหัวของฉัน ฉันคิดว่าฉันต้องการนักแปลแบบย้อนกลับ: P
Emigna

2
ไปหามันไม่ควรยากเกินไป: P
Shaun Wild

น่ากลัวฉันคิดว่ามันบอกว่าฉันรักกอล์ฟ
datagod

ฉันเปลี่ยนคำถามซึ่งทำให้คุณตอบไม่ถูกต้อง ต้องทำงานกับบรรทัดใหม่
Shaun Wild


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- เท่านั้น

รุ่น golfed น้อย

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 :) ดีใจที่ได้เห็น codegolf ในแบทช์!
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 แต่นี่สั้นกว่าเวอร์ชั่นหลักอย่างมากและด้วยวิธีนี้ฉันได้รับจดหมายอีกฉบับเพื่อสะกดสิ่งที่ฉันต้องการ!

แข็งแรงเล่นกอล์ฟ

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

บันทึก 1 ไบต์ขอบคุณ edc65
บันทึก 1 ไบต์ขอบคุณ Neil

การสาธิต

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

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

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

และเอเลี่ยนกลับมาเป็นภาษาอังกฤษ (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;}

Ungolfed:

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


@ceilingcat & c สามารถตกลงได้ถ้ามันบันทึกหมายเลขเป็น byte1 byte2 byte3 ... ตัวอย่างเช่น 255 ในหน่วยความจำเป็น ff 00 00 00 แต่ถ้ามี endian อื่น ๆ สำหรับ 255 เรามี 00 00 00 ff และพิมพ์สตริงโมฆะ ...
RosLuP


2

C #, 133 121 ไบต์

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

@ มาร์ตินเดอร์นั่นเป็นสิ่งที่คาดไม่ถึง ... แต่ขอบคุณ :)
Xdevelnet

(c=getchar())!= EOFสามารถกลายเป็น~(c=getchar())
Cyoce


1

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

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 = [จำเป็นต้องใช้ช่องว่างหรือไม่
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

ทับทิม, 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 ตัวอักษรถัดไปในสตริงการแปล


1
ฉันสงสัยว่าเครื่องหมายอัญประกาศนำหน้าและต่อท้าย (และการหลีกเลี่ยงภายในหากอินพุตมีเครื่องหมายอัญประกาศ) ในผลลัพธ์อาจตัดสิทธิ์นี้ อย่างไรก็ตามคุณสามารถบันทึกสองไบต์ด้วยการย้ายการกำหนดbไปยัง Regexp ( /[#{b=...}/)
Jordan

1
ฉันคิดว่าพื้นที่p $*ไม่จำเป็น
Cyoce

1
ใช้-pแฟล็กเพื่อบันทึกไบต์เพิ่มเติม ruby -pe 'gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}'
Value Ink

ฉันนับ 78 + 2 ( -pe) คุณจะได้ 71 อย่างไร
ไม่ใช่ชาร์ลส์ที่

@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

คำอธิบาย:
(เพิ่มบรรทัดใหม่เพื่อให้สามารถอ่านได้หลายบรรทัดจากบรรทัดเดียวกันจะถูกแสดงด้วย a :ในบล็อคโค้ดต่อไปนี้)

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 สองไบต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.