Wann werde ich ein Doppelauto haben?

19

Als ich heute zur Arbeit kam, bemerkte ich, dass der Kilometerzähler meines Autos bei 101101 lag. Was eine coole Zahl ist, weil es binär ist (und ein Palindrom, aber das ist nicht wichtig). Jetzt möchte ich wissen, wann ich das nächste Mal einen binären Kilometerzählerstand haben werde. Ich kann den Kilometerzähler während der Fahrt nicht ablesen, da dies gefährlich wäre. Daher muss er entweder binär sein, wenn ich zur Arbeit gehe oder nach Hause komme.

Auf dem Weg von und zu meinem Büro herrscht sehr viel Verkehr, daher muss ich jeden Tag eine andere Route einschlagen.

Für diese Herausforderung ist ein Tag eine Rundreise und beginnt mit meinem Weg zur Arbeit.

Sie müssen zunächst den Kilometerzähler und eine 10-Elemente-Sequenz ablesen, die die Anzahl der Meilen pro Strecke angibt. Diese Sequenz sollte wiederholt werden, bis Sie zu einem binären Kilometerzähler kommen. Sie sollten dann die Anzahl der Tage ausgeben, die es dauert, bis wir zu einem binären Messwert kommen.

Sowohl der Kilometerstand als auch der Kilometerstand sind positive ganze Zahlen. Die Anzahl der Tage ist entweder xoder x.5, daher muss Ihre Ausgabe der Tageszählung für halbe Tage Gleitkommazahlen unterstützen. Wenn die Tageszählung eine Ganzzahl ist, müssen Sie die nicht ausgeben .0. Der Kilometerzähler erreicht irgendwann immer einen binären Zustand.

Jede Form von Eingabe / Ausgabe ist akzeptabel und Standardlücken sind nicht zulässig .

Testfälle:

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
Morgan Thrapp
quelle
Wird ein Tagesergebnis immer nur eine ganze Zahl oder eine ganze Zahl plus eine halbe sein?
FryAmTheEggman
2
@FryAmTheEggman Ja. Jeder Schritt dauert einen halben Tag.
Morgan Thrapp
5
Wo arbeiten / leben Sie, wenn 3, 25 und 92 Meilen (km?) Regelmäßig akzeptable Pendelstrecken sind?
Kingofzeal
1
@kingofzeal Ein Wurmloch.
Morgan Thrapp
1
@TobySpeight Es ist ein magischer Kilometerzähler mit einer unendlichen Anzahl von Ziffern.
Morgan Thrapp

Antworten:

3

Jelly, 22 17 16 Bytes

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

Probieren Sie es online!

Wie es funktioniert

Ṡç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.
Dennis
quelle
6

Javascript, 68 63 61 60 52 Bytes

5 Bytes weg danke @ETHproductions . 2 3 11 !! Bytes off danke @NotthatCharles .

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

Hier testen.

entfernt
quelle
Verdammt, du hast mich geschlagen.
SuperJedi224
Würde (i+=a[++m%10])funktionieren
ETHproductions
@ETHproductions. Guter !! Ich habe vergessen, dass es immer 10 sein wird
entfernt
warum nicht r als 0.5 initialisieren? Oder nicht initialisieren roder mwas auch immer (sie sollten standardmäßig null sein, dh 0)
Nicht dass Charles
1
Sie können ein Byte auch speichern, indem Sie es m=0im Initialisierer erstellen und nach modulo ( m++%10) inkrementieren. An diesem Punkt können Sie es einfach rganz fallen lassen . Die ganze Methode ist dann in den niedrigen 50ern
Nicht dass Charles
5

MATL , 29 26 25 Bytes

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

Eingabeformat ist

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

BEARBEITEN (10. Juni 2016): Der folgende Link wird vdurch &v( 26 Byte ) ersetzt, um sich an Änderungen in der Sprache anzupassen

Probieren Sie es online!

