Eliminate d from values[s]; propagate when values or places <= 2. Return values, except return False if a contradiction is detected.
(values, s, d)
| 96 | |
| 97 | |
| 98 | def eliminate(values, s, d): |
| 99 | """ |
| 100 | Eliminate d from values[s]; propagate when values or places <= 2. |
| 101 | Return values, except return False if a contradiction is detected. |
| 102 | """ |
| 103 | if d not in values[s]: |
| 104 | return values ## Already eliminated |
| 105 | values[s] = values[s].replace(d, "") |
| 106 | ## (1) If a square s is reduced to one value d2, then eliminate d2 from the peers. |
| 107 | if len(values[s]) == 0: |
| 108 | return False ## Contradiction: removed last value |
| 109 | elif len(values[s]) == 1: |
| 110 | d2 = values[s] |
| 111 | if not all(eliminate(values, s2, d2) for s2 in peers[s]): |
| 112 | return False |
| 113 | ## (2) If a unit u is reduced to only one place for a value d, then put it there. |
| 114 | for u in units[s]: |
| 115 | dplaces = [s for s in u if d in values[s]] |
| 116 | if len(dplaces) == 0: |
| 117 | return False ## Contradiction: no place for this value |
| 118 | # d can only be in one place in unit; assign it there |
| 119 | elif len(dplaces) == 1 and not assign(values, dplaces[0], d): |
| 120 | return False |
| 121 | return values |
| 122 | |
| 123 | |
| 124 | def display(values): |