天气预报


13

编写最短的程序来预测未来7天的天气

输入(来自stdin)是工作日季节

(到标准输出)的输出是工作日的七行,温度为摄氏度

工作日从输入的工作日开始

温度是随机数字,其范围取决于季节

弹簧10-30度  
夏季20至40度  
秋季5-25度(秋季是秋季的代名词)
冬季-5-15度

样本输入

Thursday Winter

样本输出

星期四-1
星期五3
星期六8
星期日7
星期一10
星期二10
星期三-1

每次使用相同的输入运行您的程序时,其输出都不得相同


仅一天有随机温度是否足够?这样,每次运行的输出就不会相同。
hallvabo,2011年

1
我一直在考虑标记问题,并建议将其模拟为是否预测。
dmckee ---前主持人小猫,

@hallvabo,我不想在这个问题上添加任何额外的条件,它是什么意思:)
gnibbler 2011年

FWIW:至少从我的解决方案的角度来看,每天只生成随机温度比每天只生成随机温度要容易得多。一整天都一样,打高尔夫球要容易得多,也更好。
乔伊,

你在开玩笑吗?
机械蜗牛

Answers:


8

Ruby 1.8,95个字符

#!ruby -nrdate
7.times{|i|puts (Date.parse($_)+i).strftime"%A #{"\023\004\016\016\035"[$_[-3]%5]-9+rand(21)}"}

