আমার দুধের মেয়াদ শেষ হয়ে গেছে?


98

ওহ, মানুষ, এই মেয়াদ শেষ হওয়ার তারিখটি চিঠিপত্র সহ কয়েক মাস লিখবে না! এটি 10 ​​ই মার্চ বা 3 শে অক্টোবর শেষ হচ্ছে কিনা তা আমি বলতে পারব না ... অপেক্ষা করুন, না, কিছু মনে করবেন না, বছরটি ২০১২ বলে। (অ্যালি-ওফস পাত্রে অর্ধ-ব্যবহৃত ইট কোনও প্রকার পছন্দ করতে পারে)

সুতরাং আসুন এক মুহুর্তের জন্য ধরুন যে আপনি যখন মারিনার এই জারটির মেয়াদ শেষ হওয়ার কথা রয়েছে তখন যুক্তি খুঁজে বের করতে খুব ব্যস্ত হয়ে পড়ুন। আপনি কেবল ক্লিফ নোট সংস্করণটি চান: এটি সম্ভবত হয়ে যাওয়ার সম্ভাবনা কতটা? আসুন কিছু কোড লিখি!

আপনি জানেন যে নির্মাতারা তিনটি বিন্যাসের মধ্যে একটিতে আদেশকৃত ট্রিপল হিসাবে পূর্ণসংখ্যার তারিখটি মুদ্রণ করে:

YEAR  MONTH DAY
MONTH DAY   YEAR
DAY   MONTH YEAR

এবং আপনি জানেন যে কিছু তারিখ কেবল একটি বা দুটি উপায়ে ব্যাখ্যা করা যেতে পারে, তিনটিই নয়: 55-11-5ত্রিংকিসের এই বিশেষ বাক্সটির অর্থ 55 নম্বরের একটি বছর হতে হবে, নভেম্বর 5, 1955-এ মেয়াদ শেষ হয়েছিল। বছরটি কখনও কখনও চার অঙ্কে দেওয়া হয় এবং দুটি নয়, যা কিছু বিকল্পকে বাতিল করতে পারে। এটি যখন দুটি অঙ্ক, যদিও, 50..99 অর্থ 1950..1999 এবং 0..49 অর্থ 2000..2049।

আপনার কাজটি এমন একটি প্রোগ্রাম বা ফাংশন লিখতে হবে যা একটি পূর্ণসংখ্যার অ্যারে নেয় যা উপরোক্ত ব্যাখ্যার অন্তত একটিতে বৈধ তারিখ এবং এটি এখনও ভাল হওয়ার শতভাগ সুযোগকে সরিয়ে দেয়। শতকরা সুযোগটি কেবল আজকের তারিখের চেয়ে বা তার পরে যে তারিখের বৈধ ব্যাখ্যার শতাংশ ।

পূর্ণসংখ্যার অ্যারেটি আপনার ভাষার [Int]দৈর্ঘ্যের ধরণের তিনটি হবে যদি এটি কোনও ফাংশনের পক্ষে যুক্তিযুক্ত হয় এবং ড্যাশ-, স্ল্যাশ- বা স্থান দ্বারা পৃথক করা হয় (আপনি চয়ন করতে পারেন) যদি STDIN এ ইনপুট হিসাবে ব্যবহৃত হয় তবে পুরো প্রোগ্রাম। *

"আজকের তারিখ" আজকের আসল তারিখ হতে পারে, যেমন কোনও তারিখ ফাংশনের মাধ্যমে প্রাপ্ত হয়, বা এসটিডিআইএন-এ অতিরিক্ত প্যারামিটারে কাজ করার জন্য অতিরিক্ত যুক্তিতে প্রদত্ত তারিখ। এটি ইউনিক্স যুগের সেকেন্ডে হতে পারে, উপরের তিনটি উপায়ের মধ্যে একটি বা আরও একটি সুবিধাজনক ফ্যাশনে আরও একটি বছর-মাস-দিনের ট্রিপল প্রবেশ করেছে।

আসুন কিছু উদাহরণ আছে! মেয়াদ শেষ হওয়ার তারিখ ইনপুট ড্যাশ-বিচ্ছিন্ন শৈলীতে থাকবে এবং নীচের উদাহরণগুলির জন্য ধরে নিই যে আজকের তারিখটি July ই জুলাই, ২০০ 2006।

  • 14-12-14- এটির (ডিএমওয়াই এবং ওয়াইএমডি) উভয় বৈধ ব্যাখ্যাই সমান, 14 ডিসেম্বর, 2014. আউটপুট 100 কারণ এই পণ্যটি এখনও অবশ্যই ভাল।
  • 8-2-2006- শেষ সংখ্যাটি অবশ্যই এক বছর, যেহেতু এর চারটি সংখ্যা রয়েছে। এটি 8 ই ফেব্রুয়ারী (মেয়াদোত্তীর্ণ) অথবা 2 শে আগস্ট (এখনও ভাল) হতে পারে। আউটপুট 50
  • 6-7-5- এটা কিছু হতে পারে! "5 জুলাই, 2006" ব্যাখ্যাটি এখনও ভাল (কেবলমাত্র এক দিনের জন্য), তবে বাকী দুটোই ২০০৫ সালে এবং যত তাড়াতাড়ি সম্ভব টস করা উচিত। আউটপুট 33
  • 6-5-7- এখানে, তিনটির মধ্যে দুটি ব্যাখ্যা নিরাপদ। আপনি আপনার দশমিক উপরে বা নীচে গোল করতে পারেন, সুতরাং 66 বা 67 উভয়ই ঠিক আছে।
  • 12-31-99- ঠিক আছে, এই একটি শতাব্দীর শুরু থেকেই নির্বিঘ্নে (50 থেকে 99 বছর 19XX, এবং 31 সম্ভবত একটি মাস হতে পারে না)। একটি বড় ফ্যাট 0 , এবং আপনার প্রকৃতপক্ষে আরও বেশি বার আপনার ফ্রিজ পরিষ্কার করা উচিত।

আপনি নিরাপদে ধরে নিতে পারেন যে উপরের মানগুলি পূরণ করে না এমন কোনও ইনপুট উপরের আউটপুট নিয়মগুলিতে গোপনীয় নয়।

