Quando terei um carro binário?

19

Percebi que o odômetro do meu carro estava em 101101 quando cheguei ao trabalho hoje. O que é um número interessante porque é binário (e um palíndromo, mas isso não é importante). Agora, quero saber quando da próxima vez vou ter uma leitura de odômetro binário. Não consigo ler o odômetro enquanto estou dirigindo, porque isso seria perigoso, portanto, terá que ser binário quando chegar ao trabalho ou chegar em casa.

Há um tráfego muito ruim no caminho de e para o meu escritório, por isso tenho que seguir uma rota diferente a cada dia.

Para os propósitos deste desafio, um dia é uma viagem de ida e volta e começa com meu trajeto para o trabalho.

Você precisará fazer a leitura inicial do odômetro e uma sequência de 10 elementos representando a quantidade de milhas em cada sentido. Essa sequência deve ser repetida até você chegar a uma leitura de odômetro binário. Você deve então imprimir o número de dias que leva até chegarmos a uma leitura binária.

Tanto a milhagem para a rota quanto a leitura do odômetro serão números inteiros positivos. A contagem de dias será xou x.5, portanto, a contagem da saída do dia precisará suportar ponto flutuante por meio dia. Se a contagem de dias for um número inteiro, você não precisará gerar o .0. O odômetro sempre chegará a um estado binário.

Qualquer forma de entrada / saída é aceitável e as brechas padrão não são permitidas.

Casos de teste:

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
fonte
Um resultado do dia será apenas um número inteiro ou um número inteiro mais meio?
FryAmTheEggman
2
@FryAmTheEggman Sim. Cada passo é meio dia.
22416 Morgan Thrapp
5
Onde você trabalha / mora que 3, 25 e 92 milhas (km?) São distâncias regulares aceitáveis ​​de deslocamento diário?
22616 kingofzeal
11
@kingofzeal Um buraco de minhoca.
Morgan Thrapp 22/02
11
@TobySpeight É um odômetro mágico com um número infinito de dígitos.
Morgan Thrapp

Respostas:

3

Geléia, 22 17 16 bytes

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

Experimente online!

Como 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.
Dennis
fonte
6

Javascript, 68 63 61 60 52 bytes

5 bytes de desconto, graças à @ETHproductions . 2 3 11 !! bytes desativados, graças a @NotthatCharles .

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

Teste aqui.

removido
fonte
Droga, você me venceu.
SuperJedi224 22/02
Funcionaria (i+=a[++m%10])?
ETHproductions
@ETHproductions. Um bom!! Eu esqueci que sempre será 10
removido
por que não inicializar r como 0,5? Ou não inicializar rou o mque quer que seja (eles devem usar como padrão nulo, ou seja, 0)
Não que Charles seja o dia
11
Você também pode salvar um byte criando m=0no inicializador e incrementando após modulo ( m++%10) ... nesse ponto, você pode simplesmente eliminar rcompletamente. Todo o método está nos 50 e poucos anos
Não que Charles
5

MATL , 29 26 25 bytes

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

O formato de entrada é

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

EDIT (10 de junho de 2016): O link a seguir substitui vpor &v( 26 bytes ) para se adaptar às alterações no idioma

Experimente 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
fonte
3

Lua, 108 bytes

Primeira vez usando o loop repeat..until em um 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

Após o primeiro loop, oterá uma parte decimal por causa de tonumber, tive que removê-lo ... E para adicioná-lo no primeiro caso, é por isso que concatená-lo com a ".".

Katenkyo
fonte
3

Java, 112 milhas 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
fonte
3

05AB1E , 31 bytes

Código:

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

De alguma forma, o código não para de ser executado (e não consigo entender o porquê) . Aparentemente, eu esqueci que existem três loops em vez de 2. Portanto, ele ainda entraria em um loop infinito ...

Experimente online!

Adnan
fonte
3

PowerShell, 84 73 67 59 57 bytes

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

