Quand vais-je avoir une voiture binaire?

19

J'ai remarqué que le compteur kilométrique de ma voiture était à 101101 lorsque j'ai commencé à travailler aujourd'hui. C'est un chiffre sympa parce que c'est binaire (et un palindrome, mais ce n'est pas important). Maintenant, je veux savoir quand la prochaine fois je vais avoir un compteur kilométrique binaire. Je ne peux pas lire le compteur kilométrique pendant que je conduis, car ce serait dangereux, donc il faudra que ce soit binaire lorsque je vais au travail ou à la maison.

Il y a vraiment une mauvaise circulation sur le chemin de et vers mon bureau, donc je dois emprunter un itinéraire différent chaque jour.

Aux fins de ce défi, une journée est un aller-retour et commence par mon trajet au travail.

Vous devrez prendre la lecture initiale de l'odomètre et une séquence de 10 éléments représentant le nombre de miles dans chaque sens. Cette séquence doit être répétée jusqu'à ce que vous arriviez à une lecture d'odomètre binaire. Vous devez ensuite afficher le nombre de jours nécessaires pour arriver à une lecture binaire.

Le kilométrage pour l'itinéraire et la lecture du compteur kilométrique seront des entiers positifs. Le nombre de jours sera soit xou x.5, donc votre sortie du nombre de jours doit prendre en charge la virgule flottante pendant une demi-journée. Si le nombre de jours est un entier, vous n'avez pas besoin de sortir le .0. Le compteur kilométrique atteindra toujours éventuellement un état binaire.

Toute forme d'entrée / sortie est acceptable et les failles standard sont interdites.

Cas de test:

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
la source
Un résultat journalier ne sera-t-il jamais qu'un entier ou un entier plus un demi?
FryAmTheEggman
2
@FryAmTheEggman Oui. Chaque étape dure une demi-journée.
Morgan Thrapp
5
Où travaillez-vous / vivez-vous à une distance de 3, 25 et 92 miles (km?) Régulière acceptable?
kingofzeal
1
@kingofzeal Un trou de ver.
Morgan Thrapp
1
@TobySpeight C'est un odomètre magique avec un nombre infini de chiffres.
Morgan Thrapp

Réponses:

3

Gelée, 22 17 16 octets

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

Essayez-le en ligne!

Comment ça fonctionne

Ṡç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
la source
6

Javascript, 68 63 61 60 52 octets

5 octets de réduction grâce à @ETHproductions . 2 3 11 !! octets de réduction merci @NotthatCharles .

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

Testez ici.

supprimé
la source
Bon sang, tu m'as battu.
SuperJedi224 du
Ça (i+=a[++m%10])marcherait?
ETHproductions
@ETHproductions. Bon !! J'ai oublié qu'il sera toujours 10
supprimé le
pourquoi ne pas initialiser r à 0,5? Ou ne pas initialiser rou mquoi que ce soit (ils devraient par défaut être nuls, c.-à-d., 0)
Pas que Charles
1
Vous pouvez également enregistrer un octet en effectuant m=0l'initialisation et l'incrémenter après modulo ( m++%10) ... à quel point vous pouvez simplement le supprimer rentièrement. Toute la méthode est alors dans les années 50
Pas que Charles
5

MATL , 29 26 25 octets

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

Le format d'entrée est

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

EDIT (10 juin 2016): Le lien suivant remplace vpar &v( 26 octets ) pour s'adapter aux changements de langue

Essayez-le en ligne!

