PHP Classes

File: src/Compare.php

Recommend this page to a friend!
  Classes of Rodolfo Berrios Arce   Wordle CLI   src/Compare.php   Download  
File: src/Compare.php
Role: Class source
Content type: text/plain
Description: Class source
Class: Wordle CLI
Run the Wordle game on the command line console
Author: By
Last change:
Date: 8 days ago
Size: 2,293 bytes
 

Contents

Class file image Download
<?php

/*
 * This file is part of Chevere.
 *
 * (c) Rodolfo Berrios <[email protected]>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

declare(strict_types=1);

namespace
Rodber\Wordle;

use
LengthException;

final class
Compare
{
    private array
$computed;

    private
bool $match;

    private
float $percent;

    private
string $percentFormat;

    private
string $fraction;

    public function
__construct(
        private
Word $word,
        private
Word $against
   
) {
       
$this->assertLength($against);
       
$matches = 0;
       
$partial = [];
       
$values = $this->word->countValues();
        foreach (
$against->split() as $pos => $letter) {
           
$match = $this->word->getPosMatch($pos, $letter);
            if (
$match === Word::CHAR_MATCH_EXACT) {
               
$values[$letter]--;
               
$matches++;
            }
            if (
$match === Word::CHAR_MATCH_PARTIAL) {
               
$partial[$pos] = $letter;
            }
           
$this->computed[] = [
               
$letter => $match,
            ];
        }
        foreach (
$partial as $pos => $letter) {
            if (
$values[$letter] === 0) {
               
$this->computed[$pos] = [
                   
$letter => Word::CHAR_MATCH_NONE,
                ];
            }
        }
       
$this->match = $matches === $this->word->length();
       
$this->percent = $matches / $this->word->length();
       
$this->percentFormat = number_format(100 * $this->percent, 0) . '%';
       
$this->fraction = strval($matches)
            .
'/'
           
. strval($this->word->length());
    }

    public function
computed(): array
    {
        return
$this->computed;
    }

    public function
match(): bool
   
{
        return
$this->match;
    }

    public function
percent(): float
   
{
        return
$this->percent;
    }

    public function
percentFormat(): string
   
{
        return
$this->percentFormat;
    }

    public function
fraction(): string
   
{
        return
$this->fraction;
    }

    private function
assertLength(Word $against): void
   
{
        if (
$this->word->length() !== $against->length()) {
            throw new
LengthException();
        }
    }
}