Phiên dịch tiếng Anh sang người nước ngoài


18

Cuộc họp

Người ngoài hành tinh đã định cư trên trái đất và thật kỳ lạ, bảng chữ cái của họ giống hệt như chúng ta. Ngôn ngữ của họ cũng rất giống với ngôn ngữ của chúng ta với một số khác biệt rất khác biệt và dễ tính toán.

Thử thách

Lấy một chuỗi và xuất ra ngôn ngữ tương đương của người ngoài hành tinh. Bản dịch hoạt động như vậy:

Hoán đổi tất cả các nguyên âm trong từ với tương ứng:

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

Bạn cũng có thể viết một dịch giả khác để dịch Alien-> tiếng Anh, tuy nhiên đây là tùy chọn.

Ví dụ

Input: Shaun
Output: Shoboikin

Input: Java
Output: Jobovobo

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

Nếu nguyên âm được viết hoa thì bạn viết hoa chữ cái đầu tiên ..

Input: Alan
Output: Obolobon

Input: Australia
Output: Oboikistroboliniobo

Quy tắc

  • Áp dụng sơ hở tiêu chuẩn
  • Phải làm việc cho văn bản có chứa dòng mới
  • Bạn có thể viết một hàm, lambda hoặc chương trình đầy đủ

    Capingrobotikilobotiniapin apin wrinitining thunu runuvunursunu trobonslobotapir!


Tôi không chắc những gì bạn cũng có thể viết một dịch giả khác để dịch Alien-> tiếng Anh có nghĩa là gì. Chúng ta có thể viết trình dịch ngược thay vì thông thường không?
Dennis

4
Có lẽ đó chỉ là tôi, nhưng đối với tôi điều đó cũng không rõ ràng . Dù sao, tôi không chắc đây là quy tắc như thế nào nếu nó không phải là một phần của nhiệm vụ thực tế.
Dennis

@Dennis Bạn có một chút chơi chữ, nhưng tôi đã chỉnh sửa nó để làm cho nó rõ ràng hơn.
Shaun Wild

2
Tại sao yêu cầu cho dòng mới? Theo tôi, điều này là không cần thiết và không thêm bất cứ điều gì vào điểm chính của thử thách.
Ad Nam

1
Đầu vào có thể chứa bất kỳ ký tự ASCII nào hay chỉ một tập hợp con. Ví dụ, bao giờ sẽ có số trong đầu vào?
Riley

Câu trả lời:


14

Haskell, 100 91 byte

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

5
Hoboskunull chắc chắn
jk.

12

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

Hy vọng người ngoài hành tinh sử dụng máy tính TI-83/84;)

Chương trình chính, 173 byte

THƯỞNG: Giữ dòng thứ hai hoặc thứ ba tùy thuộc vào việc bạn muốn một người dịch bình thường hay ngược lại.

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

