Tłumacz z angielskiego na obcy

18

Odprawa

Obcy osiedlili się na ziemi i, o dziwo, ich alfabet jest dokładnie taki sam jak nasz. Ich język jest również bardzo podobny do naszego z kilkoma bardzo wyraźnymi i łatwymi do obliczenia różnicami.

Wyzwanie

Weź ciąg i wypisz odpowiednik języka obcego. Tłumaczenie działa jako takie:

Zamień wszystkie samogłoski w słowie na odpowiednie:

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

Możesz także napisać innego tłumacza, który przetłumaczy Alien-> angielski, jest to jednak opcjonalne.

Przykłady

Input: Shaun
Output: Shoboikin

Input: Java
Output: Jobovobo

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

Jeśli samogłoska jest pisana wielką literą, to pierwsza litera jest pisana wielką literą.

Input: Alan
Output: Obolobon

Input: Australia
Output: Oboikistroboliniobo

Zasady

  • Obowiązują standardowe luki
  • Musi działać w przypadku tekstu zawierającego nowe wiersze
  • Możesz napisać funkcję, lambda lub pełny program

    Capingrobotikilobotiniapins apin wrinitining thunu runuvunursunu trobonslobotapir!

Shaun Wild
źródło
Nie jestem pewien, co może oznaczać napisanie innego tłumacza do tłumaczenia Alien-> angielski . Czy możemy napisać tłumaczenie wsteczne zamiast zwykłego?
Dennis
4
Może to tylko ja, ale nie jest dla mnie oczywiste, że ma to tutaj również znaczenie. W każdym razie nie jestem pewien, jak to jest reguła, jeśli nie jest częścią rzeczywistego zadania.
Dennis
@Dennis Jesteś trochę punudobontiniczny, ale ja to zredagowałem, żeby było jaśniej.
Shaun Wild,
2
Dlaczego wymóg dotyczący nowych linii? Moim zdaniem jest to niepotrzebne i nie dodaje niczego do głównego punktu wyzwania.
Adnan
1
Czy dane wejściowe mogą zawierać dowolny znak ASCII lub tylko podzbiór. Np. Czy na wejściu będą kiedyś liczby?
Riley

Odpowiedzi:

14

Haskell, 100 91 bajtów

(>>= \x->last$[x]:[y|(z:y)<-words"aobo eunu iini oapi uiki AObo EUnu IIni OApi UIki",z==x])
Damien
źródło
5
Hoboskunull na pewno
jk.
12

TI-Basic, 173 + 59 + 148 = 380 bajtów

Mam nadzieję, że obcy używają kalkulatorów TI-83/84;)

Program główny, 173 bajty

BONUS: Zachowaj drugą lub trzecią linię w zależności od tego, czy chcesz tłumaczenie zwykłe czy zwrotne.

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

Podprogram ( prgmQ), 59 bajtów:

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

Podprogram ( prgmR), 148 bajtów:

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 ~reprezentuje token 0x81i @reprezentuje token 0x7F, dowiedz się więcej tutaj .

