Hangi yıldayız?


9

Aralık 2014 ve 2015 neredeyse başladı. Ancak, herkes bunu farketmemiş gibi görünüyor.

Jon: “2009 kesinlikle uzun bir yıl oldu” |  Garfield takvime bakıyor |  Garfield: “Yeni bir takvim almalıyız”

Ama PPCG halkı kurtarmaya geliyor!

Giriş

Programınıza duvardaki gibi bir ızgara verilir, Aralık ayında olan günler Kasım ve Ocak aylarındakinden farklı görünür. Her hafta Pazar ile başlar ve Cumartesi ile biter.

Ay içindeki günler a ile temsil edilir #. Ayın dışında kalan günler (boşluk, ASCII kodu 32) ile temsil edilir . Her hafta ayrı bir satırda. Satırlar yeni satır karakteri ( \n) ile ayrılır . Programınız, girişin sonunda bir denetim veya yeni satır eklenmesini gerektirebilir.

Örneğin, Aralık 2009 için girdi:

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

Takvim her zaman Aralık ayıdır.

Görev

Girdi göz önüne alındığında, takvim ile ilişkili yılı bulmalısınız. Bir takvimin eşleştiği birden fazla yıl olduğundan, 2015'e en yakın olan yılı (2015'ten önce) iade etmelisiniz. (2015 hariç).

Programınızın, Aralık için 2015'e yakın bir yıl (2015'ten önce) bir takvim düzenine eşit olanlar hariç, <2015 yılı için doğru çıktıyı üretmesi gerekir.

Yıl <2014 ise, yıl ile 2014 arasındaki farkı da hesaplamanız gerekir. Örneğin, 2012 için fark 2.

Çıktı

Programınızın çıktısı:

  • Metin: Your calendar is for <year>.(Not: Bu başlangıçta “takvim” olarak yazıldığından, bu yazımı da kabul edeceğim.)
  • Ardından bir satırsonu ( \nveya \r\n) gelir.
  • Ardından metin: It's almost 2015.
  • Yıl <2014 ise, bunu metin takip You're <difference> years behind.etmelidir : Bu ayrı bir satırda olmalıdır.
  • Ardından bir satırsonu ( \nveya \r\n) gelir.
  • Ardından metin: Go buy a new calendar!
  • İsteğe bağlı olarak bir satırsonu ( \nveya \r\n) gelir.

kurallar

  • Takvimi komut satırı bağımsız değişkeni (örneğin yourprogram.exe <calendar>) veya kullanıcı girişi istemi olarak almak isteyip istemediğinizi seçebilirsiniz .
  • Programınızın geçersiz girdi almayacağını varsayabilirsiniz. Geçersiz girdi, yılı olmayan takvim düzenini içeriyor.
  • En kısa kod (bayt cinsinden, herhangi bir dilde) kazanır.
  • Standart olmayan tüm komut satırı bağımsız değişkenleri (bir komut dosyasını çalıştırmak için normalde gerekli olmayan bağımsız değişkenler) toplam karakter sayısına dahil edilir.

  • Programınızın yapmaması gerekenler:

    • Harici kaynaklara bağlı.
    • Belirli bir dosya adına sahip olduğunuza bağlıdır.
    • Gerekli çıktıdan başka bir çıktı alın.
    • Koşmak için olağanüstü uzun zaman ayırın. Programınız ortalama bir ev kullanıcısının bilgisayarında bir dakikadan fazla çalışıyorsa geçersizdir.
  • Programınız, bu meydan okuma gönderilmeden önce herkese açık bir derleyici / yorumlayıcı bulunmayan bir programlama dilinde yazılmamalıdır.

Örnekler

Giriş:

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

Çıktı:

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

Giriş:

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

Çıktı:

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

Giriş:

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

Çıktı:

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

Uf. 2014'te bitmeden 6 saniye önce (SE tarafından kullanılan) UTC'de yayınlamayı başardı. Ayrıca, herkese mutlu yıllar!
user2428118