Chương trình con ( 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

Chương trình con ( 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 ~đại diện cho mã thông báo 0x81@đại diện cho mã thông báo 0x7F, tìm hiểu thêm tại đây .

PPS Một phần của lý do tại sao các chương trình này có một số byte cao là bởi vì sub(, inString(, length(, và tất cả các chữ thường là hai byte mỗi ...


Tôi nghĩ rằng bạn đã trộn lẫn prgmRprgmQtrong tiêu đề mã của bạn một lần?
Chỉ huy Byte

Vâng, cảm ơn vì đã nắm bắt được điều đó @ByteCommander :)
Timtech

8

Perl, 56 byte

Bao gồm +1 cho -p

Cung cấp đầu vào trên STDIN

alien.pl:

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

Hoạt động như được hiển thị, nhưng thay thế các \xXXlối thoát bằng ký tự thực tế để có được số điểm được yêu cầu


1
+1 Upvote chỉ dành cho avatar người ngoài hành tinh. Đùa thôi, giải pháp cũng hay đấy.
Hỗn loạn

1
Chúa Giêsu Kitô .. Perl ở tốt nhất của nó, phụ nữ và gents.
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,

Điều này có hoạt động cho đầu vào có chứa dòng mới?
Jordan

@Jordan Nó làm. sed đọc "một dòng tại một thời điểm". Vì vậy, nó sẽ xử lý mọi thứ cho đến dòng mới đầu tiên, in nó, in một dòng mới, sau đó bắt đầu lại nếu có nhiều văn bản hơn.
Riley

À, tất nhiên rồi. 👍🏻
Jordan

@Jordan Đó không phải là một quy tắc khi tôi viết bài này, nhưng cuối cùng nó vẫn hoạt động.
Riley

6

Python, 99 95 93 byte

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

Trên ideone.com ...

Khá đơn giản. Chỉ cần lấy chỉ mục chúng ta tìm thấy mỗi ký tự trong danh sách nguyên âm và sử dụng nó để kéo ba ký tự chúng ta cần. Nếu nó không được tìm thấy, .find()trả về -1vì vậy chỉ cần dán ký tự hiện tại vào cuối chuỗi. Các khoảng trắng là cần thiết để bất kỳ chữ cái "a"nào không bao gồm thêm c. Các nguyên âm được dịch được nhóm theo thứ tự chữ cái (chữ cái đầu tiên của mỗi bản dịch, sau đó là thứ hai, sau đó là thứ ba).


Wow, cách tiếp cận sáng tạo tốt đẹp. Tôi rất ấn tượng :)
Chỉ huy Byte

1
Bạn có thể xóa khoảng trống trong["aeiouAEIOU".find(c)::11] for
acrolith

6

05AB1E , 28 27 20 byte

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

Hãy thử trực tuyến!

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

@Bas VềAlanTuring: Mất quá nhiều thời gian để dịch nó trong đầu. Tôi nghĩ rằng tôi cần một dịch giả ngược: P
Emigna

2
Đi cho nó, không nên quá khó: P
Shaun Wild

Đáng sợ, tôi nghĩ rằng nó nói tôi yêu golf.
datagod

Tôi đã thay đổi câu hỏi của tôi khiến bạn trả lời không hợp lệ. Điều này phải hoạt động với các dòng mới
Shaun Wild

5

PHP, 91 byte

<?=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 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)

Xem nó chạy trên ideone.com

Đây là một phiên bản được định dạng độc đáo hơn:

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)

Các phần thú vị nhất là { ... }.get(l.lower(), l)cố gắng tra cứu chữ cái được lưu trữ lthành chữ thường trong từ điển và trả về phiên bản dịch (nếu tìm thấy), hoặc nếu không là chữ cái gốc,
[str, str.capitalize][ord(l) < 91]( ... )kiểm tra xem chữ cái gốc có phải là chữ in hoa không ( Mã ASCII điểm thấp hơn 91) và sau đó gọi str()hàm bằng chữ cái là đối số (nếu đó không phải là chữ in hoa, không có gì) hoặc str.capitalize()hàm (chuyển đổi chữ cái đầu tiên của chuỗi đối số thành chữ hoa).


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

Hãy thử trực tuyến!

Dựa trên câu trả lời của @algmyr và -8 chỉ nhờ @ ASCII

Phiên bản ít chơi gôn

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 - chỉ

cũng có thể 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 - chỉ

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 - chỉ

4

Mẻ, 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

Đưa đầu vào vào STDIN. Xử lý từng ký tự có sự tiện lợi của phân biệt chữ hoa chữ thường.


Batch chỉ là công cụ tồi tệ nhất cho mọi thứ, phải không? (Chà, ít nhất thì bạn đã đánh bại TI-Basic :) Nhân tiện, rất vui khi thấy một con cá tuyết trong Batch, nhân tiện!
YYYYY

4

Bình thường, 42 byte

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

Một chương trình nhận đầu vào trên STDIN và in đầu ra.

Dùng thử trực tuyến

Làm thế nào nó hoạt động

#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 byte

Tôi thực sự không muốn bỏ thói quen luôn luôn thực hiện các chức năng chính khi mã hóa C, nhưng điều này ngắn hơn đáng kể so với phiên bản chính và bằng cách này tôi đã có một chữ cái khác để đánh vần những gì tôi muốn!

Chơi gôn

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

Đã bình luận

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ó một cái gì đó đặc biệt về C và bạn có thể kinh khủng như thế nào với con trỏ và như vậy.



@ceilingcat Tôi muốn tự mình đăng câu trả lời. Nó đủ để xứng đáng với câu trả lời của riêng mình. :)
algmyr


3

Javascript (ES6), 94 93 92 byte

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

Đã lưu 1 byte nhờ edc65
Đã lưu 1 byte nhờ Neil

Bản giới thiệu

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
Để kiểm tra giá trị trả về .indexOf.searchsử dụng ~thay vì<0
edc65

1
Tôi nhìn để xem điều gì sẽ xảy ra nếu bạn chỉ thay thế các nguyên âm và ban đầu tôi nhận s=>s.replace(/[aeiou]/gi,c=>"ouiaiOUIAI"[n="aeiouAEIOU".indexOf(c)]+"bnnpk"[n%=5]+"ouiii"[n])được vẫn là 93 byte. Nhưng vì cbây giờ được biết đến là một nguyên âm, bây giờ bạn có thể sử dụng searchthay vì indexOfđể lưu một byte!
Neil

@Neil - Tốt đẹp! Tôi đã thử cả hai, thực sự, nhưng không nghĩ đến việc kết hợp chúng.
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;}

vô dụng:

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

Và Alien trở lại tiếng Anh (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;}

Ung dung:

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 byte

Chuỗi được dịch là trong biến 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

Toán học, 128 byte

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

Không chắc chắn liệu một chương trình ngắn hơn có thể thu được bằng cách sử dụng IgnoreCase->Truecùng với kiểm tra trường hợp.


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


