몇 년입니까?


9

2014 년 12 월이며 2015 년이 거의 시작되었습니다. 그러나 모든 사람이 이것을 깨달은 것은 아닙니다.

Jon : "2009 년은 확실히 오랜 세월입니다"|  가필드는 달력을 본다 |  가필드 :“새 달력을 얻어야 해”

그러나 PPCG의 사람들은 구출에 온다!

입력

당신의 프로그램은 12 월에있는 날들이 11 월과 1 월의 날들과 다르게 보이는 벽과 같은 그리드를받습니다. 매주 일요일로 시작하여 토요일로 끝납니다.

월 내의 일수는로 표시됩니다 #. 월이 아닌 날은 (공백, ASCII 코드 32)로 표시됩니다. 매주 별도의 줄에 있습니다. 줄은 개행 문자 ( \n) 로 구분됩니다 . 프로그램은 입력이 끝날 때 줄 바꿈을 생략하거나 포함해야 할 수 있습니다.

예를 들어, 이것은 2009 년 12 월의 입력입니다.

  #####
#######
#######
#######
#####  

달력은 항상 12 월입니다.

직무

입력이 주어지면 달력과 연관된 연도를 찾아야합니다. 달력이 일치하는 연도는 여러 해이므로 2015 년에 가장 가까운 연도 (2015 년 이전)를 반환해야합니다 (2015 년 제외).

귀하의 프로그램은 2015 년에 가까운 다른 연도 (2015 년 이전)와 동일한 12 월의 달력 레이아웃을 갖는 것을 제외하고 <2015 년의 모든 연도에 대해 올바른 결과를 산출해야합니다.

연도가 <2014 인 경우 연도와 2014의 차이도 계산해야합니다. 예를 들어 2012 년의 경우 차이는 2입니다.

산출

프로그램의 출력은 다음과 같아야합니다.

  • 텍스트 : Your calendar is for <year>.(참고 : 원래 '캘린더'로 철자가되었으므로 해당 철자를 받아들입니다.)
  • 개행 ( \n또는 \r\n)이 뒤 따릅니다 .
  • 뒤에 텍스트 : It's almost 2015.
  • 연도가 <2014 인 경우 다음에 텍스트가 와야합니다. You're <difference> years behind.이것은 별도의 줄에 있어야합니다.
  • 개행 ( \n또는 \r\n)이 뒤 따릅니다 .
  • 뒤에 텍스트 : Go buy a new calendar!
  • 선택적으로 개행 ( \n또는 \r\n) 이옵니다 .

규칙

  • 캘린더를 명령 줄 인수 (예 :)로 수신할지 yourprogram.exe <calendar>또는 사용자 입력 프롬프트 로 수신할지 선택할 수 있습니다 .
  • 프로그램이 유효하지 않은 입력을받지 못한다고 가정 할 수 있습니다. 유효하지 않은 입력은 연도가없는 캘린더 레이아웃을 포함합니다.
  • 가장 짧은 코드 (모든 언어로 된 바이트)가 이깁니다.
  • 비표준 명령 줄 인수 (일반적으로 스크립트를 실행하는 데 필요하지 않은 인수)는 총 문자 수에 포함됩니다.

  • 프로그램 이하지 말아야 할 것 :

    • 외부 자원에 의존하십시오.
    • 특정 파일 이름이 있어야합니다.
    • 필요한 출력 이외의 것을 출력하십시오.
    • 실행하는 데 시간이 오래 걸립니다. 일반 가정 사용자의 컴퓨터에서 1 분 이상 프로그램을 실행하면 유효하지 않습니다.
  • 이 과제를 게시하기 전에 공개적으로 사용 가능한 컴파일러 / 인터프리터가없는 프로그래밍 언어로 프로그램을 작성해서는 안됩니다.

입력:

  #####
#######
#######
#######
#####  

산출:

Your calendar is for 2009.
It's almost 2015.
You're 5 years behind.
Go buy a new calendar!

입력:

 ######
#######
#######
#######
####   

산출:

Your calendar is for 2014.
It's almost 2015.
Go buy a new calendar!

입력:

      #
#######
#######
#######
#######
##     

산출:

Your calendar is for 2012.
It's almost 2015.
You're 2 years behind.
Go buy a new calendar!

휴 2014 년이 끝나기 6 초 전에 게시 (SE에서 사용)했습니다. 또한, 새해 복 많이 받으세요!
user2428118

가설 적으로, 2016 년과 2009 년의 모양이 같다고 가정 해보십시오. 그렇다면 가장 가까운 것은 무엇입니까? (즉, 절대 거리에 가장 가깝거나 2015 년 이전에 가장 가깝다는 것을 의미합니까?)
Sp3000

@ SP3000 후자. 명확히하기 위해 게시물을 편집했습니다.
user2428118

2
출력에서 두 가지 다른 방식으로 달력을 철자해야합니까?
feersum

3
"분수를 명령 줄 인수로 받을지 여부를 선택할 수 있습니다 (예 : yourprogram.exe 2/5)"... 무엇?
feersum

답변:


2

CJam, 126 바이트

"Your calendar is for "2e3q'##"DE9AB6C"=~+".
It's almost "2015_(".
You're 5 years behind"9@5$-:TtTg*".
Go buy a new calendar!"

3

파이썬 3, 178 바이트

s=input();i=42157313>>s.index("#")*4&15;print("Your calendar is for %d.\nIt's almost 2015.\n%sGo buy a new calendar!"%(2014-i,(i>0)*("You're %d year%s behind.\n"%(i,"s"*(i>1)))))

첫 번째 위치를 기반으로 한 간단한 조회 테이블입니다 #.

넓히는:

s=input()
i=42157313>>s.index("#")*4&15
print("Your calendar is for %d.\nIt's almost 2015.\n%sGo buy a new calendar!"\
    %(2014-i,(i>0)*("You're %d year%s behind.\n"%(i,"s"*(i>1)))))

2

펄-187

$ARGV[0]=~/^( *)/;my@a=(7,8,3..5,0,6);my$b=($a[length$1]+2006);print"Your calendar is for $b.\nIt's almost 2015.\n".($b<2014?"You're ".2014-$b." years behind.\nGo buy a new calendar!":"")

"." "-"의 연산자 우선 순위가 동일하므로 "2014- $ b"주위에 괄호가 필요합니다.
nutki jan


@ nutki Aah, 나는 이미 그것을 고쳤다 고 생각했다.
KSFT

2

펄 5 : 137 143

#!perl -p
$_="Your calendar is for ".(2014-($%=w834506&s/#/?/r)).".
It's almost 2015.
".("You're $% years behind.
")x!!$%."Go buy a new calendar!"

이전 접근법 :

#!perl -p
/#/;$_="Your calendar is for ".(2014-($b=1558279/9**"@-"%9)).".
It's almost 2015.
".("You're $b years behind.
")x!!$b."Go buy a new calendar!"

표준 입력의 달력 (첫 번째 줄만 중요합니다)

perl 2014.pl <<<" ######"

2

C # 235

축소 :

class P{static void Main(string[] a){var y=new[]{1,0,5,4,3,8,2}[a[0].IndexOf('#')];var z=2014-y;System.Console.Write("Your calendar is for "+z+"\nIt's almost 2015.\n"+(z>0?"You're "+z+" years behind.":"")+"\nGo buy a new calendar!");}}

언 골프

class P
{
    static void Main(string[] a)
    {
        var y = new[]{1,0,5,4,3,8,2}[a[0].IndexOf('#')];
        var z = 2014-y; 
        System.Console.Write("Your calendar is for "+z+"\nIt's almost 2015.\n"+(z>0 ? "You're "+z+" years behind.":"")+"\nGo buy a new calendar!");
    }
}

글쎄, 언어는 장황하다 :)


1
수업과 메인은 공개 할 필요가 없습니다. 또한 쉽게 이름 Program을 바꿀 수 있습니다 P. 그것은 당신에게 일부 문자를 저장해야합니다 :)
ProgramFOX

실제로 20 자, 감사합니다 :)
Manuel Schweigert

1
y계산 방식을 변경하여 몇 개의 문자를 저장할 수 있습니다 . 문자열을 색인화하면 배열을 설명하는 데 필요한 구문을 저장할 수 있습니다 (예 var y = "1054382"[index]-48: 0ASCII 48). 추가 절약 y을 위해 z계산에 인라인 될 수도 있습니다 .
VisualMelon

2

C #, 384 , 363325 바이트

C # 시간, 규칙 중 하나를 놓친 경우 알려주십시오.

string a(string s){var l=s.IndexOf('#');var x=(DayOfWeek)Enum.Parse(typeof(DayOfWeek),""+l);l=1;for(;;){var y=DateTime.Now.Year-l;var t=(new DateTime(y,12,1).DayOfWeek==x)?"Your calendar is for "+y+"\nIt's almost 2015\n"+((y < 2014)?"You're "+--l+"years behind\n":"")+"Go buy a new calendar":null;if(t!=null){return t;}l++;}}

입력

" ######" 
"#######"  
"#######" 
"#######" 
"#####  "

산출

"Your calendar is for 2014
 It's almost 2015
 Go buy a new calendar

입력 2

"  #####"
"#######"  
"#######"
"#######" 
"#####  "

출력 2

"Your calendar is for 2009
 It's almost 2015
 You're 5 years behind
 Go buy a new calendar"

편집 : 업데이트되어 일부 바이트를 제거했습니다.


구두점이 출력에서 ​​누락되었습니다.
Titus

2

자바, 243 바이트

장황한 언어입니다 :-)

class A{public static void main(String[]s){int y=2005+new int[]{8,9,4,5,0,6,7}[s[0].indexOf("#")],d=2014-y;System.out.print("Your calendar is for "+y+".\nIt's almost 2015.\n"+(d>0?"You're "+d+" years behind.\n":"")+"Go buy a new calendar!");}}

축소되지 않은

class A {
    public static void main(String[] s) {
        int y = 2005 + new int[]{8,9,4,5,0,6,7}[s[0].indexOf("#")],
            d = 2014 - y;
        System.out.print("Your calendar is for " + y + ".\nIt's almost 2015.\n"
            + (d > 0 ? "You're " + d + " years behind.\n" : "") + "Go buy a new calendar!");
    }
}

1

자바 스크립트 (ES6), 199 170 바이트

ES6를 작성하는 데 익숙하지 않으므로 모든 팁을 주시면 감사하겠습니다.

조회 테이블, 170 바이트

