अंधविश्वासी प्रोग्रामिंग


19

आपकी चुनौती बेहद सरल है। एक वर्ष को इनपुट के रूप में देखते हुए, उस वर्ष के सभी महीनों को प्रिंट करें जिसमें ग्रेगोरियन कैलेंडर के अनुसार शुक्रवार 13 वां होगा । ध्यान दें कि भले ही ग्रेगोरियन कैलेंडर 1582 तक पेश नहीं किया गया था, सादगी के लिए हम यह दिखावा करेंगे कि यह 0001 ईस्वी से उपयोग में है।

नियम

  • पूर्ण कार्यक्रमों या कार्यों की अनुमति है।

  • आप इनपुट को तर्कों से, STDIN से, या कमांड लाइन तर्कों के रूप में ले सकते हैं।

  • आपको किसी भी तारीख और समय के निर्माण का उपयोग करने की अनुमति नहीं है।

  • आप सुरक्षित रूप से मान सकते हैं कि इनपुट एक वैध वर्ष होगा। यदि इनपुट 1 से छोटा है, तो मान्य पूर्णांक नहीं है, या आपकी भाषाओं के देशी नंबर प्रकार से बड़ा है, आपको इसे संभालने की आवश्यकता नहीं है, और आपको अपरिभाषित व्यवहार मिलता है।

  • आउटपुट संख्या, अंग्रेजी में, या किसी अन्य मानव पठनीय प्रारूप में हो सकता है, इसलिए जब तक आप मानक निर्दिष्ट करते हैं।

  • सुनिश्चित करें कि आप लीप-इयर्स के लिए खाते हैं। और याद रखें, लीप-ईयर्स हर 4 साल में नहीं होते हैं!

टिप्स

चूंकि इस बारे में जाने के लिए कई अलग-अलग तरीके हैं, इसलिए मैं आपको यह नहीं बताना चाहता कि यह कैसे करना है। हालांकि, यह भ्रमित हो सकता है कि कहां से शुरू करें, इसलिए यहां एक तारीख से सप्ताह के दिन का निर्धारण करने के कुछ अलग-अलग विश्वसनीय तरीके हैं।

नमूना IO

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

हमेशा की तरह, यह कोड-गोल्फ है, इसलिए मानक-कमियां लागू होती हैं, और सबसे छोटी उत्तर जीत होती है।


5
जब 13 वें शुक्रवार को चलाया जाता है, तो इसे रिवर्स और आउटपुट महीनों में होना चाहिए, जिसमें शुक्रवार 13 तारीख को नहीं होना चाहिए। (जीत के लिए अजीब शुक्रवार के संदर्भ)
एडिसन क्रम्प


क्या यह उदाहरण सही है 0001 --> 5:? के अनुसार यह पेज (और मेरी कोड) यह अप्रैल और जुलाई में होना चाहिए।
फ़ूबी

@faubiguy मेरा बुरा, तुम सही हो। वह जूलियन कैलेंडर पर था। मुझे वह ठीक करने दो।
DJMcMayhem

"आपको किसी भी तारीख या समय के निर्माण का उपयोग करने की अनुमति नहीं है", क्या यह है कि मैं यूनिक्स समय में भी परिवर्तित नहीं कर सकता हूं?
बसुक्सुआन

जवाबों:


1

पायथ, 73 बाइट्स

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

इसे ऑनलाइन आज़माएं!

मेरे पायथन उत्तर की तरह, गॉस-एल्गोरिथम का उपयोग करना। ~ कोड के 55 बाइट्स कार्यदिवस की गणना के लिए होते हैं, इसलिए एक बेहतर एल्गोरिदम को चुनने से मुझे यह बहुत कम लगता है कि मुझे लगता है ... लेकिन हे, कम से कम अब काम कर रहा है! :)


2

पायथन 2, 157 144 136 बाइट्स

मेरा समाधान गॉस-एल्गोरिथम का उपयोग करता है। इनपुट इंजीगर के रूप में वर्ष है। आउटपुट एक फ्राइडे 13 वें नंबर के साथ महीनों की सूची है (1-12)। संभवत: कुछ और गोल्फिंग संभव है, लेकिन इसकी देर हो रही है ... गोना ने इसे कल संपादित किया है और इसे थोड़ा और नीचे लाना है। इस बीच सुझावों का हमेशा स्वागत है!

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]

संपादित करें: फॉर-लूप को एक सूची समझ के साथ बदलकर इसे 144 तक नीचे लाया गया है, जो कुछ अन्य छोटे समायोजन को पूर्ववत कर रहा है।

