निकटतम घड़ी हाथों को खोजें


15

चुनौती

आधी रात के बाद की संख्या को देखते हुए, घड़ी के चेहरे पर किसी भी दो हाथों के बीच सबसे छोटे कोण का उत्पादन, संभव के रूप में कुछ बाइट्स का उपयोग करके।

आप मान सकते हैं कि सेकंड की संख्या हमेशा 86400 से कम है। कोणों को डिग्री या रेडियन में दर्शाया जा सकता है।

एक संदर्भ समाधान यहां है: http://ideone.com/eVdgC0

परीक्षण मामले (डिग्री में परिणाम)

0 -> 0
60 -> 0.5
600 -> 5
3600 -> 0
5400 -> 45
6930 -> 84.75
50000 -> 63.333

Clarificarions

  • घड़ी के 3 हाथ हैं: घंटे, मिनट और सेकंड।
  • सभी हाथ लगातार चलते रहते हैं, इस प्रकार घंटा और मिनट हाथ घड़ी चेहरे पर स्नातक स्तर की पढ़ाई के बीच पाया जा सकता है।

संबंधित चुनौती (मिनट और घंटे केवल डिग्री में)
Sp3000

1
आपको संभवतः विशिष्ट होना चाहिए कि घड़ी पर दूसरा हाथ है।
isaacg

क्या आप कुछ परीक्षण मामलों को जोड़ सकते हैं?
बीटा डेके

1
कुछ घड़ियों पर, मिनट का हाथ अगले मिनट तक कूदता है जब दूसरा हाथ शीर्ष पर पहुंचता है। दूसरों पर, यह लगातार चलता रहता है। मुझे लगता है कि यह एक घड़ी है जहां यह लगातार चलती है? इसके अलावा, जब आप एक बार ध्यान से पढ़ते हैं तो यह स्पष्ट होता है, मैंने शुरू में "सेकंड हैंड" अस्पष्ट पाया, क्योंकि ज्यादातर घड़ियों में वैसे भी कम से कम दो हाथ होते हैं, इसलिए "सेकंड हैंड" को वास्तव में एक तीसरा हाथ जोड़ता है।
रेटो कोरदी

1
@ बटेडेके निश्चित रूप से। मैंने कुछ ऐसा कहा होगा: "घड़ियों के तीन हाथ होते हैं: घंटे, मिनट और सेकंड।"
रेटो कोरदी

जवाबों:


10

CJam, 36 35 34 32 30 बाइट्स

riP*30/_60/_C/]2m*::-:mc:mC$3=

आउटपुट रेडियंस में है। मैंने सभी 86400 संभावित इनपुट के लिए समाधानों का सत्यापन किया है।

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

विचार

चूंकि रेडियन एक पूर्ण गोद है, इसलिए घड़ी पर प्रत्येक मिनट / सेकंड का अंतराल 2π / 60 = is / 30 इंच चौड़ा है।

इस प्रकार, सेकंड की संख्या को विभाजित करके divid / 30 से से दूसरे हाथ की स्थिति उत्पन्न होती है।

मिनट का हाथ दूसरे हाथ की गति के एक छठे भाग पर जाता है, इसलिए परिणाम को ऊपर से विभाजित करना 60 मिनट मिनट हाथ की स्थिति उत्पन्न होती है।

इसी तरह, अंतिम परिणाम को विभाजित करके 12 से पर घंटे के हाथ की स्थिति उत्पन्न होती है।

ध्यान दें कि ऊपर से हमारे तीन भागफल आवश्यक रूप से सीमा में नहीं हैं [0,2।)।

हाथों के कोणों के सभी नौ संभावित अंतरों की गणना करके, हम तीन प्राप्त करते हैं 0 (एक हाथ और खुद के बीच कोणीय दूरी) और विभिन्न हाथों के बीच छह दूरी प्राप्त करते हैं।

यदि निकटतम हाथ आधे पर हैं जिसमें 12 शामिल नहीं हैं , तो ऊपर से मतभेदों में से एक वांछित आउटपुट (मॉड) होगा ) होगा।

हालाँकि, दोपहर 01:55:30 (उदाहरण के लिए), घंटा हाथ 1.008 रेड (57.75 डिग्री) के कोण पर और मिनट हाथ 5.812 रेड (333.00 डिग्री) के कोण पर है 12 , जो 4.804 रेड का अंतर देता है (275.25 डिग्री)। इस परिणाम को एक पूर्ण गोद से घटाकर, हम "दूसरी दिशा में" मापा गया कोण प्राप्त करते हैं, जो 1.479 रेड (84.75 रेड) के बराबर होता है।

अब, प्रत्येक कोण θ को [0,2θ] में मैप करने के बजाय और सशर्त रूप से π से परिणाम को घटाते हुए , हम बस arccos (cos (θ)) की गणना कर सकते हैं , क्योंकि cos आवधिक और समान दोनों है, और arccos में एक मान प्राप्त होता है [ 0, π)

तीन सबसे छोटे परिणामों (सभी शून्य) पर लंघन, चौथा सबसे छोटा वांछित उत्पादन होगा।

कोड

