Dự báo thời tiết


13

Viết chương trình ngắn nhất để dự báo thời tiết trong 7 ngày tới

Đầu vào (từ stdin) là ngày trong tuầnmùa

Đầu ra (tới thiết bị xuất chuẩn) là bảy dòng ngày trong tuầnnhiệt độ tính bằng C.

Các ngày trong tuần bắt đầu vào các ngày trong tuần

Nhiệt độ là số ngẫu nhiên với phạm vi tùy theo mùa

Mùa xuân 10 - 30 độ  
Mùa hè 20 - 40 độ  
Mùa thu 5 - 25 độ (Mùa thu là từ đồng nghĩa với mùa thu)
Mùa đông -5 - 15 độ

Đầu vào mẫu

Thursday Winter

Đầu ra mẫu

Thứ Năm -1
Thứ 6
Thứ bảy 8
Chủ nhật 7
Thứ hai 10
Thứ ba 10
Thứ Tư -1

Chương trình của bạn không được có đầu ra giống hệt nhau mỗi khi nó được chạy với cùng một đầu vào


Có đủ chỉ một ngày có nhiệt độ ngẫu nhiên? Theo cách này, đầu ra sẽ không giống nhau cho mỗi lần chạy.
hallvabo

1
Tôi đã suy nghĩ về các vấn đề gắn thẻ và sẽ đề nghị rằng đây là một mô phỏng của một dự báo.
dmckee --- ex-moderator mèo con

@hallvabo, tôi không có ý định thêm bất kỳ điều kiện nào vào câu hỏi, đó là gì :)
gnibbler

FWIW: Ít nhất là từ quan điểm của giải pháp của tôi, việc tạo ra nhiệt độ ngẫu nhiên cho mỗi ngày dễ dàng hơn nhiều so với chỉ một lần duy nhất. Xử lý tất cả các ngày giống nhau là dễ dàng hơn và tốt hơn để chơi golf.
Joey

Đây co phải la một tro đua?
Ốc cơ khí

Câu trả lời:


8

Ruby 1.8, 95 ký tự

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

Ký tự thoát bên trong chuỗi nên được thay thế bằng các ký tự mà chúng đại diện.

  • Tìm thấy một cách ngắn hơn để đóng gói dữ liệu, Ruby 1.9 sẽ dài hơn 4 ký tự (thêm .ordsau $_[-3]).
  • 112 -> 105 bằng cách đánh cắp ý tưởng của Joey về việc không tách đầu vào.
  • 105 -> 101. Lưu ý rằng dòng đầu tiên thực sự được phân tích cú pháp bởi chính trình thông dịch Ruby, do đó, nó thậm chí hoạt động khi chạy giải pháp như echo "Thursday Winter" | ruby1.8 forecast.rb
  • 101 -> 96. Lấy ý tưởng của Joey một lần nữa để nhúng nhiệt độ vào một chuỗi thay vì một mảng.
  • Rất tiếc, chỉ cần chú ý là rand (21), không phải rand (20).
  • 96 -> 95. Đã xóa khoảng trắng không cần thiết.

4

Windows PowerShell, 104

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

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

Các chuỗi trong đó có một chút icky, vì vậy một chế độ xem hex để thuận tiện cho bạn:

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])}

Lịch sử:

  • 2011/02/2016 00:16 (179) - Đầu tiên, nỗ lực đơn giản.
  • 2011/02/2016 00:20 (155) - Tại sao phải khớp tên toàn bộ mùa khi bạn có thể thoát khỏi các ký tự riêng lẻ và khớp chính tả? Sẽ không xử lý tốt với đầu vào không hợp lệ nhưng điều đó luôn được mong đợi trong Golfing.
  • 2011 / 02-06 13:12 (149) - Loại bỏ những $tthứ chỉ kéo dài.
  • 2011/02/10 22:50 (142) - Việc tạo tên ngày trở nên đơn giản hơn. Tôi chỉ tạo ra một tuần hai lần, lập chỉ mục ở vị trí chính xác và rút ra bảy mục.
  • 2011/02/10 22:52 (138) - Di chuyển các diễn viên ban đầu sang khai báo cũng $dtiết kiệm một vài byte - và bị loại bỏ $x.
  • 2011/02/10 23:03 (135) - Di chuyển dàn diễn viên xuống đường ống để tránh dàn diễn viên (cần bổ sung []). Cũng thay đổi đầu ra để chuyển một danh sách các đối tượng thành chuỗi, trong đó chèn một khoảng trắng ( $OFSmặc định).
  • 2011/02/11 20:54 (132) - Thay thế trận đấu regex bằng danh sách mã ký tự và lập chỉ mục thành một hashmap với ký tự thứ ba từ mùa.
  • 2011/02/11 21:00 (122) - Thay thế bản đồ băm bằng một mảng.
  • 2011/02/11 21:12 (117) - Tốt hơn mảng-y. Và ngắn hơn để khởi động. Modulo 8 gói ngắn hơn một chút.
  • 2011/02/11 21:16 (116) - Trích xuất một yếu tố năm để thay thế 0,0,2bằng 0..2ngắn hơn.
  • 2011/02/11 21:22 (114) - Được sử dụng một phép tính hơi khác. Nó vẫn ánh xạ mùa thu và mùa thu đến cùng một chỉ mục và có lợi thế là chỉ yêu cầu năm giá trị. Rất đẹp. Chỉ số âm vào chuỗi cũng chơi rất tốt với »Fall« ngắn hơn phần còn lại.
  • 2011/02/11 21:45 (112) - Cách đánh cắp của Ventero để xác định phạm vi nhiệt độ của mùa ngắn hơn hai byte.
  • 2011/02/12 03:16 (105) - Quay lại 105 sau một nỗ lực khác chỉ in một dòng duy nhất.
  • 2011/02/12 13:23 (104) - Quay lại 104 lần nữa, sử dụng chỉ số tích cực vào mùa giải kể từ khi tôi chia tay một lần nữa.

