मेरे पास बाइनरी कार कब होगी?


19

मैंने देखा कि मेरी कार का ओडोमीटर 101101 पर था जब मुझे आज काम मिला। जो एक शांत संख्या है क्योंकि यह द्विआधारी (और एक पैलिंड्रोम है, लेकिन यह महत्वपूर्ण नहीं है)। अब, मैं जानना चाहता हूं कि अगली बार मैं बाइनरी ओडोमीटर रीडिंग कब करूंगा। मैं गाड़ी चलाते समय ओडोमीटर नहीं पढ़ सकता, क्योंकि यह खतरनाक होगा, इसलिए जब मुझे काम करना हो या घर जाना हो तो बाइनरी होना पड़ेगा।

मेरे कार्यालय से आने-जाने के रास्ते में वास्तव में बहुत बुरा यातायात है, इसलिए मुझे प्रत्येक दिन एक अलग रास्ता अपनाना पड़ता है।

इस चुनौती के प्रयोजनों के लिए, एक दिन एक दौर की यात्रा है और काम करने के लिए मेरे आवागमन के साथ शुरू होता है।

आपको ओडोमीटर के प्रारंभिक पढ़ने और प्रत्येक तरह से मील की मात्रा का प्रतिनिधित्व करने वाले 10 तत्व अनुक्रम लेने की आवश्यकता होगी। यह क्रम तब तक दोहराया जाना चाहिए जब तक आप बाइनरी ओडोमीटर रीडिंग के लिए नहीं मिलते। आपको तब तक दिनों की संख्या का उत्पादन करना चाहिए जब तक कि हमें बाइनरी रीडिंग नहीं मिलती।

मार्ग और ओडोमीटर पढ़ने के लिए दोनों का माइलेज सकारात्मक पूर्णांक होगा। दिनों की गिनती या तो हो जाएगा xया x.5, तो दिन गणना की जरूरत के अपने उत्पादन आधा दिनों के लिए चल बिन्दु समर्थन करने के लिए। यदि दिन की गणना पूर्णांक है, तो आपको आउटपुट की आवश्यकता नहीं है .0। ओडोमीटर हमेशा एक बाइनरी स्थिति तक पहुंच जाएगा।

इनपुट / आउटपुट का कोई भी रूप स्वीकार्य है और मानक खामियां हैं।

परीक्षण के मामलों:

101101, [27, 27, 27, 27, 27, 27, 27, 27, 27, 27] == 165.0
1, [13, 25, 3, 4, 10, 8, 92, 3, 3, 100] == 22.5
2, [2, 3, 1, 2, 7, 6, 10, 92, 3, 7] == 2.0

क्या एक दिन परिणाम केवल एक पूर्णांक या एक पूर्णांक प्लस आधा होगा?
FryAmTheEggman

2
@FryAmTheEggman हां। प्रत्येक चरण आधा दिन है।
मॉर्गन थ्राप

5
आप कहाँ काम करते हैं / रहते हैं कि 3, 25 और 92 मील (किमी?) नियमित स्वीकार्य आवागमन दूरी हैं?
21

1
@kingofzeal एक वर्महोल।
मॉर्गन थ्रैप

1
@TobySpeight अंकों की अनंत संख्या के साथ यह एक जादुई ओडोमीटर है।
मॉर्गन थ्राप

जवाबों:


3

जेली, 22 17 16 बाइट्स

RịS+³DṀ=1
Ṡç1#SH

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

Ṡç1#SH     Main link. Left input: n (initial reading). Right input: A (distances)

Ṡ          Compute the sign of n. Since n is positive, this returns 1.
 ç         Apply the helper link to 1, 2, 3, ... until...
  1#         one match is found. Return the match in an array.
    S      Compute the sum of the array. This yields the match.
     H     Halve the result.


RịS+³DṀ=1  Helper link. Left argument: k (integer). Right argument: A (distances)

