Batıl Programlama


19

Zorluğunuz son derece basit. Girdi olarak bir yıl verildiğinde, o yılki Gregoryen takvimine göre 13. cuma içeren tüm ayları yazdırın . Gregoryen Takvimi 1582'ye kadar tanıtılmasa da, basitlik uğruna, MS 0001'den beri kullanımda olduğunu iddia edeceğiz.

kurallar

  • Tam programlara veya işlevlere izin verilir.

  • Girdiyi işlev bağımsız değişkenleri, STDIN'den veya komut satırı bağımsız değişkenleri olarak alabilirsiniz.

  • Tarih ve saat yerleşiklerini kullanma izniniz yok.

  • Girdinin geçerli bir yıl olacağını güvenle kabul edebilirsiniz. Giriş 1'den küçükse, geçerli bir tamsayı değilse veya dillerinizin yerel sayı türünden daha büyükse, bunu işlemeniz gerekmez ve tanımlanmamış davranış elde edersiniz.

  • Çıktı, standardı belirttiğiniz sürece, İngilizce veya başka bir insan tarafından okunabilir biçimde sayılar olabilir.

  • Artık yılları hesaba kattığınızdan emin olun. Ve unutmayın, artık yıllar her 4 yılda bir olmaz!

İpuçları

Bununla ilgili çok farklı yollar olduğundan, bunu nasıl yapacağınızı söylemek istemiyorum. Bununla birlikte, nereden başlayacağınız kafa karıştırıcı olabilir, bu yüzden haftanın gününü bir tarihten itibaren belirlemenin birkaç farklı güvenilir yolu.

Örnek ES

2016 --> May
0001 --> 4, 7
1997 --> Jun
1337 --> 09, 12
123456789 --> January, October

Her zamanki gibi, bu kod golf, bu yüzden standart boşluklar uygulanır ve en kısa cevap kazanır.


5
13. Cuma günü çalıştırıldığında, 13. Cuma günü olmayan ayları tersine çevirmeli ve çıktı almalıdır. (Kazanmak için Freaky Friday referansları)
Addison Crump


Bu örnek doğru 0001 --> 5mu? Göre bu sayfayı (ve benim kod) o nisan ve temmuz olmalıdır.
Faubi

@faubiguy benim hatam, haklısın. Julian Takvimi'ndeydi. Bunu düzeltmeme izin ver.
DJMcMayhem

"Herhangi bir tarih veya saat yerleşimini kullanma izniniz yok" ile, ben de unix zaman dönüştürmek değil mi?
busukxuan

Yanıtlar:


1

Pyth, 73 Bayt

L?>b2QtQfq%+++13+/-*2.6?qT2 12%-T2 12 .2 1*5%yT4*4%yT100*6%yT400 7 5r1 13

Çevrimiçi deneyin!

Python cevabımda olduğu gibi Gauss-Algoritmasını kullanmak. ~ 55 bayt kod hafta içi hesaplama içindir, bu yüzden daha iyi bir algoritma seçmek sanırım çok şey aşağı alabilir ... ama hey, en azından şimdi çalışıyor! :)


2

Python 2, 157 144 136 Bayt

Benim çözümüm Gauss-Algoritmasını kullanıyor. Girdi, Tamsayı olarak yıl. Çıktı, cuma günleri sayı olarak (1-12) olan ayların listesidir. Muhtemelen biraz daha golf oynamak mümkün, ama geç kalıyor ... Bunu yarın düzenleyecek ve biraz daha aşağı indireceğim. Öneriler bu arada her zaman bekleriz!

def f(i):y=lambda m:(i-1,i)[m>2];print[m for m in range(1,13)if(13+int(2.6*((m-2)%12,12)[m==2]-.2)+y(m)%4*5+y(m)%100*4+y(m)%400*6)%7==5]

edit: for-loop bir liste kavrama ve diğer bazı küçük ayarlamalar yaparak değiştirerek 144 var.

edit2: Morgan Thrapp'ın önerileri ile 136'ya kadar golf yaptı ve keşfettiği hatayı düzeltti. Çok teşekkürler! :)


1

Perl - 141 107 103 bayt

$y=<>-1;map{$y++if++$i==3;print"$i "if($y+int($y/4)-int($y/100)+int($y/400))%7==$_}'634163152042'=~/./g

