বিপদাশঙ্কা অপ্টিমাইজেশন


28

আমার অ্যালার্ম ঘড়ি

আমি আমেরিকান, এবং আমার (ডিজিটাল) অ্যালার্ম ক্লকটি। অ্যালার্ম সেট করতে, এটি আগে ছিল এমন সময়ে শুরু হয়। ঘন্টা বোতামটি আঘাত করা এটি এক ঘন্টা উপরে নিয়ে যায়, এবং মিনিটের বোতামটি আঘাত করে এটি এক মিনিটের উপরে চলে যায়। একই সাথে উভয় বোতামে আঘাত হ'ল এটি মধ্যরাতে (সকাল 12:00) পুনরায় সেট করে এবং দুটি বোতাম টিপতে গণনা করা হয়।

যখন ঘন্টাগুলি তাদের ক্যাপ (12) অতিক্রম করে, তখন এটি 1 এ পুনরায় সেট হয় এবং এএম / প্রধানমন্ত্রী আলো টগল করে। যখন মিনিটগুলি তাদের ক্যাপটি ছাড়িয়ে যায় (59), তারা ঘন্টাগুলিকে প্রভাবিত না করে 0 এ পুনরায় সেট করে।

কাজটি

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

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

উদাহরণ

1:15 pm -> 2:30 am

আপনি সকাল 12 টা থেকে পুনরায় সেট করতে উভয় 2+2+30 = 34বোতামটি টিপতে পারেন, তারপরে বেলা আড়াইটা বাড়াতে যা বাটন টিপতে হবে । আপনি বেলা আড়াইটা পর্যন্ত বৃদ্ধি করতে পারেন যা 13+15 = 28বোতাম টিপতে হবে । সুতরাং, আপনার আউটপুট হয় 28

3:58 am -> 4:02 am

আপনি পুনরায় সেট করতে এবং ইনক্রিমেন্ট করতে 2+4+2 = 8পারেন যা বোতাম টিপতে হবে । আপনি বাড়াতে পারেন, যা 1+4 = 5বোতাম টিপতে হবে । সুতরাং, আপনার আউটপুট হয় 5

10:55 pm -> 1:00 am

আপনি পুনরায় সেট করতে এবং ইনক্রিমেন্ট করতে 2+1 = 3পারেন যা বোতাম টিপতে হবে । আপনি বাড়াতে পারেন, যা 3+5=8বোতাম টিপতে হবে । সুতরাং, আপনার আউটপুট হয় 3

1:00 am -> 1:59 pm

আপনি পুনরায় সেট করতে এবং ইনক্রিমেন্ট করতে পারতেন, তবে এটি কেবল ইনক্রিমেন্টিংয়ের চেয়ে আরও তিনটি প্রেস হবে। সুতরাং, আপনার আউটপুট হয় 12+59 = 71

পরীক্ষার মামলা

Current  Target   = Output
1:15pm   2:30am   = 28
3:58am   4:02am   = 5
10:55pm  1:00am   = 3
1:00am   1:59pm   = 71
12:00am  12:00am  = 0
6:51pm   12:00am  = 2
2:01pm   11:00pm  = 25
2:01pm   11:01pm  = 9
12:59am  12:01am  = 2
11:50am  12:00pm  = 11


13
পবিত্র বাজে! দুটি বোতাম টিপানো আমার (ইউরোপীয়) অ্যালার্ম
আর্নাউল্ড

8
"সামরিক সময় (বা বিশ্বের বেশিরভাগ নিয়মিত সময়)" ... আপনি যে শব্দটির সন্ধান করছেন তা হ'ল "24 ঘন্টা সময়"।
Jakob

12
@ জ্যাকব না, তিনি যে শব্দটির সন্ধান করছেন তা হ'ল "নিয়মিত সময়"। আমেরিকানরা অনিয়মিত সময়, অনিয়মিত তারিখ, অনিয়মিত ইউনিট ইত্যাদি ব্যবহার করে
নীল

1
@ স্টেপহেন আমি ইউকেতে আছি এবং জাকোব এটি ব্যাখ্যা না করা পর্যন্ত "সামরিক সময়" বলতে কী বোঝাতে চেয়েছিলেন সে সম্পর্কে কোনও ধারণা ছিল না। 24 ঘন্টা সময়টি আমার কাছে সঠিক ধারণা দেয়
ড্যারেন এইচ

উত্তর:


