HomeHome More SamplesMore Samples
///////////////////////////////////////////////////////////////////////////////
// 
// Title: Building Blocks
// Author: Humphrey Dudley
// Publication: Dell Logic Puzzles
// Issue: April, 1998
// Page: 19 (top)
// Stars: 3
// 
// Each of four alphabet blocks has a single letter of the alphabet on each of 
// its six sides. In all, the four blocks contain every letter but Q and Z. 
// By arranging the blocks in various ways, you can spell all of the words 
// listed below. 
// Can you figure out how the letters are arranged on the four blocks? 
// 
// BAKE ONYX ECHO OVAL 
// 
// GIRD SMUG JUMP TORN 
// 
// LUCK VINY LUSH WRAP 
//
///////////////////////////////////////////////////////////////////////////////
//
// Query: 
//          all BuildingBlocks()
//
// Solution:
//
//          Block 0: B F I O U W
//          Block 1: A C D J N S
//          Block 2: H K M R V X
//          Block 3: E G L P T Y    
//
///////////////////////////////////////////////////////////////////////////////

Block = [0..5]->I["A".."Z"]
Blocks = [0..3]->Block 

pred BuildingBlocks() iff
    blocks::Blocks & InitializeAllBlocks(blocks,0) &

    // By assigning the letters "B","A","K","E" to the blocks 0,1,2,3 we
    // will eliminate multiple equivalent solutions.  
    blocks(0,_) = "B" & blocks(1,_) = "A" & blocks(2,_) = "K" & blocks(3,_) = "E" &

    // Place all constraints 

    CanSpell(blocks,"B","A","K","E") &
    CanSpell(blocks,"O","N","Y","X") &
    CanSpell(blocks,"E","C","H","O") &
    CanSpell(blocks,"O","V","A","L") & 
    CanSpell(blocks,"G","I","R","D") &
    CanSpell(blocks,"S","M","U","G") &
    CanSpell(blocks,"J","U","M","P") &
    CanSpell(blocks,"T","O","R","N") &
    CanSpell(blocks,"L","U","C","K") &
    CanSpell(blocks,"V","I","N","Y") &
    CanSpell(blocks,"L","U","S","H") &
    CanSpell(blocks,"W","R","A","P") &
    // Print the solution in a friendly format.
    PrintAllBlocks(blocks,0) 

///////////////////////////////////////////////////////////////////////////////
// Setup problem constraints.
// Place four letters c1,c2,c3,c4 on four different blocks x,y,z,v.
// The letter placed on one block cannot appear on the other three blocks.
local pred CanSpell(blocks::Blocks,c1:<I,c2:<I,c3:<I,c4:<I) iff
    blocks(x,_) = c1 & ~c1 in blocks(y) & ~c1 in blocks(z) & ~c1 in blocks(v) & 
    blocks(y,_) = c2 & ~c2 in blocks(x) & ~c2 in blocks(z) & ~c2 in blocks(v) & 
    blocks(z,_) = c3 & ~c3 in blocks(x) & ~c3 in blocks(y) & ~c3 in blocks(v) & 
    blocks(v,_) = c4 & ~c4 in blocks(x) & ~c4 in blocks(y) & ~c4 in blocks(z) &

    // Insist none of the four indeces x,y,z,v are the same
    x <> y & x <> z & x <> v & y <> z & y <> v & z <> v        

///////////////////////////////////////////////////////////////////////////////
// Remove letters "Z" and "Q" from all blocks.
// Alphabetically sort each block.
local pred InitializeAllBlocks(blocks::Blocks,i:<I) iff
    if i < Len(blocks) then
        ~"Q" in blocks(i) &
        ~"Z" in blocks(i) &
        InitializeOneBlock(blocks(i),0) &
        InitializeAllBlocks(blocks,i+1)
    end

///////////////////////////////////////////////////////////////////////////////
// Ensure the elements of each block are in ascending order.
// This will eliminate all permutations of the elements, thus eliminating 
// multiple equivalent solutions.
// This also ensures all elements on one block are different.
// Sorting ASCII characters in ascending order is equivalent to sorting 
// alphabetically.
local pred InitializeOneBlock(block::Block,i:<I) iff
    if i < Len(block) then
        if i > 0 then 
            block(i) > block(i-1) 
        end &
        InitializeOneBlock(block,i+1)
    end

///////////////////////////////////////////////////////////////////////////////
// Print the solution 
// Convert each numerical ASCII value into a string.
local proc PrintAllBlocks(blocks:<Blocks,i:<I) iff
    if i < Len(blocks) then
        Print('\nBlock ',i,': ') &
        Print(blocks(i,0):S,' ',blocks(i,1):S,' ',blocks(i,2):S,' ',  
              blocks(i,3):S,' ',blocks(i,4):S,' ',blocks(i,5):S) &
        PrintAllBlocks(blocks,i+1)
    end



This page was created by F1toHTML