word crosout puzle ?

General FreeBASIC programming questions.
Post Reply
bluatigro
Posts: 660
Joined: Apr 25, 2012 10:35
Location: netherlands

word crosout puzle ?

Post by bluatigro »

error :
near al char's are crosed

Code: Select all

'' bluatigro 2 feb 2018
'' word zoeker

dim as string word( 30 ) , letter( 30 , 30 ) , a
dim as integer i , j , k , l , m , b( 30 , 30 ) , wtel , ltel

for i = 0 to 30
  read word( i )
  if word( i ) = "=" then exit for
  wtel += 1
next i
data "appelsap" , "banketletter" , "bonbon" , "boterkoek"
data "hopje" , "kletskop" , "lekkerny" , "moorkop"
data "pepernoot" , "praline" , "slagroomsoesje" , "snoepje"
data "snoepschep" , "speculaas" , "spekkies" , "stoopbal"
data "suikerspin" , "truffel" , "turksfruit" , "zoethoudertjes"
data "zuurstok" , "="
for j = 0 to 30
  read a
  for i = 1 to len( a )
    letter( i - 1 , j ) = mid( a , i , 1 )
  next i
  if a = "=" then exit for
  ltel += 1
next j
data "bssuikerspin"
data "olenejpeonet"
data "najkosckheup"
data "bgtleeruirer"
data "orrieopkkpja"
data "noeyofksempl"
data "kodmnefrcpoi"
data "omupprnuehhn"
data "tsosuoelrtee"
data "sohiojfketop"
data "rettelteknab"
data "usesaaluceps"
data "ujoppokstelk"
data "zezstroopbal"
data "="
for i = 0 to wtel
  for k = 0 to 30 
  for m = 0 to 30 - len( word( i ) )
    j = 0
    while j < len( word( i ) ) _
    and letter( k , m + j ) = mid( word( i ) , j + 1 , 1 )
      j += 1
      b( k , m + j ) = 1
    wend
  next m
  next k
  for k = 0 to 30 
  for m = len( word( i ) ) to 30
    j = 0
    while j < len( word( i ) ) _
    and letter( k , m - j ) = mid( word( i ) , j + 1 , 1 )
      j += 1
      b( k , m - j ) = 1
    wend
  next m
  next k
  for k = 0 to 30 - len( word( i ) )
  for m = 0 to 30
    j = 0
    while j < len( word( i ) ) _
    and letter( k + j , j ) = mid( word( i ) , j + 1 , 1 )
      j += 1
      b( k + j , m ) = 1
    wend
  next m
  next k
  for k = len( word( i ) ) to 30 
  for m = 0 to 30
    j = 0
    while j < len( word( i ) ) _
    and letter( k - j , m ) = mid( word( i ) , j + 1 , 1 )
      j += 1
      b( k - j , m ) = 1
    wend
  next m
  next k
  for k = 0 to 30 - len( word( i ) )
  for m = 0 to 30 - len( word( i ) )
    j = 0 
    while j < len( word( i ) ) _
    and letter( k + j , m + j ) = mid( word( i ) , j + 1 , 1 )
      j += 1
      b( k + j, m + j ) = 1
    wend
  next m
  next k
  for k = 0 to 30 - len( word( i ) )
  for m = len( word( i ) ) to 30
    j = 0 
    while j < len( word( i ) ) _
    and letter( k + j , m - j ) = mid( word( i ) , j + 1 , 1 )
      j += 1
      b( k + j , m - j ) = 1
    wend
  next m
  next k
  for k = len( word( i ) ) to 30
  for m = 0 to 30 - len( word( i ) )
    j = 0 
    while j < len( word( i ) ) _
    and letter( k - j, m + j ) = mid( word( i ) , j + 1 , 1 )
      j += 1
      b( k - j , m + j ) = 1
    wend
  next m
  next k
  for k = len( word( i ) ) to 30
  for m = len( word( i ) ) to 30
    j = 0 
    while j < len( word( i ) ) _
    and letter( k - j, m - j ) = mid( word( i ) , j + 1 , 1 )
      j += 1
      b( k - j , m - j ) = 1
    wend
  next m
  next k
