Quando avrò un'auto binaria?


19

Ho notato che il contachilometri della mia macchina era a 101101 quando ho iniziato a lavorare oggi. Il che è un numero interessante perché è binario (e un palindromo, ma non è importante). Ora, voglio sapere quando la prossima volta avrò una lettura del contachilometri binario. Non riesco a leggere il contachilometri mentre guido, perché sarebbe pericoloso, quindi dovrà essere binario sia quando lavoro che torno a casa.

C'è un traffico davvero scarso sulla strada da e per il mio ufficio, quindi devo prendere un percorso diverso ogni giorno.

Ai fini di questa sfida, una giornata è di andata e ritorno e inizia con il mio viaggio al lavoro.

Dovrai prendere la lettura iniziale del contachilometri e una sequenza di 10 elementi che rappresenta la quantità di miglia a tratta. Questa sequenza dovrebbe essere ripetuta fino ad arrivare a una lettura del contachilometri binario. Dovresti quindi visualizzare il numero di giorni necessari fino a quando non arriviamo a una lettura binaria.

Sia il chilometraggio per il percorso che la lettura del contachilometri saranno numeri interi positivi. Il conteggio dei giorni sarà xo x.5, quindi l'output del conteggio dei giorni deve supportare il virgola mobile per mezza giornata. Se il conteggio dei giorni è un numero intero, non è necessario generare l'output .0. L'odometro raggiungerà sempre uno stato binario.

Qualsiasi forma di input / output è accettabile e le scappatoie standard sono vietate.

Casi test:

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

Il risultato di un giorno sarà sempre e solo un numero intero o un numero intero più la metà?
FryAmTheEggman,

2
@FryAmTheEggman Sì. Ogni passaggio è di mezza giornata.
Morgan Thrapp,

5
Dove lavori / vivi che 3, 25 e 92 miglia (km?) Sono distanze regolari accettabili?
Kingofzeal,

1
@kingofzeal Un wormhole.
Morgan Thrapp,

1
@TobySpeight È un contachilometri magico con un numero infinito di cifre.
Morgan Thrapp,

Risposte:


3

Gelatina, 22 17 16 byte

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

Provalo online!

Come funziona

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

5 byte di sconto grazie a @ETHproductions . 2 3 11 !! grazie grazie @NotthatCharles .

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

Prova qui


Accidenti, mi hai battuto.
SuperJedi224,

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

@ETHproductions. Buona !! Ho dimenticato che saranno sempre le 10
rimosse il

perché non inizializzare r come 0,5? O non inizializzare ro mqualsiasi altra cosa (dovrebbero essere predefiniti su null, cioè. 0)
Non che Charles

1
Puoi anche salvare un byte inserendo m=0l'inizializzatore e incrementandolo dopo modulo ( m++%10) ... a quel punto puoi semplicemente rilasciarlo rcompletamente. L'intero metodo è quindi nei bassi anni '50
Non che Charles

5

MATL , 29 26 25 byte

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

Il formato di input è

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

EDIT (10 giugno 2016): il seguente link sostituisce vcon &v( 26 byte ) per adattarsi ai cambiamenti nella lingua

Provalo 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

3

Lua, 108 byte

Prima volta usando il ciclo repeat..until in 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

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

Dopo il primo ciclo, oavrà una parte decimale a causa di tonumber, ho dovuto rimuoverlo ... E per aggiungerlo per il primo caso, ecco perché lo concateno con a ".".


3

Java, 112 miglia byte

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 byte

Codice:

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

In qualche modo, il codice non smette di funzionare (e non riesco a capire perché) . Apparentemente ho dimenticato che ci sono tre cicli in corso invece di 2. Quindi entrerebbe comunque in un ciclo infinito ...

Provalo online!


3

PowerShell, 84 73 67 59 57 byte

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

