Kapan saya akan memiliki mobil biner?


19

Saya perhatikan bahwa odometer mobil saya berada di 101101 ketika saya mulai bekerja hari ini. Yang merupakan angka keren karena biner (dan palindrom, tapi itu tidak penting). Sekarang, saya ingin tahu kapan waktu berikutnya saya akan membaca biner odometer. Saya tidak dapat membaca odometer saat mengemudi, karena itu akan berbahaya, jadi harus berupa biner ketika saya mulai bekerja atau pulang.

Ada lalu lintas yang sangat buruk dalam perjalanan ke dan dari kantor saya, jadi saya harus mengambil rute yang berbeda setiap hari.

Untuk keperluan tantangan ini, satu hari adalah perjalanan pulang pergi dan dimulai dengan perjalanan saya untuk bekerja.

Anda harus mengambil pembacaan awal odometer dan urutan 10 elemen yang mewakili jumlah mil setiap jalan. Urutan ini harus diulang sampai Anda mendapatkan pembacaan odometer biner. Anda kemudian harus menampilkan jumlah hari yang diperlukan sampai kita mendapatkan pembacaan biner.

Baik jarak tempuh untuk rute dan pembacaan odometer akan menjadi bilangan bulat positif. Hitungan hari akan menjadi xatau x.5, jadi output Anda dari hitungan hari perlu mendukung floating point selama setengah hari. Jika hitungan hari adalah bilangan bulat, Anda tidak perlu menampilkan .0. Odometer pada akhirnya akan selalu mencapai status biner.

Segala bentuk input / output dapat diterima dan celah standar tidak diizinkan.

Kasus uji:

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

Akankah hasil sehari hanya berupa bilangan bulat atau bilangan bulat ditambah setengah?
FryAmTheEggman

2
@FryAmTheEggman Ya. Setiap langkah setengah hari.
Morgan Thrapp

5
Di mana Anda bekerja / tinggal yang 3, 25, dan 92 mil (km?) Adalah jarak perjalanan reguler yang dapat diterima?
kingofzeal

1
@kingofzeal A wormhole.
Morgan Thrapp

1
@TobySpeight Ini adalah odometer ajaib dengan jumlah digit yang tak terbatas.
Morgan Thrapp

Jawaban:


3

Jelly, 22 17 16 byte

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

Cobalah online!

Bagaimana itu bekerja

Ṡç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 off terima kasih @ETHproductions . 2 3 11 !! mati byte terima kasih @NotthatCharles .

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

Tes di sini.


Sial, Anda mengalahkan saya untuk itu.
SuperJedi224

Akan (i+=a[++m%10])bekerja
ETHproduksi

@ ETHproductions. Bagus !! Saya lupa itu akan selalu 10
dihapus

mengapa tidak menginisialisasi r sebagai 0,5? Atau tidak menginisialisasi ratau mapa pun (mereka harus default ke nol, yaitu., 0)
Bukan berarti Charles

1
Anda juga dapat menyimpan byte dengan membuat m=0inisialisasi dan selisih setelah modulo ( m++%10) ... di mana Anda hanya bisa menjatuhkan rseluruhnya. Seluruh metode kemudian di 50
Bukan bahwa Charles

5

MATL , 29 26 25 byte

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

Format input adalah

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

EDIT (10 Juni 2016): Tautan berikut menggantikan vdengan &v( 26 byte ) untuk beradaptasi dengan perubahan dalam bahasa

Cobalah 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 Bytes

Pertama kali menggunakan pengulangan..sampai loop dalam 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

Tidak disatukan

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

Setelah loop pertama, oakan memiliki bagian desimal karena tonumber, saya harus menghapusnya ... Dan menambahkannya untuk kasus pertama, itu sebabnya saya menggabungkannya dengan a ".".


3

Java, 112 mil 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

Kode:

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

Entah bagaimana, kode tidak berhenti berjalan (dan saya tidak tahu mengapa) . Rupanya saya lupa bahwa ada tiga loop yang terjadi bukannya 2. Jadi itu masih akan masuk ke loop yang tak terbatas ...

Cobalah online!


