Прогнозуйте погоду


13

Напишіть найкоротшу програму, щоб прогнозувати погоду на наступні 7 днів

Вхідні дані (від stdin) - будній день та сезон

Вихід (для відсторонення) - це сім рядків будній день, а температура в градусах Цельсія

Будні дні починаються з вхідного будня

Температури - випадкові числа з діапазоном залежно від пори року

Весна 10 - 30 градусів  
Влітку 20 - 40 градусів  
Осінь 5 - 25 градусів (осінь - синонім осені)
Взимку -5 - 15 градусів

Зразок введення

Thursday Winter

Вибірка зразка

Четвер -1
П’ятниця 3
Субота 8
Неділя 7
Понеділок 10
Вівторок 10
Середа -1

Програма не повинна мати однаковий вихід кожного разу, коли вона працює з одним і тим же входом


Чи достатньо, що лише один день має випадкові температури? Таким чином, вихід не буде ідентичним для кожного запуску.
hallvabo

1
Я думав над тегами питань і запропонував би це симуляція чи прогноз.
dmckee --- кошеня колишнього модератора

@hallvabo, я не збираюся додавати жодних додаткових умов до питання, це те, що це таке :)
gnibbler

FWIW: Принаймні, з точки зору мого рішення, набагато простіше просто генерувати випадкові температури на кожен день, ніж просто для однієї. Поводження з цими днями однаково набагато простіше і краще в гольф.
Джої

Відповіді:


8

Рубін 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, викравши ідею Джоу не розбивати вхід.
  • 105 -> 101. Зауважте, що перший рядок насправді розбирається самим інтерпретатором Ruby, тому він працює навіть під час запуску рішення, як echo "Thursday Winter" | ruby1.8 forecast.rb
  • 101 -> 96. Вкрав ідею Джоя знову просто вбудувати температури в рядок замість масиву.
  • Ну, щойно помітили, це повинен бути 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) - Навіщо відповідати іменам цілого сезону, коли ви можете піти з окремими персонажами та збігом регулярних виразів? Не вдасться розібратися з недійсним вкладом, але це завжди слід очікувати в Golfing.
  • 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-02-11 21:12 (117) - Більше масиву-у добра. І коротше до завантаження. 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) - спосіб вкраденого Вентеро визначити температурний діапазон сезону, який на два байти коротший.
  • 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

Гольфскрипт - 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

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

Напевно, ви можете зберегти багато символів, просто видавивши з нього всі нові рядки та відступи та більшість інших пробілів? ;-)
Кріс Єстер-Янг

Я порахував персонажів із видаленим зайвим пробілом. Просто так важко читати так, що здавалося нерозумним розмістити це так.
Джонатан М Девіс

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 # зазвичай потребує всієї допомоги, яку він може отримати, тому ви можете замінити вміст свого циклу на цей (я думаю): 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 після того, як поточне навіть не повністю відповідає умовам виклику.

Він покладається на 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 як синонім осені.

Пробіл:

  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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.