เมื่อไหร่ฉันจะได้รถไบนารี


19

ฉันสังเกตเห็นว่ามาตรวัดระยะทางรถยนต์ของฉันอยู่ที่ 1,01101 เมื่อฉันไปทำงานวันนี้ อันไหนเป็นจำนวนที่เท่เพราะมันเป็นเลขฐานสอง (และ palindrome แต่นั่นไม่สำคัญ) ตอนนี้ฉันอยากรู้ว่าครั้งต่อไปฉันจะอ่านเลขฐานสองเมื่อใด ฉันไม่สามารถอ่านมาตรวัดระยะทางในขณะที่ฉันขับรถเพราะนั่นจะเป็นอันตรายดังนั้นมันจะต้องเป็นเลขฐานสองทั้งเมื่อฉันไปทำงานหรือกลับบ้าน

มีการจราจรติดขัดระหว่างทางไปและกลับจากออฟฟิศของฉันดังนั้นฉันต้องใช้เส้นทางที่แตกต่างกันในแต่ละวัน

สำหรับวัตถุประสงค์ของการท้าทายนี้วันหนึ่งเป็นการเดินทางไปกลับและเริ่มต้นด้วยการเดินทางของฉันเพื่อทำงาน

คุณจะต้องอ่านค่าเริ่มต้นของมาตรวัดระยะทางและลำดับองค์ประกอบ 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 ไมล์ (กม.?) เป็นระยะเดินทางปกติที่ยอมรับได้อย่างไร
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

Javascript, 68 63 61 60 52 ไบต์

5 ไบต์ปิดขอบคุณ@ETHproductions 2 3 11 !! ไบต์ปิดขอบคุณ@NotthatCharles

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

ทดสอบที่นี่


Darn คุณเอาชนะฉันไปที่มัน
SuperJedi224

จะ(i+=a[++m%10])ทำงานอย่างไร
ETHproductions

@ETHproductions สิ่งที่ดี!! ฉันลืมว่ามันจะเป็น 10 เสมอ
นำออก

ทำไมไม่เริ่มต้น r เป็น 0.5? หรือไม่เริ่มต้นrหรือmสิ่งใด ๆ (พวกเขาควรเริ่มต้นให้เป็นโมฆะเช่น., 0)
ไม่ว่าชาร์ลส์

1
นอกจากนี้คุณยังสามารถบันทึกไบต์ด้วยการทำm=0initializer และเพิ่มขึ้นหลังจาก modulo ( m++%10) ... ตรงจุดที่คุณสามารถดรอปได้rทั้งหมด วิธีการทั้งหมดนั้นอยู่ในช่วง 50s ต่ำ
ไม่ใช่ว่า Charles

5

MATL , 29 26 25 ไบต์

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

รูปแบบอินพุตคือ

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

แก้ไข (10 มิถุนายน 2559): ลิงค์ต่อไปนี้แทนที่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

Lua, 108 ไบต์

ครั้งแรกที่ใช้การทำซ้ำ .. ถึงลูปใน 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

Ungolfed

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ผมต้องเอามันออกไป ... และเพื่อเพิ่มสำหรับกรณีแรกที่ว่าทำไมฉัน concatenate "."ด้วย



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)) จากนั้นเราป้อน a do/ untilloop การวนซ้ำแต่ละครั้งเราเพิ่มขึ้น$aด้วยระยะทาง$bที่ตำแหน่ง$i++ % 10เพื่อให้เราวนรอบอย่างต่อเนื่อง สิ่งนี้จะเริ่มต้นที่ศูนย์เนื่องจากสำหรับลูปแรก$iจะไม่ถูกเตรียมใช้งานและประเมินค่า$nullซึ่งเท่ากับ0ในบริบทนี้และหลังจากการประเมินนั้น++เกิดขึ้นเท่านั้น

จากนั้นuntilตรวจสอบคำสั่งถ้าจำนวนของเราเป็นเพียง0และ1เป็นครั้งแรกโดย-replaceไอเอ็นจีทั้งหมด1มีอะไรหล่อที่กลับเป็นจำนวนเต็มกับและจากนั้นการบูลีนไม่ด้วย+ !ถ้ามันประเมินว่าเป็นจริงเราจะทำการวนลูปเอาท์พุท$i / 2และยุติโปรแกรม

คำอธิบายสำหรับวงเงื่อนไข -ใน PowerShell ใด ๆ ที่ไม่ใช่ศูนย์จำนวนเต็ม$trueและสตริงใด ๆ $trueที่ไม่ว่างเปล่ายังเป็น ยกตัวอย่างเช่น231145(จำนวนเต็ม) จะเปลี่ยนไป"2345"(สตริง) หลังจากที่-replaceซึ่งจะจำนวนเต็มหล่อเป็น2345(จำนวนเต็ม) ที่ซึ่งเป็น! $falseอย่างไรก็ตาม101101(จำนวนเต็ม) จะเปลี่ยนไป"00"(สตริง) ซึ่งจะโยนเป็น0(จำนวนเต็ม) ที่ซึ่งเป็น! $trueถ้าเราไม่ได้มี+ความ"00"ประสงค์!ที่จะ$falseเพราะมันเป็นสายไม่ว่างเปล่า

แก้ไข - บันทึก 11 ไบต์โดยการเปลี่ยนความเท่าเทียมกันบนความยาวเพื่อให้เป็นศูนย์อย่างเคร่งครัด
แก้ไข 2 - บันทึกอีก 6 ไบต์โดยตระหนักว่า$b.countจะเป็น10...
แก้ไข 3 - บันทึกอีก 8 ไบต์โดยใช้ do / จนกว่าแทนที่จะ
แก้ไข 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 มันเป็นแลมบ์ดา - วิธีที่ง่ายที่สุดคือต่อท้าย params ในวงเล็บสี่เหลี่ยม หรือคุณสามารถกำหนดแลมบ์ดาให้กับตัวแปรและเพิ่มพารามิเตอร์ในวงเล็บสี่เหลี่ยมอีกครั้ง เช่น->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;
            }
        }
    }
}

การแจ้งเตือน PHP สามารถลบได้โดยมีค่าใช้จ่ายเพิ่มเติม 4 ตัวอักษร$d = 0;ในเวอร์ชัน golfed

ตัวอย่าง

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

การลบวงเล็บปีกการอบ ๆifลบ 0 ออก0.5และลบ|ระหว่าง 1 และ 0 ใน regex ของคุณช่วยให้คุณประหยัด 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 ก่อน. 0.5 ชัดเจนฉันพลาด เปลี่ยนแล้ว
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
      = J # ตั้ง J เป็น
        + J # ผลรวมของ J
          @Qb # และค่าที่ Q [b% len (q)]
             ฉัน # ถ้า
              <2 # ต่ำกว่า 2
                  {`J # ลบตัวเลขที่ซ้ำกันออกจาก J 
               ssM # แม็พตัวเลขที่เหลืออยู่กลับไปเป็นจำนวนเต็มและหาผลรวม
                      KbB # ถ้าข้างต้น evals เป็นจริงให้บันทึก b เป็น K และออกจากลูป
                         ; # End body loop
                           hK # Increment K เพราะเราพลาดการเพิ่มลูปหนึ่งครั้ง
                          c 2 # แล้วหารด้วย 2 เพื่อให้ได้วัน


0

คมชัด, 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.