Hava durumunu tahmin et


13

Önümüzdeki 7 gün için hava durumunu tahmin etmek için en kısa programı yazın

Girdi (stdin'den) hafta içi ve sezon

Çıktı (stdout'a) hafta içi yedi satır ve santigrat cinsinden sıcaklık

Hafta içi, hafta içi girişten başlar

Sıcaklıklar sezona bağlı olarak rastgele sayılardır

İlkbahar 10-30 derece  
Yaz 20-40 derece  
Sonbahar 5 - 25 derece (Sonbahar, sonbahar ile eşanlamlıdır)
Kış -5 - 15 derece

Örnek Giriş

Thursday Winter

Örnek Çıktı

Perşembe -1
Cuma 3
Cumartesi 8
Pazar 7
Pazartesi 10
Salı 10
Çarşamba -1

Programınız aynı girişle her çalıştırıldığında aynı çıktıya sahip olmamalıdır


Sadece bir günün rastgele sıcaklıklara sahip olması yeterli mi? Bu şekilde, çıktı her çalışma için aynı olmaz.
hallvabo

1
Sorunları etiketlemeyi düşünüyorum ve bunun bir tahmin olup olmadığını simüle etmesini öneririm .
dmckee --- eski moderatör yavru kedi

@hallvabo, soruya herhangi bir ekstra koşul eklemek niyetinde değilim, ne olduğunu :)
gnibbler

FWIW: En azından benim çözümüm açısından, her gün için rastgele sıcaklıklar oluşturmak tek bir sıcaklıktan çok daha kolay. Bütün günler aynı şekilde hareket etmek golf oynamak için çok daha kolay ve daha iyidir.
Joey

Bu bir şaka mı?
Mekanik salyangoz

Yanıtlar:


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

Dizenin içinde kaçan karakter, temsil ettikleri karakter değişmezleriyle değiştirilmelidir.

  • Verileri paketlemenin daha kısa bir yolunu buldu, Ruby 1.9 şimdi 4 karakter daha uzun olurdu ( .ordsonra ekleyin $_[-3]).
  • 112 -> 105 Joey'nin girişi bölmeme fikrini çalarak.
  • 105 -> 101. İlk satırın Ruby yorumlayıcısının kendisi tarafından ayrıştırıldığına dikkat edin, bu nedenle çözümü çalıştırırken bile çalışır echo "Thursday Winter" | ruby1.8 forecast.rb
  • 101 -> 96. Sıcaklığı bir dizi yerine bir dizeye gömmek için Joey'nin fikrini tekrar çaldı.
  • Hata! Rand (20) değil rand (21) olması gerektiğini fark ettim.
  • 96 -> 95. Gereksiz boşluk kaldırıldı.

4

Windows PowerShell, 104

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

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

Oradaki dizeler biraz icky, bu yüzden rahatınız için onaltılık bir görünüm:

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

Tarih:

  • 2011-02-04 00:16 (179) - İlk olarak, basit bir girişim.
  • 2011-02-04 00:20 (155) - Bireysel karakterler ve normal ifade eşleşmesiyle kaçabileceğiniz zaman neden tüm sezon isimlerini eşleştiriyoruz? Geçersiz girdilerle iyi uğraşmayacaksınız, ancak bu her zaman Golf'te bekleniyor.
  • 2011-02-06 13:12 (149) - $tSadece uzatılmış şeylerden kurtuldum .
  • 2011-02-10 22:50 (142) - Gün ismi üretimi daha kolay. Sadece iki hafta bir hafta oluşturmak, doğru pozisyonda dizin ve yedi ürün dışarı çekin.
  • 2011-02-10 22:52 (138) - İlk oyuncu kadrosunun deklarasyonuna taşınması da $dbirkaç bayt kurtardı - ve kurtuldu $x.
  • 2011-02-10 23:03 (135) - Dizi dökümünü önlemek için kalıbı boru hattında daha ileriye taşıyor (buna ek olarak ihtiyaç duyuyor []). Ayrıca, çıktıyı örtük olarak bir boşluk ekleyen dizeye bir nesne listesi yayınlamaya değiştirdi ( $OFSvarsayılan).
  • 2011-02-11 20:54 (132) - Normal ifade eşleşmesini, bir karakter kodları listesiyle değiştirdi ve sezonun üçüncü karakteri olan bir hashmap dizine ekledi.
  • 2011-02-11 21:00 (122) - Karma haritasını bir diziyle değiştirdi.
  • 2011-02-11 21:12 (117) - Daha fazla dizi-iyilik. Ve önyükleme daha kısa. Modulo 8 diziyi biraz daha kısa paketler.
  • 2011-02-11 21:16 (116), - değiştirmek için bir beş faktörü Çıkarılan 0,0,2göre 0..2daha kısa olan.
  • 2011-02-11 21:22 (114) - Biraz farklı bir hesaplama kullanıldı. Hala sonbahar ve sonbahar aynı endekse haritalar ve sadece beş değer gerektirme avantajına sahiptir. Çok hoş. Dizeye negatif endeks de »Fall« 'un diğerlerinden daha kısa olmasıyla çok iyi oynar.
  • 2011-02-11 21:45 (112) - Çalıntı Ventero'nun iki bayt daha kısa olan mevsim sıcaklık aralığını belirleme şekli.
  • 2011-02-12 03:16 (105) - Farklı bir denemeden sonra 105'e kadar tek bir satır yazdırdı.
  • 2011-02-12 13:23 (104) - Tekrar 104'e döndüğümde, tekrar bölündüğümden beri sezona pozitif bir endeks kullanarak.

Test komut dosyası (hiçbir şey çıktı olmadığı sürece sonuç iyi değil):

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}/
  • Tüm sıcaklık aralıklarını, mevsimleri tam olarak destekleyin ve "Sonbahar" ın eş anlamlısı olarak "Sonbahar" ı da destekleyin.
  • Bazı iyileştirme odaları olduğunu düşünüyorum, ancak mevcut golfscript bilgim şimdiye kadar sınırlıdır.

