รับชุดค่าผสมที่เป็นไปได้ทั้งหมดของคำด้วยตัวอักษรตัวพิมพ์เล็ก / ตัวพิมพ์ใหญ่


14

ฉันต้องการเขียนสคริปต์ทุบตีเพื่อพิมพ์วิธีเรียงสับเปลี่ยนตัวพิมพ์เล็กและใหญ่ที่เป็นไปได้ทั้งหมดเช่นฮาร์เลย์:

harley
harleY
harlEy
harLey
...
HARLey
HARLEy
HARLEY

โซลูชันไร้เดียงสาของฉันคือการเขียน n-th (n คือ len (คำ)) ซ้อนสำหรับลูปสำหรับคำเฉพาะนี้:

#!/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'

เพื่อความสนุกสนานลองแทนที่ "harley" ด้วย"supercalifragilisticexpialidocious"เป็นเวลา 5 นาทีและคอมพิวเตอร์ของฉันยังคงกระทืบบนตัวนี้และอาจจะไม่เสร็จ :)


1
สำหรับ w ใน {h, H} {a, A} {r, R} {l, L} {e, E} {y, Y}; ทำ echo $ w เสร็จแล้ว
mattdm

4
โซลูชั่นแบบต่อบรรทัดที่เรียบง่ายยังคงง่ายขึ้น:printf '%s\n' {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}
John1024

2
@ John1024 ฉันขอแนะนำให้คุณโพสต์ว่าเป็นคำตอบมันเป็นคุณสมบัติที่ได้รับการชื่นชมจาก bash'sprintf
steeldriver

10
eval echo $ (echo " word " | 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

แก้ไข 2:คำตอบนี้ผิด ไม่สร้างการรวม 2 ^ n เท่าที่ควร

แก้ไข:ฉันไม่รู้ว่าทำไม แต่โซลูชันนี้เร็วจริง ๆเมื่อเทียบกับโซลูชัน perl โดย @Joeseph R. มันทำงาน "Supercalifragilisticexpialidocious" ในเวลาน้อยกว่า 0.3 วินาที!

นี่คือรอยแตกของฉันที่มัน:

#!/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
@ Denis Yup คุณพูดถูก ทุกครั้งที่ควรมีผลลัพธ์ 2 ^ n โดยที่ n คือจำนวนอักขระของสตริงต้นฉบับ คำตอบนี้ผิด
ryanmjacobs

0

หากคุณต้องการใช้เครื่องมือที่พร้อมใช้งานแทนการเข้ารหัสคุณสามารถใช้ TextMechanic (เครื่องมือสร้างการเปลี่ยนแปลง / การรวมกัน) และ Unit-Conversion.info


พวกเขาจะใช้และใช้เครื่องมือเหล่านั้นได้อย่างไร
Jeff Schaller

คำตอบนี้อาจได้รับการปรับปรุงอย่างมากโดยการเพิ่มรายละเอียดบางอย่างเช่นโฮมเพจหรือที่เก็บ GitHub สำหรับโครงการเหล่านี้และ / หรือถ้าพวกเขาสามารถติดตั้งได้จากแพ็คเกจ
Anthony Geoghegan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.