¿Cuándo tendré un auto binario?


19

Noté que el odómetro de mi auto estaba en 101101 cuando hoy me puse a trabajar. Lo cual es un número genial porque es binario (y un palíndromo, pero eso no es importante). Ahora, quiero saber cuándo la próxima vez tendré una lectura binaria del odómetro. No puedo leer el cuentakilómetros mientras conduzco, porque eso sería peligroso, por lo que tendrá que ser binario cuando llegue al trabajo o llegue a casa.

Hay muy mal tráfico en el camino hacia y desde mi oficina, así que tengo que tomar una ruta diferente cada día.

Para los propósitos de este desafío, un día es un viaje de ida y vuelta y comienza con mi viaje al trabajo.

Tendrá que tomar la lectura inicial del odómetro y una secuencia de 10 elementos que represente la cantidad de millas en cada sentido. Esta secuencia debe repetirse hasta llegar a una lectura binaria del odómetro. Luego, debe mostrar la cantidad de días que lleva hasta que lleguemos a una lectura binaria.

Tanto el kilometraje de la ruta como la lectura del odómetro serán enteros positivos. El recuento de días será xo x.5, por lo que su salida del recuento de días debe admitir coma flotante durante medio día. Si el recuento de días es un número entero, no necesita generar el .0. El odómetro siempre alcanzará un estado binario.

Cualquier forma de entrada / salida es aceptable y las lagunas estándar no están permitidas.

Casos de prueba:

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

¿El resultado de un día solo será un entero o un entero más la mitad?
FryAmTheEggman

2
@FryAmTheEggman Sí. Cada paso es medio día.
Morgan Thrapp

55
¿Dónde trabaja / vive que 3, 25 y 92 millas (km?) Son distancias de viaje regulares aceptables?
kingofzeal

1
@kingofzeal Un agujero de gusano.
Morgan Thrapp

1
@TobySpeight Es un odómetro mágico con un número infinito de dígitos.
Morgan Thrapp

Respuestas:


3

Jalea, 22 17 16 bytes

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

Pruébalo en línea!

Cómo funciona

Ṡç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

Javascript, 68 63 61 60 52 bytes

5 bytes de descuento gracias a @ETHproductions . 2 3 11 !! bytes desactivados gracias @NotthatCharles .

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

Prueba aquí.


Maldición, me ganaste.
SuperJedi224

Funcionaria (i+=a[++m%10])?
ETHproductions

@ETHproductions. Buena !! Olvidé que siempre será 10
eliminado

¿Por qué no inicializar r como 0.5? O no inicializar ro en mabsoluto (deberían ser nulos, es decir, 0)
No es que Charles

1
También puede guardar un byte introduciendo m=0el inicializador e incrementando después del módulo ( m++%10) ... en ese punto, puede soltarlo por rcompleto. Todo el método está en los bajos 50
No es que Charles

5

MATL , 29 26 25 bytes

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

El formato de entrada es

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

EDITAR (10 de junio de 2016): el siguiente enlace reemplaza vpor &v( 26 bytes ) para adaptarse a los cambios en el idioma

Pruébalo en línea!

`              ]           % 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

Lua, 108 bytes

Primera vez que utilizo la repetición ... hasta el bucle en 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

Sin 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

Después del primer bucle, otendré una parte decimal debido a tonumberque tuve que eliminarlo ... Y para agregarlo en el primer caso, es por eso que lo concateno con a ".".


3

Java, 112 millas 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;}}

3

05AB1E , 31 bytes

Código:

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

De alguna manera, el código no deja de ejecutarse (y no puedo entender por qué) . Aparentemente olvidé que hay tres bucles en lugar de 2. Así que todavía entraría en un bucle infinito ...

Pruébalo en línea!


3

PowerShell, 84 73 67 59 57 bytes

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

Toma información $ay $bespera $bser un conjunto explícito de kilometraje (por ejemplo, .\binary-car.ps1 1 @(13,25,3,4,10,8,92,3,3,100)). Luego ingresamos a do/ untilloop. Cada iteración, incrementamos $acon el kilometraje en la $bposición $i++ % 10para que recorramos continuamente la matriz. Esto comenzará en cero ya que para el primer bucle $ino se inicializa, por lo que se evalúa en $null, lo que equivale a 0en este contexto, y es solo después de esa evaluación ++ocurre.

Luego, el untilenunciado verifica si nuestro número es solo 0y, 1al principio -replace, 1no contiene nada, lo devuelve como un entero con +, y luego toma el Booleano-no con !. Si se evalúa verdadero, terminaremos el ciclo, salida$i / 2 y terminaremos el programa.

Explicación del bucle condicional: en PowerShell, cualquier número entero distinto de cero es $true, y cualquier cadena no vacía también lo es $true. Por ejemplo, 231145(un entero) cambiará a "2345"(una cadena) después de -replace, que se convertirá en entero como 2345(un entero), el !cual es $false. Sin embargo, 101101(un entero) cambiará a "00"(una cadena) que se convertirá como 0(un entero), el !cual es $true. Si no tuviéramos +la "00"voluntad! que $falseya que es una cadena no vacía.

Edición: guardó 11 bytes intercambiando igualdad en longitud por estrictamente cero
Edición 2: guardó otros 6 bytes al darse cuenta de que $b.countsiempre será 10...
Edición 3: guardó otros 8 bytes utilizando do / hasta en lugar de
Editar 4 - Si el objeto que -replacees d es un valor entero, no necesita comillas, guardando otros 2 bytes


2

Rubí, 58

Nada especial. Solo un ciclo ...

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

¿Cómo lo ejecutas?
bogl

1
@bogl Es una lambda: la forma más fácil es agregar los parámetros entre corchetes. O puede asignar la lambda a una variable y, nuevamente, agregar parámetros entre corchetes. Por ejemplo, ->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]]o ...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]]
No es que 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)&

Sí. La entrada es el odómetro y una lista de veces. La salida es el recuento de días.


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

Versión sin golf

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

Los avisos PHP se pueden eliminar con un costo adicional de 4 caracteres $d = 0; en la versión de golf.

Ejemplo

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

Quitar las llaves alrededor del if, quitar el 0 0.5y quitar |entre el 1 y el 0 en su expresión regular le ahorra 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, buena sugerencia, paréntesis y 0 antes de .5 claramente me perdí. Cambiado ahora.
kuldeep.kamboj

1

Pyth, 36 32 30 bytes

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

Pruébalo aquí!

Explicación

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

Jvz # asigna valor inicial a J
   .V0 # Comienza un ciclo infinito iterando sobre b comenzando en 0
      = J # Establezca J en
        + J # la suma de J
          @Qb # y el valor en Q [b% len (q)]
             Yo # si
              <2 # inferior a 2
                  {`J # Eliminar dígitos duplicados de J 
               ssM # Mapear los dígitos restantes de nuevo a enteros y sumarlos
                      KbB # si lo anterior se evalúa como verdadero, guarde b en K y deje el bucle
                         ; # Fin del cuerpo del bucle
                           hK # Incremento K porque perdimos un incremento de bucle
                          c 2 # y divídalo por 2 para obtener los días


0

C Sharp, 180.

Estimado señor C # es largo.

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;}}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.