Когда у меня будет бинарный автомобиль?


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 мили (км?) Были регулярными приемлемыми расстояниями для поездок на работу?
kingofzeal

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

Javascript, 68 63 61 60 52 байта

5 байтов от спасибо @ETHproductions . 2 3 11 !! Спасибо, @NotthatCharles .

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

Проверьте здесь.


Черт, ты побил меня к этому.
SuperJedi224

Будет (i+=a[++m%10])работать?
ETHproductions

@ETHproductions. Хороший!! Я забыл, что всегда будет 10
удалено

почему бы не инициализировать r как 0.5? Или не инициализировать rили mчто-то еще (они должны по умолчанию равны нулю, т. Е. 0)
не то, что Чарльз

1
Вы также можете сохранить байт, выполнив m=0инициализатор и увеличив его после modulo ( 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 байт

Впервые с помощью цикла repeat..until в 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

После первого цикла 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/?}Ž}Ž

Почему-то код не перестает работать (и я не могу понять, почему) . Видимо, я забыл, что вместо 2 происходит три цикла, поэтому он все равно попадет в бесконечный цикл ...

Попробуйте онлайн!


3

PowerShell, 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не инициализируется, и поэтому оценивается как $null, что соответствует 0в этом контексте, и это только после этой оценки ++происходит.

Затем untilзаявление проверяет наш номер только 0и 1сначала -replaceИНГ все 1ничего, отливка , что еще как целое число с +, а затем принимать булево-не с !. Если он оценивается как true, мы закончим цикл, выведем $i / 2и завершим программу.

Пояснение к условному циклу - в PowerShell любое ненулевое целое число равно $trueи любая непустая строка также $true. Например, 231145(целое число) изменится на "2345"(строку) после -replace, который будет 2345приводить к целому числу (целое число), значение !которого равно $false. Однако 101101(целое число) изменится на "00"(строку), которая будет приведена как 0(целое число), значение !которого равно $true. Если мы не имеем +, то "00"воля !к , $falseтак как это не пустая строка.

Правка - Сохранение 11 байтов путем замены равенства по длине на строго нулевое значение
Правка 2 - Сохранение еще 6 байтов, понимая, что $b.countвсегда будет 10...
Правка 3 - Сохранение еще 8 байтов с использованием do / till вместо для
Правка 4 - Если объект -replaced является целочисленным значением, кавычки не нужны, сохраняя еще 2 байта


2

Руби, 58

Ничего особенного. Просто цикл ...

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

Как вы управляете этим?
Бог

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

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

Безголовая версия

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 могут быть удалены за дополнительную плату в 4 символа $d = 0;в версии для гольфа.

пример

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

Удаление фигурных скобок вокруг if, удаление 0 из 0.5и удаление |между 1 и 0 в вашем регулярном выражении экономит 4 байта. function f($i,$s){while(1)foreach($s as$v){$d+=.5;$i+=$v;if(preg_match('/^[01]+$/',$i))return$d;}}
Samsquanch

@Samsquanch, хорошее предложение, скобки и 0 перед .5 явно я пропустил. Изменилось сейчас.
kuldeep.kamboj

1

Pyth, 36 32 30 байт

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

Попробуй это здесь!

объяснение

Jvz.V0=J+J@QbI <ssM {`J2KbB; chK2 # Q = входная последовательность

Jvz # назначить начальное значение J
   .V0 # Запустить бесконечный цикл, повторяющийся по b, начиная с 0
      = J # Установите J в
        + J # сумма J
          @Qb # и значение в Q [b% len (q)]
             Я # если
              <2 # ниже 2
                  {`J # Удалить повторяющиеся цифры из J 
               ssM # Сопоставить оставшиеся цифры с целыми числами и суммировать их
                      KbB # если приведенное выше становится истинным, сохраните b в K и выйдите из цикла
                         ; # Конец тела цикла
                           hK # Приращение K, потому что мы пропустили одно приращение цикла
                          c 2 # и разделить его на 2, чтобы получить дни


0

С Sharp, 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 и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.