Briefing

Aliens haben sich auf der Erde niedergelassen und seltsamerweise ist ihr Alphabet genau das gleiche wie das unsere. Ihre Sprache ist auch unserer sehr ähnlich, mit einigen sehr unterschiedlichen und leicht zu berechnenden Unterschieden.

Herausforderung

Nehmen Sie eine Zeichenfolge und geben Sie das Sprachäquivalent des Außerirdischen aus. Die Übersetzung funktioniert als solche :

Tauschen Sie alle Vokale im Wort mit den entsprechenden aus:

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

Sie können auch einen anderen Übersetzer schreiben, um Alien zu übersetzen -> Englisch, dies ist jedoch optional.

Beispiele

Input: Shaun Output: Shoboikin Input: Java Output: Jobovobo Input: Hello, World! Output: Hunullapi, Wapirld! 

Wenn der Vokal groß geschrieben wird, wird der erste großgeschrieben Buchstabe ..

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

Regeln

  • Es gelten Standardlücken
  • Muss für Text funktionieren, der neue enthält Zeilen
  • Sie können entweder eine Funktion, ein Lambda oder ein vollständiges Programm schreiben.

    Capingrobotikilobotiniapins apin wrinitining thunu runuvunursunu trobonslobotapir!

Kommentare

  • Ich ‚ bin nicht sicher, was Sie können auch einen anderen Übersetzer schreiben, um Alien-

    Englisch soll bedeuten. Können wir den umgekehrten Übersetzer anstelle des regulären Übersetzers schreiben?

  • Vielleicht ist ‚ nur ich, aber ‚ ist mir nicht klar, dass auch hier diese Bedeutung hat. Wie auch immer, ich ‚ bin mir nicht sicher, wie dies eine Regel ist, wenn ‚ nicht Teil der tatsächlichen ist Aufgabe.
  • @Dennis Sie ‚ sind ein bisschen punudobontinisch, aber ich ‚ habe es bearbeitet, um es zu machen klarer.
  • Warum die Anforderung für Zeilenumbrüche? Meiner Meinung nach ist dies nicht erforderlich und ‚ fügt dem Hauptpunkt der Herausforderung nichts hinzu.
  • Kann die Eingabe ein beliebiges ASCII-Zeichen oder nur eine Teilmenge enthalten . Wird es jemals Zahlen in der Eingabe geben?

Antwort

Haskell, 100 91 Bytes

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

Kommentare

  • Hoboskunull sicher

Antwort

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

Hoffentlich verwenden die Außerirdischen TI- 83/84 Taschenrechner;)

Hauptprogramm, 173 Bytes

BONUS: Behalten Sie die zweite oder dritte Zeile bei, je nachdem, ob Sie einen normalen oder einen umgekehrten Übersetzer wünschen.

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

Unterprogramm (prgmQ), 59 Byte:

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

