Ne zaman bir ikili araba alacağım?


19

Bugün işe geldiğimde arabamın kilometre sayacının 101101'de olduğunu fark ettim. Bu serin bir sayı çünkü ikili (ve bir palindrom, ama bu önemli değil). Şimdi, bir dahaki sefere ikili bir kilometre sayacı okumam olacağını bilmek istiyorum. Sürüş sırasında kilometre sayacını okuyamıyorum, çünkü bu tehlikeli olurdu, bu yüzden işe geldiğimde veya eve geldiğimde ikili olması gerekecek.

Ofisime gidip gelirken gerçekten kötü trafik var, bu yüzden her gün farklı bir rota seçmem gerekiyor.

Bu zorluğun amaçları için, bir gün gidiş-dönüş bir yolculuktur ve işe gidip gelirim.

Kilometre sayacının ilk okumasını ve her bir yoldaki mil miktarını temsil eden 10 elemanlık bir diziyi almanız gerekir. Bir ikili kilometre sayacı okuması elde edene kadar bu dizi tekrarlanmalıdır. Daha sonra ikili okumaya gelene kadar geçen gün sayısını çıkarmalısınız.

Hem rota için milaj hem de kilometre sayacı okuması pozitif tamsayılar olacaktır. Gün sayısı ya olacak ya xda x.5, bu nedenle gün sayımınızın yarım gün boyunca kayan noktayı desteklemesi gerekir. Gün sayısı bir tamsayı ise, çıktısını almanıza gerek yoktur .0. Kilometre sayacı her zaman sonunda bir ikili duruma ulaşacaktır.

Herhangi bir giriş / çıkış biçimi kabul edilebilir ve standart boşluklara izin verilmez.

Test senaryoları:

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

Bir gün sonucu yalnızca bir tam sayı mı yoksa bir tam sayı artı bir yarım mı olacak?
FryAmTheEggman

2
@FryAmTheEggman Evet. Her adım yarım gündür.
Morgan Thrapp

5
3, 25 ve 92 milin (km) düzenli olarak kabul edilebilir işe gidip gelme mesafeleri olduğu yerlerde nerede çalışıyorsunuz / yaşıyorsunuz?
kingofzeal

1
@kingofzeal Solucan deliği.
Morgan Thrapp

1
@TobySpeight Sonsuz sayıda basamak içeren büyülü bir kilometre sayacıdır.
Morgan Thrapp

Yanıtlar:


3

Jöle, 22 17 16 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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

5 bytes kapalı teşekkürler @ETHproductions . 2 3 11 !! @NotthatCharles bayt kapalı teşekkürler .

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

Burada test edin.


Lanet olsun, beni dövüyorsun.
SuperJedi224

Çalışır mıydı (i+=a[++m%10])?
ETHproductions

@ETHproductions. İyi bir!! Her zaman 10 olacağını unuttum
kaldırıldı

neden r'yi 0.5 olarak başlatmıyorsunuz? Veya başlatmayın rveya herhangi bir mşekilde (varsayılan olarak null
Charles,

1
Ayrıca m=0, modülodan ( m++%10) sonra başlatıcıyı ve artışı yaparak bir bayt kaydedebilirsiniz ... bu noktada rtamamen düşebilirsiniz . Tüm yöntem o zaman düşük 50'lerde
Charles değil

5

MATL , 29 26 25 bayt

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

Girdi biçimi:

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

DÜZENLEME (2016 10 Haziran): Aşağıdaki bağlantı cümledeki vtarafından &v( 26 bayt ) dilinde değişikliklere uyum sağlama

Çevrimiçi deneyin!

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

İlk kez bir codegolf repeat..until döngü kullanarak!

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

İlk döngüden sonra, oondalık bir kısmı olacaktır, çünkü tonumberkaldırmak zorunda kaldım ... Ve ilk durum için eklemek için, bu yüzden bir ile birleştiriyorum ".".


3

Java, 112 mil bayt

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 bayt

Kod:

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

Her nasılsa, kod çalışmayı durdurmaz (ve nedenini anlayamıyorum) . Görünüşe göre 2 yerine üç döngü olduğunu unuttum. Bu yüzden hala sonsuz bir döngüye girecekti ...

Çevrimiçi deneyin!


3

PowerShell, 84 73 67 59 57 bayt

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