ri                             e# Read an integer from STDIN.
  P*30/                        e# Multiply by π and divide by 30.
       _60/                    e# Divide a copy by 60.
           _C/                 e# Divide a copy by 12.
              ]2m*             e# Push the array of all pairs of quotients.
                  ::-          e# Replace each pair by its difference.
                     :mc       e# Apply cosine to each difference.
                        :mC    e# Apply arccosine to each cosine.
                           $3= e# Sort and select the fourth smallest element.

वैकल्पिक संस्करण (34 बाइट्स)

rd6*_60/_C/]360f%2m*::m360X$f-+$6=

आउटपुट डिग्री में है और कोई त्रिकोणमितीय फ़ंक्शन उपयोग नहीं किया जाता है।

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।


9

गणितज्ञ, 40 बाइट्स

Min@Abs@Mod[#{11,708,719}/120,360,-180]&

स्पष्टीकरण: tआधी रात के बाद से सेकंड की संख्या होने दें । प्रत्येक हाथ की स्थिति है

hour: t/120 (mod 360)
min:  t/10 (mod 360)
sec:  6t (mod 360)

xडिग्री और yडिग्री के बीच पूर्ण कोणीय दूरी की गणना करने के लिए , हम y - x360 को सीमा में मोड सकते हैं [-180, 180]और फिर पूर्ण मान ले सकते हैं। (नोट वहाँ पर कोई प्रतिबंध नहीं है कि xऔर y।) तो यह समारोह सिर्फ जोड़ो में मतभेद की गणना करता है t/10-t/120, 6t-t/10और 6t-t/120और कहा कि नहीं करता है।


क्षमा करें, गणितज्ञ से परिचित नहीं है, लेकिन क्या यह वास्तव में आधी रात के बाद से सेकंड के लिए एक तर्क या चर को स्वीकार करता है?
विनी जूल

1
@ हां, यह एक शुद्ध कार्य है (इसके द्वारा दर्शाया गया है &) और इसके पास दिए गए पहले तर्क को अंदर की ओर संदर्भित किया गया है #
jcai

7

पायथन, 65

lambda n,l={720,60,1}:6*min((n/x-n/y)%60for x in l for y in{x}^l)

घेरे की 1/60 इकाइयों में घंटे, मिनट और दूसरे हाथ से यात्रा की गई दूरी होती है h,m,s = n/720, n/60, n/1। हम इन आधुनिक 60 लेने से वृत्त पर अपनी स्थिति पाने के लिए कर सकते हैं 0करने के लिए60

यदि हम उनके अंतर मॉड 60 लेते हैं, तो हमें उन इकाइयों की संख्या मिलती है जो एक दूसरे के सामने हैं। हम सभी छह संभावित अंतर लेते हैं, मिनट पाते हैं, फिर 6से पुनर्विक्रय द्वारा गुणा करते हैं360 डिग्री ।

दो-परत सूची समझ पहले प्रतिनिधित्व के रूप में पहला हाथ चुनती है 720,60 या 1है, तो दूसरी ओर सेट XOR के माध्यम से हटाया पहली पसंद के साथ है कि सेट से बाहर चुनता है।

मैंने इसे संदर्भ कोड के खिलाफ पूरी तरह से परीक्षण किया।


6

सी #, 163 152 बाइट्स

यह रैप-अराउंड के लिए गणना करने के लिए हर हाथ को दो बार बनाता है, फिर हर संयोजन के माध्यम से लूप करता है और हाथों के बीच न्यूनतम कोण पाता है। गणना 60 डिवीजनों में की जाती है, फिर डिग्री प्राप्त करने के लिए 6 से गुणा किया जाता है।

स्पष्टता के लिए प्रस्तुत:

float F(int s){
    float b=60,c;
    float[]a={c=s/b/b%12*5,c+b,c=s/b%b,c+b,s%=60,s+b};
    for(s=36;s-->0;)
        b=s%6!=s/6&(c=(c=a[s%6]-a[s/6])<0?-c:c)<b?c:b;
    return b*6;
}

उदाहरण आउटपुट:

    0 seconds, 00:00:00, smallest angle is 0°
43200 seconds, 12:00:00, smallest angle is 0°
86399 seconds, 23:59:59, smallest angle is 0.09164429°
 3330 seconds, 00:55:30, smallest angle is 54.75°
39930 seconds, 11:05:30, smallest angle is 60.25001°
21955 seconds, 06:05:55, smallest angle is 65.49998°
21305 seconds, 05:55:05, smallest angle is 59.50001°
 5455 seconds, 01:30:55, smallest angle is 75.45831°
41405 seconds, 11:30:05, smallest angle is 44.95834°

रैप के लिए खाते में अच्छा समाधान के आसपास
टोटो

2

टीआई-बेसिक, 17 बाइट्स

min(cos⁻¹(cos(ΔList(Ans{6,.1,5!⁻¹,6

arccos(cos(दूरियों को सामान्य करने के लिए डेनिस का उपयोग करता है ; हालांकि, सभी जोड़ीदार दूरी की गणना करने के बजाय, यह केवल तीन आवश्यक उपयोग की गणना करता हैΔList([seconds],[minutes],[hours],[seconds]

यह कार्यक्रम उम्मीद करता है Degree मोड की है और डिग्री में उत्तर देता है।

संपादित करें: 5!एक बाइट से छोटा है 120

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