พยากรณ์อากาศ


13

เขียนโปรแกรมที่สั้นที่สุดเพื่อพยากรณ์อากาศ 7 วันข้างหน้า

อินพุต (จาก stdin) คือวันทำงานและฤดูกาล

เอาท์พุท (ที่ stdout) เป็นเจ็ดสายวันทำงานและอุณหภูมิในเซนติเกรด

วันทำงานเริ่มต้นในวันทำการอินพุต

อุณหภูมิเป็นตัวเลขสุ่มด้วยช่วงขึ้นอยู่กับฤดูกาล

ฤดูใบไม้ผลิ 10 - 30 องศา  
ฤดูร้อน 20 - 40 องศา  
ฤดูใบไม้ร่วง 5 - 25 องศา (ฤดูใบไม้ร่วงเป็นคำพ้องความหมายสำหรับฤดูใบไม้ร่วง)
ฤดูหนาว -5 - 15 องศา

ตัวอย่างอินพุต

Thursday Winter

ตัวอย่างผลลัพธ์

วันพฤหัสบดีที่ -1
วันศุกร์ที่ 3
วันเสาร์ที่ 8
วันอาทิตย์ที่ 7
วันจันทร์ที่ 10
วันอังคารที่ 10
วันพุธที่ -1

โปรแกรมของคุณจะต้องไม่มีเอาต์พุตเหมือนกันทุกครั้งที่รันด้วยอินพุตเดียวกัน


เพียงพอหรือไม่ที่วันหนึ่งมีอุณหภูมิแบบสุ่ม? ด้วยวิธีนี้ผลลัพธ์จะไม่เหมือนกันสำหรับการทำงานแต่ละครั้ง
hallvabo

1
ฉันเคยคิดเกี่ยวกับปัญหาการติดแท็กและขอแนะนำว่านี่เป็นการจำลองว่าการพยากรณ์
dmckee --- ผู้ดูแลอดีตลูกแมว

@ Hallvabo ฉันไม่ได้ตั้งใจที่จะเพิ่มเงื่อนไขพิเศษใด ๆ กับคำถามมันคือสิ่งที่มันเป็น :)
gnibbler

FWIW: อย่างน้อยจากมุมมองของการแก้ปัญหาของฉันมันง่ายกว่าที่จะสร้างอุณหภูมิแบบสุ่มในแต่ละวันมากกว่าแค่เพียงครั้งเดียว การจัดการทุกวันเหมือนกันนั้นง่ายกว่าและดีกว่าในการเล่นกอล์ฟ
Joey

นี่เรื่องตลกใช่ไหม?
หอยทากเครื่องกล

คำตอบ:


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 อีกครั้งเพื่อฝังอุณหภูมิลงในสตริงแทนที่จะเป็นอาร์เรย์
  • อ๊ะเพิ่งสังเกตว่ามันควรเป็นแรนด์ (21) ไม่ใช่แรนด์ (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])}

สตริงในนั้นมีบิตเล็กน้อยดังนั้นมุมมอง hex เพื่อความสะดวกของคุณ:

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) - ทำไมต้องจับคู่ชื่อเต็มฤดูเมื่อคุณสามารถออกไปพร้อมกับตัวละครแต่ละตัวและการแข่งขัน regex? จะไม่จัดการกับการป้อนข้อมูลที่ไม่ถูกต้องเป็นอย่างดี แต่ก็มักจะคาดหวังในการเล่นกอล์ฟ
  • 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) - แทนที่การแข่งขัน regex ด้วยรายการของรหัสตัวอักษรและการจัดทำดัชนีลงใน hashmap ด้วยอักขระตัวที่สามจากซีซัน
  • 2011-02-11 21:00 (122) - แทนที่แผนที่แฮชด้วยอาร์เรย์
  • 2011-02-11 21:12 (117) - คุณงามความดีอาร์เรย์ -y เพิ่มเติม และสั้นลงเพื่อบูต Modulo 8 บรรจุอาร์เรย์ให้สั้นลงเล็กน้อย
  • 2011/02/11 21:16 (116) - สกัดปัจจัยห้าที่จะมาแทนที่0,0,2โดย0..2ซึ่งเป็นที่สั้นกว่า
  • 2011-02-11 21:22 (114) - ใช้การคำนวณที่แตกต่างกันเล็กน้อย มันยังคงแมปในฤดูใบไม้ร่วงและตกอยู่ในดัชนีเดียวกันและมีความได้เปรียบเพียงต้องการค่าห้าค่า ดีมาก. ดัชนีลบในสตริงยังเล่นได้ดีกับ»ตกลง«ซึ่งสั้นกว่าส่วนที่เหลือ
  • 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}/
  • รองรับทุกช่วงอุณหภูมิฤดูกาลและรองรับ "ฤดูใบไม้ร่วง" เป็นคำพ้องความหมายสำหรับ "ฤดูใบไม้ร่วง" เช่นกัน
  • ฉันคิดว่ามีบางห้องสำหรับการปรับปรุง แต่ความรู้นักกอล์ฟปัจจุบันของฉันยังมี จำกัด

นี่คือการทดสอบ 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());}

แน่นอนคุณสามารถบันทึกตัวละครจำนวนมากได้เพียงแค่บีบ newlines และย่อหน้าทั้งหมดและช่องว่างอื่น ๆ ส่วนใหญ่ใช่ไหม ;-)
Chris Jester-Young

ฉันนับตัวละครที่มีการลบช่องว่างพิเศษทั้งหมด มันยากมากที่จะอ่านแบบที่มันดูโง่ ๆ ที่จะโพสต์แบบนั้น
Jonathan M Davis

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])."
";}

Ungolfed

<?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 # มักต้องการความช่วยเหลือทั้งหมดที่สามารถรับได้ดังนั้นคุณสามารถแทนที่เนื้อหาของลูปของคุณด้วย (ฉันคิดว่า): Console.WriteLine (Enum.GetName (typeof (DayOfWeek), z ++% 7) + "" + r ถัดไป (l, u));
Steve

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 ของตัวเองหลังจากที่ปัจจุบันไม่ได้ตอบสนองความท้าทายอย่างเต็มที่

มันขึ้นอยู่กับ 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

Whitespaced:

  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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.