Bu, 13 Mart haftasının gününü hesaplamak için Julian günü için formülün değiştirilmiş bir sürümünü kullanır, daha sonra her ayın haftanın günlerini Ocak ayının geri kalanında bulmak için Ocak ayından itibaren dengelenir. bir önceki yılın son 2 ayından başlayarak Mart ayında başlayıp o zamanki yılın ilk 10 ayı (artık yılların iki kez hesaplanmasını önlemek için).


1

C - 164 153 112 bayt

Schwerdtfeger'in yönteminin yoğun şekilde değiştirilmiş bir sürümünü kullanarak hoş bir küçük çözüm buldum. İşaretli bir 32 bit sözcüğe sığacak şekilde değiştirilmiş taban 7'yi kullanarak gerekli tabloyu bir tamsayıda kodlar. Ayı ASCII karakteri olarak verir; Ocak 1, Şubat olarak 2kodlanır ve Ekim :, Kasım olarak kodlanır ;ve Aralık, Aralık olarak kodlanır <.

t=1496603958,m;main(y){for(scanf("%d",&y),y--;(y%100+y%100/4+y/100%4*5+t+5)%7||putchar(m+49),t;t/=7)2-++m||y++;}

Burada hafifçe soluksuz:

t=1496603958,m;
main(y){
  for(
    scanf("%d",&y),y--;
    (y%100+y%100/4+y/100%4*5+t+5)%7||putchar(m+49),t;
    t/=7
  )
    2-++m||y++;
}

Daha da küçük yapmanın birkaç yolu olduğundan eminim, ancak algoritmanın veya bunun küçük bir varyasyonunun, 13. kodun oluştuğu ayları bulmak için neredeyse ideal olduğunu düşünüyorum (kod boyutuna göre). Notlar:

  1. 64-bit bir kelime kullanılmış olsaydı can sıkıcı bir eklemeden kurtulmak mümkün olurdu ( +5).
  2. Değişken maslında gerekli değildir, çünkü baktığımız ay çıkarılabilir t.

Eski cevabımı aşağıda bırakıyorum, burada diğer cevaplarda görülmeyen tamamen farklı bir yöntem kullandığını görüyorum.