Unterprogramm (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 ~ steht für Token 0x81 und @ steht für Token 0x7F, erfahren Sie mehr hier .

PPS Ein Grund, warum diese Programme eine hohe Byteanzahl haben, ist, dass sub(, inString(, length( und alle Kleinbuchstaben sind jeweils zwei Bytes …

Kommentare

  • Ich denke, Sie haben prgmR und prgmQ einmal in Ihren Code-Überschriften?
  • Ja, danke, dass Sie diesen @ ByteCommander abgefangen haben 🙂

Antwort

Perl, 56 Byte

Enthält +1 für -p

Eingabe auf STDIN geben

alien.pl:

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

Funktioniert wie gezeigt, Ersetzen Sie jedoch die \xXX Escapezeichen durch das tatsächliche Zeichen, um die beanspruchte Punktzahl zu erhalten.

Kommentare

  • +1 Nur für den Alien-Avatar optimiert. Nur ein Scherz, die Lösung ist auch nett.
  • Jesus Christus. Perl von seiner besten Seite, meine Damen und Herren.

Antwort

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, 

Kommentare

  • Tut dies Arbeiten Sie für Eingaben, die Zeilenumbrüche enthalten?
  • @Jordan Das tut es. sed liest “ zeilenweise „. Es wird also alles bis zur ersten neuen Zeile verarbeitet, diese gedruckt, eine neue Zeile gedruckt und dann von vorne begonnen, wenn mehr Text vorhanden ist.
  • Ah, natürlich. 👍🏻
  • @Jordan Das war keine ‚ Regel, als ich das schrieb, aber es funktionierte trotzdem.

Antwort

Python, 99 95 93 Byte

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

Auf ideone.com …

Ziemlich einfach. Nehmen Sie einfach den Index, unter dem wir jedes Zeichen in der Vokalliste finden, und verwenden Sie ihn, um die drei Zeichen zu ziehen, die wir benötigen.Wenn es nicht gefunden wird, gibt .find() -1 zurück. Kleben Sie also einfach das aktuelle Zeichen an das Ende der Zeichenfolge. Die Leerzeichen sind also erforderlich Jeder Buchstabe "a" enthält nicht das hinzugefügte c. Die übersetzten Vokale sind nach Buchstabenreihenfolge gruppiert (der erste Buchstabe jeder Übersetzung, dann der zweite, dann der dritte).

Kommentare

  • Wow, schöner kreativer Ansatz. Ich ‚ bin beeindruckt 🙂
  • Sie können das Leerzeichen in ["aeiouAEIOU".find(c)::11] for

entfernen

Antwort

05AB1E , 28 27 20 Bytes

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

Probieren Sie es online aus!

Unuxplobonobotiniapin

žÀ # the string "aeiouAEIOU" .•₅%~≠#ùÛãú• # the string "obounuiniapiiki" 3ô # split in pieces of 3 D™« # concatenate with a title-case copy ‡ # transliterate 

Kommentare

  • Ini lapivunu gapilfining!
  • @BasicallyAlanTuring: Ich habe viel zu lange gebraucht, um das in meinem Kopf zu übersetzen. Ich denke, ich brauche einen umgekehrten Übersetzer: P
  • Mach es, sollte ‚ nicht zu schwer sein: P
  • Beängstigend, denke ich Es heißt, ich liebe Golf.
  • Ich ‚ habe meine Frage geändert, wodurch Sie ungültig antworten. Dies muss mit neuen Zeilen funktionieren.

Antwort

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

Antwort

Python, 129 Byte

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) 

Sehen Sie, wie es auf ideone.com ausgeführt wird

Hier „ist eine besser formatierte Version:

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) 

Die interessantesten Teile sind { ... }.get(l.lower(), l), die versuchen, den in l konvertierten Buchstaben nachzuschlagen Kleinbuchstaben im Wörterbuch und geben entweder die übersetzte Version (falls gefunden) oder den Originalbuchstaben
und [str, str.capitalize][ord(l) < 91]( ... ) zurück, wodurch überprüft wird, ob der Originalbuchstabe ein Großbuchstabe war ( ASCII-Codepunkt niedriger als 91) und ruft dann entweder die Funktion str() mit dem Buchstaben als Argument (wenn es sich nicht um einen Großbuchstaben handelt, tut nichts) oder die Funktion -Funktion (konvertiert den ersten Buchstaben der Argumentzeichenfolge in Großbuchstaben).

Antwort

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

Probieren Sie es online aus!

Basierend auf der Antwort von @algmyr und -8 dank @ ASCII-only

Weniger Golfversion

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

Kommentare

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

Antwort

Stapel, 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 

Nimmt Eingaben in STDIN vor. Die zeichenweise Verarbeitung hat den Vorteil, dass zwischen Groß- und Kleinschreibung unterschieden wird.

Kommentare

  • Stapel ist nur das schlechteste Werkzeug für alles, isn ‚ nicht wahr? (Nun, zumindest hast du TI-Basic geschlagen 🙂 Schön, einen Codegolf in Batch zu sehen!

Antwort

Pyth, 42 Byte

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

Ein Programm, das Eingaben in STDIN entgegennimmt und die Ausgabe druckt.

Probieren Sie es online aus

Funktionsweise

#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 

Antwort

C, 167 Bytes

I. Ich wollte wirklich nicht meine Gewohnheit aufgeben, beim Codieren von C immer Hauptfunktionen auszuführen, aber dies ist wesentlich kürzer als die Version mit einer Hauptfunktion, und auf diese Weise erhielt ich einen weiteren Buchstaben, um zu buchstabieren, was ich wollte!

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

Kommentiert

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

C hat etwas Besonderes und wie schrecklich Sie können mit Zeigern und dergleichen sein.

Kommentare

  • 151 Bytes
  • @ceilingcat I ‚ würde sagen, poste deine Antwort alleine. ‚ ist so weit auseinander gegangen, dass es eine eigene Antwort verdient. 🙂

Antwort

Retina 60 Byte

Die Anzahl der Bytes setzt die ISO 8859-1-Codierung voraus.

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

Probieren Sie es online aus!

Antwort

Javascript (ES6), 94 93 92 Bytes

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

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

Kommentare

  • Um den Rückgabewert von .indexOf und .search zu überprüfen, verwenden Sie ~ anstelle von <0
  • Ich habe nachgesehen, was passieren würde, wenn Sie nur Vokale ersetzen würden, und ich habe ursprünglich s=>s.replace(/[aeiou]/gi,c=>"ouiaiOUIAI"[n="aeiouAEIOU".indexOf(c)]+"bnnpk"[n%=5]+"ouiii"[n]) erhalten, was immer noch 93 Bytes sind . Da c jetzt als Vokal bekannt ist, können Sie jetzt search anstelle von indexOf um ein Byte zu speichern!
  • @Neil – Schön! Eigentlich habe ich beide ausprobiert, aber ‚ habe nicht daran gedacht, sie zu kombinieren.

Antwort

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

Und Alien zurück zu Englisch (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; } 

Antwort

Tcl, 75 Bytes

Zu übersetzende Zeichenfolge befindet sich in der Variablen s.

string map {A Obo a obo E Unu e unu I Ini i ini O Api o api U Iki u iki} $s 

Antwort

Mathematica, 128 Byte

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

Nicht sicher, ob ein kürzeres Programm erhalten werden kann, wenn IgnoreCase->True zusammen mit einer Fallprüfung verwendet wird.

Antwort

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

Kommentare

  • 153 Bytes
  • @ceilingcat & c kann in Ordnung sein, wenn die Nummer als Byte1 Byte2 Byte3 gespeichert wird … Zum Beispiel 255 im Speicher als ff 00 00 00, aber wenn es den anderen Endian für 255 gibt Wir haben 00 00 00 ff und drucken die leere Zeichenfolge …

Antwort

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

Kommentare

  • Wenn Sie char*t="aeiou"; in die for-Schleife einfügen, wird 1 Byte gespeichert
  • 144 Bytes

Antwort

C #, 133 121 Bytes

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

Bearbeiten (dank milk)

danke 🙂 Ich kenne diese Überladung tatsächlich, habe sie aber beim Schreiben irgendwie komplett vergessen.

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

Kommentare

  • Sie können die Überladung Select(char, int) verwenden, damit Sie ‚ nicht i und kann alles in eine Zeile setzen. s=>string.Concat(s.Select((c,i)=>(i="AIUEOaiueo".IndexOf(c))>-1?"OboIniIkiUnuApioboiniikiunuapi".Substring(i*3,3):c+""));

Antwort

C, 207 202 Bytes (dank 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) Ich hasse es, vor jeder Art von Deklaration den Typ wegzulassen.

2) Ich mag es nicht, unbrauchbaren Code (ohne main () -Funktion) zu setzen.

Verwendung:

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

Kommentare

  • Willkommen bei PPCG!
  • @MartinEnder, das ‚ ist unerwartet … aber danke 🙂
  • (c=getchar())!= EOF kann zu ~(c=getchar())
  • 143 Bytes werden

Antwort

Swift 2.2 196 Bytes

¯ \ _ (ツ) _ / ¯

Golf

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

Kommentare

  • Sind die Leerzeichen in var r = [ notwendig?
  • Ja, in der Spielplatz-App, wenn Sie ‚ kein Leerzeichen zwischen eine Aufgabe setzen, wird ein Fehler angezeigt und Sie werden aufgefordert, Leerzeichen hinzuzufügen . Swift ist wahrscheinlich eine der schlechtesten Sprachen zum Golfen, aber ich dachte, es würde Spaß machen, es zu versuchen.
  • Und es war interessant, dass es mir ‚ nicht gegeben hat Fehler beim Zuweisen einer Variablen zu einem Abschluss. Daher der achselzuckende Mann. Ja, das habe ich auch bemerkt. Deshalb war ich ‚ verwirrt.

Antwort

Perl 6 , 84 82 Byte

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

Erweitert:

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

Verwendung:

 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  

Antwort

C – 192 Bytes

(Zeilenumbrüche zur Verdeutlichung hinzugefügt)

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

Nur Nachschlagetabellen und ein boolescher Schalter.

Suchen Sie jeden Buchstaben in der Vokaltabelle (Zeichenfolge). Wenn gefunden, ändern Sie es gemäß der Regel in Tabelle s. Drucken Sie jedes Zeichen gefolgt von einer Zeichenfolge: Wenn ein Vokal gefunden wurde, drucken Sie das Zeichen, das durch den Wert in s geändert wurde, gefolgt vom Rest der in Tabelle ; Wenn kein Vokal gefunden wurde, drucken Sie das Originalzeichen und eine leere Zeichenfolge.

Kommentare

Antwort

Ruby, 102 93 91 88 78 Bytes

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

Erläuterung:

Führen Sie die Zeile wie ruby -pe "gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}" aus. Geben Sie als Nächstes beispielsweise Australia ein, das ausgegeben werden soll: Oboikistroboliniobo.

Es ist ziemlich einfach, alle Vokale durch einen Teilstring zu ersetzen, der auf dem Index des zu ersetzenden Vokals in (b), Zeiten 3 und 3 basiert die nächsten 3 Zeichen in der Übersetzungszeichenfolge.

Kommentare

  • Ich vermute die führenden und nachfolgenden Anführungszeichen (und interne Escapezeichen, wenn die Eingabe Anführungszeichen enthält ) in der Ausgabe kann dies disqualifizieren. Sie können jedoch zwei Bytes speichern, indem Sie die Zuweisung von b in den Regexp (/[#{b=...}/).
  • Ich denke, das Leerzeichen p $* ist unnötig
  • Verwenden Sie das Flag -p, um zusätzliche Bytes zu speichern. ruby -pe 'gsub(/[#{b="aeiouAEIOU"}]/){"obounuiniapiikiOboUnuIniApiIki"[b.index($&)*3,3]}'
  • Ich zähle 78 + 2 (-pe). Wie kommt man zu 71?
  • @NotthatCharles Sind die für die Ausführung benötigten Zeichen in diesem Fall wirklich wichtig? Ich habe sie nur nicht ‚ gezählt.

Antwort

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 

Zu denken, ich würde einen anderen TI finden -BASIC Antwort hier!

Wie auch immer, die Eingabe ist eine englische Zeichenfolge in Ans.
Die Ausgabe ist die übersetzte Zeichenfolge.

Beispiele:

"HE HE prgmCDGF1A HUnu "Hello Hello prgmCDGF1A Hunullapi 

Erläuterung:
(Zur besseren Lesbarkeit hinzugefügte Zeilenumbrüche. Mehrere Zeilen derselben Zeile werden mit einem : im folgenden Codeblock.)

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" 

Hinweise:

  • TI-BASIC ist eine tokenisierte Sprache. Die Anzahl der Zeichen entspricht not gleiche Byteanzahl.

  • Kleinbuchstaben in TI-BASIC sind zwei Byte es jeweils.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.