कम / अपरकेस अक्षरों में एक शब्द के सभी संभव संयोजनों को प्राप्त करें


14

मैं एक निश्चित शब्द के सभी संभावित निचले और ऊपरी मामले क्रमांकन को प्रिंट करने के लिए एक bash स्क्रिप्ट लिखना चाहता हूं, जैसे harley:

harley
harleY
harlEy
harLey
...
HARLey
HARLEy
HARLEY

मेरा भोला समाधान इस विशिष्ट शब्द के लिए n-th (n len (शब्द)) nested for-loop लिखना है:

#!/bin/bash
for a in {h,H}; do
    for b in {a,A}; do
    ...
    done
done

हालांकि, मुझे फिर से एक अलग शब्द के लिए स्क्रिप्ट कोड करना होगा।

क्या इसे पूरा करने का एक बेहतर तरीका है?

जवाबों:


18

थोड़ा बेहतर उपाय:

echo {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}

पूर्ण मापनीयता के लिए:

echo harley \
| perl -nle 'print "echo ",
                    join "",map { "{" . lc . "," .uc ."}" } split //' \
| xargs -I {} bash -c "{}"

यदि आपके पास प्रति पंक्ति एक शब्द होना चाहिए, तो साथ जाएं

for w in {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y};do echo $w;done

Mattdm की टिप्पणी के लिए धन्यवाद

इसी स्केलेबल संस्करण होगा:

echo harley \
| perl -nle 'print join "",map { "{" . lc . "," .uc ."}" } split //' \
| xargs -I {} bash -c 'for w in {};do echo $w;done'

मज़े के लिए, "हार्ले" को "सुपरकैलिफ़ैगिलिस्टिसएक्सपियालिडोसियस " के साथ बदलने की कोशिश करें यह 5 मिनट हो गया है और मेरा कंप्यूटर अभी भी इस पर क्रंच कर रहा है और शायद कभी खत्म नहीं होगा :)


1
w में {h, H} {a, A} {r, R} {l, L} {e, E} {y, Y}; do echo $ w; किया
mattdm

4
अभी भी एक-प्रति-लाइन समाधान सरल है:printf '%s\n' {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}
जॉन 1024 24

2
@ जॉन १०२४ मैं आपको उत्तर देने के लिए प्रोत्साहित करता हूं कि एक उत्तर के रूप में, यह बाश की एक प्रशंसित विशेषता हैprintf
१२'१४

10
eval इको $ (गूंज " शब्द " | sed 's /./ {\ U &, \ L &} / g')
  • sed 's/./{&,&}/g'में बदल Fooजाएगा {F,F}{o,o}{o,o}, जो बहुत बेकार होगा। लेकिन जोड़ें \Uऔर \Lआपको प्रत्येक अक्षर का ऊपरी और निचला मामला मिलता है; यानी, {F,f}{O,o}{O,o}
  • फिर eval{ X का विस्तार करने के लिए शेल को बताने के लिए उपयोग करना एक सरल बात है , x } ब्रेस सीक्वेंस ।

1
अच्छी चाल :)। अगर मैं दो उत्तर स्वीकार कर सका, तो आपका भी स्वीकार किया जाएगा! वैसे भी वोट दें
polym

5

EDIT 2: यह उत्तर गलत है। यह 2 ^ n संयोजनों का उत्पादन नहीं करता है जैसा कि इसे करना चाहिए।

संपादित करें: मुझे नहीं पता कि क्यों, लेकिन यह समाधान @Joeseph R. द्वारा पर्ल समाधान की तुलना में बहुत तेज़ी से है। यह 0.3 सेकंड से भी कम समय में "Supercalifragilisticexpialidocious" चलाता है!

यहाँ पर मेरी दरार है:

#!/bin/bash

str=${1^^}  # convert to uppercase
len=${#str} # get length of string

for ((perm=0; perm <= len; perm++)); do
    for ((i=0; i <= len; i++)); do
        lower=${str,,}   # convert to lowercase

        # Uppercase n-th letter for permutation
        if [ $perm -gt 0 ]; then
            nth=${lower:perm-1}
            lower=$(echo ${lower:0:perm-1}${nth^})
        fi

        echo -n ${str:0:i} # print orig string from 0 to $i
        echo ${lower:i}    # print new string from $i to end
    done
done | sort -u

इसे चलाना:

$ ./permutations.sh hi
hi
hI
Hi
HI

$ ./permutations.sh harley
harley
harleY
harlEy
harLey
haRley
hArley
Harley
HarleY
HarlEy
HarLey
HaRley
HArley
HArleY
HArlEy
HArLey
HARley
HARleY
HARlEy
HARLey
HARLeY
HARLEy
HARLEY

कांटा और इसे संशोधित करने के लिए स्वतंत्र महसूस करें, मुझे यकीन है कि इसे अनुकूलित किया जा सकता है। https://gist.github.com/ryanmjacobs/4c02ad80f833dee0c307


1
कोड स्पष्ट रूप से सभी परिणामों को प्रिंट नहीं करता है। साथ harleyआप 64 परिणाम, जहां की होनी चाहिए harLEY, उदाहरण के लिए?
डेनिस

1
@ डेनिस यूप आप सही हैं। हर बार 2 ^ n परिणाम होना चाहिए, जहां n मूल स्ट्रिंग के वर्णों की संख्या है। यह उत्तर गलत है।
रियानमेकजॉब्स

0

यदि आप कोडिंग के बजाय तैयार टूल का उपयोग करना चाहते हैं, तो आप TextMechanic (क्रमपरिवर्तन / संयोजन जनरेटर टूल) और Unit-Conversion.info का उपयोग कर सकते हैं


वे कैसे प्राप्त करेंगे और उन उपकरणों का उपयोग करेंगे, बिल्कुल?
जेफ स्कालर

इन परियोजनाओं के लिए होम पेज या GitHub रिपॉजिटरी जैसे कुछ विवरणों को जोड़कर और / या अगर उन्हें एक पैकेज से स्थापित किया जा सकता है, तो इस उत्तर में बहुत सुधार किया जा सकता है।
एंथोनी जोगेगन 16
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.