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 znaków i wypisz jego odpowiednik w języku 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 również napisać innego tłumacza, który przetłumaczy Obcego -> 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 list ..

Input: Alan Output: Obolobon Input: Australia Output: Oboikistroboliniobo 

Reguły

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

    Capingrobotikilobotiniapins apin wrinitining thunu runuvunursunu trobonslobotapir!

Komentarze

  • I ' Nie wiem, co Możesz też napisać innego tłumacza, który przetłumaczy Obcy- > angielski ma oznaczać. Czy możemy napisać tłumacza wstecznego zamiast zwykłego?
  • Może to ' to tylko ja, ale ' nie jest dla mnie oczywiste, że również ma tutaj to znaczenie. W każdym razie ' nie wiem, jak to jest reguła , jeśli ' nie jest częścią rzeczywistej
  • @Dennis Ty ' jesteś trochę punudobontiniczny, ale ' zmodyfikowałeś to, aby było jaśniejsze.
  • Po co wymóg używania nowych linii? Moim zdaniem jest to niepotrzebne i nie ' nie dodaje niczego do głównego punktu wyzwania.
  • Czy dane wejściowe mogą zawierać dowolny znak ASCII lub tylko podzbiór . Np. Czy dane wejściowe będą kiedykolwiek zawierać liczby?

Odpowiedz

Haskell, 100 91 bajtów

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

Komentarze

  • Hoboskunull na pewno

Odpowiedź

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

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

Program główny, 173 bajty

BONUS: Zachowaj drugą lub trzecią linię w zależności od tego, czy chcesz mieć tłumacz normalny czy odwrotny.

"("+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 0x81, a @ reprezentuje token 0x7F, dowiedz się więcej tutaj .

PPS Przyczyną dużej liczby bajtów tych programów jest między innymi to, że sub(, inString(, length( , a wszystkie małe litery mają po dwa bajty …

Komentarze

  • Myślę, że pomieszałeś prgmR i prgmQ w nagłówkach kodu?
  • Tak, dziękuję za złapanie @ByteCommander 🙂

Odpowiedź

Perl, 56 bajtów

Obejmuje +1 dla -p

Podaj dane wejściowe na STDIN

alien.pl:

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

Działa jak pokazano, ale zamień znaki \xXX na właściwy znak, aby uzyskać żądany wynik

Komentarze

  • +1 Zagłosowano tylko za awatara Obcego. Żartuję, rozwiązanie też jest fajne.
  • Jezu Chryste … Perl w najlepszym wydaniu, panie i panowie.

Odpowiedź

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, 

Komentarze

  • Czy to działa dla wejścia, które zawiera znaki nowej linii?
  • @Jordan Tak. sed czyta ” po jednym wierszu na raz „. Więc przetworzy wszystko, aż do pierwszej nowej linii, wydrukuje to, wypisze nową linię, a następnie zacznie od nowa, jeśli jest więcej tekstu.
  • Ach, oczywiście. 👍🏻
  • @Jordan To nie była ' reguła, kiedy to pisałem, ale i tak działało.

Odpowiedź

Python, 99 95 93 bajty

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

Na ideone.com …

Całkiem proste. Po prostu weź indeks, w którym znajdujemy każdy znak na liście samogłosek i użyj go do wyciągnięcia trzech potrzebnych nam znaków.Jeśli nie zostanie znaleziony, .find() zwraca -1, więc po prostu umieść bieżący znak na końcu ciągu. 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, następnie druga, a następnie trzecia).

Komentarze

  • Wow, fajne kreatywne podejście. ' Jestem pod wrażeniem 🙂
  • Możesz usunąć spację w ["aeiouAEIOU".find(c)::11] for

Odpowiedź

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 

Komentarze

  • Ini lapivunu gapilfining!
  • @BasicallyAlanTuring: Zbyt wiele czasu zajęło mi przetłumaczenie tego w mojej głowie. Myślę, że potrzebuję tłumacza zwrotnego: P
  • Idź do tego, nie powinno ' nie być zbyt trudne: P
  • Straszne, myślę jest napisane, że kocham golfa.
  • Zmieniłem ' pytanie, przez co odpowiedź jest nieprawidłowa. To musi działać z nowymi wierszami

Odpowiedź

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

Odpowiedź

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) 

Najbardziej interesujące części to { ... }.get(l.lower(), l), który próbuje wyszukać literę zapisaną w l przekonwertowanym na małe litery w słowniku i zwracają przetłumaczoną wersję (jeśli została znaleziona) lub oryginalną literę
i [str, str.capitalize][ord(l) < 91]( ... ), która sprawdza, czy oryginalna litera była wielką literą ( Punkt kodowy ASCII mniejszy niż 91), a następnie wywołuje funkcję str() z literą jako argumentem (jeśli nie była to duża litera, nic nie robi) lub str.capitalize() function (konwertuje pierwszą literę ciągu argumentu wielkie litery).

Odpowiedź

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 udzielonej przez @algmyr i -8 dzięki @ ASCII-only

Mniej golfowa wersja

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

Komentarze

  • 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;}
  • może też 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]));}
  • 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]);}

Odpowiedź

Wsad, 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 zapewnia wygodę polegającą na rozróżnianiu wielkości liter.

Komentarze

  • Batch to najgorsze narzędzie do wszystkiego, isn ' prawda? (Cóż, przynajmniej udało ci się pokonać TI-Basic 🙂 Przy okazji, miło widzieć codegolfa w Batch!

Odpowiedz

Pyth, 42 bajty

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

Program, który przyjmuje 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 

Odpowiedź

C, 167 bajtów

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

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

Skomentowane

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 okropny możesz być ze wskaźnikami itp.

