Perl: 8 або 10 різних символів
s/// рішення: 10 виразних, 13 усього
Техніка sed (нібито; див. Нижче) sed завжди також працює в perl, і дає номер імені різних символів (10):
s/[aeiou]//gi
Наприклад:
$ echo 'This program will remove VOWELS. So we can speak without them.' |
perl -ple 's/[aeiou]//gi'
Ths prgrm wll rmv VWLS. S w cn spk wtht thm.
Це 10 різних персонажів, як це доводить:
$ echo 's/[aeiou]//gi' | perl -nle '@s{split//}=(); print scalar keys %s'
10
Проблема рішення sed полягає в тому, що /iвін не є частиною POSIX sed і, отже, не є портативним:
$ echo 'This program will remove VOWELS. So we can speak without them.' |
sed -e 's/[aeiou]//gi'
sed: 1: "s/[aeiou]//gi": bad flag in substitute command: 'i'
Це працює в системі OpenBSD. На відміну від цього, оскільки /iвін завжди є частиною стандартного Perl, ви можете розраховувати на те, що він завжди буде там. На відміну від sed.
Якщо ви хочете включити "y" до списку голосних, це, звичайно, один більший, якщо ви використовуєте ту саму техніку:
$ echo 'This nifty program remove any VOWELS. So we easily can speak without them.' |
perl -ple 's/[aeiouy]//gi'
Ths nft prgrm rmv n VWLS. S w sl cn spk wtht thm.
$ echo 's/[aeiouy]//gi' | perl -nle '@s{split//}=(); print scalar keys %s'
11
І зараз це 14 символів.
tr[][] рішення: 8 виразних 10 всього
Ви також tr///можете видалити все, що відповідає. Perl навіть може використовувати y///псевдоніми sed для tr:
y/aeiou//d
який зараз налічує 8 різних символів, але він не працює в регістрі. Вам вдається додати ще 5 символів, щоб впоратися із картами справ:
$ echo 'y/aeiouAEIOU//d' | perl -nle '@s{split//}=(); print scalar keys %s'
13
і, звичайно, це зараз 15.
Однак додавання "y" до суміші як голосної не збільшує кількість окремих символів, як це було у s///версії:
$ echo 'This nifty program remove any VOWELS. So we easily can speak without them.' |
perl -ple 'y/aeiouy//d'
Ths nft prgrm rmv n VOWELS. S w sl cn spk wtht thm.
Тож це все-таки лише оригінальні 8 різних з 11:
$ echo 'y/aeiouy//d' | perl -nle '@s{split//}=(); print scalar keys %s'
8
EDIT : Облік діакритики
А як щодо вхідних даних Renée’s naïveté? Звичайно, має бути правильний вихід Rn’s nvt. Ось як це зробити, використовуючи /rпрапор v5.14 для s///:
$ echo 'Renée’s naïveté' |
perl5.14.0 -CS -MUnicode::Normalize -nle 'print NFD($_)=~s/[aeiou]\pM*//rgi'
Rn’s nvt
Це 27 різних персонажів:
$ echo 'print NFD($_) =~ s/[aeiou]\pM*//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
27
Ви можете обрізати , що до 26 , якщо ви можете гарантувати , що ви працюєте по крайней мере v5.10 шляхом заміни printдля say:
$ echo 'Renée’s naïveté' |
perl -Mv5.14 -CS -MUnicode::Normalize -nlE 'say NFD($_) =~ s/[aeiou]\pM*//rgi'
Rn’s nvt
$ echo 'say NFD($_) =~ s/[aeiou]\pM*//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
26
І ви можете зменшити його до 22, якщо ви не проти перемістити діакритику, а не видаляти їх:
$ echo 'Renée’s naïveté' |
perl -Mv5.14 -CS -MUnicode::Normalize -nlE 'say NFD($_) =~ s/[aeiou]//rgi'
Rń’s n̈vt́
Що ... цікаво поглянути, щонайменше. :) Ось його чіткий підрахунок:
$ echo 'say NFD($_) =~ s/[aeiou]//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
22
Удачі, щоб отримати будь-яку іншу мову, щоб правильно боротися з діакритикою, використовуючи менше символів, ніж ця!