5

হুশ , 16 বাইট

§▼ṁ→(Σz%e24 60z-

এটি অনলাইন চেষ্টা করুন!

প্রারম্ভিক এবং শেষ সময়ের জন্য 24 ঘন্টা ফর্ম্যাটে দুটি তালিকা [ঘন্টা, মিনিট] হিসাবে আর্গুমেন্ট নেয়।

আমি এইটি কতটা গল্ফ করতে পেরেছি তা সম্পর্কে আমি বেশ খুশি, আমি এই আকর্ষণীয় বিষয়টি ফাংশনগুলির এই রচনাতে কীভাবে যুক্তিগুলি পরিচালনা করা হয় তা খুঁজে পাই।

ফাংশন যা গণনা করে যে রিসেটের অনুমতি না থাকলে আমাদের কতগুলি কী প্রেসগুলি প্রয়োজন তা নিম্নলিখিত:

Σz%e24 60z-
         z-    elementwise subtract the two times
 z%e24 60      take the hours difference modulo 24 and the minutes difference modulo 60
Σ              sum the two resulting numbers

মজার অংশটি হ'ল যেহেতু এই সমাধানটির বাকী অংশটি কেবলমাত্র একটি তালিকা দিয়ে যুক্তি হিসাবে কাজ করতে পারে, তাই এটি সম্পূর্ণরূপে প্রথম আর্গুমেন্টের সাথে আংশিকভাবে প্রয়োগ হয়, এটি "খাওয়া" এবং শুধুমাত্র দ্বিতীয় যুক্তিটি নিজের জন্য দৃশ্যমান রেখে দেয় এবং প্রোগ্রাম বাকি।

এরপরে, আমরা সময়টি 0:00-এ পুনরায় সেট করতে চাইলে আমরা কতগুলি কী প্রেসের প্রয়োজন তা গণনা করি

ṁ→    take the sum of each element of the list increased by 1

যেমন আগেই বলা হয়েছিল, এটি কেবলমাত্র hours+minutes+2গল্ফায়ার উপায়ে দ্বিতীয় যুক্তির (চূড়ান্ত সময়), এবং গণনাগুলিতে পরিচালিত হয়।

অবশেষে, §▼সেই অংশটি যা উভয় ফাংশনে দ্বিতীয় তর্কটি পাস করে এবং দুটি ফলাফলের চেয়ে কম ফল দেয়।


8

জাভাস্ক্রিপ্ট (ES6), 73 56 54 52 50 বাইট

24 ঘন্টা ফর্ম্যাট ব্যবহার করে। প্রতিটি সময়ের ঘন্টা এবং মিনিটের প্রতিনিধিত্ব করে 4 পূর্ণসংখ্যার হিসাবে ইনপুট নেয়।

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)

চেষ্টা করে দেখুন

:বিভাজক সহ 24 ঘন্টা বিন্যাসে সময়গুলি প্রবেশ করান ।

o.innerText=(f=

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)

)(+(x=(i.value="01:00").split`:`)[0],+x[1],+(y=(j.value="13:59").split`:`)[0],+y[1]);oninput=_=>o.innerText=f(+(x=i.value.split`:`)[0],+x[1],+(y=j.value.split`:`)[0],+y[1])
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>Current: </label><input id=i type=time><label for=j>Target: </label><input id=j type=time><pre id=o>


ব্যাখ্যা

(শীঘ্রই আপডেট করা হবে।)

(g,l,h,m)=>

বেনামী ফাংশন পরামিতি মাধ্যমে আর্গুমেন্ট হিসাবে ইন্টিজার গ্রহণ g, l, h& m, যেখানে g& lহয়, যথাক্রমে ঘন্টা & বর্তমান সময় মিনিট এবং h& mঘন্টা & লক্ষ্য সময়ের কয়েক মিনিটের হয়।

2+h+m

প্রথমে, আমরা কেবলমাত্র ঘড়িটি পুনরায় সেট করার জন্য কতগুলি বাটন প্রেসের প্রয়োজন তা গণনা করি, যা কেবলমাত্র 2 (পুনরায় সেট করার জন্য) প্লাস লক্ষ্য সময় এবং লক্ষ্য মিনিট।

h-g+24*(h<g)