next i
screen 20 , 32
for i = 0 to 30
  for j = 0 to 30
    if b( j , i ) then
      print "." ;
    else
      print letter( j , i ) ;
    end if
  next j
  print
next i
sleep 
badidea
Posts: 2591
Joined: May 24, 2007 22:10
Location: The Netherlands

Re: word crosout puzle ?

Post by badidea »

All the i's, j's, k's, m's, l's are too confusing for me, try to simplify the problem first, e.g.:

Code: Select all

'' bluatigro 2 feb 2018
'' word zoeker

dim as string word( 30 ) , letter( 30 , 30 ) , a
dim as integer i , j , k , l , m , b( 30 , 30 ) , wtel , ltel

for i = 0 to 30
	read word( i )
	'print word( i )
	if word( i ) = "=" then exit for
	wtel += 1
next i

'~ data "appelsap" , "banketletter" , "bonbon" , "boterkoek"
'~ data "hopje" , "kletskop" , "lekkerny" , "moorkop"
'~ data "pepernoot" , "praline" , "slagroomsoesje" , "snoepje"
'~ data "snoepschep" , "speculaas" , "spekkies" , "stoopbal"
data "suikerspin" , "truffel" , "turksfruit" , "zoethoudertjes"
data "zuurstok" , "="

for j = 0 to 30
	read a
	for i = 1 to len( a )
		letter( i - 1 , j ) = mid( a , i , 1 )
		'print letter ( i - 1 , j );
	next i
	'print
	if a = "=" then exit for
	ltel += 1
next j

data "bssuikerspin"
data "olenejpeonet"
data "najkosckheup"
data "bgtleeruirer"
data "orrieopkkpja"
data "noeyofksempl"
data "kodmnefrcpoi"
data "omupprnuehhn"
data "tsosuoelrtee"
data "sohiojfketop"
data "rettelteknab"
data "usesaaluceps"
data "ujoppokstelk"
data "zezstroopbal"
data "="


for i = 0 to wtel

	for k = 0 to 30
		for m = 0 to 30 - len( word( i ) )
			j = 0
			while j < len( word( i ) ) and letter( k , m + j ) = mid( word( i ) , j + 1 , 1 )
				j += 1
				b( k , m + j ) = 1 '<---- Cleared while still checking?
			wend
		next m
	next k
	
	'~ for k = 0 to 30
		'~ for m = len( word( i ) ) to 30
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k , m - j ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k , m - j ) = 1
			'~ wend
		'~ next m
	'~ next k
	
	'~ for k = 0 to 30 - len( word( i ) )
		'~ for m = 0 to 30
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k + j , j ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k + j , m ) = 1
			'~ wend
		'~ next m
	'~ next k

	'~ for k = len( word( i ) ) to 30
		'~ for m = 0 to 30
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k - j , m ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k - j , m ) = 1
			'~ wend
		'~ next m
	'~ next k

	'~ for k = 0 to 30 - len( word( i ) )
		'~ for m = 0 to 30 - len( word( i ) )
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k + j , m + j ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k + j, m + j ) = 1
			'~ wend
		'~ next m
	'~ next k

	'~ for k = 0 to 30 - len( word( i ) )
		'~ for m = len( word( i ) ) to 30
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k + j , m - j ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k + j , m - j ) = 1
			'~ wend
		'~ next m
	'~ next k
	
	'~ for k = len( word( i ) ) to 30
		'~ for m = 0 to 30 - len( word( i ) )
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k - j, m + j ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k - j , m + j ) = 1
			'~ wend
		'~ next m
	'~ next k

	'~ for k = len( word( i ) ) to 30
		'~ for m = len( word( i ) ) to 30
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k - j, m - j ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k - j , m - j ) = 1
			'~ wend
		'~ next m
	'~ next k

next i

'screen 20 , 32
for i = 0 to 30
	for j = 0 to 30
		if b( j , i ) then
			color 8
			print letter( j , i ) ;
			'print "." ;
		else
			color 15
			print letter( j , i ) ;
		end if
	next j
	print
next i
sleep
Er gaat duidelijk iets mis :-) Kijk even bij "<---- in code".
badidea
Posts: 2591
Joined: May 24, 2007 22:10
Location: The Netherlands

