It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 9 years ago.
I am almost done with my game and have employed "Alternate Data Streams" to save some high scores in a ADS. Now i tried to do the same with a color option, to make the game be the same color scheme you set it every time you open it until you want to change it. Here is the code that i am working on:
echo.
echo Color Options - background/text
echo ------------------
echo 0) Black
echo 1) Blue
echo 2) green
echo 3) Aqua
echo 4) Red
echo 5) Purple
echo 6) Yellow
echo 7) White
echo 8) Grey
echo ------------------
set /p BcolorSetting=Background:
set /p TcolorSetting=Text:
echo %BcolorSetting%%TcolorSetting% >>"%~f0:colors"
color <"%~f0:colors"
pause
If you want to see the whole thing it's...
#echo off
REM Produced by Calder Hutchins
REM This is a game
title Memory Game
:begin
set point=0
cls
echo.
echo Memeory Game
echo ------------------
echo 1) Play
echo 2) Instructions
echo 3) High Scores
echo 4) Options
echo ------------------
set /p pick=^>
if %pick%==1 goto one
if %pick%==2 goto two
if %pick%==3 goto three
if %pick%==4 goto four
if %pick%==99 goto test
goto begin
:one
cls
REM Determines the number
if %point% LSS 6 set /a rand=%random% %% (100 - 1 + 1)+ 1
if %point% LSS 12 if %point% GTR 5 set /a rand=%random% %% (500 - 100 + 1)+ 100
if %point% LSS 18 if %point% GTR 11 set /a rand=%random% %% (1000 - 500 + 1)+ 500
if %point% LSS 24 if %point% GTR 17 set /a rand=%random% %% (2000 - 1000 + 1)+ 1000
if %point% LSS 30 if %point% GTR 23 set /a rand=%random% %% (9000 - 1500 + 1)+ 1500
if %point% LSS 36 if %point% GTR 29 set /a rand=%random% %% (19000 - 5000 + 1)+ 5000
if %point% LSS 42 if %point% GTR 35 set /a rand=%random% %% (32000 - 10000 + 1)+ 10000
if %point% LSS 48 if %point% GTR 41 set /a rand=%random% %% (999 - 100 + 1)+ 100
if %point% LSS 48 if %point% GTR 41 set /a randtwo=%random% %% (999 - 100 + 1)+ 100
if %point% GTR 47 set /a rand=%random% %% (9999 - 1000 + 1)+ 1000
if %point% GTR 47 set /a randtwo=%random% %% (9999 - 1000 + 1)+ 1000
echo.
REM Prints the number
if %point% LSS 42 echo %rand%
if %point% GTR 41 set rand=%rand%%randtwo%
if %point% GTR 41 echo %rand%
echo.
ping localhost -n 3 >nul
cls
echo.
echo.
echo.
set /p yourOption=Guess:
REM Determines correct or wrong
if %youroption%==%rand% set /a point=%point% +1 & goto one
cls
echo.
echo You scored: %point%
echo.
set /p name=Type name:
echo %name% - %point% >>"%~f0:scores"
goto begin
:two
cls
echo.
echo The objective of the game is to get as many points as possible. To get points you must correctly retype the numbers that appear on the screen. The numbers show for a short period of time. As you get more points the numbers get longer! When you have lost you will be prompted to enter your name. You can view the highscores too!
echo.
pause
goto begin
:three
cls
echo.
more<"%~f0:scores" | sort
echo.
pause
goto begin
:four
cls
echo.
echo Settings/Options
echo ------------------
echo 1) color
echo ------------------
set /p pickSetting=^>
if %pickSetting%==1 goto oneSetting
goto four
:oneSetting
cls
echo.
echo Color Options - background/text
echo ------------------
echo 0) Black
echo 1) Blue
echo 2) green
echo 3) Aqua
echo 4) Red
echo 5) Purple
echo 6) Yellow
echo 7) White
echo 8) Grey
echo ------------------
set /p BcolorSetting=Background:
set /p TcolorSetting=Text:
echo %BcolorSetting%%TcolorSetting% >>"%~f0:colors"
color <"%~f0:colors"
pause
goto begin
Thank-you in advance guys!
Fortunately the FOR /F can read ADS:
for /f "usebackq" %%C in ("%~f0:colors") do COLOR %%C
It appears that you will have to CD a certain directory. Then, write to a text file within the directory. In the start, read the text file.
Then, overwrite the text file and write the color in it at the point you are stuck in.
If you need to start with settings in any app, you always need a save file.
Writing can be like this:
echo %BcolorSetting%%TcolorSetting% >>"colorsetting.txt"
And when retrieving, do it in the very beginning. Before begin.
It is read like this
set /p %~f0:colors= <colorsetting.txt
Assuming you use those variables. I hope this helps.
Related
I am made a CMD batch file to generate the barcode numbers. Batch script generate the last ninth number of barcode by doing the calculation and generate the file named "barcode.txt". The code is working fine. Only the problem is when the "fn" number "Barcode Eight Digit " start with zero then the code is not working properly.
#echo off
setlocal EnableDelayedExpansion
set /p al=Please enter Alfa two digit:
set /p fn=Please enter Barcode Eight Digit:
set /p no=Please enter number of Barode:
set /a NUMBER=%fn%
set /a to=%no%
set /a count=1
pause
:loop
if %count% GTR %to% GOTO :end
set var1=%NUMBER:~0, 1%
set var2=%NUMBER:~1, 1%
set var3=%NUMBER:~2, 1%
set var4=%NUMBER:~3, 1%
set var5=%NUMBER:~4, 1%
set var6=%NUMBER:~5, 1%
set var7=%NUMBER:~6, 1%
set var8=%NUMBER:~7, 1%
set /A B1 = %var1% * 8
set /A B2 = %var2% * 6
set /A B3 = %var3% * 4
set /A B4 = %var4% * 2
set /A B5 = %var5% * 3
set /A B6 = %var6% * 5
set /A B7 = %var7% * 9
set /A B8 = %var8% * 7
set /A B9 = %B1% + %B2% + %B3% + %B4% + %B5% + %B6% + %B7% + %B8%
set /A B10 = (%B9%) %% 11
set /A B11 = 11- %B10%
if "%B11%"=="10" (set B11=0)
if "%B11%"=="11" (set B11=5)
echo %al%%NUMBER%%B11%IN >> barcode.txt
set /a NUMBER+=1
set /a count+=1
goto loop
:end
echo end it
pause
I tried to find the solution but failed. Can please any one help me to fix the issue while number start with zero.
Use
set /a NUMBER=%fn% + 100000000
(1 followed by 8 0s)
Then
echo %al%%NUMBER:~1%%B11%IN >> barcode.txt
Thanks to suggest me. I have made the working code by just declaring set /a NUMBER=1%fn%.
#echo off
setlocal EnableDelayedExpansion
set /p al=Please enter Alfa two digit:
set /p fn=Please enter Barcode Eight Digit:
set /p no=Please enter number of Barode:
set /a NUMBER=1%fn%
set to=%no%
set count=1
pause
:loop
if %count% GTR %to% GOTO :end
set var1=%NUMBER:~1, 1%
set var2=%NUMBER:~2, 1%
set var3=%NUMBER:~3, 1%
set var4=%NUMBER:~4, 1%
set var5=%NUMBER:~5, 1%
set var6=%NUMBER:~6, 1%
set var7=%NUMBER:~7, 1%
set var8=%NUMBER:~8, 1%
set /A B1 = var1 * 8
set /A B2 = var2 * 6
set /A B3 = var3 * 4
set /A B4 = var4 * 2
set /A B5 = var5 * 3
set /A B6 = var6 * 5
set /A B7 = var7 * 9
set /A B8 = var8 * 7
set /A B9 = B1 + B2 + B3 + B4 + B5 + B6 + B7 + B8
set /A B10 = B9 %% 11
set /A B11 = 11- B10
if "%B11%"=="10" (set B11=0)
if "%B11%"=="11" (set B11=5)
echo %al%%NUMBER:~1%%B11%IN >> barcode.txt
set /a NUMBER+=1
set /a count+=1
goto loop
:end
echo end it
pause
is there a way to make a If query for specifig
number sections in Batch?
Something Like this:
IF "Var1"=="1-10" (
do something
)
the 1-10 should stand for 1,2,3,4,5,6,7,8,9,10.
I want to make 10 queries (1-10,11-20,21-30, ... , 91-100)
Is that possible?
You can do this:
#echo off
set Var1=1
for /l %%i in (0,1,10) do if %%i==%Var1% echo 10 or below
for /l %%i in (11,1,20) do if %%i==%Var1% echo 11 - 20
for /l %%i in (21,1,30) do if %%i==%Var1% echo 21 - 30
for /l %%i in (31,1,40) do if %%i==%Var1% echo 31 - 40
for /l %%i in (41,1,50) do if %%i==%Var1% echo 41 - 50
for /l %%i in (51,1,60) do if %%i==%Var1% echo 51 - 60
for /l %%i in (61,1,70) do if %%i==%Var1% echo 61 - 70
for /l %%i in (71,1,80) do if %%i==%Var1% echo 71 - 80
for /l %%i in (81,1,90) do if %%i==%Var1% echo 81 - 90
for /l %%i in (91,1,100) do if %%i==%Var1% echo 91 - 100
Here you can change set Var1=1 to any other number and it will correspond. You can replace echo N - N with your commands.
Also, set Var1=1 can be removed from the above example if used with your code as I simply set it to demonstrate the behaviour. Here is an extract from the help when running for /? so you understand the numeric behaviour.
FOR /L %variable IN (start,step,end) DO command [command-parameters]
The set is a sequence of numbers from start to end, by step amount.
So (1,1,5) would generate the sequence 1 2 3 4 5 and (5,-1,1) would
generate the sequence (5 4 3 2 1)
The following batch file works perfectly for the first 10 options. However I do not know how to extend the functionality of the batch file more than 10 option 0- 9. I have 35 possible options.
#ECHO OFF
MODE CON:COLS=100 LINES=50
SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
(SET sourceFolder=C:\Users\Administrator\Desktop\test)
](SET targetFolder=C:\Users\Administrator\Desktop\test2)
SET /P "customerID=Enter Customer ID: "
:MENU
CLS
ECHO=
ECHO= ..................................................
ECHO= PLEASE SELECT THE OPTION FROM THE EVENT MENU BELOW
ECHO= ..................................................
ECHO Option Number Event Number Event Name
ECHO.
ECHO. 0. 101 NewCustomer
ECHO. 1. 102 ExisingCustomer
ECHO. 2. 103 LockedAccount
ECHO. 3. 104 DeleteAccount
ECHO. 4. 105 ExpireSession
ECHO. 5. 106 PasswordUpdated
ECHO. 6. 107 PasswordReset
ECHO. 7 108 HackedAccount
ECHO. 8. 109 UpdateProfile
ECHO. 9. 110 UpdateLists
ECHO. A. 111 NewPurchase
ECHO. B. 112 ExisingSale
ECHO. C. 113 AmendOrder
ECHO. D. 114 AmendDelivery
ECHO. E. 115 CancelOrder
ECHO. F. 116 OvernightFiles
ECHO. G. 117 DailyFiles
ECHO. H. 118 HelpFlies
ECHO. I. 119 FraudAccount
ECHO. J. 120 DeadCustomer
ECHO. K. 121 WelcomeEmail
ECHO. L. 122 OrderEmail
ECHO. M. 123 OrderAmmended
ECHO. N. 124 NoRemainingStock
ECHO. O. 125 ReplenishStock
ECHO. P. 126 SalesQuery
ECHO. Q. 127 UpdateFirstName
ECHO. R. 128 UpdateSurname
ECHO. S. 129 UpdateAddress
ECHO. T. 130 UpdateDateOfBirth
ECHO. U. 131 UpdateContactNo
ECHO. V. 132 UpdateEmail
ECHO. W. 133 UpdatePreferences
ECHO. X. 134 UpdateEmailPreferences
ECHO. Y. 135 UpdateBankDetails
CHOICE /C 0123456789ABCDEFGHIJKLMNOPQRSTUVWXY /M "CHOOSE AN OPTION"
SET "Option=%ERRORLEVEL%"
FOR /F "TOKENS=1-4 DELIMS=. " %%A IN ('FINDSTR/BC:"ECHO. " "%~f0"'
) DO IF "%%B"=="%Option%" (SET "Name=%%C" & SET "Code=%%D")
FOR /F "DELIMS=" %%A IN (
'FINDSTR/MISC:"%customerID%" "%sourceFolder%\*"^|FINDSTR/MIF:/ /C:"%Name%"'
) DO COPY "%%A" "%targetFolder%"
PAUSE
Took me some time to understand what your problem was:
when you type a choice, you get the index of the choice and not the relevant letter, making it impossible to link back to the selected item of the menu if not 0-9.
So I propose to convert back your index to the entered letter like this (extract):
SET "Option=%ERRORLEVEL%" <== this is your code
rem here scan for correct letter
FOR /L %%a IN (0,1,35) DO if %%a==%Option% set idx=%%a
rem small correction of index
set /A idx-=1
set Option=!Choice:~%idx%,1!
Full test code, pressing a digit or a letter prints the letter and the code & title of the menu:
#echo off
set CHOICE=0123456789ABCDEFGHIJKLMNOPQRSTUVWXY
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
:MENU
CLS
ECHO=
ECHO= ..................................................
ECHO= PLEASE SELECT THE OPTION FROM THE EVENT MENU BELOW
ECHO= ..................................................
ECHO Option Number Event Number Event Name
ECHO.
ECHO. 0. 101 NewCustomer
ECHO. 1. 102 ExisingCustomer
ECHO. 2. 103 LockedAccount
ECHO. 3. 104 DeleteAccount
ECHO. 4. 105 ExpireSession
ECHO. 5. 106 PasswordUpdated
ECHO. 6. 107 PasswordReset
ECHO. 7 108 HackedAccount
ECHO. 8. 109 UpdateProfile
ECHO. 9. 110 UpdateLists
ECHO. A. 111 NewPurchase
ECHO. B. 112 ExisingSale
ECHO. C. 113 AmendOrder
ECHO. D. 114 AmendDelivery
ECHO. E. 115 CancelOrder
ECHO. F. 116 OvernightFiles
ECHO. G. 117 DailyFiles
ECHO. H. 118 HelpFlies
ECHO. I. 119 FraudAccount
ECHO. J. 120 DeadCustomer
ECHO. K. 121 WelcomeEmail
ECHO. L. 122 OrderEmail
ECHO. M. 123 OrderAmmended
ECHO. N. 124 NoRemainingStock
ECHO. O. 125 ReplenishStock
ECHO. P. 126 SalesQuery
ECHO. Q. 127 UpdateFirstName
ECHO. R. 128 UpdateSurname
ECHO. S. 129 UpdateAddress
ECHO. T. 130 UpdateDateOfBirth
ECHO. U. 131 UpdateContactNo
ECHO. V. 132 UpdateEmail
ECHO. W. 133 UpdatePreferences
ECHO. X. 134 UpdateEmailPreferences
ECHO. Y. 135 UpdateBankDetails
CHOICE /C %CHOICE% /M "CHOOSE AN OPTION"
SET "Option=%ERRORLEVEL%"
rem here scan for correct letter
FOR /L %%a IN (0,1,35) DO if %%a==%Option% set idx=%%a
rem small correction of index
set /A idx-=1
set Option=!Choice:~%idx%,1!
FOR /F "TOKENS=1-4 DELIMS=. " %%A IN ('FINDSTR/BC:"ECHO. " "%~f0"'
) DO (IF "%%B"=="%Option%" (SET "Name=%%C" & SET "Code=%%D" & echo activated %Option%: !Name!,!Code!)
)
Notes:
I needed to enable delayed expansion back
I set CHOICE in a variable at the start, nicer to propose the choice and then scan into it for correct letter/digit
May I suggest a different approach based on arrays that run faster and is simpler to keep updated?
#ECHO OFF
MODE CON:COLS=100 LINES=50
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
(SET sourceFolder=C:\Users\Administrator\Desktop\test)
(SET targetFolder=C:\Users\Administrator\Desktop\test2)
SET /P "customerID=Enter Customer ID: "
REM Assemble the data arrays
set i=0
set "options="
FOR /F "TOKENS=1-4 DELIMS=. " %%A IN ('FINDSTR/BC:"ECHO. " "%~f0"') DO (
set /A i+=1
set "options=!options!%%B"
SET "Name[!i!]=%%C"
SET "Code[!i!]=%%D"
)
:MENU
CLS
ECHO=
ECHO= ..................................................
ECHO= PLEASE SELECT THE OPTION FROM THE EVENT MENU BELOW
ECHO= ..................................................
ECHO Option Number Event Number Event Name
ECHO/
ECHO. 0. 101 NewCustomer
ECHO. 1. 102 ExisingCustomer
ECHO. 2. 103 LockedAccount
ECHO. 3. 104 DeleteAccount
ECHO. 4. 105 ExpireSession
ECHO. 5. 106 PasswordUpdated
ECHO. 6. 107 PasswordReset
ECHO. 7 108 HackedAccount
ECHO. 8. 109 UpdateProfile
ECHO. 9. 110 UpdateLists
ECHO. A. 111 NewPurchase
ECHO. B. 112 ExisingSale
ECHO. C. 113 AmendOrder
ECHO. D. 114 AmendDelivery
ECHO. E. 115 CancelOrder
ECHO. F. 116 OvernightFiles
ECHO. G. 117 DailyFiles
ECHO. H. 118 HelpFlies
ECHO. I. 119 FraudAccount
ECHO. J. 120 DeadCustomer
ECHO. K. 121 WelcomeEmail
ECHO. L. 122 OrderEmail
ECHO. M. 123 OrderAmmended
ECHO. N. 124 NoRemainingStock
ECHO. O. 125 ReplenishStock
ECHO. P. 126 SalesQuery
ECHO. Q. 127 UpdateFirstName
ECHO. R. 128 UpdateSurname
ECHO. S. 129 UpdateAddress
ECHO. T. 130 UpdateDateOfBirth
ECHO. U. 131 UpdateContactNo
ECHO. V. 132 UpdateEmail
ECHO. W. 133 UpdatePreferences
ECHO. X. 134 UpdateEmailPreferences
ECHO. Y. 135 UpdateBankDetails
CHOICE /C %options% /M "CHOOSE AN OPTION"
SET "Option=%ERRORLEVEL%"
SET "Name=!Name[%Option%]!" & SET "Code=!Code[%Option%]!"
FOR /F "DELIMS=" %%A IN (
'FINDSTR/MISC:"%customerID%" "%sourceFolder%\*"^|FINDSTR/MIF:/ /C:"%Name%"'
) DO COPY "%%A" "%targetFolder%"
PAUSE
As an alternative:
#ECHO OFF
MODE CON:COLS=50 LINES=50
SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
(SET sourceFolder=C:\test)
(SET targetFolder=C:\test2)
SET /P "customerID=Enter Customer ID: "
:MENU
"SET _="
CLS
ECHO=
ECHO= ................................................
ECHO= PLEASE SELECT THE EVENT CODE FROM THE MENU BELOW
ECHO= ................................................
ECHO=
ECHO= Event Code -=- Event Name
ECHO=
ECHO. 101 --- NewCustomer
ECHO. 102 --- ExisingCustomer
ECHO. 103 --- LockedAccount
ECHO. 104 --- DeleteAccount
ECHO. 105 --- ExpireSession
ECHO. 106 --- PasswordUpdated
ECHO. 107 --- PasswordReset
ECHO. 108 --- HackedAccount
ECHO. 109 --- UpdateProfile
ECHO. 110 --- UpdateLists
ECHO. 111 --- NewPurchase
ECHO. 112 --- ExisingSale
ECHO. 113 --- AmendOrder
ECHO. 114 --- AmendDelivery
ECHO. 115 --- CancelOrder
ECHO. 116 --- OvernightFiles
ECHO. 117 --- DailyFiles
ECHO. 118 --- HelpFlies
ECHO. 119 --- FraudAccount
ECHO. 120 --- DeadCustomer
ECHO. 121 --- WelcomeEmail
ECHO. 122 --- OrderEmail
ECHO. 123 --- OrderAmmended
ECHO. 124 --- NoRemainingStock
ECHO. 125 --- ReplenishStock
ECHO. 126 --- SalesQuery
ECHO. 127 --- UpdateFirstName
ECHO. 128 --- UpdateSurname
ECHO. 129 --- UpdateAddress
ECHO. 130 --- UpdateDateOfBirth
ECHO. 131 --- UpdateContactNo
ECHO. 132 --- UpdateEmail
ECHO. 133 --- UpdatePreferences
ECHO. 134 --- UpdateEmailPreferences
ECHO. 135 --- UpdateBankDetails
ECHO=
SET/P "PICK= > "
FOR /F "EOL=F TOKENS=2-3 DELIMS=.- " %%A IN ('FIND " --- " "%~f0"') DO (
IF %PICK%==%%A (SET "_=T"
FOR /F "DELIMS=" %%C IN (
'FINDSTR/MISC:"%customerID%" "%sourceFolder%\*"
^|FINDSTR/MIF:/ /C:"%%B"') DO COPY "%%C" "%targetFolder%"))
IF NOT DEFINED _ GOTO :MENU
TIMEOUT -1
I am new to Batch and I would like to know if I can find out all combinations of numbers in order.
In this case I have 49 Numbers from 1 - 49 , and I have to pick 6 Numbers to be the results.
For example:
1 2 3 4 5 6
1 2 3 4 5 7
...
1 2 3 4 5 49
1 2 3 4 6 7
1 2 3 4 6 8
etc...
This is my old code:
#echo off > NEWFILE & setLocal EnableDelayedExpansion
set a=44
set b=45
set c=46
set d=47
set e=48
set f=49
for /L %%a in (1 1 !a!) do (
for /L %%b in (2 1 !b!) do (
for /L %%c in (3 1 !c!) do (
for /L %%d in (4 1 !d!) do (
for /L %%e in (5 1 !e!) do (
for /L %%f in (6 1 !f!) do (
echo.%%a %%b %%c %%d %%e %%f
))))))) >> NEWFILE
goto :EOF
However it returns:
1 2 3 4 5 6
1 2 3 4 5 7
...
1 2 3 4 5 49
1 2 3 4 6 6
Two 6's appeared.
I don't seem to be able to fix it, please help, thanks very much!
When you post a question you should post your efforts to solve it, describe the method used and the problems you had; otherwise you may get similar answers with no explanations at all, like this one:
EDIT: As users dbenham and aschipfl indicated, my original code have a small bug: the set /A i=M-1 line should be placed after the :nextSet label. This is the right code:
#echo off
setlocal EnableDelayedExpansion
set "N=%1"
set "M=%2"
set "line="
for /L %%i in (1,1,%M%) do (
set "C[%%i]=%%i"
set "line=!line! ^!C[%%i]^!"
)
:nextSet
set /A i=M-1
for /L %%j in (!C[%M%]!,1,%N%) do (
set "C[%M%]=%%j"
echo %line%
)
:nextPos
set "C=!C[%i%]!"
if %C% equ %N% (
set /A i-=1
if !i! equ 0 goto :EOF
goto nextPos
)
for /L %%i in (%i%,1,%M%) do (
set /A C+=1,C[%%i]=C
)
if !C[%M%]! gtr %N% goto nextPos
goto nextSet
Obviously, the corrected code generate a much larger number of results and this version is particularly slow... :(
The new version below use the exact same code of dbenham's solution; its only advantage is that you may change the parameters used to generate the result in a very easy way:
#echo off
setlocal EnableDelayedExpansion
set "N=%1"
set "M=%2"
set /A j=N-M, prev=0
set "for=" & set "line=" & set "endfor="
for /L %%i in (1,1,%M%) do (
set /A j+=1
set "for=!for! set /A start=!prev!+1 & for /L %%%%i in (^!start^!,1,!j!) do ("
set "line=!line! %%%%i"
set "endfor=!endfor!)"
set "prev=%%%%i"
)
REM ECHO !FOR! echo !LINE! %ENDFOR%
%for% echo %line% %endfor%
Output example:
C:\> test.bat 6 4
1 2 3 4
1 2 3 5
1 2 3 6
1 2 4 5
1 2 4 6
1 2 5 6
1 3 4 5
1 3 4 6
1 3 5 6
1 4 5 6
2 3 4 5
2 3 4 6
2 3 5 6
2 4 5 6
3 4 5 6
To get your results, use: test.bat 49 6
2ND EDIT: Faster method added
When the problem to solve is the excessive time a process takes, an obvious alternative is to use a faster programming language. The solution below use JScript, that is somewhat similar to Batch file programming:
#if (#CodeSection == #Batch) #then
#echo off
echo Start: %time%
cscript //nologo //E:JScript "%~F0" > result.txt
echo End: %time%
goto :EOF
#end
// JScript code section
for ( var A=1; A <= 44; ++A ) {
for ( var B=A+1; B <= 45; ++B ) {
for ( var C=B+1; C <= 46; ++C ) {
for ( var D=C+1; D <= 47; ++D ) {
for ( var E=D+1; E <= 48; ++E ) {
for ( var F=E+1; F <= 49; ++F ) {
WScript.Echo(A,B,C,D,E,F);
}
}
}
}
}
}
This is a Batch-JScript hybrid script; save it with .BAT extension. This program took a little less than 9 minutes in my cheap-and-slow lap-top computer to generate a 239 MB file with 13983816 lines.
The problem is compute intensive, given that there are 13,983,816 unique permutations. (See https://en.wikipedia.org/wiki/Lottery_mathematics#Calculation_explained_in_choosing_6_from_49.)
The Rojo answer should work, but the GOTO and repetitive FOR /F parsing and IF logic will slow things down considerably.
The code is much faster if you use nested FOR /L loops.
#echo off
setlocal enableDelayedExpansion
for /l %%A in (1 1 44) do (
set /a start=%%A+1
for /l %%B in (!start! 1 45) do (
set /a start=%%B+1
for /l %%C in (!start! 1 46) do (
set /a start=%%C+1
for /l %%D in (!start! 1 47) do (
set /a start=%%D+1
for /l %%E in (!start! 1 48) do (
set /a start=%%E+1
for /l %%F in (!start! 1 49) do (
echo %%A %%B %%C %%D %%E %%F
)
)
)
)
)
)
This will still be unbearably slow to let this script print the results to the screen. I estimate it will take 1.25 hours on my machine. Redirecting the output to a file is about 5 times faster, around 15 minutes.
In the future, please show some code demonstrating that you've attempted to solve the problem yourself, showing where you got stuck, where the output is not as expected, etc. Questions resembling "Here are my requirements. Code this for me" generally aren't well-received around here. How you got an upvote without showing any code is beyond me, but c'est la vie.
In this instance, I found the problem interesting, so I thought I'd go ahead and get you started. Challenge: accepted. Here's one way to do it.
#echo off
setlocal enabledelayedexpansion
set "series=1 2 3 4 5 6"
:loop
echo %series%
if "%series%"=="44 45 46 47 48 49" goto :EOF
for /f "tokens=1-6" %%a in ("%series%") do (
set /a i1=%%a, i2=%%b, i3=%%c, i4=%%d, i5=%%e, i6=%%f+1
if !i6! gtr 49 set /a i5+=1, i6=i5+1
if !i5! gtr 48 set /a i4+=1, i5=i4+1, i6=i5+1
if !i4! gtr 47 set /a i3+=1, i4=i3+1, i5=i4+1, i6=i5+1
if !i3! gtr 46 set /a i2+=1, i3=i2+1, i4=i3+1, i5=i4+1, i6=i5+1
if !i2! gtr 45 set /a i1+=1, i2=i1+1, i3=i2+1, i4=i3+1, i5=i4+1, i6=i5+1
set "series=!i1! !i2! !i3! !i4! !i5! !i6!"
)
goto loop
Here's another solution that should be more efficient.
#echo off
setlocal enabledelayedexpansion
set "series=1 2 3 4 5 6"
set total=0
for /L %%a in (1,1,44) do (
set /a i2 = %%a + 1
for /L %%b in (!i2!, 1, 45) do (
set /a i3 = %%b + 1
for /L %%c in (!i3!, 1, 46) do (
set /a i4 = %%c + 1
for /L %%d in (!i4!, 1, 47) do (
set /a i5 = %%d + 1
for /L %%e in (!i5!, 1, 48) do (
set /a i6 = %%e + 1
for /L %%f in (!i6!, 1, 49) do (
rem // Uncomment this echo to watch the progress (severely decreases efficiency)
rem echo %%a %%b %%c %%d %%e %%f
set /a total += 1
)
)
)
)
)
echo Total so far: !total!
)
rem // Should have gone through 13983816 iterations
In a Windows cmd script (aka bat script), I have a FOR /L loop from 1 to 8, where I need to do a bit shift and somehow format a variable as a hexadecimal number (which if you ask, is a single CPU identifier bit to feed into /AFFINITY).
I can't figure out how to do the last step. This is my loop.cmd file:
#ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /L %%i IN (1,1,8) DO (
SET /A "J=1<<%%i"
ECHO %%i and !J!
)
which does everything but format a hex number:
1 and 2
2 and 4
3 and 8
4 and 16
5 and 32
6 and 64
7 and 128
8 and 256
expected output is:
1 and 2
2 and 4
3 and 8
4 and 10
5 and 20
6 and 40
7 and 80
8 and 100
How do you format a hexadecimal number?
#ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /L %%i IN (1,1,8) DO (
SET /A "J=1<<%%i"
CALL :DECTOHEX J
ECHO %%i and !J!
)
GOTO :EOF
:DECTOHEX VAR
SET "DEC=!%1!"
SET "HEX="
:NEXT
SET /A DIGIT=DEC%%16, DEC/=16
SET "HEX=%DIGIT%%HEX%"
IF %DEC% NEQ 0 GOTO NEXT
SET "%1=%HEX%"
EXIT /B
EDIT: Reply to the comment
Previous solution works correctly when the shifted value have just one bit on, as stated in the question. If the shifted value may have several bits on then a more general decimal-to-hexadecimal conversion is required, like the one below:
#ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
REM DEFINE THE HEXA DIGITS
SET "HEXA=0123456789ABCDEF"
FOR /L %%i IN (1,1,8) DO (
SET /A "J=3<<%%i"
CALL :DECTOHEX J
ECHO %%i and !J!
)
GOTO :EOF
:DECTOHEX VAR
SET "DEC=!%1!"
SET "HEX="
:NEXT
SET /A DIGIT=DEC%%16, DEC/=16
SET "HEX=!HEXA:~%DIGIT%,1!%HEX%"
IF %DEC% NEQ 0 GOTO NEXT
SET "%1=%HEX%"
EXIT /B
#echo off
setlocal enabledelayedexpansion
set x=2
set n=1
set /a result=n
for /l %%a in (1,1,10) do (
set /a result*=x
if "!result:~0,1!"=="1" set result=!result:16=10!
echo %%a and !result!
)
output:
1 and 2
2 and 4
3 and 8
4 and 10
5 and 20
6 and 40
7 and 80
8 and 100
9 and 200
10 and 400