Stable marriage problem: Difference between revisions
Content added Content deleted
Simple9371 (talk | contribs) (→{{header|Batch File}}: Better code.) |
|||
Line 199: | Line 199: | ||
=={{header|Batch File}}== |
=={{header|Batch File}}== |
||
<lang dos>:: Stable Marriage Problem in Rosetta Code |
|||
<lang dos>@echo off |
|||
:: Batch File Implementation |
|||
@echo off |
|||
setlocal enabledelayedexpansion |
setlocal enabledelayedexpansion |
||
:: Initialization (Index Starts in 0) |
|||
set "male= |
set "male=abe bob col dan ed fred gav hal ian jon" |
||
set " |
set "femm=abi bea cath dee eve fay gay hope ivy jan" |
||
set "abe[]=abi, eve, cath, ivy, jan, dee, fay, bea, hope, gay" |
|||
::Initialization of pseudo-arrays [Male] |
|||
set " |
set "bob[]=cath, hope, abi, dee, eve, fay, bea, jan, ivy, gay" |
||
set " |
set "col[]=hope, eve, abi, dee, bea, fay, ivy, gay, cath, jan" |
||
set " |
set "dan[]=ivy, fay, dee, gay, hope, eve, jan, bea, cath, abi" |
||
set " |
set "ed[]=jan, dee, bea, cath, fay, eve, abi, ivy, hope, gay" |
||
set " |
set "fred[]=bea, abi, dee, gay, eve, ivy, cath, jan, hope, fay" |
||
set " |
set "gav[]=gay, eve, ivy, bea, cath, abi, dee, hope, jan, fay" |
||
set " |
set "hal[]=abi, eve, hope, fay, ivy, cath, jan, bea, gay, dee" |
||
set " |
set "ian[]=hope, cath, dee, gay, bea, abi, fay, ivy, jan, eve" |
||
set " |
set "jon[]=abi, fay, jan, gay, eve, bea, dee, cath, ivy, hope" |
||
set "cnt=0" & for %%. in (abi, fay, jan, gay, eve, bea, dee, cath, ivy, hope) do (set jon[!cnt!]=%%.&set /a cnt+=1) |
|||
set "abi[]=bob, fred, jon, gav, ian, abe, dan, ed, col, hal" |
|||
::Initialization of pseudo-arrays [Female] |
|||
set " |
set "bea[]=bob, abe, col, fred, gav, dan, ian, ed, jon, hal" |
||
set " |
set "cath[]=fred, bob, ed, gav, hal, col, ian, abe, dan, jon" |
||
set " |
set "dee[]=fred, jon, col, abe, ian, hal, gav, dan, bob, ed" |
||
set " |
set "eve[]=jon, hal, fred, dan, abe, gav, col, ed, ian, bob" |
||
set " |
set "fay[]=bob, abe, ed, ian, jon, dan, fred, gav, col, hal" |
||
set " |
set "gay[]=jon, gav, hal, fred, bob, abe, col, ed, dan, ian" |
||
set " |
set "hope[]=gav, jon, bob, abe, ian, dan, hal, ed, col, fred" |
||
set " |
set "ivy[]=ian, col, hal, gav, fred, bob, abe, ed, jon, dan" |
||
set " |
set "jan[]=ed, hal, gav, abe, bob, jon, col, ian, fred, dan" |
||
set "cnt=0" & for %%. in (ed, hal, gav, abe, bob, jon, col, ian, fred, dan) do (set jan[!cnt!]=%%.&set /a cnt+=1) |
|||
%==/Initialization ==% |
|||
rem variable notation: |
|||
( %== The main thing ==% |
|||
rem <boy>{<index>} = <girl> |
|||
echo.HISTORY: |
|||
rem <boy>[<girl>] = <index> |
|||
for %%M in (%male%) do ( |
|||
set cnt=0 |
|||
for %%. in (!%%M[]!) do ( |
|||
set "%%M{!cnt!}=%%." |
|||
set "%%M[%%.]=!cnt!" |
|||
set /a cnt+=1 |
|||
) |
|||
) |
|||
for %%F in (%femm%) do ( |
|||
set cnt=0 |
|||
for %%. in (!%%F[]!) do ( |
|||
set "%%F[%%.]=!cnt!" |
|||
set /a cnt+=1 |
|||
) |
|||
) |
|||
:: The Main Thing |
|||
echo(HISTORY: |
|||
call :stableMatching |
call :stableMatching |
||
echo |
echo( |
||
echo |
echo(NEWLYWEDS: |
||
call :display |
call :display |
||
echo |
echo( |
||
call :isStable |
call :isStable |
||
echo |
echo( |
||
echo |
echo(What if ed and hal swapped? |
||
call :swapper ed hal |
call :swapper ed hal |
||
echo |
echo( |
||
echo |
echo(NEW-NEWLYWEDS: |
||
call :display |
call :display |
||
echo |
echo( |
||
call :isStable |
call :isStable |
||
pause>nul |
pause>nul |
||
exit /b 0 |
exit /b 0 |
||
) %==/The main thing ==% |
|||
:: The Algorithm |
|||
:stableMatching |
:stableMatching |
||
set "free_men=%male%" |
|||
set "free_fem=%femm%" |
|||
set "free_women=%female%" ::The free-women variable |
|||
for %%M in (%male%) do set "%%M_tried=0" |
|||
set nextgirl=0 |
|||
:thematchloop |
|||
set m=&for %%F in (!free_men!) do (if not defined m set "m=%%F") |
|||
if "!m!"=="" goto :EOF |
|||
:match_loop |
|||
for /f "tokens=1-2 delims==" %%A in ('set !m![!nextgirl!]') do set "w=%%B" |
|||
if "%free_men%"=="" goto :EOF |
|||
set "propo=" |
|||
for %%W in (!free_women!) do ( |
|||
if "%%W"=="!w!" ( |
|||
set propo=TRUE |
|||
set "!w!_=!m!" & set "!m!_=!w!" |
|||
set free_women=!free_women: %w%=! |
|||
set free_men=!free_men: %m%=! |
|||
echo. !w! ACCEPTED !m!. |
|||
) |
|||
) |
|||
if defined propo (set "nextgirl=0" & goto thematchloop) |
|||
for /f "tokens=1* delims= " %%m in ("%free_men%") do ( |
|||
rem get woman not yet proposed to, but if man's tries exceeds the number |
|||
set "replace=" & for /f "tokens=1-2 delims==" %%R in ('set !w![') do ( |
|||
rem of women (poor guy), he starts again to his most preferred woman (#0). |
|||
if not defined replace ( |
|||
for /f %%x in ("!%%m_tried!") do if not defined %%m{%%x} ( |
|||
if "%%S"=="!m!" ( |
|||
set "%%m_tried=0" & set "w=!%%m{0}!" |
|||
set replace=TRUE |
|||
) else set "w=!%%m{%%x}!" |
|||
set "m=%%m" |
|||
set "free_men=!free_men! !mbef!" |
|||
set "free_men=!free_men: %m%=!" |
|||
set nextgirl=0 |
|||
echo. !w! LEFT !mbef!. |
|||
echo. !w! ACCEPTED !m!. |
|||
) |
|||
if "%%S"=="!mbef!" ( |
|||
set /a nextgirl+=1 |
|||
set replace=FALSE |
|||
) |
|||
) |
|||
) |
|||
goto thematchloop |
|||
%==/The Algorithm ==% |
|||
for /f %%x in ("free_fem:!w!=") do ( |
|||
%== Output the Couples ==% |
|||
if not "!free_fem!"=="!%%x!" ( |
|||
rem accept because !w! (the woman) is free |
|||
set "!m!_=!w!" & set "!w!_=!m!" |
|||
set "free_men=%%n" & set "free_fem=!%%x!" |
|||
echo( !w! ACCEPTED !m!. |
|||
) else ( |
|||
rem here, !w! already has a pair; get his name and rank. |
|||
for /f %%. in ("!w!") do set "cur_man=!%%._!" |
|||
for /f %%. in ("!w![!cur_man!]") do set "rank_cur=!%%.!" |
|||
rem also, get the rank of current proposing man. |
|||
for /f %%. in ("!w![!m!]") do set "rank_new=!%%.!" |
|||
if !rank_new! lss !rank_cur! ( |
|||
rem here, !w! will leave her pair, and choose !m!. |
|||
set "free_men=%%n !cur_man!" |
|||
echo( !w! LEFT !cur_man!. |
|||
rem pair them up now! |
|||
set "!m!_=!w!" & set "!w!_=!m!" |
|||
echo( !w! ACCEPTED !m!. |
|||
) |
|||
) |
|||
) |
|||
set /a "!m!_tried+=1" |
|||
) |
|||
goto :match_loop |
|||
:: Output the Couples |
|||
:display |
:display |
||
for %%S in ( |
for %%S in (%femm%) do echo. %%S and !%%S_!. |
||
goto :EOF |
goto :EOF |
||
%==/Output the Couples ==% |
|||
:: Stability Checking |
|||
:isStable |
:isStable |
||
for %% |
for %%f in (%femm%) do ( |
||
for %%g in (%male%) do ( |
|||
set "better=" |
|||
for /f %%. in ("%%f[!%%f_!]") do set "girl_cur=!%%.!" |
|||
set "girl_aboy=!%%f[%%g]!" |
|||
if not defined dislike ( |
|||
for /f %%. in ("%%g[!%%g_!]") do set "boy_cur=!%%.!" |
|||
set "boy_agirl=!%%g[%%f]!" |
|||
) |
|||
) |
|||
if !boy_cur! gtr !boy_agirl! ( |
|||
for %%X in (!better!) do ( |
|||
if !girl_cur! gtr !girl_aboy! ( |
|||
for /f "tokens=1-2 delims==" %%F in ('set %%X_') do set curr_partner_of_boy=%%G |
|||
echo(STABILITY = FALSE. |
|||
set "main_check=" |
|||
echo(%%f and %%g would rather be together than their current partners. |
|||
for /f "tokens=1-2 delims==" %%B in ('set %%X[') do ( |
|||
goto :EOF |
|||
if not defined main_check ( |
|||
) |
|||
if "%%C"=="%%M" ( |
|||
) |
|||
echo.STABILITY = FALSE. |
|||
) |
|||
echo %%M and %%X would rather be together than their current partners. |
|||
goto :EOF |
|||
) |
|||
if "%%C"=="!curr_partner_of_boy!" set "main_check=CONTINUE" |
|||
) |
|||
) |
|||
) |
|||
) |
) |
||
echo |
echo(STABILITY = TRUE. |
||
goto :EOF |
goto :EOF |
||
%==/Stability Chacking ==% |
|||
:: Swapper |
|||
:swapper |
:swapper |
||
set %~1.tmp=!%~1_! |
|||
set %~2.tmp=!%~2_! |
|||
set "%~1_=!%~2.tmp!" |
|||
set "%~2_=!%~1.tmp!" |
|||
set "!%~1.tmp!_=%~2" |
|||
set "!%~2.tmp!_=%~1" |
|||
goto :EOF</lang> |
|||
%==/Swapper==%</lang> |
|||
{{Out}} |
{{Out}} |
||
<pre>HISTORY: |
<pre>HISTORY: |
||
abi ACCEPTED abe. |
|||
cath ACCEPTED bob. |
|||
hope ACCEPTED col. |
|||
ivy ACCEPTED dan. |
|||
jan ACCEPTED ed. |
|||
bea ACCEPTED fred. |
|||
gay ACCEPTED gav. |
|||
eve ACCEPTED hal. |
|||
hope LEFT col. |
|||
hope ACCEPTED ian. |
|||
abi LEFT abe. |
|||
abi ACCEPTED jon. |
|||
dee ACCEPTED col. |
|||
ivy LEFT dan. |
|||
ivy ACCEPTED abe. |
|||
fay ACCEPTED dan. |
|||
NEWLYWEDS: |
NEWLYWEDS: |
||
abi and jon. |
|||
bea and fred. |
|||
cath and bob. |
|||
dee and col. |
|||
eve and hal. |
|||
fay and dan. |
|||
gay and gav. |
|||
hope and ian. |
|||
ivy and abe. |
|||
jan and ed. |
|||
STABILITY = TRUE. |
STABILITY = TRUE. |
||
Line 374: | Line 385: | ||
NEW-NEWLYWEDS: |
NEW-NEWLYWEDS: |
||
abi and jon. |
|||
bea and fred. |
|||
cath and bob. |
|||
dee and col. |
|||
eve and ed. |
|||
fay and dan. |
|||
gay and gav. |
|||
hope and ian. |
|||
ivy and abe. |
|||
jan and hal. |
|||
STABILITY = FALSE. |
STABILITY = FALSE. |
||
eve and |
eve and abe would rather be together than their current partners.</pre> |
||
=={{header|BBC BASIC}}== |
=={{header|BBC BASIC}}== |