Re: word crosout puzle ?

Post by badidea »

Still room for improvement, but this works:

Code: Select all

'' bluatigro 2 feb 2018
'' word zoeker

dim as string word( 30 ) , letter( 30 , 30 ) , a
dim as integer i , j , k , l , m , b( 30 , 30 ) , wtel , ltel

for i = 0 to 30
	read word( i )
	'print word( i )
	if word( i ) = "=" then exit for
	wtel += 1
next i

data "appelsap" , "banketletter" , "bonbon" , "boterkoek"
data "hopje" , "kletskop" , "lekkerny" , "moorkop"
data "pepernoot" , "praline" , "slagroomsoesje" , "snoepje"
data "snoepschep" , "speculaas" , "spekkies" , "stoopbal"
data "suikerspin" , "truffel" , "turksfruit" , "zoethoudertjes"
data "zuurstok" , "="


for j = 0 to 30
	read a
	for i = 1 to len( a )
		letter( i - 1 , j ) = mid( a , i , 1 )
		'print letter ( i - 1 , j );
	next i
	'print
	if a = "=" then exit for
	ltel += 1
next j

data "bssuikerspin"
data "olenejpeonet"
data "najkosckheup"
data "bgtleeruirer"
data "orrieopkkpja"
data "noeyofksempl"
data "kodmnefrcpoi"
data "omupprnuehhn"
data "tsosuoelrtee"
data "sohiojfketop"
data "rettelteknab"
data "usesaaluceps"
data "ujoppokstelk"
data "zezstroopbal"
data "="

for i = 0 to wtel

	for k = 0 to 30 'x_letter
		for m = 0 to 30 - len( word( i ) ) 'y_letter
			l = 0
			'check if full word occurs
			for j = 0 to len( word( i ) )
				if letter( k , m + j ) = mid( word( i ) , j + 1 , 1 ) then
					l += 1
				else
					exit for
				end if
			next
			'if found, mark word
			if l = len( word( i ) ) then
				for j = 0 to len( word( i ) ) - 1
					b( k , m + j ) = 1
				next
			end if
		next m
	next k
	
	'~ for k = 0 to 30
		'~ for m = len( word( i ) ) to 30
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k , m - j ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k , m - j ) = 1
			'~ wend
		'~ next m
	'~ next k
	
	'~ for k = 0 to 30 - len( word( i ) )
		'~ for m = 0 to 30
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k + j , j ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k + j , m ) = 1
			'~ wend
		'~ next m
	'~ next k

	'~ for k = len( word( i ) ) to 30
		'~ for m = 0 to 30
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k - j , m ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k - j , m ) = 1
			'~ wend
		'~ next m
	'~ next k

	'~ for k = 0 to 30 - len( word( i ) )
		'~ for m = 0 to 30 - len( word( i ) )
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k + j , m + j ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k + j, m + j ) = 1
			'~ wend
		'~ next m
	'~ next k

	'~ for k = 0 to 30 - len( word( i ) )
		'~ for m = len( word( i ) ) to 30
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k + j , m - j ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k + j , m - j ) = 1
			'~ wend
		'~ next m
	'~ next k
	
	'~ for k = len( word( i ) ) to 30
		'~ for m = 0 to 30 - len( word( i ) )
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k - j, m + j ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k - j , m + j ) = 1
			'~ wend
		'~ next m
	'~ next k

	'~ for k = len( word( i ) ) to 30
		'~ for m = len( word( i ) ) to 30
			'~ j = 0
			'~ while j < len( word( i ) ) and letter( k - j, m - j ) = mid( word( i ) , j + 1 , 1 )
				'~ j += 1
				'~ b( k - j , m - j ) = 1
			'~ wend
		'~ next m
	'~ next k

next i

'screen 20 , 32
for i = 0 to 30
	for j = 0 to 30
		if b( j , i ) then
			color 8
			print letter( j , i ) ;
			'print "." ;
		else
			color 15
			print letter( j , i ) ;
		end if
	next j
	print
next i
sleep
badidea
Posts: 2591
Joined: May 24, 2007 22:10
Location: The Netherlands

Re: word crosout puzle ?

Post by badidea »