R          Range; yield [1, ..., k].
 ị         Retrieve the elements of A at those indices.
           Indexing in modular in Jelly.
  S        Compute the sum of the retrieved distances.
   +³      Add n (left input) to the sum.
     D     Convert the sum to base 10.
      Ṁ    Get the maximum digit.
       =1  Compare it with 1.

6

जावास्क्रिप्ट, 68 63 61 60 52 बाइट्स

5 बाइट्स धन्यवाद @ETHproductions ११ !! धन्यवाद @NotthatCharles बाइट्स ।

f=(i,a,m=0)=>/[^01]/.test(i+=a[m++%10])?f(i,a,m):m/2

यहाँ परीक्षण करें।


डार, तुमने मुझे इसके लिए हराया।
SuperJedi224 16

चाहेंगे (i+=a[++m%10])काम करते हैं?
ETHproductions

@ETHproductions। अच्छा था!! मैं भूल गया कि यह हमेशा 10
हटा दिया

0.5 के रूप में आर को आरंभीकृत क्यों नहीं किया? या आरंभिक rया mजो भी हो (वे शून्य करने के लिए डिफ़ॉल्ट होना चाहिए, यानी, 0)
ऐसा नहीं कि चार्ल्स

1
आप m=0modulo ( m++%10) ... के बाद इनिशलाइज़र और इन्क्रीमेंट में बनाकर एक बाइट भी बचा सकते हैं , जिस बिंदु पर आप बस rपूरी तरह से छोड़ सकते हैं । पूरी विधि निम्न 50 के दशक में है
नहीं कि चार्ल्स

5

MATL , 29 26 25 बाइट्स

`tvyyYs+V50<!A~]xx1Mf1)2/

इनपुट प्रारूप है

[27; 27; 27; 27; 27; 27; 27; 27; 27; 27]
101101

संपादित करें (10 जून, 2016): नीचे दिए गए लिंक की जगह vसे &v( 26 बाइट्स ) भाषा में बदलाव के लिए अनुकूल करने के लिए

इसे ऑनलाइन आज़माएं!

`              ]           % do---while loop. Exit loop when top of stack is falsy
 t                         % duplicate. Takes first input (array) first time
  v                        % concat vertically (doubles length of array)
   yy                      % copy top two. Takes second input (todasy's value) first time
     Ys                    % cumulative sum of (repeated) miles each way
       +                   % add to today's value
        V                  % convert each number to a string
         50<!A             % true for strings than only contain '01 ' (ASCII less than 50)
              ~            % negate. This is the loop condition
                xx         % delete stack contents
                  1M       % push again array that tells which strings only contain '01 '
                    f1)    % pick index of first true entry
                       2/  % divide by 2

3

लुआ, 108 बाइट्स

पहली बार कोडगोल्फ में रिपीट..सुनील लूप का उपयोग करते हुए!

