Wenn Babys den Mund öffnen, spucken sie nicht nur Kauderwelsch aus. Sie sprechen tatsächlich in einer hochentwickelten, für Erwachsene geeigneten Chiffre ...
Die Baby-Talk-Chiffre
Wenn ein Baby spricht, könnte es ungefähr so aussehen: gogooa gagooook aagaaoooy
Jeder durch ein Leerzeichen getrennte Abschnitt steht für ein Zeichen (das obige Beispiel steht also für 3 Zeichen).
Um einen Abschnitt zu entschlüsseln, müssen wir die Anzahl der darin enthaltenen As und Os zählen. Wir zählen jedoch nur diejenigen, die an einen anderen Vokal angrenzen. Zum Beispiel würde das A in "gag" nicht zählen, aber sowohl das A als auch das O in "gaog" würden zählen.
Das obige Beispiel zu zählen würde so aussehen:
Section | Num Os | Num As
gogooa | 2 | 1
gagooook | 4 | 0
aagaaoooy | 3 | 4
Diese Werte verwenden wir dann, um die Eingabe auf einem Polybius-Quadrat in Klartext umzuwandeln. Dies ist eine 5x5-Darstellung des englischen Alphabets ohne 'J'.
0 1 2 3 4
0 A B C D E
1 F G H I K
2 L M N O P
3 Q R S T U
4 V W X Y Z
Unter Verwendung der Anzahl der Os als Spalte und der Anzahl der As als Zeile finden wir, welches Zeichen jeder Abschnitt darstellt:
Section | Num Os | Num As | Character
gogooa | 2 | 1 | (2,1) -> H
gagooook | 4 | 0 | (4,0) -> E
aagaaoooy | 3 | 4 | (3,4) -> Y
Was uns sagt, dass das Baby nur "HEY" sagte.
Hinweise :
- Wenn ein Abschnitt, der ein Zeichen darstellt, mehr als 4 As oder Os hat, ignorieren Sie die Extras, da 4 der Maximalwert in der Tabelle ist. - Für diese Aufgabe ist Y kein Vokal - nur A, E, I, O und U.
Die Herausforderung
Ihre Aufgabe ist es, ein vollständiges Programm zu erstellen , das eine Eingabe, ein Wort im Baby-Sprechen, und es im Klartext druckt.
- Ihr Programm muss in der Lage sein, Eingaben in Groß- und Kleinbuchstaben sowie eine Mischung aus beiden zu verarbeiten.
- Die Eingabe enthält nur ASCII-Alphabetbuchstaben (AZ und az) mit einzelnen Leerzeichen zur Trennung der Babywörter.
- Der Ausgabetext kann in jedem Fall sein.
- Sie sollten die Eingabe übernehmen
STDIN
und den Klartext darauf druckenSTDOUT
. Wenn Ihre Sprache diese nicht hat, verwenden Sie das nächstgelegene Äquivalent. - Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes - aber jede Lösung ist willkommen.
Testfälle
'GLOOG KAKAAOOO ARGOOO OOOOOGUGUU' -> CODE
'oaka pooopaa gaau augu' -> GOLF
'Aoao U oOOAoa oaoAoo aoAoAOa' -> NAPPY
'GUG gAGaA gOougOou' -> ALE
'OOaGOG GoGOOoGoU gAA bLAA GOUGoOUgAIGAI' -> HELLO
'GUG gAGaA gOougOou' -> 'ALE'
Babys trinken Bier? : D.toUpperCase()
oder eines ähnlichen Funktionsaufrufs, keine anregende Herausforderunggogooa
man 2 o's? Und wie hatgagooook
0 a?FAG
: PAntworten:
05AB1E , 46 Bytes
Probieren Sie es online!
Erklärung in Schritten
quelle
Perl, 82 Bytes
Beinhaltet +1 für
-a
Geben Sie Input auf STDIN:
baby.pl
:Dies setzt voraus , eine neu genug Perl - Version , wo
-a
impliziert-n
. Wenn Ihr Perl zu alt ist, müssen Sie eine explizite-n
Option hinzufügen .Es wird auch davon ausgegangen, dass Babys keine allgemeinen ASCII-Zeichenfolgen sagen können, die mit Ziffern wie beginnen
1 this will not work
quelle
Brainfuck, 656 Bytes
Dies war ein ziemlich guter Weg, um ein paar Stunden zu töten.
Erfordert einen Brainfuck-Interpreter, der 8-Bit-Umbruchzellen verwendet, es Ihnen ermöglicht, von Zelle 0 nach links zu gehen und 0 zurückzugeben, wenn er verwendet
,
wird, wenn stdin leer ist. Nach meiner Erfahrung sind dies die häufigsten Einstellungen.Dieses Programm betrachtet Y nicht als Vokal, aber wenn OP dies wünscht, ist dies eine einfache Lösung.
Es scheint, als wäre das Schreiben eine entmutigende Aufgabe, aber wenn Sie mit der Sprache vertraut sind, enthält der Code nichts Überraschendes oder Neues. Standard-Brainfuck-Taktik: Lesen Sie die Eingabe, achten Sie jedoch darauf, dass zwischen den einzelnen Bytes ein paar leere Zellen stehen. Speichern Sie Daten zur Eingabe in diesen leeren Zellen. Entscheiden Sie anhand der gespeicherten Daten, wie sie transformiert werden sollen, und spucken Sie am Ende etwas aus . In diesem Fall war es die Eingabe, setzen Sie alles auf Großbuchstaben, finden Sie heraus, welche Zellen Vokale sind, werfen Sie diese Informationen weg, nachdem Sie sie verwendet haben, um festzustellen, welche Zellen sich neben Vokalen befinden, und setzen Sie alles, was sich nicht neben einem Vokal befindet, auf einige Wert, der nie relevant sein wird, sodass er später nicht mehr im Weg steht und Sie im Grunde genommen fertig sind. Von dort aus musst du nur dein
A
s undO
s zählen, multiplizierenA
s durch 5 und addieren Sie die Anzahl vonO
s, Sonderfall etwas über 8, um J und Ausgabe zu vermeiden. Ich habe mich dafür entschieden, immer nur ein Wort zu behandeln, anstatt die gesamte Eingabe auf einmal zu verarbeiten. Deshalb musste ich den Teil des Codes, der stdin liest, so einrichten, dass er bei 0 oder 32 abbricht, aber das ist kein allzu großes Problem (Binde die Subtraktion einfach mit 32 in eine Bedingung ein, damit es nicht passiert, wenn der Wert bereits 0 ist, und korrigiere dann alle<
oder>
Anweisungen, die du später verpasst hast).Ich weiß nicht, wie hilfreich es sein wird, weil ich es hauptsächlich geschrieben habe, um meine Gedanken zu klären und nicht als echte Erklärung, aber hier ist der Code mit meinen Kommentaren und dem ursprünglichen Einzug:
quelle
JavaScript (ES6), 145 Byte
Ersetzt jedes Wort (und das folgende Leerzeichen) durch den entsprechenden Buchstaben.
s.split` `.map().join``
ist 3 Bytes länger:quelle
Perl, 159 +1 = 160 Bytes
+1 Byte für -n Flag. Whitespace ist nicht Teil des Codes und dient nur der Lesbarkeit.
Der Code teilt die Eingabe durch Leerzeichen auf und konvertiert jedes Babywort in Kleinbuchstaben, bevor er fortfährt. Der Regex findet alle a- oder o-Vokale, auf die ein anderer Vokal folgt oder denen ein Vokal vorausgeht, und sortiert sie, a am Anfang, o am Ende, und findet dann den Index des ersten 'o'. Wenn die verbleibende Anzahl von Übereinstimmungen (auch bekannt als die Anzahl von 'a's) größer als 4 ist, kümmern wir uns um 4 a's, und wenn es mehr als 4 o's gibt, kümmern wir uns um 4 o's. Dann zieht es den entsprechenden Buchstaben aus der Matrix, druckt ihn aus und geht dann zum nächsten Babywort über.
quelle
Brainfuck, 283 Bytes
Formatiert:
Dies funktioniert mit oder ohne abschließende Newline in der Eingabe.
Probieren Sie es online aus.
Jedes Zeichen wird mod 32 verarbeitet (wobei der Steuerungsfluss so ist, dass der Code, der die Mod-Operation implementiert, nur einmal im Programm vorkommt). Dies ermöglicht die Unterscheidung zwischen Groß- und Kleinschreibung sowie das Zusammenfassen des Leerzeichens und der EOF in einer einzelnen Groß- und Kleinschreibung. Eine abschließende Newline wird wie folgt behandelt
J
, was sich nicht auf die Ausgabe auswirkt.Skizze des Speicherlayouts:
0 x C c y a A b B
Wo
c
ist das Eingabezeichen,C
ist der Zeichen- Mod 32,x
ist, ob es ein Vokal ist,y
ist, ob das vorherige Zeichen ein Vokal war,A
undB
sind die Zählungen von gültigen (neben Vokalen)a
bzw.o
Zeichen unda
undb
sind ihre jeweiligen Puffer, die kopiert oder gelöscht werden, je nachdem, ob ein benachbarter Vokal vorhanden ist.Wenn ein Leerzeichen oder ein EOF erreicht ist, wird ein Jongliervorgang ausgeführt, um
J
die Anzahl der Zeichen über 4 zu verringern und den Buchstaben zu überspringen. Anschließend wird das dekodierte Zeichen gedruckt.quelle
PHP, 163 Bytes
Mehr lesbare Version:
Tests:
quelle
Java 8,
272266251249 Bytes-6 Bytes dank @Joba .
-1 Byte Konvertierung von Java 7 nach 8 und
1416 zusätzliche Bytes, die durch Ändern des Druckteils eingespart werden.Erläuterung:
Probieren Sie es hier aus.
quelle
Python 3,
163162157146 BytesVerwendet Regex, um alle Zeichenfolgen von Vokalen zu finden, die größer als 2 sind, zählt As und Os mit maximal 4 und druckt dann.
quelle
APL, 60
Beachten Sie, dass ⎕IO ← 0 und ⎕ML ← 3
Beispiel:
Funktioniert in Dyalog 15.0 , da es sich um die Version handelt, in der 819⌶ eingeführt wurde, um Zeichenfolgen in Kleinbuchstaben zu schreiben.
quelle
Pyth, 64 Bytes
Kann wohl weiter golfen werden. Probieren Sie es hier aus!
quelle
R, 261 Bytes
Ich glaube, ich habe viel zu viel Zeit aufgewendet, um dies zum Laufen zu bringen, und ich glaube, dass dies eine unnötig komplizierte Lösung ist, obwohl sie funktioniert. Nimmt Eingaben von stdin entgegen, ist es wichtig, dass die Zeichenfolge in Anführungszeichen eingeschlossen ist.
Die Verwendung von vier verschachtelten
apply
Familien könnte theoretisch auf nur zwei reduziert werden, indemmapply
stattdessen verwendet wird. Sondern weil Eingänge zumapply
nicht die gleiche Länge haben, wird die kürzere recycelt, was die Sache kompliziert macht und ich konnte keine funktionierende Lösung finden.Wenn irgendjemand interessiert ist, werde ich später eine Erklärung hinzufügen.
Probieren Sie alle Testfälle auf R-Geige
Bitte beachten Sie, dass diese Version die Eingabe als Funktionsargument von stdin übernimmt, da
scan
dies bei R-Fiddle nicht funktioniert. Außerdem wurde eine neue Zeile hinzugefügt, um das Lesen zu erleichtern.quelle
Python 3, 262 Bytes
Weniger Golf (Die Kommentare sind die Variablen im verkürzten Code):
Probieren Sie es online!
quelle
blaoaoaog
: Die Interlaced-Vokale werden mehr als einmal gezählt und geben an,z
wann es sein solltet
(obwohl es nur funktioniertaaaooo
, obwohl ich nicht herausfinden kann, warum ...)aooa
== (2,2) ==n
,aoaoao
== (3,3) ==t
gaoaoaog
druckt Z anstelle von T. Ich denke, es liegt daran, dass Ihr Regex[ao,oa,ao,oa,ao]
5,5
4,4
Kotlin ,
221209 BytesJetzt viel hässlicher und langsamer, alles im Namen von 11 Bytes
Speichern Sie es in einer Datei (z.
BabyTalk.kts
B.), um es als Skript auszuführen. Der obige Code kann auch vorangestelltfun main(z:Array<String>)=
und normal für weitere 26 Byte kompiliert werden.Probieren Sie es online!
Eingerückt:
quelle
PHP,
124 129 121 120125 BytesÜbernimmt Eingaben von Befehlszeilenargumenten. Laufen Sie mit
-nr
oder versuchen Sie es online .Nervenzusammenbruch
quelle
J , 109 Bytes
Probieren Sie es online!
quelle