edit2 : मॉर्गन थ्रैप के सुझावों के साथ इसे 136 तक नीचे पहुंचा दिया और उसके द्वारा खोजे गए बग को ठीक किया। आपका बहुत बहुत धन्यवाद! :)


1

पर्ल - 141 107 103 बाइट्स

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

यह 13 मार्च के सप्ताह के दिन की गणना करने के लिए जूलियन दिन के लिए सूत्र के एक संशोधित संस्करण का उपयोग करता है, फिर सप्ताह के दिनों की संख्या का उपयोग करता है जो जनवरी से ऑफसेट है बाकी के सप्ताह के दिन को खोजने के लिए। महीने, मार्च में शुरू होने वाले पिछले वर्ष के आखिरी 2 महीनों से शुरू होकर फिर चालू वर्ष के पहले 10 महीने (दो बार लीप वर्ष की गणना से बचने के लिए)।


1

सी - 164 153 153 बाइट्स

मुझे Schwerdtfeger की विधि के भारी संशोधित संस्करण का उपयोग करके एक अच्छा सा समाधान मिला। यह आधार तालिका 7 का उपयोग कर एक पूर्णांक में आवश्यक तालिका को एनकोड करता है, जिसे एक हस्ताक्षरित 32-बिट शब्द में फिट करने के लिए संशोधित किया गया है। यह महीने को ASCII के रूप में प्रदर्शित करता है, जनवरी के साथ एन्कोडेड के रूप में 1, फरवरी के रूप में 2और इतने पर, अक्टूबर के साथ एन्कोडेड के रूप में :, नवंबर के रूप में एन्कोडेड ;और दिसंबर के रूप में इनकोड किया गया<

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

यहाँ यह थोड़ा असंयमित है:

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

मुझे यकीन है कि इसे और भी छोटा बनाने के कुछ तरीके हैं, लेकिन मुझे लगता है कि एल्गोरिथ्म, या इसमें थोड़ी भिन्नता है, उन महीनों को खोजने के लिए लगभग आदर्श है जहां शुक्रवार 13 वां होता है (कोड आकार के संबंध में)। टिप्पणियाँ:

  1. यदि 64-बिट शब्द का उपयोग किया जा सकता था, तो कष्टप्रद जोड़ से छुटकारा पाना संभव होगा (+5 ) से ।
  2. चर mवास्तव में आवश्यक नहीं है, क्योंकि जिस महीने हम देख रहे हैं, वह उससे घटाया जा सकता है t

मैं अपने पुराने उत्तर को नीचे छोड़ता हूं, क्योंकि यह अन्य उत्तरों में नहीं देखा गया एक पूरी तरह से अलग विधि का उपयोग करता है।


यह संबंधित समस्या के समाधान पर आधारित है ( /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);}

यह मूल रूप से ग्रेगोरियन कैलेंडर का अनुकरण करता है, एक दिन में एक दिन आगे बढ़ते हुए, उस महीने को प्रिंट करता है जब यह शुक्रवार और 13 तारीख होता है। यहाँ यह थोड़ा अधिक पठनीय रूप में है:

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

प्रभावशाली सनकी लेकिन 123456789 में नहीं -> जनवरी, अक्टूबर अक्टूबर
RosLuP

हम्म, यह मेरे लिए करता है। मुझे कुछ मंच पर निर्भर कारण हो सकता है? यह मेरे लिए काफी आधुनिक मैकबुक प्रो पर काम करता है जब क्लैंग के साथ संकलन किया जाता है। ध्यान दें कि यह आउटपुट के 1:लिए 123456789, जहां :अक्टूबर को दर्शाता है। मैंने ऊपर एन्कोडिंग को स्पष्ट किया।
फोर्स

हाँ 1: यहाँ भी; मुझे समझ में नहीं आया ':' अक्टूबर के लिए था ...
RosLuP

0

एक्सेल, 137 बाइट्स

A1 में इनपुट वर्ष लेता है। आउटपुट हेक्सिडेसिमल की गैर-पृथक सूची है। (जनवरी = 0, दिसंबर = बी)

जनवरी और अगस्त के लिए गॉस के एल्गोरिदम का उपयोग करता है।

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

यह उत्तर वर्तमान में तारीख और समय के निर्माण का उपयोग करता है, जिसे स्पष्ट रूप से चुनौती में नियमों के खिलाफ बताया गया है।
फोर्स

@Fors, कि बाहर इशारा करने के लिए धन्यवाद। अपडेट किया गया।
Wernisch

0

सी, 276 219 बाइट्स

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

स्टडआउट में स्टड आउटपुट से इनपुट http://ideone.com/XtuhGj [डिबग फ़ंक्शन 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");
        }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.