পরবর্তী আমরা গণনা করি যে টার্গেট আওয়ারে পৌঁছাতে কতগুলি বোতাম টিপতে হবে। আমরা লক্ষ্য ঘন্টা থেকে বর্তমান ঘন্টাটি বিয়োগ করে এটি করি। যাইহোক, যদি বর্তমান সময়টি লক্ষ্যটির চেয়ে কম হয় তবে এটি আমাদের একটি নেতিবাচক সংখ্যা দেবে তাই আমরা এটি সংশোধন করে ২৪ টি যোগ করে পরীক্ষা করে পরীক্ষা করে দেখি h<g(যেটি একটি বুলিয়ান দেয় তবে স্পষ্টভাবে পূর্ণসংখ্যায় ফেলে দেওয়া হয় 1, যদি সত্য হয়, বা 0যদি এটি দ্বারা মিথ্যা হয় গাণিতিক অপারেশন.

+m-l+60*(m<l)

আমরা বর্তমান মিনিট থেকে লক্ষ্য মিনিটে পৌঁছানোর জন্য প্রেসের সংখ্যা গণনা করতে এবং একই মুহুর্তে ঘন্টা চাপতে যোগ করতে অনুরূপ সূত্র ব্যবহার করি।

Math.min()

শেষ অবধি, আমাদের ফলাফল দেওয়ার জন্য আমরা সর্বনিম্ন 2 নম্বর পেয়েছি।


1
আপনি করতে পারেন (h-g+24)%24+(m-l+60)%60?
আর্নল্ড

7

পাইথ , 29 বাইট

এই চ্যালেঞ্জ স্পষ্টতই গল্ফিং ভাষার পক্ষে লাভ করে না, এজন্য এটি এত দীর্ঘ। অন্যদিকে, পাইথটি পাইথন-ভিত্তিক এটি দ্বারা উন্নতি হয়েছে, সুতরাং আমরা এর নেতিবাচক মডুলাসটিকে অপব্যবহার করতে পারি।

hS,+%-eQ@Q1 60%-@Q2hQ24+2s>Q2

পরীক্ষা স্যুট. পাইথের নম্বরগুলি নেতৃস্থানীয় শূন্যগুলি সমর্থন করে না।


5

জেলি , 19 বাইট

_⁵%24µ+⁴_⁶%60µ«³+⁴¤

এটি অনলাইন চেষ্টা করুন!

4 টি পূর্ণসংখ্যা হিসাবে ইনপুট (শেষ ঘন্টা, শেষ-মিনিট, শুরুর ঘন্টা, শুরু-মিনিট)




3

সি # (.নেট কোর) , 56 বাইট

(H,M,h,m)=>Math.Min(((h+24-H)%24)+((m+60-M)%60),(2+h+m))

এটি অনলাইন চেষ্টা করুন!

জাভাস্ক্রিপ্ট উত্তরের সাথে খুব মিল। সি # তে থাকা পুলগুলি সহজে সংখ্যায় রূপান্তরিত হয় না, তাই [diff]+24*(H<h)আমি পরিবর্তে ([diff]+24)%24কার্যকরভাবে একই জিনিসটি করি।


আপনি 2+h+m-2 বাইটের কাছাকাছি প্রথম বন্ধনী সরাতে পারেন ।
কেভিন ক্রুইজসেন

আমি জাভা 8-এ আপনার উত্তরের একটি বন্দর তৈরি করেছি এবং লক্ষ্য করেছি আপনি আরও চারটি বাইট গল্ফ করতে পারেন আরও বন্ধনী সরিয়ে, এটি শেষ করে(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
কেভিন ক্রুইজসেন

1
আপনি এটি করতে হবে না System.Math.Min?
LiefdeWen

3

হাস্কেল, 41 বাইট

(a#b)c d=min(a+b+2)$mod(a-c)24+mod(b-d)60

অনেকটাই অকপট. 24 ঘন্টা সময় ব্যবহার করে চারটি আর্গুমেন্ট হিসাবে ইনপুট নেয়: শেষ ঘন্টা, শেষ মিনিট, শুরুর ঘন্টা, শুরুর মিনিট।


2

পাইথন 3 , 43 বাইট

lambda a,b,c,d:min((c-a)%24+(d-b)%60,2+c+d)

এটি অনলাইন চেষ্টা করুন!

4 টি পূর্ণসংখ্যা হিসাবে ইনপুট (শুরুর ঘন্টা, শুরু-মিনিট, শেষ ঘন্টা, শেষ-মিনিট)


পুনঃটুইট সহজ ফিক্স।
হাইপার নিউট্রিনো

ব্যর্থ2 01 11 00 ? আপনার উত্তরে আপনি কীভাবে সময় নির্ধারণ করবেন AMবা PMআপনি যদি ইনপুট হিসাবে গ্রহণ না করেন?
মিস্টার এক্সকোডার

@ Mr.Xcoder; আমি 13টিআইও ব্যবহার করে সেই ইনপুটটি পেয়েছি , যা সঠিক (+ 11 <9 + 59 রিসেট)।
শেগি

2
%পাইথনের সর্বদা ইতিবাচক সংখ্যাটি কি ফেরত দেয়?
শেগি

4
@ শেগি এটি সর্বদা ডান পাশের চিহ্নটি ফিরিয়ে দেয় %1%24= 1, 1%-24= -23। এটি এই প্রশ্নের জন্য খুব সহায়ক।
স্টিফেন

2

জাভা 8, 54 50 বাইট

(h,m,H,M)->Math.min((H-h+24)%24+(M-m+60)%60,H+M+2)

@ কামিলড্রাকারীর সি # উত্তর বন্দর (আমি 2 6 বাইট গল্ফ করার পরে )।

ব্যাখ্যা:

এখানে চেষ্টা করুন।

(h,m,H,M)->       // Method with four integer parameter and integer return-type
  Math.min(       //  Return the lowest of the following two:
                  //   The hours:
   (H-h           //    Second hours - first hours inputs
       +24)       //    +24 so we won't have negative numbers
           %24    //    mod-24 to get the hours
   +              //   And add the minutes:
    (M-m          //    Second minutes - first minutes inputs
         +60)     //    +60 so we won't have negative numbers
             %60  //    mod-60 to get the minutes
    ,H+M          //  And compare it to the second hours + second minutes inputs
        +2)       //   +2 for the added +24 and +60 to get the positive modulo arguments

1

পার্ল 5 , 71 +2 (-ap) = 73 বাইট

($w,$x,$y,$z)=@F;$_=($r=2+$y+$z)>($c=($y-$w+24)%24+($z-$x+60)%60)?$c:$r

এটি অনলাইন চেষ্টা করুন!

24 ঘন্টা বিন্যাসে সামরিক সময় ইনপুট নেয় (সামরিক সময়), স্পেস দ্বারা পৃথক করে, প্রথমবার শুরু করার সময়, দ্বিতীয় বার শেষ: HH MM hh মিমি


1

রেটিনা , 106 বাইট

\d+
$*
 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2
(1*):(1* )\1(1{24})?
$2
(1*) (1*):\1(1{60})?
$2
(1+)#(?!\1)

\G1

এটি অনলাইন চেষ্টা করুন! লিঙ্কে পরীক্ষার কেস অন্তর্ভুক্ত রয়েছে। দু'বার আলাদা করার জায়গার সাথে নিয়মিত 24 ঘন্টা সময় ইনপুটটিকে বর্তমান এবং কাঙ্ক্ষিত সময় হিসাবে গ্রহণ করে। ব্যাখ্যা:

\d+
$*

অ্যানারিতে রূপান্তর করুন।

 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2

এটি দুটি কাজ করে; এটি পছন্দসই ঘন্টা এবং মিনিটে 24 ঘন্টা 60 মিনিট যুক্ত করে এবং এটি আসল কাঙ্ক্ষিত ঘন্টা এবং মিনিটের যোগফলকে 2 যোগ করে, মানে রিসেট ব্যবহার করে সেট করার জন্য বোতাম টিপে সংখ্যা।

(1*):(1* )\1(1{24})?
$2

কাঙ্ক্ষিত ঘন্টা থেকে বর্তমান সময়গুলি বিয়োগ করুন, এবং আমরা পারলে 24 টি বিয়োগ করুন can

(1*) (1*):\1(1{60})?
$2

একইভাবে কয়েক মিনিটের জন্য। এটি দুটি ফলাফল একসাথে যুক্ত করে।

(1+)#(?!\1)

যদি বর্তমান সময়টি ব্যবহার করে সেট করা প্রেসগুলির সংখ্যা পুনরায় সেট করে সেট করার জন্য চাপের সংখ্যার চেয়ে বেশি হয়, এটি মুছুন।

\G1

প্রথম বাকী সংখ্যাটিকে দশমিক দশকে রূপান্তর করুন।

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