언제 이진 자동차를 이용할 수 있습니까?


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

하루 결과가 정수 또는 정수에 반을 더한 것입니까?
FryAmTheEggman

2
@FryAmTheEggman 예. 각 단계는 반나절입니다.
Morgan Thrapp

5
3, 25, 92 마일 (km?)이 정기 통학 거리로 어디에서 일하고 살고 있습니까?
kingofzeal

1
@kingofzeal 웜홀.
Morgan Thrapp

1
@TobySpeight 그것은 무한 자릿수를 가진 마법의 주행 거리계입니다.
Morgan Thrapp

답변:


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

자바 스크립트, 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

시겠습니까 (i+=a[++m%10])일?
ETHproductions

@ETHproductions. 좋은 것 !! 나는 그것이 항상 10 일 것을 잊었다
제거

r을 0.5로 초기화하지 않는 이유는 무엇입니까? 또는 초기화하지 r않거나 m무엇이든 (기본값은 null, 즉 0으로 설정해야 함)
Charles

1
m=0이니셜 라이저에서 바이트를 저장하고 모듈로 ( m++%10) 후에 증가 시킬 수도 있습니다 ...이 시점에서 r완전히 드롭 할 수 있습니다. 전체 방법은 50 년대 최저 수준입니다
Charles가 아닙니다.

5

MATL , 29 26 25 바이트

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

입력 형식은

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

EDIT (2016 년 6 월 10 일) : 다음 연결을 대체 v하여 &v( 26 바이트 ) 언어의 변화에 적응

온라인으로 사용해보십시오!

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

루아, 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

자바, 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경우 초기화되지 않았기 때문에 0에서 시작 하므로로 평가됩니다 $null. 0이 문맥 과 동일하며 평가가 끝난 후에야++ 발생합니다.

그런 다음, until문 검사 우리의 수는 경우 01에 의해 처음으로 -replace모든 보내고 1, 아무것도를 가진 정수로 그 뒤를 캐스팅 +, 다음과 부울 -하지를 복용 !. 그것이 true로 평가되면, 우리는 루프를 끝내고 출력 $i / 2하고 프로그램을 종료합니다.

루프 조건부 설명 -PowerShell에서 0이 아닌 정수는 $true비어 있고 비어 있지 않은 문자열도 있습니다 $true. 예를 들어, 231145(정수)는의 다음에 "2345"(문자열)로 변경되며 -replace, 정수는 2345(정수)로 정수 캐스트되고 그 중는 !입니다 $false. 그러나 101101(정수)는 "00"(문자열)로 변경되어 ( 0정수) 로 캐스팅되며 그 중는 !입니다 $true. 우리는이하지 않은 경우 +"00"의지 !$false이 비어 있지 않은 문자열이기 때문에.

편집 - 엄격하게 제로를위한 평등의 길이를 교환하여 저장된 11 바이트
그 실현에 의해 저장된 다른 6 바이트 - 편집이 $b.count항상있을 것입니다 10...
때까지 대신 위해 / 저장된 다른 8 바이트 DO를 사용하여 - 3 편집을
편집 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

수학, 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;
            }
        }
    }
}

$d = 0;골프 버전에서는 PHP 공지를 추가 비용으로 4 문자로 제거 할 수 있습니다 .

$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

@ Samsquanch, 좋은 제안, 괄호 및 0.5 이전의 0은 분명히 놓쳤습니다. 지금 변경되었습니다.
kuldeep.kamboj 2019

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 # remaning 자리수를 다시 정수로 매핑하고 합산
                      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;}}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.