Tradutor de inglês para estrangeiro

18

Briefing

Os estrangeiros se estabeleceram na Terra e, estranhamente, o alfabeto deles é exatamente o mesmo que o nosso. A linguagem deles também é muito parecida com a nossa, com algumas diferenças muito distintas e fáceis de calcular.

Desafio

Pegue uma corda e produza o equivalente em idioma do estrangeiro. A tradução funciona da seguinte maneira:

Troque todas as vogais da palavra pelo correspondente:

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

Você também pode escrever outro tradutor para traduzir Alien-> English, mas isso é opcional.

Exemplos

Input: Shaun
Output: Shoboikin

Input: Java
Output: Jobovobo

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

Se a vogal estiver em maiúscula, você maiúscula a primeira letra.

Input: Alan
Output: Obolobon

Input: Australia
Output: Oboikistroboliniobo

Regras

  • Aplicam-se brechas padrão
  • Deve funcionar para o texto que contém novas linhas
  • Você pode escrever uma função, lambda ou programa completo

    Capingrobotikilobotiniapins apin wrinitining thunu runuvunursunu trobonslobotapir!

Shaun Wild
fonte
Não sei ao certo o que você também pode escrever outro tradutor para traduzir Alien-> English . Podemos escrever o tradutor reverso em vez do tradutor regular?
Dennis
4
Talvez seja só eu, mas não é óbvio para mim que também carrega esse significado aqui. De qualquer forma, não tenho certeza de como isso é uma regra, se não fizer parte da tarefa real.
Dennis
@ Dennis Você está sendo um pouco punudobontinental, mas eu o editei para torná-lo mais claro.
Shaun Wild
2
Por que o requisito para novas linhas? Na minha opinião, isso é desnecessário e não adiciona nada ao ponto principal do desafio.
Adnan
1
A entrada pode conter qualquer caractere ASCII ou apenas um subconjunto? Por exemplo, haverá sempre números na entrada?
Riley

Respostas:

14

Haskell, 100 91 bytes

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

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

Espero que os alienígenas usem calculadoras TI-83/84;)

Programa principal, 173 bytes

BÔNUS: Mantenha a segunda ou terceira linha, dependendo se você deseja um tradutor normal ou reverso.

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

Subprograma ( prgmQ), 59 bytes:

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

Subprograma ( prgmR), 148 bytes:

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 ~representa token 0x81e @representa token 0x7F, saiba mais aqui .

PPS Parte da razão pela qual estes programas têm uma alta contagem de byte é porque sub(, inString(, length(, e todas as letras minúsculas são dois bytes cada ...

Timtech
fonte
Eu acho que você misturou prgmRe prgmQem suas manchetes de código uma vez?
Byte Commander
Sim, obrigado por captura que @ByteCommander :)
Timtech
8

Perl, 56 bytes

Inclui +1 para -p

Dê entrada no STDIN

alien.pl:

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

Funciona como mostrado, mas substitua os \xXXescapes pelo personagem real para obter a pontuação reivindicada

Ton Hospel
fonte
1
Marcado com +1 apenas para o avatar Alien. Brincadeirinha, a solução é boa também.
Chaotic
1
Jesus Cristo .. Perl no seu melhor, senhoras e senhores.
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
fonte
Isso funciona para entradas que contêm novas linhas?
Jordan
@ Jordan Faz. sed lê "uma linha de cada vez". Portanto, ele processará tudo até a primeira nova linha, imprima isso, imprima uma nova linha e inicie novamente se houver mais texto.
Riley
Ah, claro. 👍🏻
Jordan
@ Jordan Essa não era uma regra quando escrevi isso, mas acabou funcionando de qualquer maneira.
Riley
6

Python, 99 95 93 bytes

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

Em ideone.com ...

Bem simples. Basta pegar o índice em que encontramos cada caractere na lista de vogais e usá-lo para extrair os três caracteres de que precisamos. Se não for encontrado, .find()retorna , -1portanto, basta colar o caractere atual no final da string. Os espaços são necessários para que qualquer letra "a"não inclua a adição c. As vogais traduzidas são agrupadas por ordem das letras (a primeira letra de cada tradução, depois a segunda e depois a terceira).

SCB
fonte
Uau, boa abordagem criativa. Estou impressionado :)
Byte Commander
1
Você pode remover o espaço em["aeiouAEIOU".find(c)::11] for
acrolith
6

05AB1E , 28 27 20 bytes

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

Experimente online!

Unuxplobonobotiniapin

žÀ                    # the string "aeiouAEIOU"
  .•₅%~≠#ùÛãú•        # the string "obounuiniapiiki"
              3ô      # split in pieces of 3
                D™«   # concatenate with a title-case copy
                   ‡  # transliterate
Emigna
fonte
2
Ini lapivunu gapilfining!
Shaun Wild
@BasicallyAlanTuring: Levei muito tempo para traduzir isso na minha cabeça. Eu acho que preciso de um tradutor reverso: P
Emigna
2
Vá em frente, não deve ser muito difícil: P
Shaun Wild
Assustador, acho que diz que eu amo golfe.
datagod 16/09/16
Alterei minha pergunta, o que faz com que você responda inválido. Este trabalho deve com novas linhas
Shaun selvagem
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
fonte
5

Python, 129 bytes

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)