Kiểm tra tập lệnh (miễn là kết quả không có kết quả là ok):

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 ký tự

' ':^/){*}*43845%7&5*:|;){*}*333121%7&:$;7,{($+'Sun Mon Tues Wednes Thurs Fri Satur'^/.+='day '+20rand|+5-+n}/
  • Hỗ trợ đầy đủ tất cả các phạm vi nhiệt độ, mùa và cũng hỗ trợ "Mùa thu" là từ đồng nghĩa với "Mùa thu".
  • Tôi nghĩ rằng có một số phòng để cải thiện, nhưng kiến ​​thức về golf hiện tại của tôi còn hạn chế.

Dưới đây là các bài kiểm tra, 2 lần vượt qua để xác nhận tính ngẫu nhiên

$ 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 Nhân vật

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());
}

Phiên bản có khoảng trắng bên ngoài bị xóa (đó là cách tạo thành 436 ký tự):

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());}

Chắc chắn, bạn có thể tiết kiệm rất nhiều nhân vật chỉ bằng cách ép tất cả các dòng mới và thụt lề, và hầu hết các không gian khác, ra ngoài? ;-)
Chris Jester-Young

Tôi đếm các ký tự với tất cả các khoảng trắng thừa được loại bỏ. Thật khó để đọc theo cách đó đến nỗi có vẻ ngớ ngẩn khi đăng nó theo cách đó.
Jonathan M Davis

2

PHP, 353 319 305 304 288 ký tự

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

Ung dung

<?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";
        }
?>

304 -> 304: Chuyển đổi dòng mới
304 -> 288: Sử dụng mảng JSON thay vì mảng PHP


1
Không chấp nhận Fallnhư một từ đồng nghĩa cho Autumnnhư được chỉ định trong mô tả nhiệm vụ.
Joey

1

Nhân vật C # 350

Phải có một cách hiệu quả hơn thế này. Nhưng đây là những gì tôi đã có cho đến nay:

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;}}}

Hoặc trong một định dạng dễ đọc hơn, với một vài ý kiến:

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 # thường cần tất cả sự trợ giúp mà nó có thể nhận được, vì vậy bạn có thể thay thế nội dung của vòng lặp for của mình bằng cái này (tôi nghĩ): Console.WriteLine (Enum.GetName (typeof (DayOfWeek), z ++% 7) + "" + r. Tiếp theo (l, u));
Steve

1

PHP - 150 ký tự

<?$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";

Tôi hình dung tôi sẽ viết giải pháp PHP của riêng mình sau khi giải pháp hiện tại thậm chí không đáp ứng đầy đủ các điều kiện thách thức.

Nó dựa vào strtotime để phân tích ngày và ngày để lặp lại. Để xác định mùa, nó theo chữ cái thứ ba của tên mùa, là duy nhất (như đã cho).

Để chạy đúng, nó yêu cầu thông báo bị vô hiệu hóa và các thẻ ngắn được bật.


0

Javascript - 251 ký tự

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))}

Thật không may, kịch bản không đáp ứng yêu cầu stdin / stdout nhưng nó chấp nhận Fall là một từ đồng nghĩa với Autumn.

Đánh bóng trắng:

  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

Toán học 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]

Sử dụng

g["Winter", "Sunday"]

nhập mô tả hình ảnh ở đây


0

Python 2, 220 ký tự

Một chút lớn nhưng (gần như) có thể đọc được.

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)

Đầu ra

# echo "Monday Summer" | python forecast.py 
Monday 33
Tuesday 29
Wednesday 33
Thursday 28
Friday 25
Saturday 21
Sunday 30
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.