Bir sonraki 1-seyrek ikili sayıyı bulun


27

N tamsayıdır A pozitif K en az varsa -sparse K onun ikili gösterimi herhangi iki ardışık 1s arasında 0s.

Yani, 1010101 sayısı 1-seyrek iken 101101 sayılmaz.

Göreviniz verilen giriş numarasının bir sonraki seyrek numarasını bulmak. Örneğin, giriş 12 ( 0b1100) ise çıkış 16 ( 0b10000) ve giriş 18 ( 0b10010) ise çıkış 20 ( 0b10100) olmalıdır .

En küçük program veya işlev (bayt cinsinden) kazanır! Standart boşluklar izin verilmedi.


“Next” “next high” de veya “en az mutlak farkla” olduğu gibi?
FUZxxl

"sonraki" "sonraki en yüksek" deki gibi.
articuno

Hangi giriş aralığı ele alınmalıdır?
mbomb007

Olumsuz sayıların olması gerekmediğini varsayacağım.
mbomb007

@ articuno Bir fonksiyon yaratabilir miyiz, yoksa tam bir program mı olmalı? İşlevler oldukça standart.
mbomb007

Yanıtlar:



9

CJam, 14 11 bayt

DigitalTrauma sayesinde 3 bayt kaydedildi.

l~{)___+&}g

Burada test et.

açıklama

l~          "Read and eval input.";
  {      }g "Do while...";
   )_       "Increment and duplicate (call this x).";
     __+    "Get two more copies and add them to get x and 2x on the stack.";
        &   "Take their bitwise AND. This is non-zero is as long as x's base-2
             representation contains '11'.";

Bu, programın sonunda otomatik olarak yazdırılan yığında son numarayı bırakır.


8

Python 2,44 bayt

Bu n okur ve cevap yazdıran tam bir python programıdır. Okunabilirlik alt yarışmasında oldukça başarılı olduğunu düşünüyorum.

n=input()+1
while'11'in bin(n):n+=1
print n

Test sonuçları:

$ echo 12 | python soln.py 
16
$ echo 18 | python soln.py 
20

6

Pyth, 12 11 bayt

f!}`11.BThQ

Çevrimiçi deneyin: Pyth Compiler / Executor .

               implicit: Q = input()            
f        hQ    find the first integer T >= Q + 1, 
               that satisfies the condition:
 !}`11.BT         "11" is not in the binary representation of T