Veja em execução em ideone.com

Aqui está uma versão mais bem formatada:

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)

As partes mais interessantes são as { ... }.get(l.lower(), l)que tentam procurar a letra armazenada em lletras minúsculas convertidas em minúsculas no dicionário e retornam a versão traduzida (se encontrada) ou a letra original
e [str, str.capitalize][ord(l) < 91]( ... )que verifica se a letra original era uma letra maiúscula ( Ponto de código ASCII menor que 91) e, em seguida, chama a str()função com a letra como argumento (se não for uma letra maiúscula, não faz nada) ou a str.capitalize()função (converte a primeira letra da sequência de argumentos em maiúsculas).

Byte Commander
fonte
5

C (gcc) , 150 141 136 134 bytes

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

Experimente online!

Com base na resposta de @algmyr e -8, graças a @ ASCII-only

Versão menos golfe

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;
}
teto
fonte
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;}
somente ASCII em
talvez também 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]));}
somente ASCII em
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]);}
Somente ASCII em
4

Lote, 215 bytes

@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

Recebe entrada em STDIN. O processamento de caractere por caractere tem a conveniência de fazer distinção entre maiúsculas e minúsculas.

Neil
fonte
Lote é apenas a pior ferramenta para tudo, não é? (Bem, pelo menos você venceu o TI-Basic :) É bom ver um codegolf no Batch, por sinal!
YoYoYonnY
4

Pitão, 42 bytes

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

Um programa que recebe entrada no STDIN e imprime a saída.

Experimente online

Como funciona

#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
fonte
4

C, 167 bytes

Eu realmente não queria quebrar meu hábito de sempre executar funções principais ao codificar C, mas isso é substancialmente mais curto que a versão com main e, dessa forma, recebi outra letra para soletrar o que queria!

Golfe

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

Comentado

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

Há algo de especial em C e o quão horrível você pode ser com ponteiros e coisas do tipo.

algmyr
fonte
151 bytes
ceilingcat 24/02
@ceilingcat Eu diria que publique sua resposta por conta própria. É divergente o suficiente para merecer sua própria resposta. :)
algmyr 24/02
3

Retina , 60 bytes

A contagem de bytes assume a codificação ISO 8859-1.

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

Experimente online!

Martin Ender
fonte
3

Javascript (ES6), 94 93 92 bytes

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

Guardado 1 byte graças a edc65
Guardado 1 byte graças a 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
fonte
1
Para verificar o valor de retorno .indexOfe .searchutilizar ~em vez de<0
edc65
1
Eu olhei para ver o que aconteceria se você apenas substituísse as vogais e, originalmente, obtive s=>s.replace(/[aeiou]/gi,c=>"ouiaiOUIAI"[n="aeiouAEIOU".indexOf(c)]+"bnnpk"[n%=5]+"ouiii"[n])93 bytes. Mas como cagora é conhecido como uma vogal, agora você pode usar em searchvez de indexOfsalvar um byte!
Neil
@Neil - Nice! Tentei os dois, na verdade, mas não pensei em combiná-los.
Arnauld
2

Java 8, 172 bytes

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

E Alien de volta ao inglês (171 bytes):

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
fonte
2

Tcl, 75 bytes

Cadeia a ser traduzida é na variável 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
fonte
2

Mathematica, 128 bytes

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

Não tenho certeza se um programa mais curto pode ser obtido usando IgnoreCase->Truejunto com uma verificação de caso.

u54112
fonte
2

C 178 bytes

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
fonte
1
153 bytes
ceilingcat
@ceilingcat & c pode estar ok se salvar o número como byte1 byte2 byte3 ... Por exemplo, 255 na memória como ff 00 00 00, mas se houver o outro endian para 255, temos 00 00 00 ff e imprimimos a string nula ...
RosLuP
2

