Khi nào tôi sẽ có một chiếc xe nhị phân?


19

Tôi nhận thấy rằng đồng hồ đo của xe tôi ở mức 101101 khi tôi phải làm việc hôm nay. Đó là một con số tuyệt vời bởi vì nó là nhị phân (và một bảng màu, nhưng điều đó không quan trọng). Bây giờ, tôi muốn biết khi nào lần tới tôi sẽ đọc số đo đường nhị phân. Tôi không thể đọc đồng hồ đo khi đang lái xe, vì điều đó sẽ nguy hiểm, vì vậy nó sẽ phải là hệ nhị phân khi tôi đi làm hoặc về nhà.

Có lưu lượng truy cập rất tệ trên đường đến và từ văn phòng của tôi, vì vậy tôi phải đi một tuyến đường khác nhau mỗi ngày.

Đối với mục đích của thử thách này, một ngày là một chuyến đi khứ hồi và bắt đầu với việc đi làm của tôi.

Bạn sẽ cần phải thực hiện việc đọc ban đầu của odometer và một chuỗi 10 yếu tố đại diện cho số lượng dặm mỗi chiều. Trình tự này nên được lặp lại cho đến khi bạn đọc được một chỉ số đo đường nhị phân. Sau đó, bạn nên xuất số ngày cần cho đến khi chúng tôi nhận được đọc nhị phân.

Cả milage cho tuyến đường và đọc số đo đường sẽ là số nguyên dương. Số ngày sẽ là xhoặc x.5, do đó, đầu ra số ngày của bạn cần hỗ trợ điểm nổi trong nửa ngày. Nếu số ngày là một số nguyên, bạn không cần phải xuất .0. Máy đo đường cuối cùng sẽ luôn đạt đến trạng thái nhị phân.

Bất kỳ hình thức đầu vào / đầu ra đều được chấp nhận và các sơ hở tiêu chuẩn không được phép.

Các trường hợp thử nghiệm:

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

Kết quả một ngày sẽ chỉ là một số nguyên hay một số nguyên cộng với một nửa?
FryAmTheEggman

2
@FryAmTheEggman Vâng. Mỗi bước là nửa ngày.
Morgan Thrapp

5
Bạn làm việc / sống mà 3, 25 và 92 dặm (km?) Là thường xuyên khoảng cách đi lại có thể chấp nhận?
kingofzeal

1
@kingofzeal Một lỗ sâu đục.
Morgan Thrapp

1
@TobySpeight Đó là một máy đo đường kỳ diệu với số lượng chữ số vô hạn.
Morgan Thrapp 23/2/2016

Câu trả lời:


3

Thạch, 22 17 16 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Tắt 5 byte cảm ơn @ETHproductions . 2 3 11 !! tắt byte cảm ơn @NotthatCharles .

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

Kiểm tra tại đây.


Chết tiệt, bạn đánh tôi với nó.
SuperJedi224

Sẽ (i+=a[++m%10])làm việc?
Sản xuất ETH

@ETHản xuất. Tốt đấy !! Tôi quên mất nó sẽ luôn là 10
bị xóa

tại sao không khởi tạo r là 0,5? Hoặc không khởi tạo rhoặc mbất cứ điều gì (họ nên mặc định là null, tức là, 0)
Không phải là Charles

1
Bạn cũng có thể lưu một byte bằng cách tạo m=0bộ khởi tạo và tăng sau modulo ( m++%10) ... tại thời điểm đó bạn có thể bỏ rhoàn toàn. Toàn bộ phương pháp sau đó ở mức thấp trong những năm 50
Không phải là Charles

5

MATL , 29 26 25 byte

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

Định dạng đầu vào là

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

EDIT (ngày 10 tháng 6 năm 2016): Liên kết sau thay thế vbằng &v( 26 byte ) để thích ứng với các thay đổi trong ngôn ngữ

Hãy thử trực tuyến!