`              ]           % 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
la source
3

Lua, 108 octets

Première utilisation de la boucle repeat..until dans un 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

Non golfé

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

Après la première boucle, oaura une partie décimale à cause de tonumber, j'ai dû la supprimer ... Et pour l'ajouter pour le premier cas, c'est pourquoi je la concatène avec un ".".

Katenkyo
la source
3

Java, 112 milles octets

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
la source
3

05AB1E , 31 octets

Code:

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

D'une manière ou d'une autre, le code ne s'arrête pas (et je ne comprends pas pourquoi) . Apparemment, j'oubliais qu'il y avait trois boucles en cours au lieu de 2. Donc, cela entrerait toujours dans une boucle infinie ...

Essayez-le en ligne!

Adnan
la source
3

PowerShell, 84 73 67 59 57 octets

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

Prend des entrées $aet $b, s'attendant $bà être un tableau explicite de kilométrages (par exemple, .\binary-car.ps1 1 @(13,25,3,4,10,8,92,3,3,100)). On entre alors dans une boucle do/ until. À chaque itération, nous incrémentons $ale kilométrage en $bposition at $i++ % 10afin de parcourir en continu le tableau. Cela commencera à zéro car pour la première boucle, le $in'est pas initialisé, et est donc évalué à $null, ce qui équivaut à 0dans ce contexte, et ce n'est qu'après cette évaluation que ++se produit.

Ensuite, l' untilinstruction vérifie si notre nombre est seulement 0et 1en -replacecommençant 1par rien, en le convertissant en entier avec +, puis en prenant le booléen-pas avec !. S'il vaut vrai, nous terminerons la boucle, sortirons $i / 2et terminerons le programme.

Explication de la boucle conditionnelle - Dans PowerShell, tout entier non nul est $true, et toute chaîne non vide l'est également $true. Par exemple, 231145(un entier) deviendra "2345"(une chaîne) après le -replace, qui sera converti en entier comme 2345(un entier), !dont le est $false. Cependant, 101101(un entier) deviendra "00"(une chaîne) qui sera convertie en 0(un entier), !dont la valeur est $true. Si nous n'avions pas le +, la "00"volonté !de $falsepuisque c'est une chaîne non vide.

Edit - Enregistré 11 octets en échangeant l'égalité sur la longueur pour strictement zéro
Edit 2 - Enregistré encore 6 octets en réalisant que ce $b.countsera toujours 10...
Edit 3 - Enregistré encore 8 octets en utilisant do / until au lieu de for
Edit 4 - Si l'objet étant -replaced est une valeur entière, pas besoin de guillemets, économisant encore 2 octets

AdmBorkBork
la source
2

Rubis, 58

Rien de spécial. Juste un cycle ...

->s,a,i=0{a.cycle{|e|i+=0.5;break i if/[2-9]/!~'%d'%s+=e}}
Pas que Charles
la source
Comment le gérez-vous?
bogl
1
@bogl C'est un lambda - le plus simple est d'ajouter les paramètres entre crochets. Ou vous pouvez affecter le lambda à une variable et, encore une fois, ajouter des paramètres entre crochets. Par exemple, ->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]]ou ...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]]
Pas que Charles
1

Mathematica, 92 octets

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

Oui. L'entrée est l'odomètre et une liste d'heures. La sortie est le nombre de jours.

CalculatorFeline
la source
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;}}

Version non golfée

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

Les avis PHP peuvent être supprimés du coût supplémentaire de 4 caractères $d = 0;dans la version golfée.

Exemple

$i = 101101;
$s = [27, 27, 27, 27, 27, 27, 27, 27, 27, 27];
f($i,$s);
kuldeep.kamboj
la source
La suppression des accolades autour du if, la suppression du 0 0.5et la suppression |entre le 1 et le 0 dans votre expression régulière vous permettent d'économiser 4 octets. function f($i,$s){while(1)foreach($s as$v){$d+=.5;$i+=$v;if(preg_match('/^[01]+$/',$i))return$d;}}
Samsquanch
@Samsquanch, bonne suggestion, crochets et 0 avant 0,5 clairement j'ai manqué. Changé maintenant.
kuldeep.kamboj
1

Pyth, 36 32 30 octets

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

Essayez-le ici!

Explication

Jvz.V0=J+J@QbI <ssM {`J2KbB; chK2 # Q = séquence d'entrée

Jvz # attribue une valeur de départ à J
   .V0 # Démarrer une boucle infinie itérant sur b à partir de 0
      = J # Réglez J sur
        + J # la somme de J
          @Qb # et la valeur à Q [b% len (q)]
             Je # si
              <2 # inférieur à 2
                  {`J # Supprimer les chiffres en double de J 
               ssM # Mappez les chiffres restants en nombres entiers et additionnez-les
                      KbB # si ce qui précède est vrai, enregistrez b dans K et quittez la boucle
                         ; # Corps de boucle d'extrémité
                           hK # Increment K parce que nous avons manqué un incrément de boucle
                          c 2 # et divisez-le par 2 pour obtenir les jours

Denker
la source
0

C Sharp, 180.

Cher seigneur C # est long.

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
la source