চন্দ্র ফেজ গণনা করুন


10

ভূমিকা

TL; ড

এই চ্যালেঞ্জে আপনাকে একটি নির্দিষ্ট তারিখের জন্য চাঁদের পর্বটি গণনা করতে হবে।


এই চ্যালেঞ্জটি গেম সাইকো সোশ্যাল অডিওভিজুয়াল এক্সপেরিমেন্ট " সুপারব্রাদার্স: তরোয়াল ও স্বর্জন ইপি " দ্বারা অনুপ্রাণিত । এস ইন : এস অ্যান্ড এস ইপি অ্যাডভেঞ্চারের ফলাফলের জন্য চাঁদের পর্যায়গুলি গুরুত্বপূর্ণ কারণ কিছু ঘটনা কেবলমাত্র একটি নির্দিষ্ট সময়ে ঘটে।

সুপারব্রাদারদের থেকে স্ক্রিনশট: তরোয়াল ও স্বাদেরি ইপি

প্রশ্নটি হল: কোন চন্দ্র পর্বটি নির্দিষ্ট তারিখে উপস্থিত রয়েছে। প্রতিটি মূল পর্ব - অমাবস্যা থেকে প্রথম চতুর্থাংশ থেকে পূর্ণিমার থেকে তৃতীয় চতুর্থাংশ - প্রায় 7.38 দিন দীর্ঘ। পুরো চন্দ্র চক্রটি প্রায় 29.52 দিন। এই মানগুলির ভিত্তিতে গণনার বিভিন্ন পদ্ধতি বিদ্যমান। 1

ইনপুট

  • গ্রেগরিয়ান ক্যালেন্ডারের উপর ভিত্তি করে একটি তারিখ, 1 জানুয়ারী 1970 এবং 31 ডিসেম্বর 2116 এর মধ্যে।
  • আপনি নিম্নলিখিত ফরম্যাটের এক একটি নির্বাচন করুন: yyyy-mm-dd, dd.mm.yyyy, dd/mm/yyyy, yyyymmddবা ddmmyyyy

আউটপুট

[0-7]এই শূন্য-সূচকযুক্ত অ্যারের উপর ভিত্তি করে চান্দ্র পর্বের সূচি আউটপুট করুন :