字符串内的字符转义符应替换为它们表示的字符文字。

  • 找到了一种打包数据的较短方法,Ruby 1.9现在要长4个字符(在.ord后面添加$_[-3])。
  • 112-> 105,这是因为他窃取了Joey不分割输入的想法。
  • 105->101。请注意,第一行实际上是由Ruby解释器本身解析的,因此即使在运行解决方案(例如, echo "Thursday Winter" | ruby1.8 forecast.rb
  • 101->96。再次偷走Joey的想法,只是将温度嵌入字符串而不是数组中。
  • 糟糕,只是注意到应该是rand(21),而不是rand(20)。
  • 96->95。删除了不必要的空格。

4

Windows PowerShell,104

[dayofweek]$d,$s=-split$input
(0..6*2)[+$d..(6+$d)]|%{''+[dayofweek]$_,((random 20)-5+'☼

↓'[$s[3]%5])}

里面的字符串有点怪,所以为您提供方便的十六进制视图:

000: 5B 64 61 79 6F 66 77 65 │ 65 6B 5D 24 64 2C 24 73  [dayofweek]$d,$s
010: 3D 2D 73 70 6C 69 74 24 │ 69 6E 70 75 74 0A 28 30  =-split$input◙(0
020: 2E 2E 36 2A 32 29 5B 2B │ 24 64 2E 2E 28 36 2B 24  ..6*2)[+$d..(6+$
030: 64 29 5D 7C 25 7B 27 27 │ 2B 5B 64 61 79 6F 66 77  d)]|%{''+[dayofw
040: 65 65 6B 5D 24 5F 2C 28 │ 28 72 61 6E 64 6F 6D 20  eek]$_,((random
050: 32 30 29 2D 35 2B 27 0F │ 00 0A 0A 19 27 5B 24 73  20)-5+'☼ ◙◙↓'[$s
060: 5B 33 5D 25 35 5D 29 7D │                          [3]%5])}

历史:

  • 2011-02-04 00:16 (179) –首先,直接尝试。
  • 2011-02-04 00:20 (155) –当您可以通过单个字符和正则表达式比赛逃脱时,为什么要匹配整个季节的名称?处理无效的输入不会很好,但这在高尔夫运动中总是可以预期的。
  • 2011-02-06 13:12 (149) –摆脱$t它只会加长事情。
  • 2011-02-10 22:50 (142) –简化天名称的生成。我只生成了一周的两次,在正确的位置进行索引,然后取出七个项目。
  • 2011-02-10 22:52 (138) –将初始演员表移到声明的声明处也$d节省了几个字节–并摆脱了$x
  • 2011-02-10 23:03 (135) –将演员表进一步移到管线下,以避免进行数组演员表(这需要额外的[])。也将输出更改为将对象列表强制转换为字符串,从而隐式插入一个空格($OFS默认值)。
  • 2011-02-11 20:54 (132) –用字符代码列表替换了正则表达式匹配项,并使用季节中的第三个字符将其索引到哈希表中。
  • 2011-02-11 21:00 (122) –用数组替换了哈希图。
  • 2011年2月11日21:12 (117) –更多数组y的优点。而且更短启动。Modulo 8将数组打包得更短。
  • 2011-02-11 21:16 (116) –提取了五分之一来代替0,0,20..2这是较短的。
  • 2011-02-11 21:22 (114) –使用略有不同的计算。它仍然将秋季和秋季映射到相同的索引,并且具有仅需要五个值的优点。非常好。字符串中的负索引也可以很好地发挥作用,而“ Fall”要比其他字符串短。
  • 2011-02-11 21:45 (112) – Stolen Ventero确定季节温度范围的方法要短两个字节。
  • 2011-02-12 03:16 (105) –经过不同的尝试后,仅打印了一行就返回到105。
  • 2011-02-12 13:23 (104) –再次回到104,自从我再次分手以来,本赛季使用正指数。

测试脚本(只要不输出任何结果就可以):

foreach ($d in 'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday') {
    foreach ($s in 'Winter','Summer','Spring','Autumn','Fall') {
        $o=-split("$d $s"|./weather_foo.ps1)
        if ($o.Count -ne 14) { "Wrong output length" }
        $days = $o -notmatch '\d'
        $temps = $o -match '\d'
        if ($days[0]-ne$d) { "Found "+ $days[0] + " instead of $d" }
        $m = $temps | measure -min -max
        switch ($s) {
            'Summer'{ $min = 20 }
            'Spring'{ $min = 10 }
            'Fall'  { $min = 5  }
            'Autumn'{ $min = 5  }
            'Winter'{ $min = -5 }
        }

        if ($m.Minimum -lt $min) { "Minimum temperature $($m.Minimum) didn't match for $s" }
        if ($m.Maximum -gt $min + 20) { "Maximum temperature $($m.Maximum) didn't match for $s" }
    }
}

3

Golfscript-110个字符

' ':^/){*}*43845%7&5*:|;){*}*333121%7&:$;7,{($+'Sun Mon Tues Wednes Thurs Fri Satur'^/.+='day '+20rand|+5-+n}/
  • 完全支持所有温度范围,季节,也支持“秋天”作为“秋天”的代名词。
  • 我认为仍有一些改进的空间,但是到目前为止,我目前对golfscript的了解还很有限。

这是测试,每次2次通过以确认随机性

$ echo -n Thursday Spring | gs codegolf-404.gs
Thursday 23
Friday 28
Saturday 25
Sunday 22
Monday 19
Tuesday 14
Wednesday 25

$ echo -n Thursday Spring | gs codegolf-404.gs
Thursday 27
Friday 12
Saturday 26
Sunday 12
Monday 27
Tuesday 17
Wednesday 21


$ echo -n Friday Autumn | gs codegolf-404.gs
Friday 10
Saturday 5
Sunday 17
Monday 24
Tuesday 24
Wednesday 12
Thursday 18

$ echo -n Friday Autumn | gs codegolf-404.gs
Friday 13
Saturday 7
Sunday 14
Monday 6
Tuesday 14
Wednesday 21
Thursday 5


$ echo -n Sunday Summer | gs codegolf-404.gs
Sunday 39
Monday 31
Tuesday 35
Wednesday 34
Thursday 21
Friday 36
Saturday 28

$ echo -n Sunday Summer | gs codegolf-404.gs
Sunday 34
Monday 20
Tuesday 30
Wednesday 39
Thursday 30
Friday 31
Saturday 37


$ echo -n Monday Fall | gs codegolf-404.gs
Monday 6
Tuesday 7
Wednesday 18
Thursday 13
Friday 7
Saturday 5
Sunday 14

$ echo -n Monday Fall | gs codegolf-404.gs
Monday 16
Tuesday 22
Wednesday 19
Thursday 23
Friday 21
Saturday 9
Sunday 17


$ echo -n Saturday Winter | gs codegolf-404.gs
Saturday 0
Sunday -5
Monday 10
Tuesday -3
Wednesday -5
Thursday 13
Friday -1

$ echo -n Saturday Winter | gs codegolf-404.gs
Saturday -4
Sunday 13
Monday 11
Tuesday 0
Wednesday 0
Thursday -5
Friday 9


$ echo -n Tuesday Summer | gs codegolf-404.gs
Tuesday 38
Wednesday 29
Thursday 25
Friday 29
Saturday 34
Sunday 20
Monday 39

$ echo -n Tuesday Summer | gs codegolf-404.gs
Tuesday 33
Wednesday 26
Thursday 31
Friday 37
Saturday 39
Sunday 24
Monday 28


$ echo -n Wednesday Winter | gs codegolf-404.gs
W    ednesday 7
Thursday 12
Friday 0
Saturday -3
Sunday 11
Monday 14
Tuesday 8

$ echo -n Wednesday Winter | gs codegolf-404.gs
Wednesday 0
Thursday -1
Friday 7
Saturday 12
Sunday -5
Monday -3
Tuesday 2

2

D:436个字符

import std.algorithm, std.random, std.range, std.stdio, std.typecons;

void main(string[] g)
{
    alias canFind w;
    alias tuple t;

    auto s = g[2];
    auto e = w(s, "g") ? t(10, 30) : w(s, "Su") ? t(20, 40) : w(s, "W") ? t(-5, 15) : t(5, 25) ;
    auto r = rndGen();

    int v()
    {
        r.popFront();
        return e[0] + cast(int)(r.front % (e[1] - e[0]));
    }

    auto x = findSplitBefore(["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], [g[1]]);

    foreach(q; chain(x[1], x[0]))
        writefln("%s %s", q, v());
}

删除了多余空格的版本(这是436个字符的方式):

import std.algorithm,std.random,std.range,std.stdio,std.typecons;void main(string[] g){alias canFind w;alias tuple t;auto s=g[2];auto e=w(s,"g")?t(10,30):w(s,"Su")?t(20,40):w(s,"W")?t(-5,15):t(5,25);auto r=rndGen();int v(){r.popFront();return e[0]+cast(int)(r.front%(e[1]-e[0]));}auto x=findSplitBefore(["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],[g[1]]);foreach(q;chain(x[1],x[0]))writefln("%s %s",q,v());}

当然,只需将所有换行符和缩进以及大多数其他空格挤出来,您就可以节省很多字符?;-)
克里斯·杰斯特·杨

我计算了除去所有多余空格的字符。用这种方式很难阅读,以至于以这种方式发布似乎很愚蠢。
乔纳森·M·戴维斯

2

PHP,353个 319 305 304 288字符

<?$i=split(" ",fgets(STDIN));$d=$i[0][0].$i[0][1];$s=$i[1][2];$r=json_decode('{"i":[10,30],"m":[20,40],"t":[5,25],"n":[-5,15]}',true);$n=array(Sun,Mon,Tues,Wednes,Thurs,Fri,Satur);$z=$x=0;while($z<7)if($n[++$x][0].$n[$x][1]==$d||$z){$z++;echo$n[$x%7]."day ".rand($r[$s][0],$r[$s][1])."
";}

不打高尔夫球

<?php
    $input = fgets(STDIN);
    $info = split(" ", $input);
    $day = substr($info[0], 0, 2);
    $season = $info[1][2];
    $range[i][] = 10;
    $range[i][] = 30;
    $range[m][] = 20;
    $range[m][] = 40;
    $range[t][] = 5;
    $range[t][] = 25;
    $range[n][] = -5;
    $range[n][] = 15;
    $days[0] = "Sun";
    $days[1] = "Mon";
    $days[2] = "Tues";
    $days[3] = "Wednes";
    $days[4] = "Thurs";
    $days[5] = "Fri";
    $days[6] = "Satur";

    $i = $d = 0;

    while($i<7)
        if(substr($days[++$d], 0, 2)==$day||$i){
            $i++;
            echo $days[$d%7]."day ".rand($range[$season][0], $range[$season][1])."\n";
        }
?>

305-> 304:切换换行符
304-> 288:使用JSON数组而不是PHP数组


1
不接受Fall作为Autumn任务描述中指定的同义词。
Joey

1

C#350个字符

肯定有比这更有效的方法。但是,这是到目前为止我得到的:

using System;class P{static void Main(string[]x){var r=new Random();var s=x[1][2];int l=s=='r'?10:s=='m'?20:s=='n'?-5:5,u=s=='r'?31:s=='m'?41:s=='n'?16:26,i=0,z=(int)Enum.Parse(typeof(DayOfWeek),x[0]);for(;i<7;i++){var d=z<1?"Sun":z<2?"Mon":z<3?"Tues":z<4?"Wednes":z<5?"Thurs":z<6?"Fri":"Satur";Console.WriteLine(d+"day "+r.Next(l,u));z=z>5?0:z+1;}}}

或采用更具可读性的格式,并附有以下注释:

using System;
class P 
{
    static void Main(string[] x) 
    {
        var r = new Random();
        var s = x[1][2]; //3rd char of season, first where all have unique letter

   // lower & upper limits for random, based on season
        int l = s == 'r' ? 10 : s == 'm' ? 20 : s == 'n' ? -5 : 5, 
            u = s == 'r' ? 31 : s == 'm' ? 41 : s == 'n' ? 16 : 26, 
            i = 0,
   // this line makes me cringe, but converting to an int and back seems
   // the easiest way to loop through days
            z = (int)Enum.Parse(typeof(DayOfWeek), x[0]); 

        for (; i < 7; i++) 
        { 
            var d = z < 1 ? "Sun" : z < 2 ? "Mon" : z < 3 ? "Tues" : z < 4 ? "Wednes" : z < 5 ? "Thurs" : z < 6 ? "Fri" : "Satur";
            Console.WriteLine(d + "day " + r.Next(l, u)); 
            z = z > 5 ? 0 : z + 1; // increments day, resets to 0 after saturday
        }
    }
}

C#通常需要它可以获得的所有帮助,因此您可以用以下代码替换for循环的内容(我认为):Console.WriteLine(Enum.GetName(typeof(DayOfWeek),z ++%7)+“” + r。下一个(l,u));
史蒂夫

1

PHP-150个字符

<?$t=array("m"=>15,"r"=>5,"n"=>-10);for($a=split(" ",fgets(STDIN));$i<7;$i++)echo date("l ",strtotime($a[0]."+$i day")),rand(5,25)+$t[$a[1][2]],"\n";

我认为在当前的PHP解决方案甚至不能完全满足挑战条件之后,我会写自己的PHP解决方案。

它依靠strtotime来解析日期和日期以将其回显。要确定季节,请在季节名称的第三个字母后加上唯一(如给定)。

为了正常运行,它需要禁用通知并启用短标签。


0

Javascript-251个字符

d=['Mon','Tues','Wednes','Thurs','Fri','Satur','Sun'],g=function(c){return Math.random()*21+c|0},p=prompt();for(i=0,j=7,t=true;i<j;i++){t=t&&p.indexOf(d[i])!=0;t?j++:console.log(d[i>6?i-7:i]+'day '+g(/mm/.test(p)?20:/g/.test(p)?10:/te/.test(p)?-5:5))}

不幸的是,该脚本不符合stdin / stdout要求,但是它接受Fall作为Autumn的同义词。

空格:

  d = [
    'Mon'
  , 'Tues'
  , 'Wednes'
  , 'Thurs'
  , 'Fri'
  , 'Satur'
  , 'Sun'
  ]
, g = function(c) {
    return Math.random()*21+c|0
  }
, p = prompt()

  ;

  for(i = 0, j = 7, t = true; i < j; i++) {
    t = t && p.indexOf(d[i]) != 0; 
    t ? 
      j++ : 
      console.log(d[i > 6 ? i - 7 : i] + 'day ' + g(/mm/.test(p) ? 
                                                      20 : 
                                                    /g/.test(p) ? 
                                                      10 : 
                                                    /te/.test(p) ? 
                                                      -5 : 
                                                      5
                                                    )
                  )
  }

0

Mathematica 218

s_~g~d_ := 
Grid@RotateLeft[r = Thread@{DateString[{2012, 1, #}, {"DayName"}] & /@ Range@7, 
  RandomInteger[Cases[{{"Spring", {10, 30}}, {"Summer", {20, 40}}, {"Autumn", {5, 25}}, 
  {"Winter", {-5, 15}}}, {s, _}][[1, 2]], 7]}, Position[r, d][[1, 1]] - 1]

用法

g["Winter", "Sunday"]

在此处输入图片说明


0

Python 2,220个字符

有点大,但(几乎)可读。

import random
c,e=raw_input().split()
a=[d+'day'for d in'Mon Tues Wednes Thurs Fri Satur Sun'.split()]*2
x='rmtn'.index(e[2])*2
g=(10,30,20,40,5,25,-5,15)[x:x+2]
f=a.index(c)
for b in a[f:f+7]:
 print b,random.randint(*g)

输出量

# echo "Monday Summer" | python forecast.py 
Monday 33
Tuesday 29
Wednesday 33
Thursday 28
Friday 25
Saturday 21
Sunday 30
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.