Girdi alır $ave açık bir kilometre dizisi $bolmasını bekler $b(ör .\binary-car.ps1 1 @(13,25,3,4,10,8,92,3,3,100).). Sonra bir do/ untilloop giriyoruz . Her bir yineleme, sürekli olarak dizi boyunca döngü yapmamız $aiçin kilometreyi $bkonumdayken $i++ % 10arttırırız. İlk döngü için $ibaşlatılmadığından ve bu bağlamda buna $nulleşit olarak değerlendirildiğinden bu sıfırdan başlayacaktır 0ve ancak bu değerlendirmeden sonra++ gerçekleşir.

Ardından, untildeyim kontroller bizim numarası yalnızca eğer 0ve 1ilk -replacehepsi ing 1, hiçbir şey ile bir tamsayı olarak onu geri döküm +ve sonra birlikte Boole-olmayan alarak !. Doğruyu değerlendirirse, döngüyü bitirir, çıktı alır $i / 2ve programı sonlandırırız.

Döngü koşullu için açıklama - PowerShell'de, sıfır olmayan herhangi bir tam sayı $trueve boş olmayan herhangi bir dize de vardır $true. Örneğin, 231145(bir tam sayı) olarak değişecektir "2345"sonra (bir dizi) -replacetamsayı-döküm gibi, 2345(bir tam sayı) !olduğu $false. Bununla birlikte, 101101(bir tam sayı) olarak değişecektir "00"olarak dökme (a dize) 0, (bir tam sayı) !olduğu $true. Biz olmasaydı +, "00"irade !için $falsebir boş olmayan bir dize beri.

Düzenleme - kesinlikle sıfır için eşitlik on uzunluğu değiştirerek Kaydedilen 11 bayt
olduğunu fark ile Kayıtlı başka 6 bayt - Düzen 2 $b.counthep olacak 10...
kadar yerine ilişkin / kayıtlı başka 8 bayt do kullanarak - Düzenleme 3
Düzenleme 4 - -replaced olan nesne bir tamsayı değerse, tırnak işareti gerekmez, başka bir 2 bayt kaydedilir


2

Yakut, 58

Özel birşey yok. Sadece bir döngü ...

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

Nasıl çalıştırıyorsun?
bogl

1
@bogl Bu bir lambda - en kolay yol paramleri köşeli parantez içine eklemektir. Veya lambda'yı bir değişkene atayabilir ve yine köşeli parantez içine paramitler ekleyebilirsiniz. Örneđin, ->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]]ya da ...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 bayt

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

Evet. Giriş, kilometre sayacı ve saatlerin listesidir. Çıktı gün sayımıdır.


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

Ungolfed Sürümü

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 Bildirimleri, $d = 0;golf versiyonunda 4 karakterlik ekstra maliyetten kaldırılabilir .

Misal

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

Regex'inizdeki kıvrık parantezleri ifkaldırmak, 0'ı 0.5kaldırmak ve regex'inizdeki |1 ile 0 arasında kaldırmak 4 bayt kazandırır. function f($i,$s){while(1)foreach($s as$v){$d+=.5;$i+=$v;if(preg_match('/^[01]+$/',$i))return$d;}}
Samsquanch

@Samsquanch, iyi öneri, köşeli ayraçlar ve 0 önce .5 açıkça özledim. Şimdi değişti.
kuldeep.kamboj

1

Pyth, 36 32 30 bayt

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

Burada deneyin!

açıklama

Jvz.V0=J+J@QbI <ssM {`J2KbB; chK2 # Q = giriş sırası

Jvz # J'ye başlangıç ​​değeri atar
   .V0 # 0'dan başlayarak b üzerinden yinelenen sonsuz bir döngü başlatın.
      = J # J'yi
        + J # J toplamı
          @ Qb # ve Q'daki değer [b% len (q)]
             Ben #
              <2 # 2'den düşük
                  {`J # J'den yinelenen rakamları kaldırın 
               ssM # Kalan rakamları tamsayılarla eşleyin ve toplayın
                      KbB # yukarı doğru doğru değişiyorsa, b'yi K'ye kaydedin ve döngüden çıkın
                         ; # Uç döngü gövdesi
                           hK # Artış K çünkü bir döngü artışını kaçırdık
                          c 2 # ve günleri almak için 2'ye bölün


0

C Keskin, 180.

Sevgili efendisi C # uzun.

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;}}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.