Переводчик с английского на иностранный

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!

Шон Уайлд
источник
Я не уверен, что вы также можете написать другой переводчик, чтобы переводить иностранца-> английский должен означать. Можем ли мы написать обратный переводчик вместо обычного?
Деннис
4
Может быть, это только я, но это не очевидно для меня, что также несет этот смысл здесь. Во всяком случае, я не уверен, как это правило, если оно не является частью реальной задачи.
Деннис
@Dennis Ты немного капризный, но я отредактировал его, чтобы сделать его более понятным.
Шон Уайлд,
2
Почему требование перевода строки? На мой взгляд, в этом нет необходимости, и это ничего не добавляет к основному смыслу задачи.
Аднан
1
Может вход содержит любой символ ASCII или только подмножество. Например, будут ли когда-нибудь цифры на входе?
Райли

Ответы:

14

Haskell, 100 91 байт

(>>= \x->last$[x]:[y|(z:y)<-words"aobo eunu iini oapi uiki AObo EUnu IIni OApi UIki",z==x])
Damien
источник
5
Hoboskunull наверняка
.
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(, и все строчные буквы два байта каждый ...

Timtech
источник
Я думаю, что вы перепутали 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

Работает, как показано, но заменяет \xXXэкранирование на фактический персонаж, чтобы получить заявленный счет

Тон Хоспел
источник
1
+1 Проголосовал только за чужой аватар. Шучу, решение тоже хорошее.
Хаотично
1
Иисус Христос .. Perl в лучшем виде, дамы и господа.
Прииду Нимре
6

седьмой 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 читает "одна строка за раз". Таким образом, он будет обрабатывать все до первой новой строки, печатать ее, печатать новую строку, а затем начинать заново, если текста больше.
Райли
Ах, конечно. J
Иордания
@ Джордан Это не было правилом, когда я писал это, но все равно получилось.
Райли
6

Питон, 99 95 93 байта

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

На ideone.com ...

Довольно просто Просто возьмите индекс, в котором мы находим каждый символ в списке гласных, и используем его, чтобы получить три символа, которые нам нужны. Если он не найден, .find()возвращается, -1поэтому просто вставьте текущий символ в конец строки. Пробелы необходимы, поэтому ни одна буква "a"не содержит добавленных c. Переведенные гласные сгруппированы по порядку букв (первая буква каждого перевода, затем вторая, затем третья).

SCB
источник
Ух, хороший творческий подход. Я впечатлен :)
Byte Commander
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
Emigna
источник
2
Ини лапивуну зияет!
Шон Уайлд,
@BasicallyAlanTuring: у меня ушло слишком много времени, чтобы перевести это в моей голове. Я думаю, что мне нужен обратный переводчик: P
Emigna
2
Пойдите для этого, не должно быть слишком трудно: P
Шон Уайлд
Страшно, я думаю, это говорит о том, что я люблю гольф.
датагод
Я изменил свой вопрос, из-за чего вы отвечаете неверно. Это должно работать с новыми строками
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()функцию (преобразует первую букву строки аргумента в верхний регистр).

Byte Commander
источник
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;
}
ceilingcat
источник
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
TheBikingViking
источник
4

C 167 байт

Я действительно не хотел избавляться от своей привычки всегда выполнять основные функции при кодировании C, но это существенно короче, чем версия с main, и таким образом я получил еще одно письмо, чтобы написать то, что я хотел!

Golfed

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

В Си есть что-то особенное, и как ужасно ты можешь быть с указателями и тому подобным.

algmyr
источник
151 байт
floorcat
@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 байт благодаря Нейлу

демонстрация

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
источник
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сохранения байта!
Нил
@ Нил - Отлично! Я попробовал оба, на самом деле, но не думал объединить их.
Арно
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;
}
Al R
источник
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вместе с проверкой случая.

u54112
источник
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);}
RosLuP
источник
1
153 байта
floorcat
@ceilingcat & c может быть в порядке, если он сохраняет число как byte1 byte2 byte3 ... Например, 255 в памяти как ff 00 00 00, но если для 255 есть другой порядковый номер, мы имеем 00 00 00 ff и выводим строку void ...
РосЛюП
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;}
o79y
источник
ввод char*t="aeiou";в цикл сохраняет 1 байт
Мукул Kumar
144 байта
roofcat
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
Xdevelnet
источник
Добро пожаловать в PPCG!
Мартин Эндер
@MartinEnder, это неожиданно ... но спасибо :)
Xdevelnet
(c=getchar())!= EOFможет стать~(c=getchar())
Cyoce
143 байт
ceilingcat
1

Swift 2.2 196 байт

¯ \ _ (ツ) _ / ¯

Golfed

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)
}
Danwakeem
источник
Нужны ли пробелы var r = [?
Cyoce
Да, в приложении для игровых площадок, если вы не ставите пробел между заданиями, оно выдаст вам ошибку и предложит вам добавить пробелы. Свифт, наверное, один из худших языков для игры в гольф, но я подумал, что было бы интересно попробовать.
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')}

Expanded:

# 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
Брэд Гилберт b2gills
источник
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; если гласный не был найден, выведите исходный символ и пустую строку.

musarithmia
источник
149 байт
floorcat
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 символа в строке перевода.

Biketire
источник
1
Я подозреваю, что начальные и конечные кавычки (и внутренние экранированные символы, если на входе есть кавычки) в выходных данных могут это дисквалифицировать. В любом случае, вы можете сохранить два байта, переместив присваивание bв регулярное выражение ( /[#{b=...}/).
Джордан,
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

Объяснение:
(Новые строки добавлены для удобства чтения. Несколько строк из одной и той же строки будут обозначены символом :в следующем блоке кода.)

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 по два байта каждая.

Тау
источник