@ceilingcat & c có thể ổn nếu nó lưu số dưới dạng byte1 byte2 byte3 ... Ví dụ 255 trong bộ nhớ là ff 00 00 00 nhưng nếu có endian khác cho 255, chúng ta có 00 00 00 ff và in chuỗi void ...
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;}

đưa char*t="aeiou";vào vòng lặp tiết kiệm 1 byte
Mukul Kumar


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

Chỉnh sửa (cảm ơn milk)

cảm ơn bạn :) Tôi thực sự biết sự quá tải này nhưng bằng cách nào đó hoàn toàn quên nó khi viết bài này ..

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

Bạn có thể sử dụng Select(char, int)quá tải để không cần phải khai báo ivà có thể đặt tất cả trong một dòng. s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));
sữa

2

C, 207 202 byte (nhờ 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) Tôi ghét bỏ sót loại trước bất kỳ loại khai báo nào

2) Tôi không thực sự muốn đặt mã không sử dụng (không có hàm main ())

Sử dụng:

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

Chào mừng đến với PPCG!
Martin Ender

@MartinEnder, thật bất ngờ ... nhưng cảm ơn bạn :)
Xdevelnet

(c=getchar())!= EOFcó thể trở thành~(c=getchar())
Cyoce


1

Swift 2.2 196 byte

¯ \ _ (ツ) _ /

Chơi gôn

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

không có ý thức

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

Là không gian var r = [cần thiết?
Cyoce

Vâng trong ứng dụng sân chơi nếu bạn không đặt khoảng trắng ở giữa một nhiệm vụ, nó sẽ báo lỗi và cho bạn thêm khoảng trắng. Swift có lẽ là một trong những ngôn ngữ tồi tệ nhất để chơi golf nhưng tôi nghĩ sẽ rất vui nếu thử.
Danwakeem

Và thật thú vị khi nó không gây ra lỗi cho tôi khi tôi gán biến cho một bao đóng. Do đó, người đàn ông nhún vai
Danwakeem

vâng tôi cũng nhận thấy điều đó Đó là lý do tại sao tôi bối rối.
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')}

Mở rộng:

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

Sử dụng:

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 byte

(dòng mới được thêm vào cho rõ ràng)

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

Chỉ cần tra cứu bảng và chuyển đổi boolean.

Tra cứu từng chữ cái trong bảng (chuỗi) nguyên âm; nếu tìm thấy, sau đó sửa đổi nó theo quy tắc trong bảng s. In mỗi ký tự theo sau bởi một chuỗi: nếu tìm thấy nguyên âm, hãy in ký tự được sửa đổi theo giá trị stheo sau là phần còn lại của âm tiết được lưu trữ trong bảng f; nếu không tìm thấy nguyên âm, hãy in ký tự gốc và một chuỗi trống.



0

Ruby, 102 93 91 88 78 byte

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

Giải trình:

Thực hiện dòng như ruby -pe "gsub(/[#{b='aeiouAEIOU'}]/){'obounuiniapiikiOboUnuIniApiIki'[b.index($&)*3,3]}", loại tiếp theo, ví dụ, Australianó sẽ xuất ra : Oboikistroboliniobo.

Điều này khá đơn giản, thay thế tất cả các nguyên âm bằng một chuỗi con dựa trên chỉ mục của nguyên âm được thay thế trong (b), lần 3 và 3 ký tự tiếp theo trong chuỗi dịch.


1
Tôi nghi ngờ các dấu ngoặc kép hàng đầu và dấu (và thoát bên trong nếu đầu vào có dấu ngoặc kép) trong đầu ra có thể không đủ điều kiện này. Dù sao, bạn có thể lưu hai byte bằng cách di chuyển phép gán bvào Regapi ( /[#{b=...}/).
Jordan

1
Tôi nghĩ không gian p $*là không cần thiết
Cyoce

1
Sử dụng -pcờ để lưu các byte bổ sung. ruby -pe 'gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}'
Mực giá trị

Tôi đếm 78 + 2 ( -pe). Làm thế nào để bạn có được 71?
Không phải Charles

@NotthatCharles các ký tự cần thiết để thực hiện có thực sự quan trọng trong trường hợp này không? Tôi chỉ không đếm chúng.
Xe đạp

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

Nghĩ rằng tôi sẽ tìm thấy một câu trả lời TI-BASIC khác ở đây!

Dù sao, đầu vào là một chuỗi tiếng Anh Ans.
Đầu ra là chuỗi dịch.

Ví dụ:

"HE
HE
prgmCDGF1A
HUnu
"Hello
Hello
prgmCDGF1A
Hunullapi

Giải thích:
(Dòng mới được thêm vào để dễ đọc. Nhiều dòng từ cùng một dòng sẽ được ký hiệu bằng một :khối mã sau.)

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"

Ghi chú:

  • TI-BASIC là một ngôn ngữ được mã hóa. Số lượng ký tự không bằng số byte.

  • Các chữ cái viết thường trong TI-BASIC là hai byte mỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.