advent_of_code_2020/day_4/passport.php

108 lines
2.6 KiB
PHP
Raw Permalink Normal View History

2020-12-04 12:13:43 +01:00
<?php
class Passport
{
public $byr; // (Birth Year)
public $iyr; // (Issue Year)
public $eyr; // (Expiration Year)
public $hgt; // (Height)
public $hcl; // (Hair Color)
public $ecl; // (Eye Color)
public $pid; // (Passport ID)
public $cid; // (Country ID)
public static function fromInput($input)
{
$fields = preg_split('/\s+/', $input);
$new_passport = new self();
foreach ($fields as $field_data) {
[$field, $data] = explode(':', $field_data);
$new_passport->{$field} = $data;
}
return $new_passport;
}
public function validateByr()
{
return !empty($this->byr) &&
is_numeric($this->byr) &&
$this->byr >= 1920 && $this->byr <= 2002;
}
public function validateIyr()
{
return !empty($this->iyr) &&
is_numeric($this->iyr) &&
$this->iyr >= 2010 && $this->iyr <= 2020;
}
public function validateEyr()
{
return !empty($this->eyr) &&
is_numeric($this->eyr) &&
$this->eyr >= 2020 && $this->eyr <= 2030;
}
public function validateHgt()
{
$value = substr($this->hgt, 0, -2);
$unit = substr($this->hgt, -2);
return !empty($this->hgt) &&
in_array($unit, ['in','cm']) &&
($unit === 'cm' ? $value >= 150 && $value <= 193 : $value >= 59 && $value <= 76)
;
}
public function validateHcl()
{
return 1 === preg_match('/^#[0-9a-f]{6}$/', $this->hcl);
}
public function validateEcl()
{
return in_array($this->ecl, ['amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth'], true);
}
public function validatePid()
{
return 1 === preg_match('/^\d{9}$/', $this->pid);
}
public function validateCid()
{
return true;
}
public function isReallyValid()
{
if (!$this->isValid()) {
// echo sprintf("invalide basiquement\n");
return false;
}
$vars = get_object_vars($this);
foreach ($vars as $var_name => $var_value) {
$method = sprintf('validate%s', ucfirst($var_name));
if (!$this->{$method}()) {
return false;
}
}
return true;
}
public function isValid()
{
return
!empty($this->byr) &&
!empty($this->iyr) &&
!empty($this->eyr) &&
!empty($this->hgt) &&
!empty($this->hcl) &&
!empty($this->ecl) &&
!empty($this->pid);
}
}