Prakiraan cuaca


13

Tulis program terpendek untuk memperkirakan cuaca selama 7 hari ke depan

Masukan (dari stdin) adalah hari kerja dan musim

Output (ke stdout) adalah tujuh baris pada hari kerja dan suhu dalam Celcius

Hari kerja dimulai pada input hari kerja

Suhu adalah angka acak dengan kisaran tergantung pada musim

Pegas 10 - 30 derajat  
Musim panas 20 - 40 derajat  
Musim Gugur 5 - 25 derajat (Musim gugur adalah sinonim untuk musim gugur)
Musim dingin -5 - 15 derajat

Input Sampel

Thursday Winter

Output Sampel

Kamis -1
Jumat 3
Sabtu 8
Minggu 7
Senin 10
Selasa 10
Rabu -1

Program Anda tidak boleh memiliki output yang identik setiap kali dijalankan dengan input yang sama


Apakah cukup bahwa hanya satu hari memiliki suhu acak? Dengan cara ini, output tidak akan sama untuk setiap proses.
hallvabo

1
Saya sudah berpikir tentang masalah penandaan dan akan menyarankan bahwa ini merupakan simulasi dari ramalan apakah.
dmckee --- ex-moderator kitten

@hallvabo, saya tidak bermaksud untuk menambahkan ketentuan tambahan untuk pertanyaan, ini adalah apa adanya :)
gnibbler

FWIW: Paling tidak dari sudut pandang solusi saya, jauh lebih mudah untuk hanya menghasilkan suhu acak untuk setiap hari daripada hanya untuk satu suhu saja. Menangani semua hari dengan cara yang sama jauh lebih mudah dan lebih baik untuk bermain golf.
Joey

Apakah ini lelucon?
Siput mekanik

Jawaban:


8

Ruby 1.8, 95 karakter

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

Karakter yang lolos di dalam string harus diganti dengan karakter literal yang diwakilinya.

  • Menemukan cara yang lebih singkat untuk mengemas data, Ruby 1.9 akan menjadi 4 karakter lebih lama sekarang (tambahkan .ordsetelah $_[-3]).
  • 112 -> 105 dengan mencuri ide Joey untuk tidak membagi input.
  • 105 -> 101. Perhatikan bahwa baris pertama sebenarnya diuraikan oleh interpreter Ruby itu sendiri, jadi itu bahkan berfungsi ketika menjalankan solusi seperti echo "Thursday Winter" | ruby1.8 forecast.rb
  • 101 -> 96. Mencuri ide Joey lagi untuk hanya menanamkan suhu ke dalam string, bukan array.
  • Aduh, perhatikan saja seharusnya rand (21), bukan rand (20).
  • 96 -> 95. Menghapus spasi yang tidak perlu.

4

Windows PowerShell, 104

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

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

String di sana agak menjijikkan, jadi tampilan hex untuk kenyamanan Anda:

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

Sejarah:

  • 2011-02-04 00:16 (179) - Pertama, upaya langsung.
  • 2011-02-04 00:20 (155) - Mengapa mencocokkan seluruh nama musim saat Anda dapat keluar dengan karakter individual dan pertandingan regex? Tidak akan berurusan dengan baik dengan input yang tidak valid tetapi itu selalu diharapkan dalam bermain Golf.
  • 2011-02-06 13:12 (149) - Singkirkan $tyang hanya memperpanjang hal.
  • 2011-02-10 22:50 (142) - Pembuatan nama hari dipermudah. Saya hanya menghasilkan seminggu dua kali, indeks di posisi yang benar dan mengeluarkan tujuh item.
  • 2011-02-10 22:52 (138) - Memindahkan pemain awal ke deklarasi $dmenyimpan beberapa byte juga - dan menyingkirkan $x.
  • 2011-02-10 23:03 (135) - Memindahkan cast lebih jauh ke bawah pipa untuk menghindari cast array (yang perlu tambahan []). Juga mengubah output menjadi casting daftar objek ke string yang secara implisit memasukkan spasi ( $OFSdefault).
  • 2011-02-11 20:54 (132) - Mengganti pertandingan regex dengan daftar kode karakter dan mengindeks ke dalam hashmap dengan karakter ketiga dari musim.
  • 2011-02-11 21:00 (122) - Mengganti peta hash dengan array.
  • 2011-02-11 21:12 (117) - Lebih banyak kebaikan array-y. Dan lebih pendek untuk boot. Modulo 8 mengemas array lebih pendek.
  • 2011-02-11 21:16 (116) - Ekstrak faktor lima untuk menggantikan 0,0,2oleh 0..2yang lebih pendek.
  • 2011-02-11 21:22 (114) - Menggunakan perhitungan yang sedikit berbeda. Itu masih memetakan musim gugur dan musim gugur ke indeks yang sama dan memiliki keuntungan hanya membutuhkan lima nilai. Sangat bagus. Indeks negatif ke dalam string juga bermain sangat baik dengan »Fall« lebih pendek dari yang lain.
  • 2011-02-11 21:45 (112) - Cara Volen yang dicuri menentukan kisaran suhu musim yang dua byte lebih pendek.
  • 2011-02-12 03:16 (105) - Kembali ke 105 setelah upaya yang berbeda hanya mencetak satu baris.
  • 2011-02-12 13:23 (104) - Kembali ke 104 lagi, menggunakan indeks positif ke musim sejak saya berpisah lagi.