3

PowerShell, 84 73 67 59 57 byte

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

Mengambil input $adan $b, berharap $bmenjadi array jarak tempuh yang eksplisit (mis., .\binary-car.ps1 1 @(13,25,3,4,10,8,92,3,3,100)). Kami kemudian memasukkan do/ untilloop. Setiap iterasi, kita bertambah $adengan jarak tempuh di $bposisi $i++ % 10sehingga kita terus menerus melewati array. Ini akan mulai dari nol karena untuk loop pertama $itidak diinisialisasi, dan mengevaluasi $null, yang sama dengan 0dalam konteks ini, dan hanya setelah evaluasi itulah yang ++terjadi.

Kemudian, untilpernyataan memeriksa apakah nomor kita hanya 0dan 1dengan pertama- -replacetama 1memasukkan semua dengan tidak ada, melemparkannya kembali sebagai bilangan bulat dengan +, dan kemudian mengambil Boolean-bukan dengan !. Jika itu bernilai true, kami akan menyelesaikan loop, output $i / 2, dan mengakhiri program.

Penjelasan untuk kondisi loop - Di PowerShell, bilangan bulat bukan nol adalah $trueapa pun, dan string apa pun yang tidak kosong juga $true. Misalnya, 231145(integer) akan berubah menjadi "2345"(string) setelah -replace, yang akan integer-cast sebagai 2345(integer), yang !mana adalah $false. Namun, 101101(bilangan bulat) akan berubah menjadi "00"(string) yang akan dilemparkan sebagai 0(bilangan bulat), yang !mana adalah $true. Jika kita tidak memiliki +, "00"kemauan !untuk $falsekarena itu adalah string yang tidak kosong.

Sunting - Disimpan 11 byte dengan menukar kesetaraan-pada-panjang untuk ketat-nol
Sunting 2 - Menyimpan 6 byte lainnya dengan menyadari bahwa $b.countakan selalu 10...
Sunting 3 - Menyimpan 8 byte lainnya dengan menggunakan do / sampai alih-alih untuk
Edit 4 - Jika objek -replaced adalah nilai integer, tidak perlu tanda kutip, menyimpan 2 byte lagi


2

Ruby, 58

Tidak ada yang spesial. Hanya satu siklus ...

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

Bagaimana Anda menjalankannya?
Bogl

1
@ Bogl Ini lambda - cara termudah adalah menambahkan params dalam tanda kurung. Atau Anda dapat menetapkan lambda ke variabel dan, sekali lagi, menambahkan params dalam tanda kurung. Misalnya, ->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]]atau ...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]]
Bukan berarti 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)&

Ya. Input adalah odometer dan daftar waktu. Output adalah hitungan hari.


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

Versi Tidak Serigala

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

Pemberitahuan PHP dapat dihapus dengan biaya tambahan 4 karakter $d = 0;dalam versi golf.

Contoh

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

Menghapus kurung kurawal di sekitar if, menghapus 0 dari 0.5, dan menghapus |antara 1 dan 0 di regex Anda menghemat 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, saran bagus, tanda kurung dan 0 sebelumnya .5 jelas saya ketinggalan. Berubah sekarang.
kuldeep.kamboj

1

Pyth, 36 32 30 byte

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

Coba di sini!

Penjelasan

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

Jvz # menetapkan nilai awal ke J
   .V0 # Mulai perulangan tak terbatas berulang di atas b mulai dari 0
      = J # Atur J ke
        + J # jumlah dari J
          @Qb # dan nilainya pada Q [b% len (q)]
             Saya # jika
              <2 # lebih rendah dari 2
                  {`J # Hapus digit duplikat dari J 
               ssM # Memetakan angka yang dipindai kembali ke bilangan bulat dan menjumlahkannya
                      KbB # jika jawaban di atas benar, simpan b ke K dan tinggalkan loop
                         ; # Akhiri loop body
                           hK # Increment K karena kami melewatkan peningkatan satu loop
                          c 2 # dan membaginya dengan 2 untuk mendapatkan hari


0

C Sharp, 180.

Tuan C # yang panjang.

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;}}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.