Kiedy będę miał samochód binarny?

19

Zauważyłem, że licznik kilometrów mojego samochodu wyniósł 101101, kiedy dzisiaj zacząłem pracować. Co jest fajną liczbą, ponieważ jest binarna (i palindromem, ale to nie jest ważne). Teraz chcę wiedzieć, kiedy następnym razem będę miał odczyt binarnego licznika kilometrów. Nie mogę odczytać licznika przebiegu podczas jazdy, ponieważ byłoby to niebezpieczne, więc będzie musiał być binarny, kiedy będę w pracy lub w domu.

W drodze do iz mojego biura jest naprawdę duży ruch, więc muszę codziennie wybierać inną trasę.

Na potrzeby tego wyzwania dzień jest podróżą w obie strony i zaczyna się od mojej dojazdy do pracy.

Musisz wykonać wstępny odczyt licznika przebiegu i sekwencję 10 elementów reprezentującą liczbę mil w każdą stronę. Ta sekwencja powinna być powtarzana aż do binarnego odczytu licznika przebiegu. Następnie powinieneś podać liczbę dni, które upłyną, zanim przejdziemy do odczytu binarnego.

Zarówno przebieg trasy, jak i odczyt licznika przebiegu będą dodatnimi liczbami całkowitymi. Liczba dni będzie równa xlub x.5, więc wynik liczenia dni musi obsługiwać zmiennoprzecinkowe przez pół dnia. Jeśli liczba dni jest liczbą całkowitą, nie trzeba podawać wartości .0. Drogomierz zawsze ostatecznie osiągnie stan binarny.

Wszelkie formy wejścia / wyjścia są dopuszczalne, a standardowe luki są niedozwolone.

Przypadki testowe:

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
źródło
Czy wynikiem dnia będzie tylko liczba całkowita lub liczba całkowita plus połowa?
FryAmTheEggman
2
@FryAmTheEggman Tak. Każdy krok trwa pół dnia.
Morgan Thrapp
5
Gdzie pracujesz / mieszkasz, że 3, 25 i 92 mil (km?) To regularne dopuszczalne odległości dojazdy?
kingofzeal
1
@kingofzeal A tunel czasoprzestrzenny.
Morgan Thrapp
1
@TobySpeight To magiczny licznik kilometrów z nieskończoną liczbą cyfr.
Morgan Thrapp

Odpowiedzi:

3

Galaretka, 22 17 16 bajtów

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

Wypróbuj online!

Jak to działa

Ṡç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
źródło
6

JavaScript, 68 63 61 60 52 bajtów

5 bajtów taniej dzięki @ETHproductions . 2 3 11 !! bajty wyłączone dzięki @NotthatCharles .

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

Przetestuj tutaj.

oddalony
źródło
Cholera, pobiłeś mnie do tego.
SuperJedi224
Czy (i+=a[++m%10])zadziała?
ETHprodukcje
@ETHproductions. Dobry!! Zapomniałem, że zawsze będzie 10
usunięto
dlaczego nie zainicjować r jako 0,5? Lub nie inicjować rani w mogóle (powinny domyślnie mieć wartość null, tj. 0)
Nie to, że Charles
1
Możesz także zapisać bajt, wykonując m=0inicjalizator i zwiększając wartość po modulo ( m++%10) ... w którym momencie możesz po prostu rcałkowicie upuścić . Cała metoda jest wtedy w niskich 50.
Nie, że Charles
5

MATL , 29 26 25 bajtów

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

Format wejściowy to

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

EDIT (10 czerwca 2016): Tekst Link vautorstwa &v( 26 bajtów ) w celu dostosowania się do zmian w języku

Wypróbuj 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
źródło
3

Lua, 108 bajtów

Po raz pierwszy użyj pętli repeat..until w 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

Nie golfił

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

Po pierwszej pętli obędzie miała część dziesiętną, ponieważ tonumbermusiałem ją usunąć ... I aby dodać ją do pierwszego przypadku, dlatego łączę ją z ".".

Katenkyo
źródło
3

Java, 112 mil bajtów

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
źródło
3

05AB1E , 31 bajtów

Kod:

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

Jakoś kod nie przestaje działać (i nie wiem, dlaczego) . Najwyraźniej zapomniałem, że zamiast 2 działają trzy pętle, więc nadal byłby w nieskończonej pętli ...

Wypróbuj online!

Adnan
źródło
3

PowerShell, 84 73 67 59 57 bajtów

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

