일기 예보


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 : 적어도 내 솔루션의 관점에서 볼 때 단일 온도보다 매일 임의의 온도를 생성하는 것이 훨씬 쉽습니다. 하루 종일 똑같이 취급하는 것이 훨씬 쉽고 골프에 좋습니다.
Joey

지금 농담하는 거지?
기계식 달팽이

답변:


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 입력을 나누지 않는 Joey의 아이디어를 훔쳐서.
  • 105-> 101. 첫 번째 줄은 실제로 Ruby 인터프리터 자체에 의해 구문 분석되므로 솔루션을 실행할 때도 작동합니다. echo "Thursday Winter" | ruby1.8 forecast.rb
  • 101-> 96. 온도를 배열 대신 스트링에 삽입하는 Joey의 아이디어.
  • 방금 rand (20)가 아니라 rand (21)이어야한다는 것을 알았습니다.
  • 96-> 95. 불필요한 공백을 제거했습니다.

4

윈도우 PowerShell, 104

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

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

거기에있는 문자열은 약간 icky이므로 편의를위한 16 진수보기 :

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) – 요일 이름 생성이 더 간단 해졌습니다. 나는 일주일에 두 번 생성하고 올바른 위치에 색인을 생성하고 7 개의 항목을 꺼냅니다.
  • 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) – 더 많은 어레이 -y 장점. 부팅이 더 짧습니다. Modulo 8은 어레이를 조금 더 짧게 포장합니다.
  • 2011-02-11 21:16 (116) – 5 보다 작은 인수로 대체 0,0,2합니다 0..2.
  • 2011-02-11 21:22 (114) – 약간 다른 계산을 사용했습니다. 여전히 가을과 가을을 동일한 인덱스로 매핑하며 5 개의 값만 필요하다는 장점이 있습니다. 아주 좋아요 문자열에 대한 음수 인덱스도»Fall«이 나머지보다 짧아서 매우 잘 재생됩니다.
  • 2011-02-11 21:45 (112) – Stolen Ventero의 계절 온도 범위를 결정하는 방법은 2 바이트 더 짧습니다.
  • 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

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

분명히, 당신은 모든 줄 바꿈과 들여 쓰기 및 대부분의 다른 공백을 짜서 많은 문자를 저장할 수 있습니까? ;-)
Chris Jester-Young 12

여분의 공백을 모두 제거한 문자를 세었습니다. 그렇게 읽는 것이 너무 어려워서 그렇게 게시하는 것이 어리석은 것처럼 보입니다.
조나단 M 데이비스

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 : PHP 배열 대신 JSON 배열을 사용함


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 #은 일반적으로 얻을 수있는 모든 도움이 필요하므로 for 루프의 내용을 다음과 같이 바꿀 수 있습니다. Console.WriteLine (Enum.GetName (typeof (DayOfWeek), z ++ % 7) + ""+ r. 다음 (1, 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

자바 스크립트-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의 동의어로 받아들입니다.

공백 :

  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

매스 매 티카 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

파이썬 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.