কোনও ওয়েব অনুরোধ বা মানক লুফোল নেই। তারিখ পরিচালনার লাইব্রেরি অনুমোদিত। এটি কোড গল্ফ: সংক্ষিপ্ততম প্রোগ্রামের জয় হোক।

* আপনি যদি ব্রেইনফাক বা কিছু অনুরূপ ডেটাটাইপ-প্রতিবন্ধী ভাষা ব্যবহার করছেন তবে আপনি ইনপুটতে প্রথম তিনটি অক্ষরের ASCII মান ধরে নিতে পারেন যে তারিখের পূর্ণসংখ্যা। এটি অবশ্যই চার-অঙ্কের বছরের যুক্তি বাদ দেয় না, তবে আমি মনে করি ব্রেইনফাকের কোনও সমাধান না দেখে এটির জন্য আপনাকে সামান্য বলার জন্য আমরা খুব অবাক হয়ে যাব।


39
উম্ম ... বর্তমান বছর ২০০ 2006 নয়, ২০০. Your আপনার দুধের সমাপ্তি শেষ হওয়ার আট বছর আগের।
জন ডিভোরাক

11
@ জনডভোরাক আমি সার্থক উদাহরণগুলি তৈরির জন্য খুব চেষ্টা করতে চাইনি, তাই আজকের তারিখটিকে আরও সহজ করার জন্য আমি টুইট করেছি।
অ্যালগরিদমশর্ক

7
@ ডিজিরিএন care care এর যত্ন নেই, আমি এখনও সেগুলি খাব: ডি
অ্যাডিটসু

6
অস্ট্রেলিয়ায়, দুধ তারিখ অনুসারে ব্যবহারের এক সপ্তাহ পূর্বে মেয়াদ শেষ হয়ে যায়
gnibbler

5
আপনার এটিতে একটি 00 সহ একটি পরীক্ষা যুক্ত করা উচিত, যেহেতু এটি কোনও আইনী দিন বা মাস হতে পারে না।
এমটনভিউমার্ক

উত্তর:


5

কে 4 (90) (88) (87) (82)

{100*(+/~d<x)%3-+/^d:{"D"$"."/:$|z,y,x+(x<100)*100*19+x<50}.'y@/:3 3#.:'$21020101}

সঙ্গে ডাকা xএর .z.Dআজ তুলনা, বা তারিখ আপনার পছন্দের আক্ষরিক অন্যথায় জন্য (ক builtin):

  f:{100*(+/~d<x)%3-+/^d:{"D"$"."/:$|z,y,x+(x<100)*100*19+x<50}.'y@/:3 3#.:'$21020101}
  .z.D f'(14 12 14;8 2 2006;6 7 5;6 5 7;12 31 99)
100 0 0 0 0f
  2006.07.05 f'(14 12 14;8 2 2006;6 7 5;6 5 7;12 31 99)
100 50 33.33333 66.66667 0

এটি মূলত @ অ্যালেক্স-এল এর পাইথন সমাধানের একটি বন্দর যা কয়েকটি বিবিধ গল্ফিং ট্রিকস যুক্ত করেছে:

  • পুনরূদ্ধার নির্দেশাবলী কয়েকটি অক্ষর সংরক্ষণ করতে একটি স্ট্রিং এ এনকোড করা হয়েছে।
  • শর্তসাপেক্ষ যুক্তি (আব) সত্য-হিসাবে-পূর্ণসংখ্যা ব্যবহার করে (তবে পাইথন দ্রবণ থেকে পৃথক উপায়ে)।
  • বৈধতা পরীক্ষাটি কিছুটা পৃথক - কে 4 / কিউ সুখের সাথে কোনও স্ট্যাটাকে কোনও ডেটাটাইপে পার্স করবে; এটি যদি তা বুঝতে না পারে তবে এটি কেবল একটি নাল ফেরায়। সুতরাং, আমি অভ্যন্তরীণ ফাংশন থেকে তারিখগুলির একটি তালিকা ফিরিয়ে দেব, যা বাতিল বা নাও হতে পারে।
  • চূড়ান্ত ফলাফলটি সম্ভাব্য তারিখের ব্যাখ্যাগুলির মধ্যে কতগুলি শূন্য বনাম তুলনা করার তারিখের তুলনায় কত কম তা পরীক্ষা করে আসে; এখানে গুরুত্বপূর্ণ যে নাল তারিখটি অন্য কোনও তারিখের চেয়ে কম বিবেচিত হয়।

1
আপনি সর্বশেষ 0 থেকে মুছে ফেলা একটি চর সংরক্ষণ করতে পারেন "012201210", যেহেতু #এর আইটেমগুলি চক্রাকারে নেওয়া হয়। আসলে, আপনি একটি দ্বিতীয় গৃহস্থালির কাজ শেষ দুটি মামলা সোয়াপিং দ্বারা এই ভাবে সংরক্ষণ করতে পারেন: 3 3#.:'"0122102"
অ্যালগরিদমশর্ক

অভ্যন্তরীণ ফানকের আরগগুলি বিপরীত করে পেরেনগুলি সংরক্ষণ করে (তবে বিপরীত সংযোজন করে) আরও একটি চাঁচা শেভ করা হয়েছে। কেউ কি আমাকে আরও দুটি চর বাঁচাতে সহায়তা করতে পারে? এপিএল আমাকে মারছে!
অ্যারন ডেভিস

শেষে গণিতটি পুনরায় লিখে আরও পাঁচটি শেভ করলেন। পিছনে নেতৃত্বে!
অ্যারন ডেভিস

এবং যদি আমি গম্ভীরভাবে অ কার্মিক কোড লেখা আনত, আমি বিশ্ব নামস্থান দূষণ দ্বারা অন্য বাইট শেভ করতে পারেন: {c*(+/~d<x)%3-+/^d:{"D"$"."/:$|z,y,x+(c*19+x<50)*x<c::100}.'y@/:3 3#.:'$21020101}
অ্যারন ডেভিস

14

রুবি, ১১ characters টি অক্ষর