PPS Część dlaczego te programy mają wysoką Liczba bajtów jest dlatego sub(, inString(, length(, a wszystkie litery małe są dwa bajty każdy ...

Timtech
źródło
Myślę, że miesza się prgmRi prgmQw nagłówkach kodowych raz?
Byte Commander
Tak, dzięki za złapanie tego @ByteCommander :)
Timtech
8

Perl, 56 bajtów

Obejmuje +1 dla -p

Podaj dane na STDIN

alien.pl:

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

Działa tak, jak pokazano, ale zamień \xXXucieczki na rzeczywistą postać, aby uzyskać wynik

Ton Hospel
źródło
1
+1 Awansowane tylko dla awatara Obcych. Żartuję, rozwiązanie jest również miłe.
Chaotyczny
1
Jezus Chrystus .. Perl w najlepszym wydaniu, panie i panowie.
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
źródło
Czy to działa w przypadku danych wejściowych zawierających nowe wiersze?
Jordan
@Jordan Tak. sed czyta „jedną linię na raz”. Przetwarza więc wszystko do pierwszego nowego wiersza, drukuje to, drukuje nowy wiersz, a następnie zaczyna od nowa, jeśli jest więcej tekstu.
Riley
Ach, oczywiście. 👍🏻
Jordan
@Jordan Nie było to regułą, kiedy to napisałem, ale ostatecznie i tak zadziałało.
Riley
6

Python, 99 95 93 bajtów

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

Na ideone.com ...

Dość proste. Wystarczy wziąć indeks, w którym znajdujemy każdy znak na liście samogłosek, i użyć go, aby wyciągnąć trzy potrzebne nam znaki. Jeśli nie zostanie znaleziony, .find()zwraca, -1więc po prostu przyklej bieżący znak na końcu łańcucha. Spacje są konieczne, więc żadna litera "a"nie zawiera dodanego c. Przetłumaczone samogłoski są pogrupowane według kolejności liter (pierwsza litera każdego tłumaczenia, potem druga, potem trzecia).

SCB
źródło
Wow, fajne kreatywne podejście. Jestem pod wrażeniem :)
Byte Commander
1
Możesz usunąć miejsce w["aeiouAEIOU".find(c)::11] for
acrolith
6

05AB1E , 28 27 20 bajtów

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

Wypróbuj online!

Unuxplobonobotiniapin

žÀ                    # the string "aeiouAEIOU"
  .•₅%~≠#ùÛãú•        # the string "obounuiniapiiki"
              3ô      # split in pieces of 3
                D™«   # concatenate with a title-case copy
                   ‡  # transliterate
Emigna
źródło
2
Ini lapivunu gapilfining!
Shaun Wild,
@BasicallyAlanTuring: Zajęło mi to zbyt dużo czasu, aby przetłumaczyć to w mojej głowie. Myślę, że potrzebuję tłumacza zwrotnego: P
Emigna
2
Idź, nie powinno być zbyt trudne: P
Shaun Wild
Przerażające, myślę, że mówi, że kocham golfa.
datagod
Zmieniłem moje pytanie, co powoduje, że odpowiedź jest nieprawidłowa. To musi działać z nowymi liniami
Shaun Wild,
5

PHP, 91 bajtów

<?=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
źródło
5

Python, 129 bajtów

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)

Zobacz, jak działa na ideone.com

Oto ładniej sformatowana wersja:

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)

Najciekawsze są te części, { ... }.get(l.lower(), l)które próbują wyszukać literę zapisaną w lsłowniku jako skonwertowane na małe litery i albo zwraca przetłumaczoną wersję (jeśli została znaleziona), albo oryginalną literę
i [str, str.capitalize][ord(l) < 91]( ... )sprawdza, czy oryginalna litera była wielką literą ( Punkt kodu ASCII niższy niż 91), a następnie wywołuje str()funkcję z literą jako argumentem (jeśli nie jest wielką literą, nic nie robi) lub str.capitalize()funkcją (konwertuje pierwszą literę ciągu argumentu na wielkie litery).

Bajt Dowódca
źródło
5

C (gcc) , 150 141 136 134 bajtów

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

Wypróbuj online!

Na podstawie odpowiedzi @algmyr i -8 dzięki @ ASCII-only

Wersja mniej golfowa

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;
}
sufitowy
źródło
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;}
Tylko ASCII,
może także 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]));}
Tylko 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]);}
Tylko ASCII,
4

Partia, 215 bajtów

@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

Pobiera dane wejściowe na STDIN. Przetwarzanie znak po znaku ma tę zaletę, że rozróżnia małe i wielkie litery.

Neil
źródło
Partia jest po prostu najgorszym narzędziem do wszystkiego, prawda? (Cóż, przynajmniej pokonałeś TI-Basic :) Nawiasem mówiąc, miło jest zobaczyć codegolfa w partii!
YoYoYonnY
4

