【问题标题】:Algorithm help - function to deal with school "letter days". A 6 day repeating week算法帮助 - 处理学校“信天”的功能。 6天重复的一周
【发布时间】:2013-04-24 02:21:17
【问题描述】:

我在这方面花了太多时间,但无法得到它。我正在寻找一个在给定日期时返回“字母日”的函数。

字母日是一个 6 天的一周,从 A 到 F 不包括周末。如果星期一是 A,那么星期五是 E,下一个星期一是 F,星期二是 A。明白了吗?

Week 1: a, b, c, d, e, null, null
Week 2: f, a, b, c, d, null, null
Week 3: e, f, a, b, c, null, null

选择一个任意日期开始作为参考。为了功能,让我们同意 4 月 22 日星期一是 C 日。

谢谢!

【问题讨论】:

  • 如果我正确解释了您的问题,您需要查看模运算。具体来说,您需要从计算日期距开始日期的天数开始,然后查看该数字 mod 6(或 5?)。然后将结果与对应的字母进行匹配。
  • @doliver 我认为它不适用于模数,因为你需要忽略周末。
  • 你需要做一些调整。让我看看我是否可以真正快速地编写一些代码。
  • 是的,doliver 说的。理解基础数学将为您指明正确的方向。该幻灯片涵盖了十进制(以 10 为底)到八进制(以 8 为底)的转换,这几乎是您想要去的地方,除非您将 base-5 转换为 base-6。 wisc-online.com/Objects/ViewObject.aspx?ID=TMH5306

标签: php algorithm series


【解决方案1】:

这对你有用吗?

<?PHP
$datetime1 = new DateTime('2013-04-22');
$datetime2 = new DateTime('2013-04-30');
$interval = $datetime1->diff($datetime2);
$numDays = $interval->format('%d');

$calibration = 2; //April 22, 2013 is a "C" day.
$numWeekDays = $numDays - 2 * floor($numDays / 7);
$answer = ($numWeekDays + $calibration) % 6 + 1; 

echo chr(64 + $answer);
?>

【讨论】:

  • 它返回 2013-04-25 的“@”,应该是“F”。 :(
  • @ToddB 我想我修好了;如果您发现其他差异,请告诉我。
  • @ToddB 希望它能很好地为您服务。我删除了倒数第二行括号中多余的 6。 (出于某种原因,我认为低于 6 的数字模 6 返回零)
【解决方案2】:

这是一个想法:

for ($i = 0; $i < 100; $i++)
{
    if ($i % 7 == 0)
        echo "<BR>";
    echo GetLetter ($i) . ",";
}

function GetLetter ($numDays)
{
    $letters = Array ("A", "B", "C", "D", "E", "F");
    $nullRet = false;
    $currentLetter = 0;
    $lastLetter = 0;
    for ($i = 0; $i <= $numDays; $i++)
    {
        if (($i+2) % 7 == 0 || ($i+1) % 7 == 0)
        {
            $nullRet = true;
            continue;
        }
        else
        {
            $nullRet = false;
            $lastLetter = $currentLetter;
            $currentLetter++;
        }
    }
    if ($nullRet)
    {
        return "null";
    }
    else
    {
        return $letters[$lastLetter%6];
    }
}
?>

你能从这里自己算出日期吗?从这里开始很容易。这个想法是你想循环一周中的几天,跳过坐着和太阳。您在所有其他日子递增并检查它们是什么 mod 6。

【讨论】:

    【解决方案3】:
    echo get_letter('29-4-2013');
    echo get_letter('30-4-2013');
    echo get_letter('1-5-2013');
    echo get_letter('2-5-2013');
    echo get_letter('3-5-2013');
    echo PHP_EOL.'------------------'.PHP_EOL;
    echo get_letter('6-5-2013');
    echo get_letter('7-5-2013');
    echo get_letter('8-5-2013');
    echo get_letter('9-5-2013');
    echo get_letter('10-5-2013');
    
    function get_letter($set_date){
    $map=array('a','b','c','d','e','f');
    
    $start_letter = 'c';
    $start_date = strtotime("22-4-2013");
    
    $target_date = strtotime($set_date);
    
    $start_date_w = date('w',$start_date);
    
    $target_date_w = date('w',$target_date);
    
    if($target_date_w == 6 || $target_date_w == 0){
    return 'null';
    }
    
    $bwt_d = ($target_date-$start_date) / 86400;
    
    $week_count =  floor($start_date_w + $bwt_d /7)-1;
    
    
    $bwt_d5 = $bwt_d -$week_count*2;
    
    $aa=($bwt_d5+1)%6;
    
    
    return $map[$aa];
    }
    

    试试看 http://sandbox.onlinephpfunctions.com/code/295d52d2ef2ecdbd7c2d2b93c747254e864fdf9c

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2014-11-07
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多