function f(o,t)i=0repeat i,o=i+1,(o+t[i%#t+1]).."."o=o:sub(1,o:find("%.")-1)until tonumber(o,2)print(i/2)end

Ungolfed

function f(o,t)               -- o can either be a number or a string, t is a table
                              -- call it like f(2,{27,14,5...})
  i=0                         -- initialise the travel count
  repeat                      -- proceed like a do..while in C
    i,o=i+1,(o+t[i%#t+1]).."."-- increment i, and add t[i] to the odometer
    o=o:sub(1,o:find("%.")-1) -- remove the decimal part of the odometer
  until tonumber(o,2)         -- tries to convert o from binary to decimal
                              -- return nil (and repeat the loop) if it can't
  print(i/2)                  -- print i/2 which is the number of days for i travels
end

पहले लूप के बाद, oएक दशमलव भाग होगा क्योंकि tonumber, मुझे इसे निकालना था ... और इसे पहली बार जोड़ने के लिए, इसीलिए मैं इसे एक के साथ मिलाता हूं "."


3

जावा, 112 मील बाइट्स

float c(int r,int[]d){float y=0;for(int i=0;;i%=d.length){y+=.5;r+=d[i++];if((""+r).matches("[01]+"))return y;}}

3

05AB1E , 31 बाइट्स

कोड:

0IE\[²vs>sy+D§'aT«-""Qi\2/?}Ž}Ž

किसी तरह, कोड चलना बंद नहीं करता (और मैं यह पता नहीं लगा सकता कि क्यों) । जाहिरा तौर पर मैं भूल गया कि दो के बजाय तीन छोरों चल रहे हैं। तो यह अभी भी एक अनंत लूप में मिलेगा ...

इसे ऑनलाइन आज़माएं!


3

पावरशेल, 84 73 67 59 57 बाइट्स

param($a,$b)do{$a+=$b[$i++%10]}until(!+($a-replace1))$i/2

इनपुट $aऔर $b, $bएक स्पष्ट सरणी होने की उम्मीद करता है (जैसे, .\binary-car.ps1 1 @(13,25,3,4,10,8,92,3,3,100))। हम फिर एक do/ untilपाश में प्रवेश करते हैं । प्रत्येक पुनरावृत्ति, हम स्थिति $aमें लाभ के साथ वृद्धि करते हैं ताकि हम सरणी के माध्यम से लगातार लूप करें। यह शून्य पर शुरू होगा क्योंकि पहले लूप के लिए इसे आरंभीकृत नहीं किया जाता है, और इसलिए इसका मूल्यांकन करता है , जो इस संदर्भ में समान है , और यह उस मूल्यांकन के बाद ही होता है।$b$i++ % 10$i$null0++

फिर, untilबयान की जाँच करता है कि क्या हमारी संख्या केवल है 0और 1पहले से कुछ भी नहीं के साथ -replaceसब 1, आईएनजी के साथ एक पूर्णांक के रूप में वापस कास्टिंग +, और फिर बुलियन के साथ नहीं ले रही है !। यदि यह सही मूल्यांकन करता है, तो हम लूप को समाप्त करेंगे, आउटपुट करेंगे $i / 2, और प्रोग्राम को समाप्त करेंगे।

लूप सशर्त के लिए स्पष्टीकरण - पावरशेल में, कोई भी गैर-शून्य पूर्णांक है $true, और कोई भी गैर-रिक्त स्ट्रिंग भी है $true। उदाहरण के लिए, 231145(एक पूर्णांक) के "2345"बाद (-एक स्ट्रिंग) में बदल जाएगा -replace, जो पूर्णांक-कास्ट 2345(पूर्णांक) के रूप में होगा, !जिनमें से $false। हालाँकि, 101101(पूर्णांक) बदल जाएगा "00"(एक स्ट्रिंग) जो 0(पूर्णांक) के रूप में डाली जाएगी , !जिसमें से $true। हम आपके पास नहीं था +, "00"इच्छा !करने $falseके बाद से यह एक गैर रिक्त स्ट्रिंग है।

संपादित करें - के लिए सख्ती से शून्य समानता-ऑन-लंबाई को स्वैप करके सहेजी गयी 11 बाइट्स
एहसास है कि द्वारा सहेजी गयी एक और 6 बाइट्स - संपादित करें 2 $b.countहमेशा रहेंगे 10...
/ करते हैं का उपयोग करके सहेजी गयी एक और 8 बाइट्स तक के बजाय के लिए - 3 संपादित करें
संपादित करें 4 - यदि ऑब्जेक्ट -replaced एक पूर्णांक मान है, तो उद्धरण की आवश्यकता नहीं है, एक और 2 बाइट्स की बचत


2

रूबी, ५y

कुछ खास नहीं। बस एक चक्र ...

->s,a,i=0{a.cycle{|e|i+=0.5;break i if/[2-9]/!~'%d'%s+=e}}

आप इसे कैसे चलाते हैं?
bogl

1
@bogl यह लंबोदर है - सबसे आसान तरीका है कि वर्ग कोष्ठक में परिंदों को जोड़ा जाए। या आप लैम्बडा को एक वैरिएबल में असाइन कर सकते हैं और, फिर से, वर्ग ब्रैकेट में पैरामेड जोड़ सकते हैं। जैसे, ->s,a,i=0{a.cycle{|e|i+=0.5;break i if/[2-9]/!~'%d'%s+=e}}[1, [13, 25, 3, 4, 10, 8, 92, 3, 3, 100]]या ...f=->s,a,i=0{a.cycle{|e|i+=0.5;break i if/[2-9]/!~'%d'%s+=e}}; f[1, [13, 25, 3, 4, 10, 8, 92, 3, 3, 100]]
नहीं कि चार्ल्स

1

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

(y=1;x=#+#2[[1]];While[!StringMatchQ[ToString@x,{"0","1"}..],x+=#2[[y++~Mod~10+1]]];N@y/2)&

हां। इनपुट ओडोमीटर और समय की एक सूची है। आउटपुट दिन की गिनती है।


1

PHP, 102 98

function f($i,$s){while(1)foreach($s as$v){$d+=.5;$i+=$v;if(preg_match('/^[01]+$/',$i))return$d;}}

Ungolfed संस्करण

function f($i,$s) {
    $d = 0;
    while(true) {
        foreach($s as $v) {
            $d += 0.5;
            $i+=$v;
            if(preg_match('/^[0|1]+$/', $i)) {
                return $d;
            }
        }
    }
}

$d = 0;गोल्फ संस्करण में 4 वर्णों की अतिरिक्त लागत से PHP नोटिस को हटाया जा सकता है ।

उदाहरण

$i = 101101;
$s = [27, 27, 27, 27, 27, 27, 27, 27, 27, 27];
f($i,$s);

चारों ओर घुंघराले ब्रेसिज़ ifको हटाने, से 0 को 0.5हटाने, और |अपने regex में 1 और 0 के बीच में हटाने से आपको 4 बाइट्स बचते हैं। function f($i,$s){while(1)foreach($s as$v){$d+=.5;$i+=$v;if(preg_match('/^[01]+$/',$i))return$d;}}
सैमसक्च

@ सैमसकच, अच्छा सुझाव, कोष्ठक और 0 से पहले .5 स्पष्ट रूप से याद किया। अब बदल गया है।
kuldeep.kamboj

1

पायथ, 36 32 30 बाइट्स

Jvz.V0=J+J@QbI<ssM{`J2KbB;chK2

यहाँ कोशिश करो!

व्याख्या

Jvz.V0=J+J@QbI <ssM {`J2KbB; chK2 # = इनपुट अनुक्रम

Jvz # असाइनमेंट J से शुरू होता है
   .V0 # 0 से शुरू होने वाले बी पर चलने वाले एक अनंत लूप की शुरुआत करें
      = J # सेट J से
        + J # J का योग
          @ क्यू # और क्यू पर मूल्य [बी% लेन (क्यू)]
             मैं # अगर
              <2 # 2 से कम है
                  {`J # J से डुप्लिकेट अंक निकालें 
               ssM # पूर्णांक के अंकों को वापस मैप करें और उन्हें योग करें
                      KbB # यदि उपरोक्त स्पष्ट हो जाए, तो B को K में सहेजें और लूप छोड़ दें
                         ; # अंत लूप शरीर
                           hK # वृद्धि K क्योंकि हम एक लूप वेतन वृद्धि से चूक गए
                          c 2 # और इसे दिनों को प्राप्त करने के लिए 2 से विभाजित करें


0

सी तेज, 180।

प्रिय स्वामी C # लंबा है।

using System.Text.RegularExpressions;class a{double c(int a,int[]b){var d=0.5;a+=b[0];var i=1;while(!Regex.IsMatch(a.ToString(),"^[01]+$")){a+=b[i];i+=1;i=i%10;d+=0.5;}return d;}}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.