কুসংস্কারমূলক প্রোগ্রামিং


19

আপনার চ্যালেঞ্জ অত্যন্ত সহজ। ইনপুট হিসাবে একটি বছর দেওয়া হয়েছে, সেই বছরের সমস্ত মাস মুদ্রণ করুন যা গ্রেগরিয়ান ক্যালেন্ডার অনুসারে 13 শে শুক্রবার অন্তর্ভুক্ত থাকবে । নোট করুন যে যদিও গ্রেগরিয়ান ক্যালেন্ডারটি ১৫৮২ অবধি চালু করা হয়নি, সরলতার জন্য আমরা ভান করব যে এটি 0001 খ্রিস্টাব্দ থেকে ব্যবহৃত হয়ে আসছে।

বিধি

  • সম্পূর্ণ প্রোগ্রাম বা ফাংশন অনুমোদিত।

  • আপনি এসটিডিইএন থেকে ফাংশন আর্গুমেন্ট হিসাবে বা কমান্ড লাইন আর্গুমেন্ট হিসাবে ইনপুট নিতে পারেন।

  • আপনাকে কোনও তারিখ এবং সময় অন্তর্নির্মিত ব্যবহার করার অনুমতি নেই।

  • আপনি নিরাপদে ধরে নিতে পারেন যে ইনপুটটি একটি বৈধ বছর হবে। যদি ইনপুটটি 1 টির চেয়ে কম হয়, কোনও বৈধ পূর্ণসংখ্যার নয় বা আপনার ভাষার নেটিভ সংখ্যা ধরণের চেয়ে বড় হয়, আপনাকে এটি হ্যান্ডেল করতে হবে না এবং আপনি অনির্ধারিত আচরণ পান।

  • আউটপুটটি ইংরেজিতে বা অন্য যে কোনও মানব পাঠযোগ্য বিন্যাসে সংখ্যার হতে পারে, যতক্ষণ আপনি স্ট্যান্ডার্ডটি নির্দিষ্ট করেন।

  • লিপ-বছরগুলির জন্য আপনার অ্যাকাউন্ট রয়েছে তা নিশ্চিত করুন। এবং মনে রাখবেন, লিপ-বছরগুলি প্রতি 4 বছরে ঘটে না!

পরামর্শ

যেহেতু এটি সম্পর্কে অনেকগুলি বিভিন্ন উপায় রয়েছে, তাই এটি কীভাবে করবেন তা আমি আপনাকে বলতে চাই না। তবে কোথা থেকে এটি শুরু করতে হবে তা বিভ্রান্তিকর হতে পারে, সুতরাং একটি তারিখ থেকে সপ্তাহের দিন নির্ধারণের কয়েকটি ভিন্ন নির্ভরযোগ্য উপায় ways

নমুনা IO

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

যথারীতি, এটি কোড-গল্ফ, সুতরাং স্ট্যান্ডার্ড-ফাঁকগুলি প্রয়োগ হয় এবং সংক্ষিপ্ত উত্তর জেতে।


5
13 তম শুক্রবার চলাকালীন, 13 তারিখের শুক্রবার নেই এমন বিপরীত ও আউটপুট মাসগুলি হওয়া উচিত। (জয়ের জন্য অদ্ভুত শুক্রবার রেফারেন্স)
অ্যাডিসন ক্রম্প


এই উদাহরণে ঠিক আছে: 0001 --> 5? এই পৃষ্ঠা অনুসারে (এবং আমার কোড) এটি এপ্রিল এবং জুলাই হওয়া উচিত।
ফৌবি

@ ফৌবিগুয়ে আমার খারাপ, আপনি ঠিক বলেছেন। এটি জুলিয়ান ক্যালেন্ডারে ছিল। আমাকে এটি ঠিক করতে দিন।
ডিজেএমসিএমহেম

"আপনাকে কোনও তারিখ বা সময় অন্তর্নির্মিত ব্যবহার করার অনুমতি নেই", আমি কি এটিই ইউনিক্স সময় রূপান্তর করতে পারি না?
বাসুকসুয়ান

উত্তর:


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) 1 সম্ভবত আরও কিছু গল্ফিং সম্ভব, তবে দেরি হচ্ছে ... আগামীকাল এটিকে সম্পাদনা করতে হবে এবং এটিকে আরও কিছুটা নামিয়ে আনতে হবে। ইতিমধ্যে পরামর্শ সর্বদা স্বাগতম!

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-এ নামিয়ে একটি তালিকা বোধগম্যতার সাথে ফর্ম-লুপের পরিবর্তে এবং অন্যান্য কিছু ছোট সামঞ্জস্য করে।

সম্পাদনা 2: মরগান থ্রাপের পরামর্শ সহ এটি 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

এটি ১৩ ই মার্চ সপ্তাহের দিন গণনা করার জন্য জুলিয়ান দিনের সূত্রের একটি পরিবর্তিত সংস্করণ ব্যবহার করে, তারপরে প্রতিটি মাসের সপ্তাহের সংখ্যা জানুয়ারী থেকে অফসেট ব্যবহার করে বাকি সপ্তাহের জন্য সপ্তাহটি খুঁজে বের করে মাসগুলি, মার্চের শুরুতে পূর্ববর্তী বছরের শেষ 2 মাসের সাথে শুরু করে বর্তমান বছরের প্রথম 10 মাস (দু'বার লিপ বছর গণনা এড়াতে)।


1

সি - 164 153 112 বাইট

শোয়ারডটফিজারের পদ্ধতির ভারী পরিবর্তিত সংস্করণ ব্যবহার করে আমি একটি দুর্দান্ত সামান্য সমাধান পেয়েছি। এটি 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++;
}

আমি নিশ্চিত যে এটিকে আরও ছোট করার কয়েকটি উপায় রয়েছে তবে আমি মনে করি যে অ্যালগোরিদম বা এর সামান্য প্রকরণটি ১৩ ই শুক্রবার (কোডের আকারের ক্ষেত্রে) ঘটে এমন মাসগুলি সন্ধান করার জন্য প্রায় আদর্শ। মন্তব্য:

  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 -> জানুয়ারী, অক্টোবর অক্টোবর
রোজলুপি

হুম, এটা আমার জন্য প্ল্যাটফর্ম নির্ভর কিছু কারণ হতে পারে? কলংয়ের সাথে সংকলন করার সময় এটি মোটামুটি আধুনিক ম্যাকবুক প্রোতে আমার জন্য কাজ করে। মনে রাখবেন যে আউটপুট 1:জন্য 123456789, যেখানে :অক্টোবর উল্লেখ করে। আমি উপরের এনকোডিংটি পরিষ্কার করে দিয়েছি।
Fors

হ্যাঁ 1: এখানেও; বুঝতে পারিনি ':' অক্টোবরের জন্য ছিল ...
RosLuP

0

এক্সেল, 137 বাইট

এ 1 এ ইনপুট বছর নেয়। আউটপুট হেক্সিডেসিমালের অ-বিচ্ছিন্ন তালিকা। (জানুয়ারী = ০, ডিসেম্বর = বি)

জানুয়ারী এবং আগস্টের জন্য গাউসের অ্যালগরিদম ব্যবহার করে।

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

এই উত্তরটি বর্তমানে তারিখ এবং সময় বিল্টিনগুলি ব্যবহার করে, যা চ্যালেঞ্জের বিধিগুলির বিরুদ্ধে স্পষ্টভাবে বলা আছে is
Fors

@ ফোরস, এটি উল্লেখ করার জন্য ধন্যবাদ। আপডেট করা হয়েছে।
ওয়ার্নিশ

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

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.