f=->a,t{[a,a.rotate(~s=r=0),a.reverse].map{|x,*y|(t>Time.gm(x<100?x+2e3-100*x/=50:x,*y)||r+=100
s+=1)rescue p}
r/s}

এটি এমন একটি ফাংশন সংজ্ঞা দেয় fযা দুটি আর্গুমেন্ট গ্রহণ করে: ইনপুট সমেত একটি অ্যারে এবং "আজকের" তারিখ।

উদাহরণ:

f[[14,12,14], Time.new]
100
f[[8,2,2006], Time.new]
0
f[[8,2,2006], Time.new(2006, 7, 5)]
50
f[[6,7,5], Time.new(2006, 7, 5)]
33

12

পাইথন 2.7 - 172

আমি তারিখের বৈধতা এবং তুলনার জন্য ডেটটাইম মডিউলটি ব্যবহার করি। যদি dateইনপুটটির বাইরে কোনও বৈধ ডেটটাইম না তৈরি করতে পারে তবে তা উত্থাপন করে ValueError। এইভাবে sঅ-মেয়াদোত্তীর্ণ তারিখগুলির যোগফল এবং tবৈধ তারিখের মোট সংখ্যা। True == 1পাইথনে সংযোজন এবং সূচীকরণের উদ্দেশ্যে আমি এই সুযোগটি গ্রহণ করছি । আমি (1900,2000) পরিবর্তে 25 * (76,80) ব্যবহার করে একটি অক্ষর সংরক্ষণ করি।

নোট করুন দ্বিতীয় স্তরের ইন্ডেন্টেশনের লাইনগুলিতে 2 স্পেস নয়, একটি ট্যাব অক্ষর ব্যবহার করা হয়েছে।

def f(e,c,s=0,t=3):
 for Y,M,D in(0,1,2),(2,0,1),(2,1,0):
  y=e[Y]
  try:s+=date(y+25*[[76,80][y<50],0][y>99],e[M],e[D])>=c
  except:t-=1
 return 100*s/t

এটি পরীক্ষার শেষে যুক্ত করুন:

examples = [[14,12,14],[8,2,2006],[6,7,5],[6,5,7],[12,31,99]]
for e in examples:
 print f(e, date(2006,7,5))

10

পাওয়ারশেল, 183 173 168

[int](100*(($d=@(($a,$b,$c=$args[0]),($c,$a,$b),($c,$b,$a)|%{$_[0]+=1900*($_[0]-le99)+100*($_[0]-le49)
.{date($_-join'-')}2>$x}|sort -u))-ge(date)+'-1').Count/$d.Count)
  • int[]প্যারামিটারের মাধ্যমে ইনপুট যেমন , যেমন

    PS> ./milk.ps1 5,6,7
    
  • ত্রুটি বার্তাগুলি try/ এর মাধ্যমে নিঃশব্দ করা হয় catch, যতক্ষণ না আমি জানি যে স্ট্ডারারের আউটপুট অনুমোদিত কিনা।
  • +"-1"তারিখটি ব্যবহার করে, যা .AddDays(-1)বর্তমান তারিখটিকে এক দিনের মধ্যে স্থানান্তরিত করার জন্য ব্যাখ্যা করা হয়, যাতে আমরা গতকের সাথে (কেবল আজকের পরিবর্তে) তুলনা করতে পারি। এটি এই সমস্যার সমাধান করে যে আমরা সময় হিসাবে 0:00 এর সাথে একটি তারিখ পাই তবে আজকের সময়ের সাথে একটি তারিখের সাথে তুলনা করা দরকার।
  • এতক্ষণে ভারী lined
  • ব্যবহার ত্রুটি চুপ করিয়ে জন্য একটি নতুন কৌতুক বেশ একটু খাটো যে

6

আর, 269

আমি আশা করছিলাম এটি আর এ সহজ হবে, তবে একক-অঙ্কের বছরগুলি ছিল বেশ বড় কার্ভবল ball আমি মনে করি এটি এর চেয়ে আরও ভাল হতে পারে।

lubridateCRAN- র একটি প্যাকেজ, আপনার এটির সাথে ইনস্টল করার প্রয়োজন হতে পারে install.packages("lubridate")

require(lubridate)
f = function(d){
d=sapply(d,function(l)if(nchar(l)==1)sprintf("%02d",l)else l)
d=paste0(d,collapse="-")
t=ymd(Sys.Date())
s=na.omit(c(ymd(d),mdy(d),dmy(d)))
s=lapply(s,function(d){
if(year(d)>2049){year(d)=year(d)-100;d}
else d})
sum(s>t)/length(s)}

ব্যবহার: f(c(d1,d2,d3))যেখানে c(d1,d2,d3)পূর্ণসংখ্যার ভেক্টর।

যেমন f(c(6,10,14))ফেরৎ 0.3333333

lubridateপ্যাকেজ বিভিন্ন আদেশ তারিখ পার্স জন্য মোড়কের ফাংশন একটি সিরিজ আছে। আমি কোন ফর্ম্যাটগুলি বৈধ তারিখ উত্পাদন করে তা দেখতে, অবৈধগুলি ছুঁড়ে ফেলার জন্য এবং তারপরে কোনটি এখনও ঘটেনি তা দেখতে আমি এটি ব্যবহার করি।


6

গণিত, 163 153 164 বাইট

( সম্পাদনা করুন: 1950 - 2049 সীমার বাইরে স্থির তারিখ)