Pobiera dane wejściowe $ai $boczekuje, że $bbędzie to wyraźna tablica przebiegów (np .\binary-car.ps1 1 @(13,25,3,4,10,8,92,3,3,100).). Następnie wprowadzamy pętlę do/ until. Każdą iterację zwiększamy $awraz z przebiegiem w $bpozycji, $i++ % 10tak aby stale pętli w tablicy. Rozpocznie się od zera, ponieważ dla pierwszej pętli $inie jest inicjowana, a więc ocenia na $null, co jest równoznaczne 0w tym kontekście, i dopiero po tej ocenie++ .

Następnie untilinstrukcja sprawdza, czy nasz numer jest tylko 0i 1, najpierw przez -replacezliczenie wszystkiego 1z niczym, odrzucając tę ​​liczbę jako liczbę całkowitą +, a następnie biorąc wartość logiczną - nie !. Jeśli okaże się prawda, zakończymy pętlę, wyjście$i / 2 i zakończymy program.

Wyjaśnienie dotyczące pętli warunkowej - w programie PowerShell dowolna niezerowa liczba całkowita jest taka sama$true , jak każdy niepusty łańcuch $true. Na przykład 231145(liczba całkowita) zmieni się na "2345"(ciąg) po znaku -replace, który będzie rzutowany 2345na liczbę całkowitą jako (liczba całkowita), !z których jest $false. Jednak 101101(liczba całkowita) zmieni się na "00"(ciąg), który będzie rzutował jako 0(liczba całkowita), !z których jest $true. Jeśli nie mają +, "00"będzie !do$false ponieważ jest to niepusty ciąg.

Edycja - Zapisano 11 bajtów poprzez zamianę równości na długość dla ściśle zerowego
Edycja 2 - Zapisano kolejne 6 bajtów, zdając sobie sprawę, że $b.countzawsze będzie 10...
Edytuj 3 - Zapisałem kolejne 8 bajtów, używając do / do zamiast
Edycja 4 - Jeśli obiekt będący -replaced jest liczbą całkowitą, nie potrzebujesz cudzysłowów, oszczędzając kolejne 2 bajty

AdmBorkBork
źródło
2

Ruby, 58

Nic specjalnego. Tylko cykl ...

->s,a,i=0{a.cycle{|e|i+=0.5;break i if/[2-9]/!~'%d'%s+=e}}
Nie ten Charles
źródło
Jak to działa?
bagno
1
@bogl To lambda - najprostszym sposobem jest dołączenie parametrów w nawiasach kwadratowych. Lub możesz przypisać lambda do zmiennej i ponownie dołączyć parametry w nawiasach kwadratowych. Np. ->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]]Lub ...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]]
Nie, że Charles
1

Mathematica, 92 bajty

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

Tak. Dane wejściowe to licznik kilometrów i lista czasów. Dane wyjściowe to liczba dni.

CalculatorFeline
źródło
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;}}

Wersja bez golfa

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

Powiadomienia PHP mogą być usuwane za dodatkową opłatą 4 znaków $d = 0;w wersji golfowej.

Przykład

$i = 101101;
$s = [27, 27, 27, 27, 27, 27, 27, 27, 27, 27];
f($i,$s);
kuldeep.kamboj
źródło
Usunięcie nawiasów klamrowych wokół if, usunięcie 0 z 0.5i usunięcie |między 1 a 0 w wyrażeniu regularnym pozwala zaoszczędzić 4 bajty. function f($i,$s){while(1)foreach($s as$v){$d+=.5;$i+=$v;if(preg_match('/^[01]+$/',$i))return$d;}}
Samsquanch
@Samsquanch, dobra sugestia, nawiasy klamrowe i 0 przed .5 wyraźnie brakowało. Zmieniono teraz.
kuldeep.kamboj
1

Pyth, 36 32 30 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie

Jvz.V0=J+J@QbI <ssM {`J2KbB; chK2 # Q = sekwencja wejściowa

Jvz # przypisz wartość początkową do J
   .V0 # Uruchom nieskończoną pętlę iterującą od b, zaczynając od 0
      = J # Ustaw J na
        + J # suma J
          @Qb # i wartość w Q [b% len (q)]
             I # if
              <2 # niższy niż 2
                  {`J # Usuń zduplikowane cyfry z J 
               ssM # Zamapuj pozostałe cyfry z powrotem na liczby całkowite i zsumuj je
                      KbB # jeśli powyższa wartość ma wartość true, zapisz b do K i opuść pętlę
                         ; # Korpus pętli końcowej
                           hK # Przyrost K, ponieważ przeoczyliśmy jeden przyrost pętli
                          c 2 # i podziel go przez 2, aby uzyskać dni

Denker
źródło
0

C Sharp, 180.

Drogi panie C # jest długi.

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
źródło