Prende input $ae $b, prevedendo $bdi essere un array esplicito di miglia (ad es .\binary-car.ps1 1 @(13,25,3,4,10,8,92,3,3,100).). Quindi inseriamo un do/ untilloop. Ad ogni iterazione, aumentiamo $acon il chilometraggio in $bposizione in $i++ % 10modo da scorrere continuamente l'array. Questo inizierà da zero poiché per il primo ciclo il $inon è inizializzato, e quindi valuta $null, il che equivale a 0in questo contesto, ed è solo dopo quella valutazione che si ++verifica.

Quindi, l' untilistruzione verifica se il nostro numero è solo 0e 1prima -replaceing tutto 1senza nulla, eseguendo il casting come numero intero con +, e quindi prendendo il Booleano-non con !. Se viene valutato vero, finiremo il ciclo, l'output $i / 2e termineremo il programma.

Spiegazione per il condizionale del ciclo: in PowerShell, qualsiasi numero intero diverso da zero è $truee anche qualsiasi stringa non vuota $true. Ad esempio, 231145(un numero intero) cambierà in "2345"(una stringa) dopo il -replace, che sarà intero-cast come 2345(un numero intero), il !cui è $false. Tuttavia, 101101(un numero intero) cambierà in "00"(una stringa) che verrà castato come 0(un numero intero), il !cui è $true. Se non avessimo la +, la "00"volontà !di $falsedal momento che è una stringa non vuota.

Modifica: salvati 11 byte scambiando uguaglianza su lunghezza per rigorosamente zero
Modifica 2: salvati altri 6 byte realizzando che $b.countsarà sempre 10...
Modifica 3: salvati altri 8 byte utilizzando do / fino a quando invece di
Modifica 4 - Se l'oggetto essendo -replaced è un valore intero, non sono necessarie virgolette, salvando altri 2 byte


2

Ruby, 58 anni

Niente di speciale. Solo un ciclo ...

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

Come lo esegui?
bogl

1
@bogl È un lambda - il modo più semplice è aggiungere i parametri tra parentesi quadre. Oppure puoi assegnare la lambda a una variabile e, di nuovo, aggiungere i parametri tra parentesi quadre. Ad esempio, ->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]]
Non che Charles

1

Mathematica, 92 byte

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

Sì. L'ingresso è il contachilometri e un elenco di volte. L'output è il conteggio dei giorni.


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

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

Gli avvisi PHP possono essere rimossi con un costo aggiuntivo di 4 caratteri $d = 0;nella versione golf.

Esempio

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

Rimuovendo le parentesi graffe attorno a if, rimuovendo lo 0 da 0.5e rimuovendo |tra 1 e 0 nel regex si risparmiano 4 byte. function f($i,$s){while(1)foreach($s as$v){$d+=.5;$i+=$v;if(preg_match('/^[01]+$/',$i))return$d;}}
Samsquanch,

@Samsquanch, buon suggerimento, parentesi e 0 prima .5 chiaramente mi mancava. Modificato ora.
kuldeep.kamboj,

1

Pyth, 36 32 30 byte

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

Provalo qui!

Spiegazione

Jvz.V0=J+J@QbI <ssM {`J2KbB; chK2 # Q = sequenza di input

Jvz # assegna il valore iniziale a J
   .V0 # Avvia un ciclo infinito che scorre su b a partire da 0
      = J # Impostare J su
        + J # la somma di J
          @Qb # e il valore in Q [b% len (q)]
             I # if
              <2 # inferiore a 2
                  {`J # Rimuovi le cifre duplicate da J 
               ssM # Mappa le cifre rimanenti in numeri interi e somma
                      KbB # se quanto sopra passa a true, salva b in K e lascia il ciclo
                         ; # Corpo dell'anello terminale
                           hK # Incrementa K perché abbiamo perso un incremento di loop
                          c 2 # e dividerlo per 2 per ottenere i giorni


0

C Sharp, 180.

Caro signore, C # è lungo.

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;}}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.