Komentarze

  • 151 bajtów
  • @ceilingcat I ' d powiedz opublikuj swoją odpowiedź samodzielnie. ' jest na tyle rozbieżny, że zasługuje na własną odpowiedź. 🙂

Odpowiedź

Retina , 60 bajtów

Liczba bajtów przy założeniu kodowania ISO 8859-1.

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

Wypróbuj online!

Odpowiedź

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 Neilowi

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 size=80 oninput="translate()" value="Hello, World!"><br><input size=80 disabled> 

Komentarze

  • Aby sprawdzić zwracaną wartość .indexOf i .search, użyj ~ zamiast <0
  • Spojrzałem, co by się stało, gdybyś wymienił tylko samogłoski, i pierwotnie otrzymałem s=>s.replace(/[aeiou]/gi,c=>"ouiaiOUIAI"[n="aeiouAEIOU".indexOf(c)]+"bnnpk"[n%=5]+"ouiii"[n]), które nadal ma 93 bajty . Ale ponieważ c jest teraz znane jako samogłoska, możesz teraz używać search zamiast indexOf zaoszczędzić bajt!
  • @Neil – Super! Próbowałem obu, ale nie ' nie myślałem o ich połączeniu.

Odpowiedź

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

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

I Alien z powrotem 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;} 

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

Odpowiedź

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 

Odpowiedź

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 mam pewności, czy krótszy program można uzyskać, używając IgnoreCase->True razem ze sprawdzaniem wielkości liter.

Odpowiedź

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

Komentarze

  • 153 bajty
  • @ceilingcat & c może być w porządku, jeśli zapisze liczbę 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 void string …

Answer

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

Komentarze

  • umieszczenie char*t="aeiou"; w pętli for zapisuje 1 bajt
  • 144 bajty

Odpowiedź

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ę 🙂 Właściwie znam to przeciążenie, ale jakoś zupełnie o nim zapomniałem, pisząc to ..

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

Komentarze

  • Możesz użyć przeciążenia Select(char, int), więc nie ' nie musisz deklarować i i umieści to wszystko w jednej linii. s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));

Odpowiedź

C, 207 202 bajty (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 jakąkolwiek deklaracją

2) Nie lubię umieszczać bezużytecznego kodu (bez funkcji main ())

Użycie:

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

Komentarze

  • Witamy w PPCG!
  • @MartinEnder, to ' jest nieoczekiwane … ale dziękuję 🙂
  • (c=getchar())!= EOF może stać się ~(c=getchar())
  • 143 bajty

Odpowiedź

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

Komentarze

  • Czy spacje znajdują się w var r = [ konieczne?
  • Tak, w aplikacji placów zabaw, jeśli nie ' nie wstawisz spacji między przydziałem, spowoduje to błąd i poprosi o dodanie spacji . Swift jest prawdopodobnie jednym z najgorszych języków do gry w golfa, ale pomyślałem, że fajnie by było spróbować.
  • Co ciekawe, nie ' nie dał mi tego błąd podczas przypisywania zmiennej do zamknięcia. Stąd wzruszający ramionami mężczyzna
  • tak, też to zauważyłem. To ' powód, dla którego byłem zdezorientowany.

Odpowiedź

Perl 6 , 84 82 bajty

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

Rozwinięty:

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

Użycie:

 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  

Odpowiedź

C – 192 bajty

(dla przejrzystości dodano nowe wiersze)

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

Wystarczy przeglądać tabele i przełącznik boolowski.

Wyszukaj każdą literę w tabeli (ciągu) samogłosek; jeśli zostanie znaleziony, zmodyfikuj go zgodnie z regułą w tabeli s. Wydrukuj każdy znak, po którym następuje ciąg: jeśli znaleziono samogłoskę, wypisuje znak zmodyfikowany przez wartość w s, po którym następuje reszta sylaby przechowywanej w tabeli f; jeśli samogłoska nie została znaleziona, wydrukuj oryginalny znak i pusty ciąg.

Komentarze

Odpowiedź

Ruby, 102 93 91 88 78 bajtów

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

Wyjaśnienie:

Wykonaj linię taką jak ruby -pe "gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}", wpisz następną, na przykład Australia, powinna wypisać: Oboikistroboliniobo.

To całkiem proste, zamień wszystkie samogłoski na podciąg na podstawie indeksu zastępowanej samogłoski w (b), razy 3 i następne 3 znaki w ciągu tłumaczenia.

Komentarze

  • Podejrzewam początkowe i końcowe cudzysłowy (i wewnętrzne znaki specjalne, jeśli dane wejściowe mają cudzysłowy ) w danych wyjściowych może to zdyskwalifikować. W każdym razie możesz zaoszczędzić dwa bajty, przenosząc przypisanie b do Regexp (/[#{b=...}/).
  • Myślę, że spacja p $* jest niepotrzebna
  • Użyj flagi -p, aby zapisać dodatkowe bajty. ruby -pe 'gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}'
  • Naliczyłem 78 + 2 (-pe). Jak otrzymujesz 71?
  • @NotthatCharles czy postacie potrzebne do wykonania naprawdę mają znaczenie w tym przypadku? Właśnie nie ' ich nie policzyłem.

Odpowiedź

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ę inny wyznacznik celu dydaktycznego -PODSTAWOWA odpowiedź tutaj!

W każdym razie dane wejściowe to angielski ciąg znaków w Ans.
Wyjście to przetłumaczony ciąg.

Przykłady:

"HE HE prgmCDGF1A HUnu "Hello Hello prgmCDGF1A Hunullapi 

Wyjaśnienie:
(Aby zwiększyć czytelność, dodano znaki nowego wiersza. Wiele wierszy z tego samego wiersza będzie oznaczonych : w następującym 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 nie równa liczba bajtów.

  • Małe litery w TI-BASIC to dwa bajty es każdy.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *