それは何年のことか?


9

2014年12月で、2015年はもうすぐ始まります。しかし、誰もがこれを実現しているわけではないようです。

ジョン:「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!

ふew。2014年がUTC(SEで使用される)で終了する6秒前に投稿しました。また、みなさん
user2428118 2015年

仮に、2016年と2009年は同じ形であるとしましょう。では、どれが一番近いですか?(つまり、絶対距離で最も近いという意味ですか、それとも2015年より前で最も近いという意味ですか?)
Sp3000

@ SP3000後者。明確にするために投稿を編集しました。
user2428118 2015年

2
出力でカレンダーを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

Python 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

Perl-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


@nutkiああ、私はすでにそれを修正したと思った。
KSFT、2015年

2

Perl 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文字、ありがとう:)
マヌエルシュヴァイガート

1
あなたはどのように変更することで、いくつかの文字を保存することができyますインデックスを使用して、構文を保存することができます文字列は配列を記述するために必要であれば、計算された(すなわちvar y = "1054382"[index]-480ASCII 48です))。さらに節約するためyz計算にインライン化することもできます。
VisualMelon

2

C#、384363の 325バイト

C#時間、ルールの1つを見逃したかどうかなど教えてください。

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"

編集:更新され、いくつかのバイトが削除されました


出力に句読点がありません。
タイタス

2

Java、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

JavaScript(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!`;
}

JavaScript(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ループがなく、短い3項演算子もありません

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は最初の改行を無視するため、終了タグの後ろに2つの改行

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.