Коли у мене буде двійковий автомобіль?


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

EDIT (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 байт

Перший раз, використовуючи цикл повторення..утиліта у кодовому гольфі!

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

Безумовно

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, мені довелося його видалити ... І додати його для першого випадку, тому я з'єднав його з a ".".


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нічим, віддаючи це назад як ціле число +, а потім приймаючи булеве-не з !. Якщо він оцінить істину, ми закінчимо цикл, виведемо $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 / поки замість
Edit 4 - Якщо об'єкт -replaced є цілим числом, не потрібні лапки, зберігаючи ще 2 байти


2

Рубі, 58

Нічого особливого. Просто цикл ...

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

Як ти це запускаєш?
bogl

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

Математика, 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, хороша пропозиція, дужки та 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 # якщо вищезгадане оцінюється як true, збережіть b до K і залиште цикл
                         ; # Тіло кінця петлі
                           hK # Приріст K, оскільки ми пропустили один приріст циклу
                          c 2 # і розділіть його на 2, щоб отримати дні


0

C Різкий, 180.

Шановний пане С # довго.

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.