バイナリカーはいつありますか?


19

今日仕事を始めたとき、私の車の走行距離計は101101であったことに気づきました。これは、バイナリ(および回文ですが、それは重要ではありません)であるため、すばらしい数字です。さて、次にバイナリ走行距離計の読み取りを行うときを知りたいです。走行中は走行距離計を読むことができません。それは危険だからです。仕事や家に帰るときはバイナリでなければなりません。

オフィスへの行き帰りに交通渋滞がひどいので、毎日違うルートをとる必要があります。

この挑戦のために、一日は往復であり、通勤から始まります。

走行距離計の最初の測定値と、各方向のマイル数を表す10要素のシーケンスを取得する必要があります。バイナリ走行距離計の読み取り値に到達するまで、このシーケンスを繰り返す必要があります。次に、バイナリ読み取りに到達するまでにかかる日数を出力する必要があります。

ルートの走行距離と走行距離計の読み取り値は両方とも正の整数になります。日のカウントはどちらかになりますxか、x.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

1日の結果は整数または整数プラス半分になりますか?
FryAmTheEggman

2
@FryAmTheEggmanはい。各ステップは半日です。
モーガンスラップ

5
3、25、および92マイル(km?)が通常許容される通勤距離である職場/居住地はどこですか?
kingofzeal

1
@kingofzealワームホール。
モーガンスラップ

1
@TobySpeightこれは、桁数が無限の魔法の走行距離計です。
モーガンスラップ

回答:


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に感謝します2 3 11 !! @NotthatCharlesに感謝します

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

ここでテストします。


くそー、あなたはそれに私を打った。
SuperJedi224

だろう(i+=a[++m%10])動作しますか?
ETHproductions

@ETHproductions。いいね!常に10になることを忘れていた
削除

なぜrを0.5に初期化しないのですか?かない初期化rまたはm全く(彼らはすなわち、nullにデフォルトで設定される必要があり、0。)
未チャールズその

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日):次のリンクが(26バイト)に置き換えvられ、言語の変更に適応します&v

オンラインでお試しください!

`              ]           % 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つのループが進行していることを忘れていたので、無限ループに入ります...

オンラインでお試しください!


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はが初期化されないため、このコンテキスト$nullではに評価され、その評価の後に0のみが発生するためです。++

次に、このuntilステートメントは、番号が1つだけであるかどうかをチェック01、最初に-replaceすべて1を何も付けずに、整数でをキャストし+、次にでブール演算を行い!ます。trueと評価された場合、ループ$i / 2を終了し、output 、プログラムを終了します。

条件付きループの説明 -PowerShellでは、ゼロ以外の整数はで$true、空でない文字列も$trueです。例えば、231145(整数)に変更され"2345"た後(列)-replace整数キャストするように、2345(整数)!となっています$false。しかし、101101(整数)に変わる"00"ようにキャストします(文字列)0(整数)、!となっています$true。私たちは持っていなかった場合は+"00"意志!$falseそれが空でない文字列だから。

編集-長さの等値を厳密にゼロに交換することで11バイトを保存しました
編集2- $b.count常にそうなることを認識してさらに6バイトを保存しました10...
編集3- 編集ではなくdo / untilを使用してさらに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ラムダです-最も簡単な方法は、角括弧でパラメータを追加することです。または、ラムダを変数に割り当て、再度、角括弧でパラメータを追加できます。たとえば、->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]]
チャールズではない

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

4文字の追加コストのPHP通知を削除できます $d = 0;ゴルフ版で。

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

の周りの中括弧を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、良い提案、括弧、そして.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#上記の評価がtrueの場合、bをKに保存してループを抜ける
                         ; #ループ本体の終了
                           hK#ループインクリメントを1つ逃したため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;}}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.