Pyth, 42 bajty

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

Program, który pobiera dane wejściowe na STDIN i drukuje dane wyjściowe.

Wypróbuj online

Jak to działa

#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
źródło
4

C, 167 bajtów

Naprawdę nie chciałem zerwać z nawykiem wykonywania głównych funkcji podczas kodowania C, ale jest to znacznie krótsze niż wersja z głównym i w ten sposób otrzymałem kolejną literę, aby przeliterować to, co chciałem!

Grał w golfa

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

Skomentował

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

Jest coś wyjątkowego w C i jak okropnym możesz być ze wskaźnikami i tym podobne.

algmyr
źródło
151 bajtów
pułap pułapu
@ceilingcat Powiedziałbym, że opublikuj swoją odpowiedź samodzielnie. Jest wystarczająco rozbieżny, aby zasłużyć na własną odpowiedź. :)
algmyr
3

JavaScript (ES6), 94 93 92 bajty

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

Zapisano 1 bajt dzięki edc65
Zapisano 1 bajt dzięki Neil

Próbny

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
źródło
1
Aby sprawdzić wartość zwracaną .indexOfi .searchużyć ~zamiast<0
edc65
1
Spojrzałem, aby zobaczyć, co by się stało, gdybyście zastąpili samogłoski, i pierwotnie dostałem, s=>s.replace(/[aeiou]/gi,c=>"ouiaiOUIAI"[n="aeiouAEIOU".indexOf(c)]+"bnnpk"[n%=5]+"ouiii"[n])który wciąż ma 93 bajty. Ale ponieważ cobecnie jest znana jako samogłoska, możesz teraz użyć searchzamiast indexOfzapisać bajt!
Neil
@Neil - Nicea! Próbowałem obu, ale nie zastanawiałem się nad ich połączeniem.
Arnauld,
2

Java 8, 172 bajty

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

bez golfa:

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

I Alien wraca do angielskiego (171 bajtów):

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

Nie golfowany:

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.
źródło
2

Tcl, 75 bajtów

Ciąg do przetłumaczenia znajduje się w zmiennej 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
źródło
2

Mathematica, 128 bajtów

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

Nie jestem pewien, czy krótszy program można uzyskać, używając IgnoreCase->Truerazem ze sprawdzaniem wielkości liter.

u54112
źródło
2

C 178 bajtów

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
źródło
1
153 bajty
pułapkat
@ceilingcat & c może być w porządku, jeśli zapisze numer jako bajt1 bajt2 bajt3 ... Na przykład 255 w pamięci jako ff 00 00 00, ale jeśli istnieje inny endian dla 255, mamy 00 00 00 ff i wypisujemy ciąg nieważny ...
RosLuP,
2

C, 163 162 159 bajtów

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
źródło
wstawienie char*t="aeiou";do pętli oszczędza 1 bajt
Mukul Kumar
144 bajty
pułapkat
2

C #, 133 121 bajtów

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

Edytuj (dzięki milk)

dziękuję :) Tak naprawdę znam to przeciążenie, ale jakoś całkowicie zapomniałem o tym pisząc ..

s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));
Stefan
źródło
Możesz użyć Select(char, int)przeciążenia, więc nie musisz deklarować ii możesz umieścić wszystko w jednym wierszu. s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));
mleko
2

C, 207 202 bajtów (dzięki 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) Nienawidzę pomijać typu przed jakimikolwiek deklaracjami

2) Nie bardzo lubię umieszczać bezużyteczny kod (bez funkcji main ())

Stosowanie:

c89 cg.c -o cg; echo "Testing" | ./cg
Xdevelnet
źródło
Witamy w PPCG!
Martin Ender
@MartinEnder, to nieoczekiwane ... ale dziękuję :)
Xdevelnet
(c=getchar())!= EOFmoże zostać~(c=getchar())
Cyoce
143 bajty
pułapkat
1