Bu, ilgili bir sorunun çözümüne dayanır ( /codegolf//a/22531/7682 ).

Y,M,D,d;main(y){for(scanf("%d",&y);Y<=y;++D>28+(M^2?M+(M>7)&1^2:!(Y&3)&&(Y%25||!(Y&15)))&&(D=1,M=M%12+1)<2&&Y++)(d=++d%7)^1||D^13||y^Y||printf("%d,",M);}

Temel olarak Gregoryen takvimini simüle eder, her seferinde bir gün ilerler, bir cuma ve 13. ay olan ayları basar. Burada biraz daha okunabilir bir formda:

Y,M,D,d;
main(y){
  for(
    scanf("%d",&y);
    Y<=y;
    ++D>28+(
      M^2
        ?M+(M>7)&1^2
        :!(Y&3)&&(Y%25||!(Y&15))
    )&&(
      D=1,
      M=M%12+1
    )<2&&Y++
  )
    (d=++d%7)^1||D^13||y^Y||
      printf("%d,",M);
}

etkileyici ecc ancak 123456789'da bulunamadı -> Ocak, Ekim ekim
RosLuP

Hmm, benim için öyle. Platforma bağlı bir neden olabilir mi? Clang ile derlerken oldukça modern bir Macbook Pro'da benim için çalışıyor. Bu çıktılar Not 1:için 123456789, :Ekim belirtmektedir. Yukarıdaki kodlamayı açıkladım.
Fors

Evet 1: burada da; ':' Ekim
ayıydı

0

Excel, 137 bayt

A1'de girdi yılını alır. Çıktı, Hexidecimal'in ayrılmamış listesidir. (Ocak = 0, Aralık = B)

Gauss'un Algoritmasını Ocak ve Ağustos için kullanır.

=CHOOSE(MOD(6+5*MOD(A1-1,4)+4*MOD(A1-1,400),7)+1,"","",1,"","",0,"")&CHOOSE(MOD(5*MOD(A1-1,4)+4*MOD(A1-1,400),7)+1,9,35,"8B",5,"2A",7,4)

Bu cevap şu anda meydan okumadaki kurallara aykırı olarak belirtilen tarih ve saat yapılarını kullanmaktadır.
Fors

@Fors, Bunu belirttiğin için teşekkürler. Güncellenmiş.
Wernisch

0

C, 276199 bayt

#define R return
#define L(i) for(;i-->0;) 
u(y,m){R m-1?30+((2773>>m)&1):28+(y%4==0&&y%100||y%400==0);}s(y,m,g){g+=4;L(m)g+=u(y,m),g%=7;L(y)g+=1+u(y,1),g%=7;R g;}z(y,m,r){m=12;L(m)s(y,m,13)-4||(r|=1<<(m+1));R r;}

stdout'taki stdin çıkışından giriş http://ideone.com/XtuhGj [hata ayıklama işlevi z]

w(y,m,r){m=12;L(m)s(y,m,u(y,m))||(r|=1<<(m+1));R r;}
/*    
// ritorna il numero dei giorni di anno=y mese=m con mese in 0..11
// m==1 significa febbraio   y%4?0:y%100?1:!(y%400) non funziona
u(y,m){R m-1?30+((2773>>m)&1):28+(y%4==0&&y%100||y%400==0);}

// argomenti anno:y[0..0xFFFFFFF]  mese:m[0..11]  giorno:g[1..u(y,m)]
// ritorna il numero del giorno[0..6]
s(y,m,g)
{g+=4; // correzione per il giorno di partenza anno mese giorno = 0,1,1
 L(m)g+=  u(y,m),g%=7; // m:0..m-1  somma mod 7 i giorni del mese dell'anno y
 L(y)g+=1+u(y,1),g%=7; // y:0..y-1  somma mod 7 gli anni da 0..y-1
                       // g+=1+u(y,1) poiche' (365-28)%7=1 e 1 e' febbraio
 R g;
}

// argomenti anno:y[0..0xFFFFFFF], m=0 r=0 
// calcola tutti gli ultimi giorni del mese dell'anno y che cadono di lunedi'
// e mette tali mesi come bit, dal bit 1 al bit 12 [il bit 0 sempre 0] in r
w(y,m,r){m=12;L(m)s(y,m,u(y,m))||(r|=1<<(m+1));R r;}

// argomenti anno:y[0..0xFFFFFFF], m=0 r=0 
//ritorna in r il numero dei mesi che ha giorno 13 di venerdi[==4]
// e mette tali mesi come bit, dal bit 1 al bit 12 [il bit 0 sempre 0] in r
z(y,m,r){m=12;L(m)s(y,m,13)-4||(r|=1<<(m+1));R r;}
*/

#define P printf
#define W while 
#define M main 
#define F for
#define U unsigned
#define N int
#define B break
#define I if
#define J(a,b)  if(a)goto b
#define G goto
#define P printf
#define D double
#define C unsigned char
#define A getchar()
#define O putchar
#define Y malloc
#define Z free
#define S sizeof
#define T struct
#define E else
#define Q static
#define X continue
M()
{N y,m,g,r,arr[]={1,297,1776,2000,2016,3385}, arr1[]={2016,1,1997,1337,123456789};
 C*mese[]={"gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"};
 C*giorno[]={"Lun","Mar","Mer","Gio","Ven","Sab","Dom"};
 P("Inserisci Anno mese giorno>");r=scanf("%d %d %d", &y, &m, &g);
 P("Inseriti> %d %d %d r=%d\n", y, m, g, r);
 I(r!=3||m>12||m<=0||g>u(y,m-1))R 0;
 r=s(y,m-1,g);// 12-> 11 -> 0..10
 P("Risultato=%d giorno=%s\n", r, giorno[r]);
 r=w(y,0,0);P(" r=%d ", r);P("\n");
 F(m=0;m<6;++m)
        {P("N anno=%d -->",arr[m]); 
         r=w(arr[m],0,0); // ritorna in r i mesi tramite i suoi bit...
         F(y=1;y<13;++y) I(r&(1<<y))P("%s ",mese[y-1]);
         P("\n");
        }
 F(m=0;m<4;++m)
        {P("N anno=%d -->",arr1[m]); 
         r=z(arr1[m],0,0); // ritorna in r i mesi tramite i suoi bit...
         F(y=1;y<13;++y) I(r&(1<<y))P("%s ",mese[y-1]);
         P("\n");
        }

}
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.