`              ]           % 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
Luis Mendo
quelle
3

Lua, 108 Bytes

Zum ersten Mal mit der Wiederholung ... bis zur Schleife in einem Codegolf!

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

Nach der ersten Schleife owird ein Dezimalteil angezeigt, da tonumbermusste ich es entfernen ... Und um es für den ersten Fall hinzuzufügen, verkette ich es deshalb mit einem ".".

Katenkyo
quelle
3

Java, 112 Meilen Bytes

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;}}
SuperJedi224
quelle
3

05AB1E , 31 Bytes

Code:

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

Irgendwie hört der Code nicht auf zu laufen (und ich kann nicht herausfinden warum) . Anscheinend habe ich vergessen, dass es statt 2 drei Loops gibt. Es würde also immer noch zu einer Endlosschleife ...

Probieren Sie es online!

Adnan
quelle
3

PowerShell, 84 73 67 59 57 Byte

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

Übernimmt Eingaben $aund $berwartet $beine explizite Reihe von Meilen (z .\binary-car.ps1 1 @(13,25,3,4,10,8,92,3,3,100). B. ). Wir betreten dann eine do/ untilSchleife. Bei jeder Iteration erhöhen wir $aden Kilometerstand $ban der Position, $i++ % 10so dass wir das Array fortlaufend durchlaufen. Dies beginnt bei Null, da für die erste Schleife die $inicht initialisiert ist, und wird daher als ausgewertet $null, was 0in diesem Kontext gleichbedeutend ist , und es ist nur nach dieser Auswertung ++auftritt.

Dann untilprüft die Anweisung, ob unsere Zahl nur ist, 0und 1indem sie zuerst -replacealles 1mit nichts besetzt, diese Zahl als Ganzzahl mit zurückgreift +und dann den Booleschen Wert mit nicht annimmt !. Wenn es wahr ist, beenden wir die Schleife und geben sie aus$i / 2 und beenden das Programm.

Erklärung für die Schleifenbedingung - In PowerShell ist jede Ganzzahl ungleich Null $trueund jede nicht leere Zeichenfolge auch $true. Beispielsweise wird 231145(eine Ganzzahl) nach "2345"(eine Zeichenfolge) geändert -replace, die in 2345(eine Ganzzahl) umgewandelt !wird $false. Jedoch 101101(eine ganze Zahl) wird sich ändern "00"(String) , die wie gegossen 0(eine ganze Zahl), die !von denen $true. Wenn wir das nicht hätten +, das"00" Willen !dazu$false , da es sich um eine nicht leere Zeichenfolge ist.

Bearbeiten - 11 Bytes durch Vertauschen der Längengleichheit gegen Null
gespeichert. Bearbeiten 2 - Weitere 6 Bytes wurden gespeichert, indem erkannt wurde, dass dies $b.countimmer der Fall sein wird 10.
Bearbeiten 3 - Weitere 8 Bytes wurden mit do / until statt für Bearbeiten gespeichert
4 - Wenn das Objekt -replaced ein ganzzahliger Wert ist, brauchen Sie keine Anführungszeichen, und sparen Sie weitere 2 Bytes

AdmBorkBork
quelle
2

Rubin, 58

Nichts Besonderes. Nur ein Zyklus ...

->s,a,i=0{a.cycle{|e|i+=0.5;break i if/[2-9]/!~'%d'%s+=e}}
Nicht dieser Charles
quelle
Wie machst du das?
bogl
1
@bogl Es ist ein Lambda - der einfachste Weg ist, die Parameter in eckigen Klammern anzuhängen. Oder Sie können das Lambda einer Variablen zuweisen und erneut Parameter in eckigen Klammern anhängen. ZB ->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]]oder ...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]]
Nicht dass Charles
1

Mathematica, 92 Bytes

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

Ja. Eingabe ist der Kilometerzähler und eine Liste der Zeiten. Ausgabe ist die Tageszählung.

CalculatorFeline
quelle
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 Version

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;
            }
        }
    }
}

PHP-Hinweise können gegen einen Aufpreis von 4 Zeichen $d = 0;in der Golfversion entfernt werden.

Beispiel

$i = 101101;
$s = [27, 27, 27, 27, 27, 27, 27, 27, 27, 27];
f($i,$s);
kuldeep.kamboj
quelle
Das Entfernen der geschweiften Klammern um if, das Entfernen der 0 von 0.5und das Entfernen |der 1 bis 0 in Ihrem Regex erspart Ihnen 4 Bytes. function f($i,$s){while(1)foreach($s as$v){$d+=.5;$i+=$v;if(preg_match('/^[01]+$/',$i))return$d;}}
Samsquanch
@ Samsquanch, guter Vorschlag, Klammern und 0 vor .5 deutlich habe ich verpasst. Jetzt geändert.
kuldeep.kamboj
1

Pyth, 36 32 30 Bytes

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

Probieren Sie es hier aus!

Erläuterung

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

Jvz # Startwert J zuweisen
   .V0 # Startet eine Endlosschleife, die ab 0 über b iteriert
      = J # Setze J auf
        + J # die Summe von J
          @Qb # und der Wert bei Q [b% len (q)]
             Ich # wenn
              <2 # niedriger als 2
                  {`J # Entferne doppelte Ziffern von J 
               ssM # Ordne die verbleibenden Ziffern ganzen Zahlen zu und summiere sie
                      KbB # Wenn das obige Ergebnis wahr ist, speichern Sie b in K und verlassen Sie die Schleife
                         ; # Schleifenkörper beenden
                           hK # Inkrement K, weil wir ein Schleifeninkrement verpasst haben
                          c 2 # und dividiere es durch 2, um die Tage zu erhalten

Denker
quelle
0

C Sharp, 180.

Sehr geehrter Herr C # ist lang.

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;}}
Morgan Thrapp
quelle