My solution, the puzzle seems to contain some errors (e.g. 'stoopbal' shoud be 'stroopbal'):

Code: Select all

const as integer MAX_WORD = 30
const as integer MAX_ZOEK_H = 30 'max height search field
const as integer MAX_ZOEK_W = 30 'max width search field

dim as string word(MAX_WORD-1), text
dim as string zoek(MAX_ZOEK_H-1) 'Or as integer zoek(MAX_ZOEK_H-1, MAX_ZOEK_W-1)
dim as integer mask(MAX_ZOEK_H-1, MAX_ZOEK_W-1)
dim as integer wtel, zheight, zwidth

for wtel = 0 to MAX_WORD-1
	read text
	if text = "=" then exit for
	word(wtel) = text
next
'print wtel

data "appelsap" , "banketletter" , "bonbon" , "boterkoek"
data "hopje" , "kletskop" , "lekkerny" , "moorkop"
data "pepernoot" , "praline" , "slagroomsoesje" , "snoepje"
data "snoepschep" , "speculaas" , "spekkies" , "stoopbal"
data "suikerspin" , "truffel" , "turksfruit" , "zoethoudertjes"
data "zuurstok" , "="

'~ data "suikerspin", "="

for zheight = 0 to MAX_ZOEK_H-1
	read text
	if text = "=" then exit for
	zoek(zheight) = text
next
'print ztel
zwidth = len(zoek(0)) 'assume all of equal length
'print zwidth

data "bssuikerspin"
data "olenejpeonet"
data "najkosckheup"
data "bgtleeruirer"
data "orrieopkkpja"
data "noeyofksempl"
data "kodmnefrcpoi"
data "omupprnuehhn"
data "tsosuoelrtee"
data "sohiojfketop"
data "rettelteknab"
data "usesaaluceps"
data "ujoppokstelk"
data "zezstroopbal"
data "="

'Search directions:
' right, left, down, up, rightdown, leftup, rightup, leftdown
dim as integer stepx(8-1) = {+1, -1,  0,  0, +1, -1, +1, -1}
dim as integer stepy(8-1) = { 0,  0, +1, -1, +1, -1, -1, +1}
dim as integer iword, ichar, istep, wordlen
dim as integer xspan, yspan, xispan, yispan
dim as integer xstart, ystart, xzoek, yzoek, charcount
dim as integer found

for iword = 0 to wtel-1
	locate 1, 1
	color 15
	print word(iword) + "                   "
	wordlen = len(word(iword))
	for istep = 0 to 8-1
		'Number of search steps in horizontal direction:
		xspan = zwidth - (wordlen-1) * abs(stepx(istep))
		'Number of search steps in vertical direction:
		yspan = zheight - (wordlen-1) * abs(stepy(istep))
		for xispan = 0 to xspan-1
			'x-position of first character
			if stepx(istep) = -1 then xstart = (zwidth-1)-xispan else xstart = xispan
			for yispan = 0 to yspan-1
				'y-position of first character
				if stepy(istep) = -1 then ystart = (zheight-1)-yispan else ystart = yispan
				xzoek = xstart
				yzoek = ystart
				charcount = 0
				for ichar = 0 to wordlen-1
					if word(iword)[ichar] = zoek(yzoek)[xzoek] then
						charcount += 1
					else
						exit for
					end if
					'position of next character in search field
					xzoek += stepx(istep)
					yzoek += stepy(istep)
				next
				'if found, mark word, loop same positions again...
				if charcount = wordlen then
					found += 1 
					xzoek = xstart
					yzoek = ystart
					for ichar = 0 to wordlen-1
						mask(yzoek, xzoek) = 1
						xzoek += stepx(istep)
						yzoek += stepy(istep)
					next
					'and show intermediate results inline (todo: function)
					locate 3, 1
					for yzoek = 0 to zheight-1
						for xzoek = 0 to zwidth-1
							color mask(yzoek, xzoek) * 7 + 8
							print " " + chr(zoek(yzoek)[xzoek]);
						next
						print
					next
				end if
			next
		next
	next
	'some delay for visualisation
	sleep 100, 1
next

print
color 15
print "found"; found
print "wtel"; wtel
Post Reply