a=(i)=>{y=[8,9,4,5,0,6,7][i.search('#')]+2005,f=2014-y;return`Your calendar is for ${y}.\nIt's almost 2015.\n${f?`You're ${f} years behind.\n`:''}Go buy a new calendar!`}

원본, 199 바이트

a=i=>{y=2015,f=-1;do{f++;d=new Date(`${y--}-12-01`)}while(d.getDay()!=i.search('#'))return`Your calendar is for ${y}.\nIt's almost 2015.\n${f?`You're ${f} years behind.\n`:''}Go buy a new calendar!`}

축소되지 않은

a = i => {
    y = 2015;
    f = -1;
    do {
        f++;
        d = new Date(`${y--}-12-01`);
    } while (d.getDay() != i.search('#'));
    return `Your calendar is for ${y}.\nIt's almost 2015.\n${f ? `You're ${f} years behind.\n` : ''}Go buy a new calendar!`;
}

자바 스크립트 (ES5) 212 182 바이트

아래에 원래 버전도 포함했습니다.

조회 배열, 182 바이트

function a(i){y=[8,9,4,5,0,6,7][i.indexOf('#')]+2005,f=2014-y;return"Your calendar is for "+y+".\nIt's almost 2015.\n"+(f?"You're "+f+" years behind.\n":'')+"Go buy a new calendar!"}

축소되지 않은

function a(i) {
    y = [8,9,4,5,0,6,7][i.indexOf('#')] + 2005;
    f = 2014 - y;
    return "Your calendar is for " + y + ".\nIt's almost 2015.\n" + (f ? "You're " + f + " years behind.\n" : '') + "Go buy a new calendar!";
}

원본, 212 바이트

function a(i){y=2015,f=-1;do{f++;d=new Date(y--+"-12-01")}while(d.getDay()!=i.indexOf('#'));return"Your calendar is for "+y+".\nIt's almost 2015.\n"+(f?"You're "+f+" years behind.\n":'')+"Go buy a new calendar!"}

축소되지 않은

function a(i) {
    y = 2015;
    f = -1;
    do {
        f++;
        d = new Date(y-- + "-12-01");
    } while (d.getDay() != i.indexOf('#'));
    return "Your calendar is for "+y+".\nIt's almost 2015.\n" + (f ? "You're "+f+" years behind.\n" : '') + "Go buy a new calendar!";
}

1

CoffeeScript, 211 177 바이트

내 PHP 답변과 비슷하지만 CoffeeScript에는 do-while루프가 없으며 짧은 삼항 연산자가 없습니다.

a=(i)->y=2015;f=-1;loop(f++;d=new Date y--+"-12-01";break if d.getDay()==i.indexOf '#');"Your calendar is for "+y+".\nIt's almost 2015.\n"+(if f then"You're "+f+" years behind.\n"else'')+'Go buy a new calendar!'

축소되지 않은

a = (i)->
    y = 2015
    f = -1
    loop
        f++
        d = new Date y-- + "-12-01"
        break if d.getDay() == i.indexOf '#'
    "Your calendar is for " + y + ".\nIt's almost 2015.\n" + (if f then "You're " + f + " years behind.\n" else '') + 'Go buy a new calendar!'

조회 테이블을 사용하여 단축 :

a=(i)->y=[8,9,4,5,0,6,7][i.indexOf '#']+2005;f=2014-y;"Your calendar is for "+y+".\nIt's almost 2015.\n"+(if f then"You're "+f+" years behind.\n"else'')+'Go buy a new calendar!'

1

PHP, 215 181 바이트

조회 테이블, 181 바이트

짧은 배열 구문으로 인해 PHP 5.4+에서만 작동합니다.

function a($i){$y=2005+[8,9,4,5,0,6,7][strpos($i,'#')];$f=2014-$y;echo "Your calendar is for $y.\nIt's almost 2015.\n".($f?"You're $f years behind.\n":'')."Go buy a new calendar!";}

축소되지 않은

function a($input) {
    $year = 2005 + [8,9,4,5,0,6,7][strpos($input, '#')];
    $difference = 2014 - $year;
    echo "Your calendar is for $year.\nIt's almost 2015.\n" . ($difference ? "You're $difference years behind.\n" : '') . "Go buy a new calendar!";
}

원본, 215 바이트

대부분의 PHP 5 버전에서 작동합니다 :

<?function a($c){$y=2015;$f=-1;do{$f++;$d=strtotime(--$y."-12-1");}while(date(w,$d)!=strpos($c,'#'));echo"Your calendar is for $y.\nIt's almost 2015.\n".($f?"You're $f years behind.\n":'')."Go buy a new calendar!";}

축소되지 않은

<?php

function a($input) {
    $year = 2015;
    $difference = -1;
    do {
        $difference++;
        $date = strtotime(--$year . "-12-1");
    } while (date('w', $date) != strpos($input, '#'));
    echo "Your calendar is for $year.\nIt's almost 2015.\n" . ($difference ? "You're $difference years behind.\n" : '') . "Go buy a new calendar!";
}

1

루비, 174

def a(i)y=2005+[8,9,4,5,0,6,7][i.index('#')];d=2014-y;puts"Your calendar is for #{y}.\nIt's almost 2015.\n"+(d>0?"You're #{d} years behind.\n":'')+"Go buy a new calendar!"end

1

PHP, 145 바이트

PHP는 첫 번째 줄을 무시하므로 닫는 태그 뒤에 두 줄 바꿈

Your calendar is for <?=2014-$y=_1054382[1+strspn($argv[1]," ")],".
It´s almost 2015.",$y?"
You're $y years behind.":""?>

Go buy a new calendar!

명령 행 인수에서 입력을받습니다.

문자열 리터럴을 인덱싱하려면 PHP 5.6 (2014 년 12 월 18 일 릴리스) 이상이 필요합니다.


1

SmileBASIC, 159 바이트

DEF C C
Y=VAL("2834501"[INSTR(C,"#")])?"Your calender is for ";2014-Y;".
?"It's almost 2015.
IF Y THEN?"You're ";Y;" years behind.
?"Go buy a new calendar!
END

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.