पर्ल: 8 या 10 अलग-अलग वर्ण
s///
समाधान: 10 अलग, 13 कुल
(कथित; नीचे देखें) sed तकनीक हमेशा पेर्ल में भी काम करती है, और अलग-अलग वर्णों के नाम की संख्या प्राप्त करती है (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
वास्तव में हमेशा मानक पर्ल का हिस्सा होता है, आप हमेशा इसके होने पर भरोसा कर सकते हैं । सेड के विपरीत।
यदि आप स्वरों की सूची में "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///
कुछ भी मैच से हटाने के लिए उपयोग कर सकते हैं । पर्ल यहां तक कि sed के y///
उपनाम का उपयोग कर सकते हैं 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
। यहां बताया गया है कि v5.14 के /r
झंडे का उपयोग कैसे करें 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
सौभाग्य की बात है कि किसी भी अन्य भाषा को इससे कम पात्रों का उपयोग करते हुए विकृति विज्ञान से ठीक से निपटने के लिए!