Skrip uji (selama tidak menghasilkan apa-apa, hasilnya 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 karakter

' ':^/){*}*43845%7&5*:|;){*}*333121%7&:$;7,{($+'Sun Mon Tues Wednes Thurs Fri Satur'^/.+='day '+20rand|+5-+n}/
  • Sepenuhnya mendukung semua rentang suhu, musim dan juga mendukung "Jatuh" sebagai sinonim untuk "Musim Gugur" juga.
  • Saya pikir ada beberapa ruang untuk perbaikan, tetapi pengetahuan skrip golf saya saat ini terbatas.

Ini adalah tes, 2 melewati masing-masing untuk mengkonfirmasi keacakan

$ 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 Karakter

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

Versi dengan spasi kosong yang dihapus (yang artinya 436 karakter):

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

Tentunya, Anda dapat menyimpan banyak karakter hanya dengan menekan semua baris baru dan lekukan, dan sebagian besar ruang lainnya, keluar? ;-)
Chris Jester-Young

Saya menghitung karakter dengan semua spasi kosong dihapus. Sangat sulit untuk membaca seperti itu sehingga rasanya konyol untuk mempostingnya seperti itu.
Jonathan M Davis

2

PHP, 353 319 305 304 288 karakter

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

Tidak disatukan

<?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: Mengganti baris baru
304 -> 288: Menggunakan array JSON, bukan array PHP


1
Tidak menerima Fallsinonim untuk Autumnsebagaimana ditentukan dalam deskripsi tugas.
Joey

1

C # 350 Karakter

Pasti ada cara yang lebih efisien dari ini. Tapi inilah yang saya dapatkan sejauh ini:

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

Atau dalam format yang lebih mudah dibaca, dengan beberapa komentar:

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 # biasanya membutuhkan semua bantuan yang bisa didapat, sehingga Anda dapat mengganti konten loop for Anda dengan ini (saya pikir): Console.WriteLine (Enum.GetName (typeof (DayOfWeek), z ++% 7) + "" + r. Berikutnya (l, u));
Steve

1

PHP - 150 Karakter

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

Saya pikir saya akan menulis solusi PHP saya sendiri setelah yang sekarang bahkan tidak sepenuhnya memenuhi kondisi tantangan.

Itu bergantung pada strtotime untuk mengurai hari, dan tanggal untuk mengulanginya kembali. Untuk menentukan musim, itu mengikuti huruf ketiga dari nama musim, yang unik (seperti yang diberikan).

Untuk menjalankannya dengan benar, diperlukan pemberitahuan untuk dinonaktifkan dan tag pendek harus diaktifkan.


0

Javascript - 251 karakter

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

Sayangnya skrip tidak memenuhi persyaratan stdin / stdout tetapi ia menerima Fall sebagai sinonim untuk Musim Gugur.

Berputar:

  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]

Pemakaian

g["Winter", "Sunday"]

masukkan deskripsi gambar di sini


0

Python 2, 220 karakter

Agak besar tapi (hampir) terbaca.

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)

Keluaran

# echo "Monday Summer" | python forecast.py 
Monday 33
Tuesday 29
Wednesday 33
Thursday 28
Friday 25
Saturday 21
Sunday 30
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.