C, 163 162 159 bytes

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
fonte
colocar char*t="aeiou";no loop economiza 1 byte
Mukul Kumar
144 bytes
ceilingcat
2

C #, 133 121 bytes

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

Editar (graças a milk )

obrigado :) Eu realmente conheço essa sobrecarga, mas de alguma forma esqueci completamente ao escrever isso ..

s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));
Stefan
fonte
Você pode usar a Select(char, int)sobrecarga para não precisar declarar ie colocar tudo em uma linha. s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));
milk
2

C, 207 202 bytes (graças a 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) Detesto omitir o tipo antes de qualquer tipo de declaração

2) Eu realmente não gosto de colocar código inutilizável (sem a função main ())

Uso:

c89 cg.c -o cg; echo "Testing" | ./cg
Xdevelnet
fonte
Bem-vindo ao PPCG!
Martin Ender
@MartinEnder, que é inesperado ... mas obrigado :)
Xdevelnet
(c=getchar())!= EOFpode se tornar~(c=getchar())
Cyoce 20/09/16
143 bytes
ceilingcat
1

Swift 2.2 196 bytes

¯ \ _ (ツ) _ / ¯

Golfe

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
fonte
Os espaços são var r = [necessários?
Cyoce 20/09/16
Sim, no aplicativo playgrounds, se você não colocar um espaço entre uma tarefa, isso gera um erro e diz para você adicionar espaços. Swift é provavelmente um dos piores idiomas para jogar golfe, mas achei que seria divertido tentar.
Danwakeem 20/09/16
E foi interessante não me dar esse erro quando eu estava atribuindo uma variável a um fechamento. Daí o homem encolher os ombros
Danwakeem 20/09/16
Sim, eu notei isso também. Por isso fiquei confuso.
Cyoce 20/09/16
0

Perl 6 ,  84  82 bytes

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

Expandido:

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

Uso:

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
fonte
0

C - 192 bytes

(novas linhas adicionadas para maior clareza)

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

Basta procurar tabelas e um switch booleano.

Pesquise cada letra na tabela (string) de vogais; se encontrado, modifique-o de acordo com a regra na tabelas . Imprima cada caractere seguido de uma sequência: se uma vogal for encontrada, imprima o caractere modificado pelo valor em sseguido pelo restante da sílaba armazenada na tabela f; se uma vogal não foi encontrada, imprima o caractere original e uma string vazia.

musaritmia
fonte
149 bytes
ceilingcat
0

Ruby, 102 93 91 88 78 bytes

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

Explicação:

Execute a linha como ruby -pe "gsub(/[#{b='aeiouAEIOU'}]/){'obounuiniapiikiOboUnuIniApiIki'[b.index($&)*3,3]}", em seguida, digite, por exemplo,Australia a saída:Oboikistroboliniobo .

É bem simples, substitua todas as vogais por uma substring baseada no índice da vogal a ser substituída em (b), vezes 3 e nos próximos 3 caracteres na sequência de conversão.

Biketire
fonte
1
Eu suspeito que as aspas à esquerda e à direita (e escapes internas se a entrada tiver aspas) na saída podem desqualificar isso. De qualquer forma, você pode salvar dois bytes movendo a atribuição de bpara o Regexp ( /[#{b=...}/).
Jordânia
1
Eu acho que o espaço p $*é desnecessário
Cyoce
1
Use o -psinalizador para salvar bytes adicionais. ruby -pe 'gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}'
Value Ink
Eu conto 78 + 2 ( -pe). Como você consegue 71?
Não que Charles,
@NotthatCharles, os caracteres necessários para a execução realmente importam nesse caso? Eu apenas não os contei.
Biketire 27/09/16
0

TI-BASIC, 201 197 195 bytes

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

Pensar que eu encontraria outra resposta TI-BASIC aqui!

De qualquer forma, a entrada é uma string em inglês Ans.
A saída é a sequência traduzida.

Exemplos:

"HE
HE
prgmCDGF1A
HUnu
"Hello
Hello
prgmCDGF1A
Hunullapi

Explicação:
(Novas linhas adicionadas para facilitar a leitura. Várias linhas da mesma linha serão indicadas com um :no seguinte bloco de código.)

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"

Notas:

  • TI-BASIC é uma linguagem tokenizada. Contagem de caracteres não é igual à contagem de bytes.

  • Letras minúsculas no TI-BASIC têm dois bytes cada.

Tau
fonte