EnableExplicit Global verbose = #False Macro COND ( a, b ) Procedure a ( Array s ( 1 ) ) ProcedureReturn Bool( b ) EndProcedure EndMacro Prototype condition ( Array s ( 1 ) ) #N_FLOORS = 5 #TOP = #N_FLOORS - 1 Global Dim solutions ( #N_FLOORS - 1 ) Global Dim occupied ( #N_FLOORS - 1 ) Enumeration tenants #baker #cooper #fletcher #miller #smith #phantom_of_the_opera EndEnumeration Global Dim names.s ( 4 ) names( 0 ) = "baker" names( 1 ) = "cooper" names( 2 ) = "fletcher" names( 3 ) = "miller" names( 4 ) = "smith" COND( c0, s( #baker ) <> #TOP ) COND( c1, s( #cooper ) <> 0 ) COND( c2, s( #fletcher ) <> 0 And s( #fletcher ) <> #TOP ) COND( c3, s( #miller ) > s( #cooper ) ) COND( c4, Abs( s( #smith ) - s( #fletcher ) ) <> 1 ) COND( c5, Abs( s( #cooper ) - s( #fletcher ) ) <> 1 ) #N_CONDITIONS = 6 Global Dim conds ( #N_CONDITIONS - 1 ) conds( 0 ) = @c0() conds( 1 ) = @c1() conds( 2 ) = @c2() conds( 3 ) = @c3() conds( 4 ) = @c4() conds( 5 ) = @c5() Procedure solve ( person.i ) Protected i.i, j.i If person = #phantom_of_the_opera For i = 0 To #N_CONDITIONS - 1 Protected proc.condition = conds( i ) If proc( solutions( ) ) Continue EndIf If verbose For j = 0 To #N_FLOORS - 1 PrintN( Str( solutions( j ) ) + " " + names( j ) ) Next PrintN( "cond" + Str( i ) + " bad\n" ) EndIf ProcedureReturn 0 Next PrintN( "Found arrangement:" ) For i = 0 To #N_FLOORS - 1 PrintN( Str( solutions( i ) ) + " " + names( i ) ) Next ProcedureReturn 1 EndIf For i = 0 To #N_FLOORS - 1 If occupied( i ) Continue EndIf solutions( person ) = i occupied( i ) = #True If solve( person + 1 ) ProcedureReturn #True EndIf occupied( i ) = #False Next ProcedureReturn #False EndProcedure OpenConsole( ) verbose = #False If Not solve( 0 ) PrintN( "Nobody lives anywhere" ) EndIf Input( ) CloseConsole( ) End