我什么时候可以乘坐二进制汽车?


19

我注意到今天上班时,我的汽车的里程表在101101。这是一个很酷的数字,因为它是二进制的(和回文,但这并不重要)。现在,我想知道下一次什么时候可以读取二进制里程表。开车时我无法读取里程表,因为这样做很危险,所以上班或回家时必须使用二进制格式。

往返办公室的交通确实很差,所以我每天必须走不同的路线。

出于挑战的目的,一天是往返行程,从我上下班开始。

您需要获取里程表的初始读数和10个元素的序列,以表示每种方式的里程数。应当重复此过程,直到获得二进制里程表的读数。然后,您应该输出直到达到二进制读数所需的天数。

路线里程数和里程表读数均为正整数。天数将是xx.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 '16

2
@FryAmTheEggman是的。每个步骤都是半天。
Morgan Thrapp '16

5
您在哪里工作/居住,通常可以接受3、25和92英里(公里)的通勤距离?
kingofzeal

1
@kingofzeal虫洞。
Morgan Thrapp '16

1
@TobySpeight这是一个无数位数的神奇里程表。
Morgan Thrapp '16

Answers:


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字节

@ETHproductions关闭了5个字节。2 3 11!关闭字节@ @NotthatCharles

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

在这里测试。


该死,你击败了我。
SuperJedi224 '16

(i+=a[++m%10])工作吗?
ETHproductions 2016年

@ETHproductions。好一个!我忘了它将永远是10
删除

为什么不将r初始化为0.5?还是不初始化r或其他m任何内容(它们应默认为null,即0)
不是说Charles

1
您还可以通过创建m=0初始值设定项来节省一个字节,并在取模(m++%10)之后增加...,此时您可以完全删除r。整个方法然后处于50年代的低点
不是查尔斯

5

MATL29 26 25字节

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

输入格式为

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

编辑(2016年6月10日):以下链接替换v&v26 bytes)以适应语言的更改

在线尝试!

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

第一次在codegolf中使用repeat..until循环!

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,我不得不将其删除...并且在第一种情况下将其添加,这就是为什么我将其与"."


3

Java,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$null0++

然后,until语句检查,如果我们的号码是唯一01首先-replace荷兰国际集团都1没事,铸造,早与一个整数+,然后取布尔不是!。如果评估为真,我们将结束循环,输出$i / 2并终止程序。

有条件循环的说明-在PowerShell中,任何非零整数是$true,任何非空字符串也是$true。例如,231145(整数)将"2345"在后面更改为(字符串)-replace,它将被整数转换为2345(整数),!其值为$false。但是,101101(整数)将变为"00"(字符串),将转换为0(整数),!其值为$true。如果我们没有+"00"!to 的意愿,$false因为它是一个非空字符串。

编辑-通过将长度相等性交换为严格为零来保存11个字节
编辑2-通过意识到$b.count将始终为10...来保存另外6个字节。
编辑3-通过使用do / until而不是为Edit 保存另外8个字节。
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这是一个lambda-最简单的方法是将参数附加在方括号中。或者,您可以将lambda分配给变量,然后再次在方括号中附加参数。例如,->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]]
不是查尔斯(Charles)

1

Mathematica,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);

删除reg中的花括号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 '16

@Samsquanch,很好的建议,.5之前的方括号和0显然我错过了。现在改变了。
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#开始一个无限循环,从0开始遍历b
      = J#将J设置为
        + J#J的总和
          @Qb#和Q [b%len(q)]处的值
             我#如果
              <2#低于2
                  {`J#从J删除重复的数字 
               ssM#将剩余数字映射回整数并求和
                      KbB#如果上述均成立,则将b保存到K并退出循环
                         ; #结束循环体
                           hK#增量K,因为我们错过了一个循环增量
                          c 2#并将其除以2得到天数


0

C夏普(180。

亲爱的C#,您好!

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;}}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.