мозковий ебать, 656 байт
+[[>>>,[>++++[<-------->-]]<]<<[>]<-[+[<+>>+<-]----[>>+<<----]>>+[<[-<]<[>]>>-]-<[[-]>+<]>[[-[->]<<+>]<->>>]<<<[>>>+<<<-]<<-]>>>>>[[<+>>+<-]----[>-<----]>--[----<]<[>]>[----<]<[>]>[------<]<[>]>[------<]<[>]><+>[[-]<->]>>]<<<[>->]<[<]>[>[<<<<<+>>>>>>+<-]<<<<]<[-]>>>>[<[>[>+<-]<-]>[-]->[<+>-]>>]<<<[-<----[>-<----]>[>+>+<<-]+>[<->[-]<]<[<]>[[<<<]<+>>>>[>>>]<<<-]>+>--------------[<->[-]]<[-<<<<[<<<]>+>>[>>>]>]<<<<]<[<+<+>>-]>++++[<<[->]>[<]>-]+<<[[-]++++<[-]>>]>[<]<<[>+<-]>>+>->[>+>+<<-]<++++[>>[-<]<[>]<-]>>[[-]++++>[-]]<<<[>]<->>>>[<+>-]<[<<<+>>>-]<<<<[>+++++<-]>[>+>+<<-]<++++++++[>>[-<]<[>]<-]>>[[-]>+<]----[>+<----]>++.[-]+>>>,[<++++[>--------<-]]>]
Це був досить хороший спосіб вбити пару годин.
Потрібен інтерпретатор, який використовує 8-бітові клітинки для обгортки, дозволяє перейти ліворуч від комірки 0 і повертає 0, якщо ,
використовується, коли stdin порожній. На мій досвід, це найпоширеніші налаштування.
Ця програма не вважає Y голосним, але якщо OP хоче цього, це легко виправити.
Здається, написання цього було б непростим завданням, але якщо ви знайомі з мовою, у коді немає нічого дивного чи нового. Стандартна тактика головного мовлення: прочитайте вхід, але переконайтеся, що ви залишаєте пару порожніх комірок між кожним байтом, використовуйте ці порожні комірки для зберігання даних про вхід, використовуйте збережені дані, щоб вирішити, як їх перетворити і виплюнути щось наприкінці . У цьому випадку отримано введення, встановіть усе на великі регістри, з’ясуйте, які комірки є голосними, викиньте цю інформацію після її використання, щоб визначити, які клітинки знаходяться поруч з голосними, встановіть усе, що не є голосним для деяких значення, яке ніколи не буде актуальним, тому вони пізніше не підуть, і ви в основному все зробили. Звідти вам просто потрібно порахувати свої A
іO
s, помножитиA
s на 5 і додайте кількість O
s, окремий регістр що-небудь вище 8, щоб уникнути J та output. Я вирішив обробляти це одне слово за один раз, а не брати весь вхід відразу, тому мені довелося встановити частину коду, яка читає stdin, щоб перерватися на 0 або 32, але це не надто велика проблема (просто оберніть віднімання на 32 умовно, щоб це не сталося, якщо значення вже 0, а потім виправте будь-які інструкції <
чи >
інструкції, які ви пропустили пізніше).
Я не знаю, наскільки це буде корисно, тому що я написав це здебільшого, щоб думки були прямими, а не як справжнє пояснення, але ось код з моїми коментарями та його первісне відступ:
+[[>>>,[>++++[<-------->-]]<]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'
Діти п'ють ель? : D