Recebe informações $ae $b, esperando $bser uma matriz explícita de milhagens (por exemplo, .\binary-car.ps1 1 @(13,25,3,4,10,8,92,3,3,100)). Em seguida, inserimos um loop do/ until. A cada iteração, incrementamos $acom a milhagem na $bposição, de $i++ % 10forma a percorrer continuamente a matriz. Isso começará em zero, uma vez que, para o primeiro loop, o $iitem não é inicializado e, portanto, é avaliado como $null, o que equivale a 0esse contexto, e é somente após essa avaliação que ++ocorre.

Em seguida, as untildemonstrações verifica se o nosso número é apenas 0e 1pela primeira -replaceing tudo 1com nada, lançando isso de volta como um inteiro com +, e, em seguida, tomar o booleano, não com !. Se avaliar verdadeiro, terminaremos o loop, output$i / 2 e encerraremos o programa.

Explicação para o loop condicional - No PowerShell, qualquer número inteiro diferente de zero é $truee também qualquer sequência não vazia $true. Por exemplo, 231145(um número inteiro) mudará para "2345"(uma sequência) após o -replace, que será convertido como 2345um número inteiro, !cujo número é $false. No entanto, 101101(um número inteiro) irá alterar a "00"(uma cadeia) que vai expressos como 0(um número inteiro), o !de que é $true. Se não tivéssemos o +, a "00"vontade !de, $falseuma vez que é uma string não vazia.

Edit - salvas 11 bytes trocando igualdade-on-comprimento para estritamente de zero
Editar 2 - Salvo outras 6 bytes por perceber que $b.countsempre será 10...
Editar 3 - Salvo outras 8 bytes usando do / até que, em vez de para
editar 4 - Se o objeto sendo -replaced for um valor inteiro, não precisa de aspas, economizando outros 2 bytes

AdmBorkBork
fonte
2

Ruby, 58

Nada especial. Apenas um ciclo ...

->s,a,i=0{a.cycle{|e|i+=0.5;break i if/[2-9]/!~'%d'%s+=e}}
Não que Charles
fonte
Como você executa isso?
23616 bogl
11
@bogl É uma lambda - a maneira mais fácil é anexar os parâmetros entre colchetes. Ou você pode atribuir o lambda a uma variável e, novamente, anexar parâmetros entre colchetes. Por exemplo, ->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]]
Não é Charles 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)&

Sim. Entrada é o odômetro e uma lista de horários. Saída é a contagem de dias.

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

Versão 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;
            }
        }
    }
}

Os avisos do PHP podem ser removidos com um custo extra de 4 caracteres $d = 0;na versão golf.

Exemplo

$i = 101101;
$s = [27, 27, 27, 27, 27, 27, 27, 27, 27, 27];
f($i,$s);
kuldeep.kamboj
fonte
Remover as chaves ao redor do if, remover o 0 0.5e remover |entre 1 e 0 no seu regex economiza 4 bytes. function f($i,$s){while(1)foreach($s as$v){$d+=.5;$i+=$v;if(preg_match('/^[01]+$/',$i))return$d;}}
Samsquanch 23/02
@Samsquanch, boa sugestão, parênteses e 0 antes .5 claramente perdi. Alterado agora.
Kuldeep.kamboj
1

Pitão, 36 32 30 bytes

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

Experimente aqui!

Explicação

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

Jvz # atribui valor inicial a J
   .V0 # Inicia um loop infinito repetindo iterando b começando em 0
      = J # Defina J como
        + J # a soma de J
          @Qb # e o valor em Q [b% len (q)]
             Eu # se
              <2 # menor que 2
                  {`J # Remova dígitos duplicados de J 
               ssM # Mapeie os dígitos restantes de volta para números inteiros e some-os
                      KbB # se o acima for igual a true, salve b em K e deixe o loop
                         ; # Corpo do loop final
                           hK # Increment K porque perdemos um incremento de loop
                          c 2 # e divida por 2 para obter os dias

Denker
fonte
0

C Sharp, 180.

Caro senhor, C # é longo.

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
fonte