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
iprgmQ
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)
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™«‡
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;}
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.
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`».
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
zamiastindexOf
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.