1
Sen çevirerek bir karakter kaydedebilirsiniz "11"içine `11.
orlp

@orlp Teşekkürler, bunu fark etmeliydim.
Jakube,

5

Mathematica, 41 30 bayt

Martin Büttner sayesinde 11 bayt kaydedildi.

#+1//.i_/;BitAnd[i,2i]>0:>i+1&

3
Bir açıklama ekler misiniz lütfen?
mbomb007

4

Perl, 31

#!perl -p
sprintf("%b",++$_)=~/11/&&redo

Veya komut satırından:

 perl -pe'sprintf("%b",++$_)=~/11/&&redo' <<<"18"

4

APL, 18 bayt

1∘+⍣{~∨/2∧/⍺⊤⍨⍺⍴2}

Bu monadik bir işlevi değerlendirir. Burada dene. Kullanımı:

   1∘+⍣{~∨/2∧/⍺⊤⍨⍺⍴2} 12
16

açıklama

1∘+                    ⍝ Increment the input ⍺
   ⍣{            }     ⍝ until
     ~∨/               ⍝ none of
        2∧/            ⍝ the adjacent coordinates contain 1 1 in
           ⍺⊤⍨⍺⍴2      ⍝ the length-⍺ binary representation of ⍺.

4

J, 20 karakter

Monadik bir fiil. Kurallara uymak düzeltildi.

(+1 1+./@E.#:)^:_@>:

açıklama

İlk olarak, bu boşluklu fiil ve biraz daha az golf oynadı:

(+ 1 1 +./@E. #:)^:_@>:
[: (] + [: +./ 1 1 E. #:)^:_ >:

oku:

    ]                             The argument
      +                           plus
        [: +./                    the or-reduction of
               1 1 E.             the 1 1 interval membership in
                      #:          the base-2 representation of the argument,
[: (                    )^:_      that to the power limit of
                             >:   the incremented argument

Argüman artı argümanın 1 1temel-2 gösterimindeki aralık üyeliğinin veya azaltılmasının , arttırılmış argümana uygulanan güç sınırına getirilmesi.

Temelde 1 1girdinin taban-2 gösteriminde meydana gelip gelmediğini hesaplarım . Varsa girişi arttırırım. Bu bir güç sınırlaması altına alınır, yani sonuç artık değişmedene kadar uygulanır.


Güzel algoritma! APL: 'de aynı uzunluktadır {⍵+∨/2∧/⍵⊤⍨⍵⍴2}⍣=.
Zgarb

@randomra Ah, anlıyorum.
FUZxxl

4

Javascript, 25 19

1-seyrek ikili sayı için, gerçeğini kullanarak x&2*x == 0:

f=x=>x++&2*x?f(x):x

3

JavaScript (ES6), 39 43

Regexp, dizge yok, özyinelemeli:

R=(n,x=3)=>x%4>2?R(++n,n):x?R(n,x>>1):n

Yinelemeli sürüm:

F=n=>{for(x=3;x%4>2?x=++n:x>>=1;);return n}

Çok basit, sadece 11 dizisini bulmak için sağa kaydırma kullanmak. Onu bulduğumda bir sonraki sayıya atlayın. Özyinelemeli sürüm doğrudan yinelemeli sürümden türetilmiştir.

Ungolfed ve daha açık. Golf oynamak için en zor kısım iç ve dış halkaları birleştirmektir (başlangıçta x ila 3'ü başlatmak zorunda)

F = n=>{
  do {
    ++n; // next number
    for(x = n; x != 0; x >>= 1) {
      // loop to find 11 in any position
      if ((x & 3) == 3) { // least 2 bits == 11
        break;
      }
    }
  } while (x != 0) // if 11 was found,early exit from inner loop and x != 0
  return n
}

Bu %4>2, Number Theory'den gelen bazı büyücülere benziyor, lütfen açıklayabilir misiniz || bir bağlantı sağlamak?
Jacob

@Jocob (x% 4> 2) basitçe ((x & 3) == 3), fakat operatör önceliği JS olan 2 parantezden
kaçıyorsun

Düşündüğümden daha basit. Şimdi ungolfed versiyonu ile açık. Teşekkürler!
Jacob,

3

Python 2, 37 bayt

f=input()+1
while f&2*f:f+=1
print f

Mantık x & 2*x == 0, 1-seyrek sayı için kullanıldı.
@Nick ve @CarpetPython'a teşekkürler.


Neden aşağı oy? Bu mükemmel çalışıyor ve aynı zamanda iyi golf oynuyor.
ETHproductions

PPCG'ye hoş geldiniz, btw ve hoş bir ilk cevap! Sitedeki zorluklara cevap vermeye devam etmenizi tavsiye ediyorum :-)
ETHproductions 31:17

2

JavaScript, 75 66 62 bayt

Martin Büttner'e 9 byte kaydettiği için ve Pietu1998'i 4 byte'a teşekkürler!

function n(a){for(a++;/11/.test(a.toString(2));a++);return a;}

Nasıl çalışır: geçerli sayı 1-seyrek olmadığı sürece forbaşlayan bir döngü çalıştırır a + 1ve eğer öyleyse döngü kesilir ve geçerli sayıyı döndürür. Bir sayının 1-seyrek olup olmadığını kontrol etmek için, onu ikiliye dönüştürür ve içermediğini kontrol eder 11.

Golf edilmemiş kod:

function nextOneSparseNumber(num) {
    for (num++; /11/.test(num.toString(2)); num++);
    return num;
}

2

Julia, 40 bayt

n->(while contains(bin(n+=1),"11")end;n)

Bu, giriş olarak tek bir tamsayıyı kabul eden ve bir sonraki en yüksek 1-seyrek tamsayıyı döndüren adsız bir işlev yaratır. Aramak için bir isim verin, örneğin f=n->...ve yapın f(12).

Ungolfed + açıklama:

function f(n)

    # While the string representation of n+1 in binary contains "11",
    # increment n. Once it doesn't, we've got the answer!

    while contains(bin(n += 1), "11")
    end

    return(n)
end

Örnekler:

julia> f(12)
16

julia> f(16)
20

Öneriler ve / veya sorular her zaman olduğu gibi açığız!


2

> <> (Balık) , 31 + 3 = 34 bayt

1+:>:  4%:3(?v~~
;n~^?-1:,2-%2<

Kullanımı:

>python fish.py onesparse.fish -v 12
16

-vBayrak için 3 bayt eklendi .


1

JavaScript (ECMAScript 6), 40

Özyineleme ile:

g=x=>/11/.test((++x).toString(2))?g(x):x

JavaScript, 56

Ok fonksiyonları olmadan aynı.

function f(x){return/11/.test((++x).toString(2))?f(x):x}

1

Scala, 65 bayt

(n:Int)=>{var m=n+1;while(m.toBinaryString.contains("11"))m+=1;m}

(adlandırılmış bir işlev gerekirse, çözüm 69 bayt olacaktır)


1

Python, 39 33 bayt

Burada deneyin: http://repl.it/gpu/2

Lambda formunda (golf için xnor sayesinde):

f=lambda x:1+x&x/2and f(x+1)or-~x

Standart fonksiyon sözdiziminin bir kereliğine lambdadan daha kısa olduğu ortaya çıktı!

def f(x):x+=1;return x*(x&x*2<1)or f(x)

Sen 33 bayt lamda birini kısaltabilirsiniz: f=lambda x:1+x&x/2and f(x+1)or-~x. Sizin soldan ziyade sağa kayma karşınıza çıkıyor, x/2bunun yerine kullanabilirsiniz , (x+1)/2çünkü fark her zaman sıfır bit x+1. Spec olsa bir program için sorar.
xnor

Ben sordum ve fonksiyon yapabileceğimizi söyledi. Cevapların çoğu zaten.
mbomb007


0

Ruby, 44

->(i){loop{i+=1;break if i.to_s(2)!~/11/};i}

Oldukça basit. İkili gösterimi test etmek için sonsuz bir döngüye ve bir regexp'e sahip bir lambda. Ben verilmiş loopve endeks numarası diliyorum .


@ mbomb007 yapıldı. Bahşiş için teşekkürler.
Maksimum

0

Matlab ( 77 74 bayt)

m=input('');for N=m+1:2*m
if ~any(regexp(dec2bin(N),'11'))
break
end
end
N

Notlar:

  • Bu deney numaralara yeterli m+1için 2*mnerede, mgirişidir.
  • ~any(x)olduğu truetakdirde xbütün sıfırları içeren veya eğer xboş

0

C (32 bayt)

f(int x){return 2*++x&x?f(x):x;}

Diğer birçok cevapla aynı algoritmanın özyinelemeli uygulaması.


0

Perl, 16 bayt

Birleştiren x&2*xçeşitli yanıtlarından (Sanırım Nick'in ilk) NUTKİ en redo verim:

perl -pe'++$_&2*$_&&redo'

Çileklerde Test Edildi 5.26.



0

Jöle , 7 bayt

‘&Ḥ¬Ɗ1#

Pozitif bir tamsayı basan, negatif olmayan tek bir tamsayı kabul eden tam bir program (monadik bir bağlantı olarak tek bir pozitif tamsayı içeren bir liste oluşturur).

Çevrimiçi deneyin!

Nasıl?

Başlayarak v=n+1ve bir arttırılarak çift vtek bir yerde ve bit-bilge VE ile her bit kaydırmaya vo zaman ve DEĞİL testine mantıklı gerçekleştirmek vböyle bir numara bulunana kadar 1-seyrek.

‘&Ḥ¬Ɗ1# - Main Link: n   e.g. 12
‘       - increment           13
     1# - 1-find (start with that as v and increment until 1 match is found) using:
    Ɗ   -   last three links as a dyad:
  Ḥ     -   double v
 &      -   (v) bit-wise AND (with that)
   ¬    -   logical NOT (0->1 else 1)
        - implicit print (a single item list prints as just the item would)

0

Stax , 5 bayt

╦>ù╤x

Koş ve hata ayıkla

Bu prosedürü kullanarak çalışır. Giriş yığının üstünde başlar.

  • İki kez artırın ve kopyalayın.
  • Yığının tepesini yarın.
  • Bitsel ve üst üste iki öğe.
  • Sonuç truthy ise (sıfır olmayan) tüm programı tekrar eder.
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.