İşte testler, rastgelelığı onaylamak için her biri 2 geçiş

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

Yabancı boşluk kaldırılmış sürüm (436 karaktere gelir):

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

Şüphesiz, tüm yeni satırları ve girintileri ve diğer boşlukların çoğunu sıkarak çok fazla karakter kaydedebilirsiniz? ;-)
Chris Jester-Young

Tüm ekstra boşluk kaldırılmış karakterleri saydım. Bu şekilde okumak o kadar zor ki, bu şekilde yayınlamak aptalca görünüyordu.
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])."
";}

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: Yeni satırı değiştirdi
304 -> 288: PHP dizileri yerine JSON dizilerini kullanır


1
Görev açıklamasında belirtildiği gibi Falleşanlamlı olarak kabul etmez Autumn.
Joey

1

C # 350 Karakter

Bundan daha etkili bir yol olmalı. Ama şu ana kadar aldığım şey:

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

Veya daha fazla okunabilir biçimde, birkaç yorumla:

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 # genellikle alabileceği tüm yardıma ihtiyaç duyar, bu yüzden sizin için döngü içeriğini bu (bence) ile değiştirebilirsiniz: Console.WriteLine (Enum.GetName (typeof (DayOfWeek), z ++% 7) + "" + r. Sonraki (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";

Şu anki zorluk koşullarını bile tam olarak karşılamadığında kendi PHP çözümümü yazacağımı düşündüm.

Günü ayrıştırmak için strtotime'a ve geri yankılama tarihine dayanır. Sezonu belirlemek için, sezon isminin benzersiz olan (verildiği gibi) üçüncü harfini takip eder.

Düzgün çalışması için bildirimlerin devre dışı bırakılması ve kısa etiketlerin etkinleştirilmesi gerekir.


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

Ne yazık ki senaryo stdin / stdout gereksinimini karşılamıyor, ancak Sonbahar'ı Sonbahar ile eşanlamlı olarak kabul ediyor.

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]

kullanım

g["Winter", "Sunday"]

resim açıklamasını buraya girin


0

Python 2, 220 karakter

Biraz büyük ama (neredeyse) okunabilir.

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)

Çıktı

# echo "Monday Summer" | python forecast.py 
Monday 33
Tuesday 29
Wednesday 33
Thursday 28
Friday 25
Saturday 21
Sunday 30
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.