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 und O
s zählen, multiplizierenA
s durch 5 und addieren Sie die Anzahl von O
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:
+[[>>>,[>++++[<-------->-]]<]get an entire word of input
each character lowered by 32
two empty cells between characters
stops when reaching a space or null byte
any lowercase letters have become uppercase; anything with a value below 65 used
to be an uppercase character; fix it
<<[>]<-[+ for each character until hitting 1:
[<+>>+<-] make a backup
subtract 64 from the character but stop if it hits 0
----[>>+<<----]>>+ generate the number 64
[ 64 times:
<[ if the character is not 0:
- subtract 1
< go to a guaranteed 0 cell to break the loop
]
we're either on the character or to the left of it; sync up
<[>]
>>-]
-<[[-]>+<]> logical NOT of character
[ if logical NOT returns true:
[-[->]<<+>]<- add 32 to backup of character
>>>]
<<<[>>>+<<<-] move copy over to make room
<<-]
>>>>>[ for each character:
[<+>>+<-] make copies
----[>-<----]>-- check if it's A
[----<]<[>]> check if it's E
[----<]<[>]> check if it's I
[------<]<[>]> check if it's O
[------<]<[>]> check if it's U
IF YOU NEED TO ADD Y; THIS IS THE PLACE
<+>[[-]<->] logical NOT to complete vowel check
>>]
<<<[ if the last char is a vowel; prevent a side effect
>->
]
<[<]>[ for each character:
>[ if it's a vowel:
<<<<<+>>>>>>+<- leave a flag to the left and right to show that a
] vowel is adjacent
<<<<]
<[-]> clean up a side effect left behind if first char is vowel
>>>[ for each char:
<[ if it's adjacent to a vowel:
>[>+<-]<- move it to the side
]
>[-]- otherwise; destroy it
>[<+>-] move backup over if it exists (subtracting 1)
>>]
all characters without a vowel beside them have been set to 255
all characters with a vowel beside them are set to itself minus 1
notable charaters are: 'A' minus 1 = 64
'O' minus 1 = 78
<<<[ for each character:
-<----[>-<----] subtract 64
>[>+>+<<-] make a copy
+>[<->[-]<]<[<]> logical NOT
[[<<<]<+>>>>[>>>]<<<-] if NOT returns true; record an A
>+>-------------- subtract 14 from backup
[<->[-]]< logical NOT
[-<<<<[<<<]>+>>[>>>]>] if NOT returns true; record an O
<<<<]
<[<+<+>>-] make a backup of A count
>++++[<<[->]>[<]>-] subtract 4 but don't go below 0
+<<[ if the char was greater than 3:
[-]++++<[-]>> put 4 there
]
>[<] resynchronise
<<[>+<-] if there were fewer than 4 As put the number back
same thing but for the O count
>>+>->[>+>+<<-] make a backup of O count
<++++[>>[-<]<[>]<-] subtract 4 but don't go below 0
>>[ if the char was greater than 3:
[-]++++>[-] put 4 there
]
<<<[>] resynchronise
<->>>>[<+>-] if there were fewer than 4 Os put the number back
<[<<<+>>>-]<<<<[>+++++<-] A*5 plus B = index of character to output
>[>+>+<<-] make a backup
<++++++++[>>[-<]<[>]<-] subtract 8 but don't go below 0
>>[[-]>+<] if the result is nonzero it is late enough in the alphabet
that it must be increased by 1 to exclude J as a possible
output
----[>+<----]>++ add 65 to make it a letter
.[-]+>>>, output and get new input
[<++++[>--------<-]]> sub 32 if not 0
]
'GUG gAGaA gOougOou' -> 'ALE'
Babys trinken Bier? : D