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
undprgmQ
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)
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™«‡
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;}
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.
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`».
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 . Dac
jetzt als Vokal bekannt ist, können Sie jetztsearch
anstelle vonindexOf
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 ‚ nichti
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.