`              ]           % 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

Lần đầu tiên sử dụng lặp lại..cho đến vòng lặp trong một 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

Bị đánh cắp

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

Sau vòng lặp đầu tiên, osẽ có một phần thập phân vì tonumber, tôi đã phải xóa nó ... Và để thêm nó cho trường hợp đầu tiên, đó là lý do tại sao tôi ghép nó với a ".".


3

Java, 112 dặm 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

Mã số:

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

Bằng cách nào đó, mã không ngừng chạy (và tôi không thể hiểu tại sao) . Rõ ràng tôi đã quên rằng có ba vòng lặp đang diễn ra thay vì 2. Vì vậy, nó vẫn sẽ đi vào một vòng lặp vô hạn ...

Hãy thử trực tuyến!


3

PowerShell, 84 73 67 59 57 byte

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

Có đầu vào $a$b, dự kiến $blà một mảng rõ ràng của mileages (ví dụ, .\binary-car.ps1 1 @(13,25,3,4,10,8,92,3,3,100)). Chúng tôi sau đó nhập một vòng lặp do/ until. Mỗi lần lặp, chúng ta tăng dần $atheo số dặm $btại vị trí $i++ % 10để chúng ta liên tục lặp qua mảng. Điều này sẽ bắt đầu từ 0 vì vòng lặp đầu tiên $ikhông được khởi tạo, và do đó, đánh giá $null, tương đương với 0bối cảnh này, và chỉ sau khi đánh giá đó ++xảy ra.

Sau đó, untilkiểm tra tuyên bố nếu số của chúng tôi chỉ là 01bằng cách đầu tiên -replaceing tất cả 1không có gì, đúc mà lại là một số nguyên với +, và sau đó lấy Boolean-không phải với !. Nếu nó đánh giá đúng, chúng tôi sẽ hoàn thành vòng lặp, đầu ra $i / 2và kết thúc chương trình.

Giải thích cho điều kiện vòng lặp - Trong PowerShell, mọi số nguyên khác không là $truebất kỳ, và bất kỳ chuỗi không trống nào cũng được $true. Ví dụ: 231145(một số nguyên) sẽ thay đổi thành "2345"(một chuỗi) sau -replace, một số nguyên sẽ được đúc thành 2345(một số nguyên), !trong đó là số nguyên $false. Tuy nhiên, 101101(một số nguyên) sẽ thay đổi thành "00"(một chuỗi) sẽ chuyển thành 0(một số nguyên), !trong đó là một số nguyên $true. Nếu chúng ta không có +, những "00"ý chí !để $falsetừ đó là một chuỗi không trống.

Chỉnh sửa - Đã lưu 11 byte bằng cách hoán đổi độ dài bằng 0 cho đúng 0 hoàn toàn
Chỉnh sửa 2 - Đã lưu 6 byte khác bằng cách nhận ra rằng $b.countsẽ luôn là 10...
Chỉnh sửa 3 - Lưu 8 byte khác bằng cách sử dụng do / cho đến khi thay vì
Chỉnh sửa 4 - Nếu đối tượng là -replaced là một giá trị nguyên, không cần dấu ngoặc kép, lưu thêm 2 byte


2

Ruby, 58

Không có gì đặc biệt. Chỉ là một chu kỳ ...

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

Làm thế nào để bạn chạy nó?
bogl

1
@bogl Đó là lambda - cách dễ nhất là nối các thông số trong ngoặc vuông. Hoặc bạn có thể gán lambda cho một biến và, một lần nữa, nối các tham số trong ngoặc vuông. Ví dụ, ->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]]hoặc ...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]]
Không phải Charles

1

Toán học, 92 byte

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

Vâng. Đầu vào là đồng hồ đo và danh sách thời gian. Đầu ra là số ngày.


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

Phiên bản 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;
            }
        }
    }
}

Thông báo PHP có thể được loại bỏ chi phí thêm 4 ký tự $d = 0;trong phiên bản golf.

Thí dụ

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

Xóa các dấu ngoặc nhọn xung quanh if, xóa 0 khỏi 0.5và xóa |giữa 1 và 0 trong biểu thức chính quy của bạn giúp bạn tiết kiệm 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, đề xuất tốt, dấu ngoặc và 0 trước .5 rõ ràng tôi đã bỏ lỡ. Thay đổi ngay bây giờ.
kuldeep.kamboj 24/2/2016

1

Bình thường, 36 32 30 byte

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

Hãy thử nó ở đây!

Giải trình

Jvz.V0=J+J@QbI <ssM {`J2KbB; chK2 # Q = chuỗi đầu vào

Jvz # gán giá trị bắt đầu cho J
   .V0 # Bắt đầu một vòng lặp vô hạn lặp lại b bắt đầu từ 0
      = J # Đặt J thành
        + J # tổng của J
          @Qb # và giá trị tại Q [b% len (q)]
             Tôi # nếu
              <2 # thấp hơn 2
                  {`J # Xóa các chữ số trùng lặp khỏi J 
               ssM # Ánh xạ các chữ số còn lại trở về số nguyên và tính tổng chúng
                      KbB # nếu evals ở trên là true, lưu b vào K và rời khỏi vòng lặp
                         ; # Kết thúc vòng lặp cơ thể
                           hK # Tăng K vì chúng tôi đã bỏ lỡ một vòng tăng
                          c 2 # và chia cho 2 để có được ngày


0

C Sắc nét, 180.

Thưa ngài chúa C # còn dài.

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;}}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.