f=100.Count[#,x_/;x<1]/Length@#&[DateDifference[#,Date[]]&/@Cases[{If[#<100,Mod[#+50,100]+1950,#],##2}&@@@{{##},{#3,#2,#},{#3,#,#2}}&@@#,d_/;DateList@d~Take~3==d]]&

এটি এমন কোনও ফাংশন সংজ্ঞা দেয় যা আপনি পছন্দ করতে পারেন can

f[{6,7,5}]

বর্তমানে, শতাংশটি গোল হয় না (স্পষ্ট করার জন্য অপির অপেক্ষায়)।

এখানে সামান্য লম্বা ব্যাখ্যা যে কোনো ম্যাথামেটিকাল জ্ঞান বোধগম্য হতে হবে (নোট যে &সবকিছু এটা বাম একটি বেনামী ফাংশন যার পরামিতি হিসেবে উল্লেখ করা হয় তোলে #, #2, #3...):

{{##},{#3,#2,#},{#3,#,#2}}&

এটি একটি ফাংশন সংজ্ঞায়িত করে, যা 3 পরামিতিগুলিকে a,b,c3 তালিকায় রূপান্তর করে {{a,b,c},{c,b,a},{c,a,b}। নোটটি ##সমস্ত পরামিতিগুলির কেবল একটি ক্রম।

{{##},{#3,#2,#},{#3,#,#2}}&@@#

মেয়াদোত্তীর্ণের তারিখে প্রয়োগ করা হয় {y,m,d}, এটি তিনটি সম্ভাব্য ক্রমের প্রতিটিটির জন্য একটি তালিকা দেয় ।

{If[#<100,Mod[#+50,100]+1950,#],##2}&

এটি একটি বেনামে ফাংশন যা তিনটি পরামিতি নেয় a,b,cএবং তিনটির একটি তালিকা ফেরত দেয়, যেখানে প্রথমটি প্রদত্ত বিধি অনুসারে এক বছরে রূপান্তরিত হয়েছিল: 50এবং 99(মডুলোর 100) মধ্যে সংখ্যাগুলি 20 শতকের বছরে রূপান্তরিত হয়, 0এবং এর মধ্যে সংখ্যাগুলি 49( মডুলো 100) একবিংশ শতাব্দীর বছরে রূপান্তরিত হয়, অন্য সমস্তগুলি বামে রেখে যায়। এখানে, ##2প্যারামিটারগুলির একটি ক্রম দ্বিতীয়টি দিয়ে শুরু হয়, অর্থাৎ b,c

{If[#<100,Mod[#+50,100]+1950,#],##2}&@@@{{##},{#3,#2,#},{#3,#,#2}}&@@#

পূর্ববর্তী তিনটি ফলাফলের প্রত্যেকটিতে প্রয়োগ করা হয়েছে, এটি কেবল বছরের ফর্ম্যাটকে প্রমিত করে তোলে। canonicalDatesনিম্নলিখিত এক্সপ্রেশনটি সংক্ষিপ্ত করতে এটিকে ডাকি :

Cases[canonicalDates,d_/;DateList@d~Take~3==d]

এটি অবৈধ ব্যাখ্যাগুলি ছাঁটাই করে। বিভিন্ন তারিখের ফর্ম্যাটগুলির বাইরে DateList@dসম্পূর্ণ {y,m,d,h,m,s}উপস্থাপনা করে। এটি একই ক্রমে তালিকাগুলির ব্যাখ্যা করবে, তবে ক্যাচটি হ'ল আপনি এটিকে এমন কিছু পাস করতে পারবেন{8,2,2006} যা এটি বিবেচনা করবে 8 years + 2 months + 2006 days। সুতরাং আমরা পরীক্ষা করে দেখি যে প্রত্যাবর্তিত তালিকার প্রথম তিনটি উপাদান ইনপুটটির সাথে অভিন্ন (যা কেবলমাত্র মাস এবং দিন উপযুক্ত ব্যাপ্তির মধ্যে হলে ঘটতে পারে)।

নিম্নলিখিত লাইনগুলি সংক্ষিপ্ত করতে, আমি validDatesএখন থেকে সেই মত প্রকাশের ফলাফলটি উল্লেখ করব :

DateDifference[#,Date[]]&

অন্য একটি বেনামে ফাংশন যা একটি তারিখ নেয় এবং দিনের মধ্যে পার্থক্যটি আজকে দেয় (থেকে প্রাপ্ত Date[])।

DateDifference[#,Date[]]&/@validDates

বৈধ তারিখ ব্যাখ্যার উপর মানচিত্র।

100.Count[#,x_/;x<1]/Length@#&

তবুও অন্য একটি বেনাম ফাংশন যা একটি তালিকা দেওয়া ( #) দেয়, সেই তালিকায় অ-ধনাত্মক সংখ্যার শতাংশ প্রদান করে। .একটি গুণ কিন্তু দশমিক অঙ্ক, ফলে মূলদ সংখ্যার এড়াতে নয় (আপনি ভালো জিনিস পেতে চাই 100/3পরিবর্তে 33.333- আমি আসলে জানি না যে যদি একটা সমস্যা)।

100.Count[#,x_/;x<1]/Length@#&[DateDifference[#,Date[]]&/@validDates]

তারিখের পার্থক্যের তালিকায় প্রয়োগ করা, এটি আমাদের ব্যাখ্যাগুলির ভগ্নাংশ দেয় যা এখনও শেষ হয় নি।


আমার মনে হয় আপনি ভুলভাবে
বছরগুলিকে

@ ভেন্তোরো এটি সত্য। আমি ধারণা করেছিলাম যে আমরা কেবল ১৯৫০ - ২০৪৯ (এবং তাদের 1 বা 2 ডিজিট সংস্করণ) নিয়েই আলোচনা করছি, তবে চ্যালেঞ্জটি পুনরায় পড়ার সাথে এর উল্লেখ নেই।
মার্টিন ইন্ডার

@ ভেন্তোরো স্থির হয়ে গেছে (তবে আপনি ইতিমধ্যে যেভাবেই আমাকে মারতে পেরেছিলেন;))
মার্টিন এন্ডার

আমি দেখে অবাক হয়েছি যে আপনার গাণিতিকের একটি অ্যাকাউন্ট আছে তবে কোনও প্রশ্ন বা উত্তর পোস্ট করেন নি। কিছু কি পিছনে আছে?
মিঃ উইজার্ড

@ মিঃ উইজার্ড দুঃখিত, আপনাকে জবাব দিতে সম্পূর্ণ ভুলে গেছি। প্রশ্নগুলি: এখনও পর্যন্ত আমার যে সমস্ত সমস্যা ছিল তা গুগলিং / অন্যান্য এসই প্রশ্নের সাথে সমাধান করা যেতে পারে। উত্তর: আমি জানি না ... আমি আমি নিজেকে হিসেবে না অনুমান যে দক্ষ যখন এটি ম্যাথামেটিকাল লাভজনকভাবে ব্যবহার করে আসে ... আমি শুধুমাত্র এখানে সেখানে (এবং কোড গলফ) দ্রুত স্নিপেট জন্য এটি ব্যবহার। এছাড়াও, আমি অনুমান করি যে আমি কী উত্তর দিতে পারি তা দেখার জন্য আমাকে সক্রিয়ভাবে নতুন দেখতে হবে এবং আমার সমস্ত এসই সময় পিপিসিজির জন্য বরাদ্দ করা হয়েছে। ;) আপনি যদি আমাকে অন্যথায় বোঝাতে চান তবে চ্যাট করতে দ্বিধা বোধ করুন! :)
মার্টিন এন্ডার

4

জাভাস্ক্রিপ্ট (E6) 159 164 172

ইঙ্গিতগুলির জন্য এবং আমাকে আবার ভাবতে বাধ্য করার জন্য nderscore ধন্যবাদ সম্পাদনা করুন । পুনর্গঠিত ডি প্যারামিটারগুলি এড়ানো এবং কিছু অক্ষর কাটা।

এনডারস্কোর দ্বারা 2 টি কৌশল সম্পাদনা করুন , 2 টি ফাংশন 1 টিতে একত্রীকরণ করা হয়েছে Then এরপরে দুটি প্রথম বন্ধনী একত্রিত হয়ে কমা দ্বারা পৃথক হওয়া এক্সপ্রেশনকে সরাল। সিডনোটের কাছে পঠনযোগ্যতা: গোল না করা আরও 2 টি অক্ষর বাঁচাতে পারে (| 0)।

F=(a,t)=>t?100*(3-((i=F([y,m,d]=a))<t)-((j=F([m,d,y]=a))<t)-((k=F([d,m]=a))<t))/(3-!i-!j-!k)|0:(q=new Date(y<50?y+2e3:y,--m,d)).getMonth()==m&q.getDate()==d&&q

টেস্ট ফায়ারফক্স কনসোলে

;[[14,12,14],[8,2,2006],[6,7,5],[6,5,7],[12,31,99]]
.map(x=>x + ' ' + F(x, new Date(2006,6,5)))

আউটপুট:

["14,12,14 100", "8,2,2006 50", "6,7,5 33", "6,5,7 66", "12,31,99 0"]

Ungolfed

এনবি ডি ফাংশন প্রদত্ত বছর, মাস, দিন দিয়ে একটি তারিখ তৈরি করার চেষ্টা করে তবে তৈরি তারিখটি যদি নির্ধারিত না হয় তবে তা মিথ্যা দেয় (! = দিন বা মাস)

F=(d,t)=>
(
  D=(y,m,d)=>(
    q=new Date(y<50?y+2000:y, --m, d), // decr m as javascript (like java) counts months starting at 0
    q.getMonth() == m & q.getDate() == d && q
  ),
  [a,b,c] = d, 
  x=D(...d), // three ways of express the date ...
  y=D(c,a,b),
  z=D(c,b,a),
  100 * (3-(x<t)-(y<t)-(z<t)) / (3-!x-!y-!z) | 0  
)   

ডি পরিবর্তন করার জন্য @nderscore ঠিক আছে, অন্যটির জন্য সিনট্যাক্স ত্রুটি। তবে আরও
বেশিভাবে

রহস্যময়। আমি যখন মন্তব্যটিতে আটকালাম তখন অবশ্যই কিছু ঘটেছে। আপনার সর্বশেষতম অপ্টিমাইজেশানগুলি যদিও এটি অপ্রাসঙ্গিক করে
তোলে

1
এটিকে একটি পেস্টে রাখছি, কারণ আমি আর এসই এর মন্তব্যে বিশ্বাস করি না: (-3) pastie.org/private/6bemdweyndcaiseay70kia
nderscore

4

লিংকপ্যাডে সি # - 446 408 272 বাইট

তৃতীয় সম্পাদনা: ডেটটাইম.ডোডাই সঠিক নয়, ডেটটাইম.নাউ সঠিক নয় বলে উল্লেখ করার জন্য লে ক্যানার্ড ফোউকে ধন্যবাদ। দ্বিতীয় সম্পাদনা: এই চতুর সমাধানের জন্য ভিজ্যুয়ালমেলনকে ধন্যবাদ!

void g(int[]d){var p=".";int a=d[2],b=d[1],e=d[0],y=a+(a<100?a>49?1900:2000:0),q=0,s=0;DateTime c;Action<string>z=x=>{if(DateTime.TryParse(x,out c)){s++;if(c>=DateTime.Today)q+=100;}};z(e+p+b+p+y);z(b+p+e+p+y);z(a+p+b+p+(e<100?‌​e>49?1900+e:2000+e:e));(q/(s>0?s:1)).Dump();}

সম্পাদনা করুন: কোডটি সংক্ষিপ্ত করতে আমাকে সহায়তা করার জন্য পোডিলুস্কা এবং এডসি 65 ধন্যবাদ! আমি আরও লক্ষ্য করেছি যে বছরের ইনপুটটি 4 বাইট দীর্ঘ হলে আমার সমাধানটি সঠিক ছিল না, তাই আমি এই সমস্যার জন্য সমাধানটি অন্তর্ভুক্ত করেছি। এই সমাধানের জন্য স্কোর 408 বাইট।

যদিও আমি পূর্বের কোনও উত্তর মারছি না, তবুও আমি আমার সি # সমাধানটি ভাগ করে নিতে চাইছিলাম। কোন সহায়তা / পরামর্শ প্রশংসা করা হয়! ;)

void g(int[]d){var q=new List<DateTime>();var p=".";int s=0,a=d[2],b=d[1],e=d[0],y=0;var c=new DateTime();y=(a<100)?(a>49)?1900+a:2000+a:a;if(DateTime.TryParse(e+p+b+p+y,out c)){q.Add(c);s++;}if(DateTime.TryParse(b+p+e+p+y,out c)){q.Add(c);s++;}y=(e<100)?(e>49)?1900+e:2000+e:e;if(DateTime.TryParse(a+p+b+p+y,out c)){q.Add(c);s++;}q=q.Where(i=>i>=DateTime.Now).ToList();if(s==0){s=1;}(q.Count*100/s).Dump();}

ফর্ম্যাট এবং অবরুদ্ধ সংস্করণ:

void g(int[] d)
    {
        var q = new List<DateTime>();
        var p = ".";
        int s = 0, a = d[2],b = d[1],e = d[0], y=0;
        var c = new DateTime();
        y = (a < 100) ?((a > 49) ? 1900 + a : 2000 + a) : a;

        if (DateTime.TryParse(e + p + b + p + y, out c))
        {
            q.Add(c);
            s++;
        }
        if (DateTime.TryParse(b + p + e + p + y, out c))
        {
            q.Add(c);
            s++;
        }
        y = (e < 100) ? ((e > 49) ? 1900 + e : 2000 + e) : e;

        if (DateTime.TryParse(a + p + b + p + y, out c))
        {
            q.Add(c);
            s++;
        }
        q = q.Where(i => i >= DateTime.Now).ToList();
        if (s == 0)
        {
            s = 1;
        }
        (q.Count*100/s).Dump();
    }

আমি একটি সমাধান করার চেষ্টা করেছি যেখানে "ডেটটাইম.ট্রি পার্স"-পার্টটি এই দ্রষ্টব্য হিসাবে পুনরাবৃত্তি হয় নি, তবে এটি 21 বাইট বেশি ছিল।

"ডেটটাইম.ট্রি পার্স" পুনরাবৃত্তি না করে সমাধান: 467 বাইট

void g(int[]d){var q=new List<DateTime>();int s=0;int a=d[2];int b=d[1];int e=d[0];int y=0;if(a<100){if(a>49){y=1900+a;}else{y=2000+a;}}if(z(e,b,y,q)){s++;}if(z(b,e,y,q)){s++;}if(e<100){if(e>49){y=1900+e;}else{y=2000+e;}}if(z(a,b,y,q)){s++;}q=q.Where(i=>i>=DateTime.Now).ToList();if(s==0){s=1;}(q.Count*100/s).Dump();}bool z(int a,int b,int d,List<DateTime> q){var c=new DateTime();var p=".";if(DateTime.TryParse(a+p+b+p+d,out c)){q.Add(c);return true;}return false;}

অবরুদ্ধ সংস্করণ:

private void g(int[] d)
    {
        var q = new List<DateTime>();
        int s = 0;
        int a = d[2];
        int b = d[1];
        int e = d[0];
        int y = 0;
        if (a < 100)
        {
            if (a > 49)
            {
                y = 1900 + a;
            }
            else
            {
                y = 2000 + a;
            }
        }
        if (z(e, b, y, q))
        {
            s++;
        }
        if (z(b, e, y, q))
        {
            s++;
        }
        if (e < 100)
        {
            if (e > 49)
            {
                y = 1900 + e;
            }
            else
            {
                y = 2000 + e;
            }
        }
        if (z(a, b, y, q))
        {
            s++;
        }
        q = q.Where(i => i >= DateTime.Now).ToList();
        if (s == 0)
        {
            s = 1;
        }
        (q.Count*100/s).Dump();
    }

    private bool z(int a, int b, int d, List<DateTime> q)
    {
        var c = new DateTime();
        string p = ".";
        if (DateTime.TryParse(a + p + b + p + d, out c))
        {
            q.Add(c);
            return true;
        }
        return false;
    }

2
int s=0;int a=d[2];int b=d[1];int e=d[0];->int s=0,a=d[2],b=d[1],e=d[0];
পোডিলুস্কা

2
পরামর্শ: আপনি / অন্যটি পরিবর্তে যখন সম্ভব তখন টার্নারি (? :) ব্যবহার করুন
edc65

1
@ThomasW। আমি মনে করি না যেহেতু y এর 2 টি আলাদা মান রয়েছে, এক সময় এটি নির্ভর করে অন্য সময় এটি ই এর উপর নির্ভরশীল। যাই হোক ধন্যবাদ!
tsavinho

1
DateTime.TryParseকলগুলি অপসারণ করা আমার প্রথম প্রবৃত্তি ছিল, এটি একটি ল্যাম্বডা দিয়ে প্রতিস্থাপন করেছিল যা মানটিকে পুনরায় কুইতে ফেলে দেয়। 328chars পেতে আরও কিছু পদক্ষেপ ( পেস্টবিন ) সঞ্চালিত হয়েছে :void g(int[]d){var q=new List<DateTime>();var p=".";int a=d[2],b=d[1],e=d[0],y;DateTime c;y=(a<100)?(a>49)?1900+a:2000+a:a;Action<string>z=(x)=>{if(DateTime.TryParse(x,out c))q.Add(c);};z(e+p+b+p+y);z(b+p+e+p+y);y=(e<100)?(e>49)?1900+e:2000+e:e;z(a+p+b+p+y);(q.Where(i=>i>=DateTime.Now).Count()*100/(q.Any()?q.Count:1)).Dump();}
ভিজুয়ালমেলন

1
@ ভিজুয়ালমেলন বাহ, আপনি কোড-গল্ফিংয়ে সত্যিই ভাল! আমি দেখেছি Action<string>আগে, তাই আমি আপনার কাছ থেকে কিছু শিখতে পারে;) আমি 318 অক্ষর নিচে প্রতিস্থাপন করে আপনার উত্তর পেতে সক্ষম ছিল q.Where(i=>i>=DateTime.Now).Countসঙ্গে q.Count(i=>i>=DateTime.Now। আমি আশেপাশে বন্ধনীগুলি সরিয়েছি xযাতে আমি আরও 2 টি অক্ষর সংরক্ষণ করতে পারি!
tsavinho

3

হাস্কেল, 171 165 টি অক্ষর

l=length
r y|y<100=(y+50)`mod`100+1950|y>0=y
q d m y z|d<32&&m<13&&d*m>0=(r y,m,d):z|1<3=z
v(a,b,c)=q c b a$q b a c$q a b c[]
t%d=(l$filter(>t)(v d))*100`div`l(v d)

ফাংশনের নাম %। প্রকৃত বছরের সাথে ক্যানোনিকাল (y, m, d) ক্রমানুসারে টেস্টের তারিখ এবং তিনটি সংখ্যার মূল হিসাবে কার্টন স্ট্যাম্পের সাথে চালনা করুন:

λ: (2006,6,5)%(14,12,14)
100

λ: (2006,6,5)%(8,2,2006)
50

λ: (2006,6,5)%(6,7,5)
33

λ: (2006,6,5)%(6,5,7)
66

λ: (2006,6,5)%(12,31,99)
0

λ: (2006,6,5)%(0,1,7)
0

2

এরলং, 146

f([A,B,C]=U,N)->F=[T||T<-[{(Y+50)rem 100+1950,M,D}||[Y,M,D]<-[U,[C,A,B],[C,B,A]]],calendar:valid_date(T)],100*length([1||T<-F,T>=N])div length(F).

পরীক্ষার কাজটি হবে:

t() ->
    0 = f([12,31,99],{2006,6,5}),
    66 = f([6,5,7],{2006,6,5}),
    33 = f([6,7,5],{2006,6,5}),
    100 = f([14,12,14],{2006,6,5}),
    50 = f([8,2,2006],{2006,6,5}),
    100 = f([29,2,2],{2006,6,5}).

Ungolfed

f([A,B,C]=U,Today)->
    Perms = [U,[C,A,B],[C,B,A]],
    WithYears = [{(Y+50) rem 100+1950,M,D} || [Y,M,D] <- Perms],
    ValidDates = [T || T <- WithYears, calendar:valid_date(T)],
    100*length([1 || T <- ValidDates, T >= Today]) div length(ValidDates).

এই সমাধান তালিকা বোঝার উপর নির্ভর করে। এটি হাস্কেল সমাধান থেকে বছরের জন্য মডুলো ট্রিক ধার করে। এটি calendar:valid_date/1অসম্ভব তারিখগুলি পরিচালনা করতেও ব্যবহার করে কারণ একটি নির্দিষ্ট মাসে দিন সংখ্যা (যেমন "29-2-2" কেবল ওয়াইএমডি ফর্ম্যাটে থাকতে পারে)। এছাড়াও, আজকের দিনটি এরং এর date()ফর্ম্যাটে রয়েছে (একটি ওয়াইএমডি টিপল)।


2

এপিএল (85)

এটি ডায়ালগ এপিএল 14 এর নতুন কয়েকটি ফাংশন ব্যবহার করে তবে কোনও বাহ্যিক লাইব্রেরি নেই। পরিবর্তনের জন্য, এটি ট্রাইএপিএল-এ কাজ করে ।

{100×(+/÷⍴)⍺≤{(3/100)⊥⍵+(99≥⊃⍵)×3↑1900+100×50>⊃⍵}¨Z/⍨{∧/12 31≥1↓⍵}¨Z←(⊂⌽⍵),(⊂2⌽⍵),⊂⍵}

এটি এমন একটি ফাংশন যা 3-উপাদান অ্যারেটিকে তার ডান দিকের ( ) তর্ক হিসাবে এবং YYYYMMDDবিন্যাসের পূর্ণসংখ্যার হিসাবে তার বাম দিক ( ) যুক্তি হিসাবে পরীক্ষা করার তারিখ গ্রহণ করে। অর্থাৎ, তারিখটি 2014-07-09সংখ্যা হিসাবে উপস্থাপিত হয় 20140709

টেস্ট:

      20060705 {100×(+/÷⍴)⍺≤{(3/100)⊥⍵+(99≥⊃⍵)×3↑1900+100×50>⊃⍵}¨Z/⍨{∧/12 31≥1↓⍵}¨Z←(⊂⌽⍵),(⊂2⌽⍵),⊂⍵} 14 12 14
100
      20060705 {100×(+/÷⍴)⍺≤{(3/100)⊥⍵+(99≥⊃⍵)×3↑1900+100×50>⊃⍵}¨Z/⍨{∧/12 31≥1↓⍵}¨Z←(⊂⌽⍵),(⊂2⌽⍵),⊂⍵} 8 2 2006
50
      20060705 {100×(+/÷⍴)⍺≤{(3/100)⊥⍵+(99≥⊃⍵)×3↑1900+100×50>⊃⍵}¨Z/⍨{∧/12 31≥1↓⍵}¨Z←(⊂⌽⍵),(⊂2⌽⍵),⊂⍵} 6 7 5
33.3333
      20060705 {100×(+/÷⍴)⍺≤{(3/100)⊥⍵+(99≥⊃⍵)×3↑1900+100×50>⊃⍵}¨Z/⍨{∧/12 31≥1↓⍵}¨Z←(⊂⌽⍵),(⊂2⌽⍵),⊂⍵} 12 31 99
0

ব্যাখ্যা:

  • Z←(⊂⌽⍵),(⊂2⌽⍵),⊂⍵: প্রদত্ত তারিখটিকে উল্টিয়ে (⊂⌽⍵), 2 এ বামে ঘোরানো (⊂2⌽⍵), বা কিছুই না করে YMD ফর্ম্যাটে পরিণত করুন ⊂⍵। এর মধ্যে কমপক্ষে একটি এখন ওয়াইএমডি ফর্ম্যাটে যথাযথ তারিখ, সম্ভবত তারিখটি অস্পষ্ট থাকলে একের বেশি হতে পারে।
  • {∧/12 31≥1↓⍵}¨Z: পরীক্ষা যদি প্রতিটি তারিখ বৈধ হয়: বছর (প্রথম উপাদান) বাদ দেওয়া হয় এবং তারপরে মাসটি অবশ্যই 12 এর চেয়ে বেশি হবে না এবং দিনটি 31 এর চেয়ে বেশি হওয়া উচিত নয়।
  • Z/⍨: থেকে বৈধ তারিখগুলি ফিল্টার করুন Z
  • {... : প্রতিটি বৈধ তারিখের জন্য:
    • ⍵+(99≥⊃⍵)×3↑1900+100×50>⊃⍵: বছর যদি 99 এর চেয়ে বেশি না হয়, 1900 যোগ করুন, তবে বছরটি 50 এর চেয়ে কম হলে 100 যোগ করুন।
    • (3/100)⊥: এটি ডিকোড করুন যেন এটি বেস -100 সংখ্যার একটি সেট। (বছরটি 100 এরও বেশি, তবে এটি প্রথম উপাদান হিসাবে বিবেচ্য নয়)) এটি বাম আর্গুমেন্টের মতো একই ফরমেটে প্রতিটি বৈধ তারিখের জন্য একটি সংখ্যা দেয়।
  • ⍺≤: প্রতিটি তারিখের জন্য, দেখুন এটির চেয়ে ছোট নয় কিনা । এটি একটি বাইনারি ভেক্টর দেবে যেখানে 1 অর্থ OKএবং 0 টি অর্থ spoiled
  • 100×(+/÷⍴): বাইনারি ভেক্টরের যোগফলকে তার দৈর্ঘ্য দ্বারা ভাগ করুন এবং 100 দ্বারা গুণিত করুন।

7 টি বাইট সংরক্ষণ করুন (এবং কে কে একটি দুর্দান্ত ব্যবধানে পরাজিত করুন) {100×(+/÷⍴)⍺≤((3/100)⊥⊢+(99≥⊃)×3↑1900+100×50>⊃)¨Z/⍨{∧/12 31≥1↓⍵}¨Z←(⌽⍵)(2⌽⍵)⍵}
স্ট্র্যান্ডিং

0

জাভা: 349 টি অক্ষর (3 ডাব্লু / ও স্পেস)

int e(int[]n,Date t){int a=n[0],b=n[1],c=n[2];Date[]d=new Date[3];if(b<13&&c<32)d[0]=new Date((a<50?100:(a>100?-1900:0))+a,b-1,c);if(b<13&&a<32)d[1]=new Date((c<50?100:(c>100?-1900:0))+c,b-1,a);if(a<13&&b<32)d[2]=new Date((c<50?100:(c>100?-1900:0))+c,a-1,b);int v=0,g=0;for(int i=0;i<3;i++)if(d[i]!=null){if(!d[i].before(t))g++;v++;}return 100*g/v;}

এখানে একটি সামান্য শ্রেণি রয়েছে যা এটি পরীক্ষা করতে ব্যবহার করা যেতে পারে, এতে পদ্ধতির (কিছুটা) ডিফল্ট সংস্করণও রয়েছে:

import java.util.*;
class i{

   int e(int[]n,Date t){
      int a=n[0],b=n[1],c=n[2];
      Date[]d=new Date[3];
      if(b<13&&c<32)d[0]=new Date((a<50?100:(a>100?-1900:0))+a,b-1,c);
      if(b<13&&a<32)d[1]=new Date((c<50?100:(c>100?-1900:0))+c,b-1,a);
      if(a<13&&b<32)d[2]=new Date((c<50?100:(c>100?-1900:0))+c,a-1,b);
      int v=0,g=0;
      for(int i=0;i<3;i++)
         if(d[i]!=null){
            if(!d[i].before(t))
               g++;
            v++;
         }
      return 100*g/v;}

   public static void main(String[] args){
      int[]i=new int[3];
      for(int k=0;k<3;k++)
         i[k] = Integer.parseInt(args[k]);
      int j = new i().e(i,new Date());
      System.out.println(j+"%");
   }   
}

এটি কোড গল্ফের আমার প্রথম রাউন্ড এবং আমি মনে করি কেন আমি সাধারণত খুব বেশি জাভা গল্ফার দেখতে পাচ্ছি না তা বুঝতে পেরেছি।


1
আপনার একটি int[]যুক্তি হিসাবে গ্রহণ করা দরকার , তিনটি নয় int
জয়ে

ঠিক আছে, আমি এটা ঠিক করেছি।
শিল্ডজেনেটর

0

সি # 287 বাইট

namespace System{class E{static float a,o,l;void M(int[]i){int d=i[0],m=i[1],y=i[2],t;if(l<3)try{if(l==1){t=y;y=d;d=t;}if(l++==0){t=d;d=m;m=t;}if(y<100&&(y+=1900)<1950)y+=100;o+=new DateTime(y,m,d)>=DateTime.Today?1:0;a++;if(l<3)i[9]=9;}catch{M(i);throw;}Console.Write(o/a);}}}

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

সত্যিকারের প্রোগ্রাম নয়, কেবল একটি ফাংশন প্রয়োজন বলে এই বিষয়টি আপত্তিজনকভাবে ব্যবহার করা হচ্ছে। এছাড়াও, ফাংশনটি সর্বদা একটি ব্যতীত ব্যতিক্রম হয় in

Ungolfed

namespace System {
    class E {
        static float a, o, l;
        void M(int[] i) {
            int d = i[0], m = i[1], y = i[2], t;
            if (l < 3)
                try {
                    if (l == 1) { 
                        t = y; y = d; d = t; 
                    } 
                    if (l++ == 0) { 
                        t = d; d = m; m = t; 
                    } 
                    if (y < 100 && (y += 1900) < 1950)
                        y += 100; 
                    o += new DateTime(y, m, d) >= DateTime.Today ? 1 : 0; // # not expired
                    a++; // # valid dates
                    if (l < 3)
                        i[9] = 9; // throw new Exception()
                } 
                catch { 
                    M(i);
                    throw; // fail after the first Console.Write()
                } 
            Console.Write(o / a); 
        } 
    } 
}

0

গণিত , 118

M.buettner এর কোডটিকে একটি প্রাথমিক পয়েন্ট হিসাবে ব্যবহার করার সাথে আমার কয়েকটি উন্নতি হয়েছে:

⌊100Mean@UnitStep@Cases[DateDifference@{If[#<100,Mod[#+50,100]+1950,#],##2}&@@@{#,RotateRight@#,Reverse@#},_Integer]⌋&

গল্ফ হতে পারে তর্ক হিসাবে একটি তিন-আন্ত তালিকা গ্রহণ একটি ফাংশন।
অ্যালগরিদমশর্ক

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