['New moon', 'Waxing crescent', 'First quarter', 'Waxing gibbous', 'Full moon', 'Waning gibbous', 'Third quarter', 'Waning crescent`]

আবশ্যকতা

  • আপনি একটি প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন। আপনি যদি কোনও বেনামি ফাংশন নিয়ে যান তবে দয়া করে কীভাবে এটি চালাবেন তার একটি উদাহরণ অন্তর্ভুক্ত করুন।
  • STDINফাংশন প্যারামিটার হিসাবে বা নিকটতম সমতুল্য থেকে কমান্ড লাইন আর্গুমেন্ট থেকে ইনপুট গ্রহণ করা হয় ।
  • এটি তাই বাইট জিতে সংক্ষিপ্ত উত্তর।
  • অন্তর্নির্মিত বা বাহ্যিক গ্রন্থাগারগুলি যা চাঁদ পর্যায়ের গণনা করে তা অনুমোদিত নয়। 2
  • স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়।

টেস্ট

মানগুলি হ'ল: date | index of the phase | illumination | name

একটি পূর্ণ চন্দ্র চক্র:

08.02.2016 | 0 |   0% | New moon
07.02.2016 | 7 |   2% | Waning crescent
07.02.2016 | 7 |   2% | Waning crescent
06.02.2016 | 7 |   6% | Waning crescent
05.02.2016 | 7 |  12% | Waning crescent
04.02.2016 | 7 |  19% | Waning crescent
03.02.2016 | 7 |  28% | Waning crescent
02.02.2016 | 7 |  37% | Waning crescent
01.02.2016 | 6 |  47% | Third quarter
31.01.2016 | 5 |  56% | Waning gibbous
30.01.2016 | 5 |  65% | Waning gibbous
29.01.2016 | 5 |  74% | Waning gibbous
28.01.2016 | 5 |  82% | Waning gibbous
27.01.2016 | 5 |  89% | Waning gibbous
26.01.2016 | 5 |  94% | Waning gibbous
25.01.2016 | 5 |  98% | Waning gibbous
24.01.2016 | 4 | 100% | Full moon
23.01.2016 | 3 | 100% | Waxing gibbous
22.01.2016 | 3 |  97% | Waxing gibbous
21.01.2016 | 3 |  93% | Waxing gibbous
20.01.2016 | 3 |  86% | Waxing gibbous
19.01.2016 | 3 |  77% | Waxing gibbous
18.01.2016 | 3 |  67% | Waxing gibbous
17.01.2016 | 3 |  56% | Waxing gibbous
16.01.2016 | 2 |  45% | First quarter
15.01.2016 | 1 |  33% | Waxing crescent
14.01.2016 | 1 |  23% | Waxing crescent
13.01.2016 | 1 |  14% | Waxing crescent
12.01.2016 | 1 |   7% | Waxing crescent
11.01.2016 | 1 |   2% | Waxing crescent
10.01.2016 | 0 |   0% | New moon

এলোমেলো পরীক্ষার কেস:

14.12.2016 | 4 | 100% | Full moon
16.10.1983 | 3 |  75% | Waxing gibbous
04.07.1976 | 2 |  47% | First quarter
28.11.1970 | 0 |   0% | New moon

যেহেতু বেশিরভাগ পদ্ধতি বৈজ্ঞানিক স্তরের সাথে সঠিক নয় এবং আপনি বিভিন্ন ওয়েবসাইটে এই কয়েক দিনের জন্য মিশ্র ফলাফলও পান, যদি আপনার ফলাফলগুলি ± 1 দিনের মধ্যে থাকে তবে তা গ্রহণযোগ্য ।

বোনাস

আপনার বাইট গণনা হ্রাস করুন এবং প্রত্যাহার করুন :

  • 15% - পর্বের আসল নামটি এর সূচির পরিবর্তে আউটপুট বিভাগে তালিকাভুক্ত করুন।
  • 25% - খালি ইনপুটটিতে একটি সাদা জায়গা বা নিউলাইন দ্বারা পৃথক আসন্ন নতুন এবং পূর্ণিমার তারিখগুলি মুদ্রণ করুন।

1 উদাহরণস্বরূপ: উইকিপিডিয়ায় পর্যায় গণনা করা
2 দুঃখিত গণিত


আমার টাকাই জাপটে।
lirtosiast

প্রতিটি পর্ব কত দিন স্থায়ী হয়? আপনি আনুমানিক days দিন স্থায়ী চারটি প্রধান পর্যায়ক্রমে উল্লেখ করুন তবে এর সাথে মোকাবিলা করার জন্য 8 টি পর্যায় রয়েছে।
শার্লক 9

1
আমি প্রতিটি পর্যায়টি কত দীর্ঘ হওয়া উচিত তা বুঝতে আমাকে সাহায্য করার জন্য মনে করি, আপনি কি প্রায় একটানা পাঁচ দিনের একটি পরীক্ষার কেস পোস্ট করতে পারেন, তবে আপনার হিসাব অনুসারে "মোমের গিব্বস" থেকে "গিব্বাসকে নিখরচায়" করতে আরও বেশি সময় লাগতে পারে? সংজ্ঞাগুলির সাথে আমার সমস্যা হচ্ছে কারণ, উদাহরণস্বরূপ, চতুর্থাংশ চাঁদগুলি হ'ল 50% আলোকসজ্জার তাত্ক্ষণিক , সুতরাং "প্রথম চতুর্থাংশ" কেবল তার আগেই হওয়া উচিত , "ওয়েক্সিং ক্রিসেন্ট" এবং "ওপেন ক্রিসেন্ট" এর আগের দিনগুলিতে এবং পরে। কিন্তু আমি নিশ্চিত না.
শার্লক 9

ঠিক আছে, আমি আমার সমাধান শুরু করব। এই কিছু আপ সাফ করার জন্য ধন্যবাদ।
শার্লক 9

@ শার্লক 9 আমি একটি পূর্ণ চন্দ্রচক্র এবং প্রতিদিনের আলোকসজ্জা সহ কিছু এলোমেলো মান সহ পরীক্ষার কেসগুলি আপডেট করেছি। আশা করি এটি সহায়ক।
সন্নিবেশকারীর নাম এখানে

উত্তর:


3

পাইথন 2 3, 255 204 180 178 বাইট

পরীক্ষার কয়েকটি মামলার জন্য বেশ কয়েকটি জায়গায় এই উত্তর দু'একদিনের মধ্যেই সঠিক নয়, যদিও আমাকে বলা হয়েছিল যে কিছুটা অসম্পূর্ণতা গ্রহণযোগ্য। যে কোনও হারে, চাঁদের গতি কখনই খুব সঠিক হয় না এবং এই ফাংশনটি সাধারণত সঠিক থাকে (বা কমপক্ষে, এটি খুব বেশি আলাদা হয় না)।

সম্পাদনা করুন: আমার কোডটি সংশোধন করে এটিকে আরও নির্ভুল করে তোলার ক্ষেত্রে, আমি এটিকে যথেষ্ট গল্ফ করেছি।

সম্পাদনা করুন: এই কোডটি এখন এক-লাইনের পাইথন 3 প্রোগ্রাম। ( "ম্যাজিক নাম্বার" নামে টিমমিডকে ক্রেডিট )

p,q,r=(int(i)for i in input().split("-"));t=q<3;y=p-2000-t;i,j=divmod(((r+(153*(q+12*t-3)+2)//5+365*y+y//4-y//100+y//400+11010)*86400-74100)%2551443,637861);print((86400<=j)+2*i)

Ungolfed:

def jul(p,q,r):
    '''
    The Julian Day Number (JDN) of the input minus the JDN of January 7, 1970,
    the first new moon after January 1, 1970.
    '''
    t=q<3
    y=p-2000-t  # -2000 years to push day 0 to January 1, 2000
    return r+(153*(q+12*t-3)+2)//5+365*y+y//4-y//100+y//400+11010
    # +11010 days to push day 0 to January 7, 1970

def moon(s):
    '''
    Input format: yyyy-mm-dd

    An attempt at explaining the "magic numbers"
    - 29.53059 days is close to 2551443 seconds, so I used that
    - The offset of +12300 seconds because the new moon of 1970-01-07 was at 2035 UTC 
      or 12300 seconds before midnight. For those of you saying that this pushes 
      the beginning of my calendar to 2035, *6* January 1970, yes it does.
      But if I need to the calendar to recognize 1970-01-07 as the day of the new moon 
      which means that midnight needed to be a positive number of seconds, 0 <= x < 86400.
      Basically, I hacked it together, and +12300 worked.        
    '''
    d = 86400
    p,q,r = map(int, s.split("-"))
    z=(jul(p,q,r)*d+12300)%2551443  # 2551443 is about the number of seconds in a lunar month
    div, mod = divmod(z, 637861)    # 637861 seconds is about a quarter of a lunar month
                                    # div is what part of the lunar month this is (0 - 3)
                                    # mod is seconds since the start of the main phase
    return 2*div + (86400 <= mod)   # 2*div for the main phase, and 
                                    # is mod >= the number seconds in a day?
                                    # (+0 if within a day of the main phase, +1 otherwise)

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