Varsayımla, 2016 ve 2009'un aynı şekle sahip olduğunu varsayalım. O zaman hangisi en yakını? (yani, mutlak mesafeye en yakın mı
yoksa

@ SP3000 İkincisi. Açıklığa kavuşturmak için yayını düzenledim.
user2428118

2
Çıktıda takvimi iki farklı şekilde hecelemek gerçekten gerekli mi?
feersum

3
"Kesriyi komut satırı bağımsız değişkeni olarak almak isteyip istemediğinizi seçebilirsiniz (örneğin, programınız 2/5)" ... Ne?
feersum

Yanıtlar:


2

CJam, 126 bayt

"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 bayt

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

İlkinin konumuna göre basit bir arama tablosu #.

Expanded:

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!":"")

"" ve "-" aynı operatör önceliğine sahiptir, bu nedenle "2014- $ b" etrafında parantez gerekir.
nutki


@nutki Aah, bunu zaten düzelttiğimi sanıyordum.
KSFT

2

Perl 5: 137143

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

Önceki yaklaşım:

#!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!"

Standart girdi takvimi (sadece ilk satır elbette önemlidir)

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

2

C # 235

minified:

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

Ungolfed

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

Dil çok ayrıntılı :)


1
Sınıfınız ve Main'in herkese açık olması gerekmez. Ayrıca, kolayca yeniden adlandırabilirsiniz Programiçin P. Bu size bazı karakterler kazandırmalı :)
ProgramFOX

20 karakter gerçekten, teşekkürler :)
Manuel Schweigert

1
Nasıl yhesaplanacağını değiştirerek birkaç karakter kaydedebilirsiniz , bir dizeyi dizine eklerseniz diziyi tanımlamak için gerekli sözdizimini kaydedebilirsiniz (yani var y = "1054382"[index]-48( 0ASCII 48'dir). daha fazla tasarruf yiçin zhesaplamaya da dahil edilebilir .
VisualMelon

2

C #, 384 , 363325 Bayt

C # Zaman, lütfen kurallardan birini kaçırırsam söyle.

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

Giriş

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

Çıktı

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

Giriş 2

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

Çıktı 2

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

Düzenleme: Güncellenmiş, bazı baytları kaldırmayı başardı


Çıktınızda noktalama işareti eksik.
Titus

2

Java, 243 bayt

Bu kapsamlı bir dildir :-)

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

Unminified

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 bayt

Henüz ES6 yazmaya alışkın değilim, bu yüzden herhangi bir ipucu takdir edilecektir:

Arama tablosu, 170 bayt

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!`}

Orijinal, 199 bayt

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!`}

Unminified

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 bayt

Orijinal versiyonumu da aşağıya ekledim

Arama dizisi, 182 bayt

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

Unminified

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

Orijinal, 212 bayt

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

Unminified

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 bayt

PHP yanıtımado-while benzer, ancak CoffeeScript'te döngüler veya kısa üçlü bir operatör yok:

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!'

Unminifed

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!'

Bir arama tablosu kullanılarak kısaltıldı:

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 bayt

Arama tablosu, 181 bayt

Kısa dizi sözdizimi nedeniyle, yalnızca PHP 5.4+ üzerinde çalışır:

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

Unminified

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

Orijinal, 215 bayt

PHP 5'in çoğu (hepsi değilse de) sürümleriyle çalışır:

<?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!";}

Unminified

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

Ruby, 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 bayt

kapanış etiketinin arkasındaki iki satır sonu PHP ilkini yoksayacak

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!

komut satırı bağımsız değişkeninden girdi alır;

dizgi değişmezinin dizine eklenmesi için PHP 5.6 (18 Aralık 2014'te yayınlanmıştır) veya daha yenisini gerektirir.


1

SmileBASIC, 159 bayt

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

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.