2013-06-06 2 views
0

이 문제가 발생했습니다. 일종의 programm를 만들고 싶습니다. 모든 단어를 대문자로 바꿀 수 있습니다. = 무언가 -> 무언가를 되풀이해라; 무언가; 무언가 ... 무언가 ... 무언가 ... 무언가 ... 아이디어가 있으십니까?모든 소문자를 점진적으로 대문자로 변경하여 일괄 처리로 모든 조합을 가져옵니다.

+0

일부 추가 고려 사항 : 1. 단어가 "테스트"라고 가정 해보십시오. 귀하의 상황에서 "Test"가 "TesT"와 다른 조합입니까? 2. "맛"과 같은 단어가 여러 개인 경우 "맛"과 다른 "맛"입니까? – panhandel

+0

이것은 일종의'순열'이다. [Aacini] (http://stackoverflow.com/users/778560/aacini)를 기다려라. 그가 도와 줄 수있다. – Endoro

+0

@Endoro : 고마워! 당신은 내게 많은 확신을 가지고 있습니다. :-) – Aacini

답변

3

EDIT : 첫 번째 해결 방법은 공백과 같은 알파벳이 아닌 문자로 인한 반복 된 순열을 올바르게 관리하지 못한다는 것을 깨달았습니다. 아래의 배치 파일을 수정하여이 세부 사항을 수정했습니다.

@echo off 
setlocal EnableDelayedExpansion 

set /P "input=Enter input: " 

rem Convert "input" into "upcase" and "lowcase", and create "letters" string 
set upcase=%input% 
set lowcase=%input% 
set letters= 
for %%a in ("a=A" "b=B" "c=C" "d=D" "e=E" "f=F" "g=G" "h=H" "i=I" "j=J" "k=K" "l=L" "m=M" 
      "n=N" "o=O" "p=P" "q=Q" "r=R" "s=S" "t=T" "u=U" "v=V" "w=W" "x=X" "y=Y" "z=Z") do (
    set upcase=!upcase:%%~a! 
    for /F "tokens=1,2 delims==" %%b in (%%a) do (
     set lowcase=!lowcase:%%c=%%b! 
     set letters=!letters!%%c 
    ) 
) 

rem Separate individual characters in "char" two dimensional array, and create "bit" array 
rem Non-alphabetic characters are marked with "bit" elements = 2 
set n=-1 
:nextChar 
    set /A n+=1 
    set char=%lowcase:~0,1% 
    if "!letters:%char%=!" neq "%letters%" (
     set bit[%n%]=0 
     set char[%n%,0]=%char% 
     set char[%n%,1]=%upcase:~0,1% 
    ) else (
     set bit[%n%]=2 
     set char[%n%,2]=%char% 
    ) 
    set upcase=%upcase:~1% 
    set lowcase=%lowcase:~1% 
if defined lowcase goto nextChar 

rem Generate all permutations 
:nextValue 
    rem Copy characters from "char" array into "output" string with current "bit" values 
    set output= 
    for /L %%i in (0,1,%n%) do (
     for %%b in (!bit[%%i]!) do (
     set output=!output!!char[%%i,%%b]! 
    ) 
    ) 
    rem Show this permutation 
    echo %output% 
    rem Advance "bit" array to next value 
    set /A b=n+1, carry=1 
    :nextBit 
     set /A b-=1 
     if !bit[%b%]! lss 2 (
     if !bit[%b%]! equ 0 (
      set /A bit[%b%]=1, carry=0 
     ) else (
      set /A bit[%b%]=0, carry=1 
     ) 
    ) 
    if %b% gtr 0 if %carry% equ 1 goto nextBit 
if %carry% equ 0 goto nextValue 
+0

+1, 좋고 잘 작동합니다. – Endoro

+0

대단히 감사합니다. 당신은 내 시간을 많이 절약했습니다 :) –

+0

@ MichalHerobrineSeják : 글쎄, 당신이이 대답이 당신의 질문을 해결했다고 생각한다면, 당신은 그것을 최선의 답변으로 받아 들일 것입니다. :) – Aacini

1

이 솔루션은 대소 문자가없는 문자열의 문자를 올바르게 처리합니다.

@echo off 
setlocal enableDelayedExpansion 

set "string=%~1" 
set "permutation=" 
set pos=0 

for %%C in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set "lower_%%C=%%C" 
for %%C in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set "upper_%%C=%%C" 

if defined string call :permute 
exit /b 

:permute 
setlocal 
set "chr=!string:~%pos%,1!" 
if not defined chr (
    echo(!permutation! 
    exit /b 
) 
set /a pos+=1 
for /f delims^=^ eol^= %%C in ("!chr!") do (
    if defined upper_%%C (
    set "permutation=!permutation!!lower_%%C!" 
    call :permute 
    set "permutation=!permutation:~0,-1!!upper_%%C!" 
    call :permute 
) else (
    set "permutation=!permutation!%%C" 
    call :permute 
) 
) 
exit /b 

가정 스크립트는 여기 PERMUTE.BAT입니다 출력 샘플 호출입니다 : (두 번 이상 나타나는 문자 용으로) 당신에게 정확한 답을 얻기를위한

>permute.bat "test it" 
test it 
test iT 
test It 
test IT 
tesT it 
tesT iT 
tesT It 
tesT IT 
teSt it 
teSt iT 
teSt It 
teSt IT 
teST it 
teST iT 
teST It 
teST IT 
tEst it 
tEst iT 
tEst It 
tEst IT 
tEsT it 
tEsT iT 
tEsT It 
tEsT IT 
tESt it 
tESt iT 
tESt It 
tESt IT 
tEST it 
tEST iT 
tEST It 
tEST IT 
Test it 
Test iT 
Test It 
Test IT 
TesT it 
TesT iT 
TesT It 
TesT IT 
TeSt it 
TeSt iT 
TeSt It 
TeSt IT 
TeST it 
TeST iT 
TeST It 
TeST IT 
TEst it 
TEst iT 
TEst It 
TEst IT 
TEsT it 
TEsT iT 
TEsT It 
TEsT IT 
TESt it 
TESt iT 
TESt It 
TESt IT 
TEST it 
TEST iT 
TEST It 
TEST IT 
+0

+1, 그것은 훌륭하고 잘 작동합니다. – Endoro

관련 문제