Swift 2,2 196 bajtów

¯ \ _ (ツ) _ / ¯

Grał w golfa

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
źródło
Czy miejsca są var r = [konieczne?
Cyoce,
Tak, w aplikacji o placach zabaw, jeśli nie umieścisz spacji między zadaniami, pojawi się błąd i wyświetli polecenie dodania spacji. Swift jest prawdopodobnie jednym z najgorszych języków do gry w golfa, ale pomyślałem, że fajnie byłoby spróbować.
Danwakeem,
I to było interesujące, że nie dało mi tego błędu, gdy przypisywałem zmienną do zamknięcia. Stąd wzruszający człowiek
Danwakeem,
tak, też to zauważyłem. Właśnie dlatego byłem zdezorientowany.
Cyoce,
0

Perl 6 ,  84  82 bajtów

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

Rozszerzony:

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

Stosowanie:

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
źródło
0

C - 192 bajty

(dodano nowe linie dla zachowania przejrzystości)

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

Po prostu tabele wyszukiwania i przełącznik boolowski.

Wyszukaj każdą literę w tabeli (ciąg) samogłosek; jeśli zostanie znaleziony, zmodyfikuj go zgodnie z regułą w tabeli s. Wydrukuj każdy znak, a następnie ciąg: jeśli znaleziono samogłoskę, wydrukuj znak zmodyfikowany wartością, sa następnie resztą sylaby przechowywanej w tabeli f; jeśli nie znaleziono samogłoski, wydrukuj oryginalny znak i pusty ciąg.

musarithmia
źródło
149 bajtów
pułapkat
0

Ruby, 102 93 91 88 78 bajtów

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

Wyjaśnienie:

Wykonaj wiersz jak ruby -pe "gsub(/[#{b='aeiouAEIOU'}]/){'obounuiniapiikiOboUnuIniApiIki'[b.index($&)*3,3]}"na przykład typ następnego, na przykład,Australia powinien wypisać:Oboikistroboliniobo .

Jest to dość proste, zamień wszystkie samogłoski na podłańcuch oparty na indeksie samogłoski, która ma zostać zastąpiona w (b), razy 3 i kolejnych 3 znakach w ciągu tłumaczenia.

Biketire
źródło
1
Podejrzewam, że wiodące i końcowe znaki cudzysłowu (i wewnętrzne znaki ucieczki, jeśli dane wejściowe zawierają znaki cudzysłowu), mogą zdyskwalifikować to. W każdym razie możesz zapisać dwa bajty, przenosząc przypisanie bdo funkcji Regexp ( /[#{b=...}/).
Jordan
1
Myślę, że przestrzeń p $*jest niepotrzebna
Cyoce,
1
Użyj -pflagi, aby zapisać dodatkowe bajty. ruby -pe 'gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}'
Wartość tuszu
Liczę 78 + 2 ( -pe). Jak zdobyć 71?
Nie to, że Charles
@NotthatCharles czy znaki potrzebne do wykonania naprawdę mają znaczenie w tym przypadku? Po prostu ich nie policzyłem.
Biketire 27.09.16
0

TI-BASIC, 201 197 195 bajtów

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

Pomyśleć, że znajdę tutaj kolejną odpowiedź TI-BASIC!

W każdym razie, wejście jest w języku angielskim Ans.
Dane wyjściowe to przetłumaczony ciąg.

Przykłady:

"HE
HE
prgmCDGF1A
HUnu
"Hello
Hello
prgmCDGF1A
Hunullapi

Objaśnienie:
(Dodano nowe linie dla zwiększenia czytelności. Wiele linii z tej samej linii będzie oznaczonych przez :w poniższym bloku kodu).

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"

Uwagi:

  • TI-BASIC jest językiem tokenizowanym. Liczba znaków nie jest równa liczbie bajtów.

  • Małe litery w TI-BASIC mają po dwa bajty.

Tau
źródło