How to resolve the algorithm Dinesman's multiple-dwelling problem step by step in the M2000 Interpreter programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Dinesman's multiple-dwelling problem step by step in the M2000 Interpreter programming language

Table of Contents

Problem Statement

Solve Dinesman's multiple dwelling problem but in a way that most naturally follows the problem statement given below. Solutions are allowed (but not required) to parse and interpret the problem text, but should remain flexible and should state what changes to the problem text are allowed. Flexibility and ease of expression are valued. Examples may be be split into "setup", "problem statement", and "output" sections where the ease and naturalness of stating the problem and getting an answer, as well as the ease and flexibility of modifying the problem are the primary concerns. Example output should be shown here, as well as any comments on the examples flexibility.

Baker, Cooper, Fletcher, Miller, and Smith live on different floors of an apartment house that contains only five floors.

Where does everyone live?

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Dinesman's multiple-dwelling problem step by step in the M2000 Interpreter programming language

Source code in the m2000 programming language

Module Dinesman_s_multiple_dwelling_problem {
	// this is the standard perimutation function
	// which create a lambda function:
	// pointer_to_array=Func(&BooleanVariable)
	// when BooleanVariable = true we get the last permutation
	Function PermutationStep (a as array) {
		c1=lambda (&f, a) ->{
			=a : f=true
		}
		integer m=len(a)
		if m=0 then Error "No items to make permutations"
		c=c1
		While m>1
			c1=lambda c2=c,p=0%, m=(,) (&f, a, clear as boolean=false) ->{
				if clear then m=(,)
				if len(m)=0 then m=a
				=cons(car(m),c2(&f, cdr(m)))
				if f then f=false:p++:  m=cons(cdr(m), car(m)) : if p=len(m) then p=0 : m=(,):: f=true
				}
			c=c1  
			m--
		End While
		=lambda c, a (&f, clear as boolean=false) -> {
			=c(&f, a, clear)
		}
	}
	boolean k
	object s=("Baker", "Cooper", "Fletcher", "Miller", "Smith")
	StepA=PermutationStep(s)
	while not k
		s=StepA(&k)
		if s#val$(4)= "Baker" then continue
		if s#val$(0)="Cooper" then continue
		if s#val$(0)="Fletcher" then continue
		if s#val$(4)="Fletcher" then continue
		if s#pos("Cooper")> s#pos("Miller") then continue
		if abs(s#pos("Smith")-s#pos("Fletcher"))=1 then continue
		if abs(s#pos("Cooper")-s#pos("Fletcher"))=1 then continue
		exit  // for one solution
	end while
	object c=each(s)
	while c
		Print array$(c)+" lives on floor "+(c^+1)
	end while
}
Dinesman_s_multiple_dwelling_problem

Module Using_AmbFunction {
	Enum Solution {First, Any=-1}
	Function Amb(way as Solution, failure) {
		read a
		c1=lambda i=0, a, (&any,  &ret) ->{
			any=(array(a,i),)
			ret=any
			i++
			ok=i=len(a)
			if ok then i=0
			=ok
		}
		m=stack.size
		if m=0 then Error "At least two arrays needed"
		c=c1
		while m>0 {
			read a
			c1=lambda c2=c, i=0, a,  (&any,  &ret) ->{
				any=(array(a,i),)
				ret=(,) :  ok=false :  anyother=(,)
				ok=c2(&anyother,  &ret)  
				ret=cons(ret, any)
				if ok then i++
				ok=i=len(a)
				if ok  then i=0 
				=ok
			}
			c=c1 :  m--
		}
		ok=false
		any=(,)
		flush
		while not ok
			ret=(,)
			ok=c(&any, &ret)
			s=stack(ret)
			if not failure(! s)  then data ret : if way>0 then ok=true
		End While
		if empty then
			ret=(("",),)
		else
			ret=array([])
		end if
		=ret
	}
	Range=lambda (a, f) ->{
		for i=a to f-1: data i: next
		=array([])
	}
	
	Baker=range(1, 5) 
	Cooper=range(2, 6)
	Fletcher=range(2, 5)
	Miller=range(1,6)
	Smith=range(1,6)
	
	failure=lambda   (Baker, Cooper, Fletcher, Miller, Smith)->{
		if Baker=Cooper or Baker=Fletcher or Baker=Miller or Baker=Smith then =true:exit
		if Cooper=Fletcher or Cooper =Miller or Cooper=Smith then =true:exit
		if Fletcher=Miller or Fletcher=Smith or Miller=Smith then =true:exit
		if Miller
	}
	all=amb(Any, failure, Baker, Cooper, Fletcher, Miller, Smith)
	k=each(all)
	s=("Baker", "Cooper", "Fletcher", "Miller", "Smith")
	while k
		z=array(k)
		zz=each(z, , -2)
		while zz
			? s#val$(zz^)+" ("+array(zz)+"), ";
		end while
		zz=each(z, -1)
		while zz
			? s#val$(zz^)+" ("+array(zz)+") "
		end while
	end while
}
Using_AmbFunction

  

You may also check:How to resolve the algorithm Substring step by step in the Prolog programming language
You may also check:How to resolve the algorithm Product of min and max prime factors step by step in the Quackery programming language
You may also check:How to resolve the algorithm XML/Output step by step in the J programming language
You may also check:How to resolve the algorithm Longest string challenge step by step in the VBScript programming language
You may also check:How to resolve the algorithm Random Latin squares step by step in the Factor programming language