pieprzenie mózgu, 656 bajtów
+[[>>>,[>++++[<-------->-]]<]<<[>]<-[+[<+>>+<-]----[>>+<<----]>>+[<[-<]<[>]>>-]-<[[-]>+<]>[[-[->]<<+>]<->>>]<<<[>>>+<<<-]<<-]>>>>>[[<+>>+<-]----[>-<----]>--[----<]<[>]>[----<]<[>]>[------<]<[>]>[------<]<[>]><+>[[-]<->]>>]<<<[>->]<[<]>[>[<<<<<+>>>>>>+<-]<<<<]<[-]>>>>[<[>[>+<-]<-]>[-]->[<+>-]>>]<<<[-<----[>-<----]>[>+>+<<-]+>[<->[-]<]<[<]>[[<<<]<+>>>>[>>>]<<<-]>+>--------------[<->[-]]<[-<<<<[<<<]>+>>[>>>]>]<<<<]<[<+<+>>-]>++++[<<[->]>[<]>-]+<<[[-]++++<[-]>>]>[<]<<[>+<-]>>+>->[>+>+<<-]<++++[>>[-<]<[>]<-]>>[[-]++++>[-]]<<<[>]<->>>>[<+>-]<[<<<+>>>-]<<<<[>+++++<-]>[>+>+<<-]<++++++++[>>[-<]<[>]<-]>>[[-]>+<]----[>+<----]>++.[-]+>>>,[<++++[>--------<-]]>]
To był całkiem dobry sposób na zabicie kilku godzin.
Wymaga interpretera pieprzenia mózgu, który wykorzystuje 8-bitowe zawijanie komórek, pozwala przejść w lewo od komórki 0 i zwraca 0, jeśli ,
jest używany, gdy standardowe wejście jest puste. Z mojego doświadczenia są to najczęstsze ustawienia.
Ten program nie uważa Y za samogłoskę, ale jeśli OP tego chce, jest to łatwa poprawka.
Wygląda na to, że napisanie tego byłoby zniechęcającym zadaniem, ale jeśli znasz język, w kodzie nie ma nic zaskakującego ani nowego. Standardowa taktyka: „odczytaj dane wejściowe”, ale pamiętaj, aby zostawić kilka pustych komórek między bajtami, użyj tych pustych komórek do przechowywania danych o danych wejściowych, wykorzystaj zapisane dane, aby zdecydować, jak je przekształcić i wypluć coś na końcu . W tym przypadku uzyskano dane wejściowe, ustawiono je na wielkie litery, ustalono, które komórki są samogłoskami, wyrzucono tę informację po użyciu jej do ustalenia, które komórki znajdują się obok samogłosek, ustawiono wszystko, co nie jest obok samogłoski wartość, która nigdy nie będzie istotna, więc nie przeszkadzają później, a ty w zasadzie skończyłeś. Stamtąd po prostu trzeba liczyć A
s i O
s, należy pomnożyćA
s przez 5 i dodaj liczbę O
s, specjalny przypadek powyżej 8, aby uniknąć J i wyjścia. Zdecydowałem się poradzić sobie z tym jednym słowem na raz, zamiast brać cały wkład naraz, więc musiałem ustawić część kodu, która odczytuje stdin, by przerwać na 0 lub 32, ale to nie jest zbyt duży problem (po prostu odejmij odejmowanie o 32 w warunkowe, aby nie zdarzyło się, jeśli wartość wynosi już 0, a następnie popraw dowolne <
lub >
instrukcje, które przegapiłeś później).
Nie wiem, jak bardzo będzie pomocna, ponieważ napisałem ją głównie po to, aby moje myśli były proste, a nie prawdziwe wyjaśnienie, ale oto kod z moimi komentarzami i jego oryginalnymi wcięciami:
+[[>>>,[>++++[<-------->-]]<]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'
Dzieci piją piwo? : D