Bir tamsayının ikili değerinde en uzun 1'lerin serisini hesaplayın


32

Hedef

Negatif olmayan bir tamsayı verildiğinde, bu tamsayının ikili değerinde art arda en büyük 1'lerin sayısının başlangıç ​​konumunu döndüren bir işlev oluşturun.

Bir giriş yapıldığında 0, geri dönün 0.

Sayı, eşit uzunlukta birden çok çizgiye sahipse, son çizginin konumunu döndürmeniz gerekir.

Giriş

0 veya daha büyük bir tam sayı .

Çıktı

Aşağıda açıklandığı gibi hesaplanan bir tam sayı.

kurallar

  • Bu kod golf, yani her dilde bayt cinsinden en kısa kod kazanır.
  • Standart boşluklar yasaktır.

Örnekler ve Test Durumları

örnek 1

  • İşleviniz 142 tamsayısına geçti
  • 142, ikili olarak 10001110'a eşittir
  • En uzun çizgi "111" dir (üçlü çizgi)
  • Çizgi, 2 ^ 1 konumunda başlar
  • İşleviniz sonuç olarak 1 değerini döndürür

Örnek 2

  • İşleviniz tamsayı geçirilir 48
  • 48, ikili olarak 110000’e eşittir
  • En uzun çizgi "11" dir (iki kişiden oluşan çizgi)
  • Çizgi, 2 ^ 4 konumunda başlar
  • İşleviniz sonuç olarak 4 döndürür

Örnek 3

  • İşleviniz 750 tamsayısına geçildi
  • 750 ikilik olarak 1011101110 eşittir
  • En uzun çizgi "111" dir (üçlü çizgi)
  • İki eşit uzunlukta çizgiler olduğundan, sonraki çizgiyi döndürürüz.
  • Daha sonraki çizgi 2 ^ 5 konumunda başlar
  • İşleviniz sonuç olarak 5 döndürür


@Okx Vücudun içinde bahsedilmişti, bu yüzden etiketi ekledim.
tamamen insan

İnsanların test etmesini sağla 0. Bu önemli bir test durumu.
mbomb007 16:17

2
"Son çizgi" veya "en son çizgi" yerine "en büyük yer değerine sahip çizgi" öneririm.
aschepler

@Okx Neden kazanan kriter gerekli? Neden sadece bir bulmaca olamaz?
corsiKa

Yanıtlar:


21

Jöle , 10 8 bayt

Ba\ÐƤṀċ¬

Çevrimiçi deneyin!

Nasıl çalışır

Ba\ÐƤṀċ¬  Main link. Argument: n


B         Binary; convert n to base 2.

   ÐƤ     Apply the link to the left to all postfixes of the binary array.
 a\         Cumulatively reduce by logical AND.

          For example, the array

          [1, 0, 1, 1, 1, 0, 1, 1, 1, 0]

          becomes the following array of arrays.

          [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
             [0, 0, 0, 0, 0, 0, 0, 0, 0]
                [1, 1, 1, 0, 0, 0, 0, 0]
                   [1, 1, 0, 0, 0, 0, 0]
                      [1, 0, 0, 0, 0, 0]
                         [0, 0, 0, 0, 0]
                            [1, 1, 1, 0]
                               [1, 1, 0]
                                  [1, 0]
                                     [0]

     Ṁ    Take the lexicographical maximum, i.e., the array with the most 1's at
          the beginning, breaking ties by length.

       ¬  Yield the logical NOT of n, i.e., 0 if n > 0 and 1 if n = 0.

      ċ   Count the occurrences of the result to the right in the one to the left.

Tebrikler!
Defacto,

24

JavaScript (ES6), 41 40 36 34 bayt

@ThePirateBay sayesinde 4 bayt kaydedildi

f=x=>(k=x&x/2)?f(k):Math.log2(x)|0

Test durumları

Nasıl?

Genel durum x> 0

Yinelemeli Biz ve giriş X ile X / 2 kademeli dizi kalıntılarının sadece en sağdaki bit kadar birbirini takip eden ayar bit modellerini azaltmaktadır. Son sıfır olmayan değerin bir kopyasını tutarız ve en önemli bitinin konumunu, taban-2 logaritmasını zemine yuvarlayarak belirleriz.

Aşağıda x = 750 için attığımız adımlar var ( ikili olarak 1011101110 ).

    1011101110 --.
,----------------'
'-> 1011101110
AND 0101110111
    ----------
=   0001100110 --.
,----------------'
'-> 0001100110
AND 0000110011
    ----------
=   0000100010 --.  --> output = position of MSB = 5  (0000100010)
,----------------'                                         ^
'-> 0000100010
AND 0000010001
    ----------
=   0000000000

Kenar çantası x = 0

Özel durum x = 0hemen yol açar Math.log2(0) | 0. Logaritma , ikili bit cinsinden VEYA değerini 0değerlendirir -Infinityve zorlamayı 32 bit bir tam sayıya zorlar. Soyut işlemin ToInt32 spesifikasyonuna uygun olarak , bu beklenenleri verir 0:

Eğer sayı olan NaN , 0 , -0 , + ∞ veya -∞ , dönüş +0


Bu 0, giriş aralığının bir parçası olan giriş için hatalar .
Justin Mariner

@JustinMariner Sabit.
Arnauld,

Ya Math.log2(k)|0yerine 31-Math.clz32(k)? Yoksa bir şey mi kaçırıyorum?

@PirateBay Math.log2(k)|0aslında özel durum için hem daha kısa hem de daha basittir x=0. Teşekkürler. :)
Arnauld,

1
Çok güzel bir algoritma ve iyi bir açıklama. 14 bayt x86 makine kodunda uyguladım .
Peter Cordes

12

x86 makine kodu, 14 bayt

Kullanılması Arnauld algoritması @ ait x &= x>>1ve daha önce adımında en yüksek ayar bit pozisyon alarak xolur 0.

C / C ++ 'dan unsigned longest_set(unsigned edi);x86-64 System V ABI imzalı imzalı . Aynı makine kodu baytları 32 bit modunda aynı şekilde çözülür, ancak standart 32 bit arama kuralları ilk argümanı koymuştur edi. (Giriş kayıt defterini Windows için ecxveya edxWindows için _fastcall/ _vectorcallveya gcc -mregparmherhangi bir şey kırmadan yapılabilir.)

   address   machine-code
             bytes
                         global longest_set
 1                       longest_set:
 2 00000000 31C0             xor  eax, eax    ; 0 for input = 0
 3                       
 4                       .loop:               ; do{
 5 00000002 0FBDC7           bsr  eax, edi    ;  eax = position of highest set bit
 6                           ;; bsr leaves output unmodified when input = 0 (and sets ZF)
 7                           ;; AMD documents this; Intel manuals say unspecified but Intel CPUs implement it
 8 00000005 89F9             mov  ecx, edi
 9 00000007 D1E9             shr  ecx, 1
10 00000009 21CF             and  edi, ecx
11 0000000B 75F5             jnz .loop        ; } while (x &= x>>1);
12                       
13 0000000D C3               ret

x86'nın BSRtalimatı (Bit Tarama Ters) bunun için mükemmeldir ve baştaki sıfırları saymak yerine doğrudan bit dizinini verir. ( bsrDoğrudan = 0 gibi giriş için 0 üretmez 32-lzcnt(x), ama biz bu yüzden, sıfır olmayan girişler için = 31-lzcnt BSR gerek lzcnttek başına bayt sayısını olmaz hatta talimatlar tasarruf, let. Sıfırlama eax nedeniyle döngü eserleri önce bsr' giriş sıfır olduğunda hedefi değiştirilmemiş olarak bırakma yarı resmi davranışı.)

En uzun vadede MSB pozisyonunu geri getirebilirsek, bu daha da kısa olacaktır. Bu durumda, lea ecx, [rdi+rdi](3 bayt) , + (4 bayt) yerine + sola kaydırma işlemini kopyalar .movshr

Bir arayan arayan için bu TIO bağlantısına bakın.exit(longest_set(argc-1));

Bir kabuk döngüsü ile test etme:

l=(); for ((i=0;i<1025;i++));do 
    ./longest-set-bitrun "${l[@]}";   # number of args = $i
    printf "$i %#x: $?\n" $i; 
    l+=($i); 
done | m

0 0: 0
1 0x1: 0
2 0x2: 1
3 0x3: 0
4 0x4: 2
5 0x5: 2
6 0x6: 1
7 0x7: 0
8 0x8: 3
9 0x9: 3
10 0xa: 3
11 0xb: 0
12 0xc: 2
13 0xd: 2
14 0xe: 1
15 0xf: 0
16 0x10: 4
17 0x11: 4
18 0x12: 4
19 0x13: 0
20 0x14: 4
21 0x15: 4

...

747 0x2eb: 5
748 0x2ec: 5
749 0x2ed: 5
750 0x2ee: 5
751 0x2ef: 0
752 0x2f0: 4
753 0x2f1: 4
754 0x2f2: 4

1
Güzel! (Benim gibi) diğer meclis lehçelerine daha aşina olanlar için bir not: x86 BSR anımsatıcısı "Branch to SubRoutine" değil " Bit Scan Reverse" anlamına gelir .
Arnauld,

@Arnauld: İyi bir nokta, anımsatıcının kodunu çözmek için düzenlenmiş ve insn referans el kitabına bir bağlantı içeren.
Peter Cordes

5

Jöle , 19 17 11 bayt

HÐĿ&\ḟ0ṪBL’

Çevrimiçi deneyin!

-6 (!) Bayt @ Dennis'in keskin gözlemleri sayesinde

Nasıl çalışır

HÐĿ&\ḟ0ṪBL’
HÐĿ         - halve repeatedly until reaching 0 due to rounding
   &\       - cumulative AND
     ḟ0Ṫ    - final non-zero, or 0 if all elements are 0
        BL  - length of binary representation (log base 2). 0->[0]->1
          ’ - decrement

0Giriş aralığında olan hatalar .
Bay Xcoder

@ Mr.Xcoder Sabit
fireflame241

Düzeltme için bir bayt kaydedebilirsinizȯ-µ...
Jonathan Allan

@ JonathanAllan OR-ing'in nasıl yardımcı olacağını anlamıyorum. Kodunuz var mı?
fireflame241 16:17

1
Yana Bhep ile başlayan bir dizi döndürür 1 , BUṪMṪ’×Ṡolabilir ṪBL’. Ayrıca, ihtiyacınız yok ve ḟ0bir bayttan tasarruf sağlar ¹Ðf.
Dennis,

5

Python 2,45 bayt

f=lambda x:f(x&x/2)if x&x/2else len(bin(x))-3

Çevrimiçi deneyin!

Dennis sayesinde çok sayıda bayt kurtarıldı! (Kafaları kadar len(bin(...))-3yerine math.frexp)

Neyse ki kolayca tamir edilebilir bir hata bulmak için @xnor için teşekkürler!


Bu tür gelince yanlış cevaplar vermek gibi görünüyor x=3, çünkü bence and/orkısa devre yanlış zaman fonksiyon 0 döndürür
XNOR

@xnor Bunu fark ettiğiniz için teşekkürler! Sabitlendi.
Bay Xcoder

4

Perl 6 ,45 35 bayt

Bu oldukça gelişmiş sürüm @nwellnhof'un izniyle kullanılmıştır.

{.msb+1-(.base(2)~~m:g/1+/).max.to}

Çevrimiçi deneyin!


:gTüm eşleşmeleri almak için basitçe eşleşebilirsiniz . Akıllı maç operatörü ile, ben 40 bayt golf aşağı olabilir:{sort(.base(2).flip~~m:g/1+/).tail.from}
nwellnhof


@nwellnhof, çok teşekkür ederim. Her nasılsa kaçırdım :gve smartmatch operatörü ile zarf nasıl kullanabileceğimi bulamadım. Ayrıca .msbyöntem burada oldukça yararlı ve daha önce bilmiyordum.
Ramillies

3

Python 2 , 89 78 bayt

m=t=i=j=0
for c in bin(input()):
 t=-~t*(c>'0');i+=1
 if t>m:j=i;m=t
print i-j

Çevrimiçi deneyin!

EDIT: Bay Xcoder sayesinde 11 bayt kurtardı.




@ Mr.Xcoder Ben de özellikle bir fonksiyon yazmasını istediği halde bunu düşündüm.
Jonathan Frech

@JonathanFrech OP gerçekten fonksiyon anlamına geldiğini sanmıyorum . Muhtemelen sadece genel bir terim.
Bay Xcoder

@ Mr.Xcoder Lütfen bunu açıklayın. Teşekkürler,
lifebalance

3

05AB1E , 14 12 11 bayt

bDγàŠrkrJgα

Çevrimiçi deneyin! veya test durumlarını çalıştırın .

açıklama

bDγàŠrkrJgα  Implicit input (ex: 750)
bD           Convert input to binary string and duplicate
                 '1011101110', '1011101110'
  γ          Split into groups of 1s or 0s
                 '1011101110', ['1', '0', '111', '0', '111', '0']
   à         Pull out max, parsing each as an integer
                 '1011101110', ['1', '0', '0', '111', '0'], '111'
    Šrk      Rearrange stack and get first index of max run of ones
                 ['1', '0', '0', '111', '0'], 2
       rJg   Reverse stack, join the array to a string, and get its length
                 2, 7
          α  Get absolute difference
                 5

3

J , 18 17 bayt

(#-0{#\\:#.~\)@#:

Çevrimiçi deneyin!

açıklama

(#-0{#\\:#.~\)@#:  Input: integer n
               #:  Binary
     #\            Length of each prefix
       \:          Sorted down using
         #.~\      Mixed base conversion on each prefix
   0{              Get the value at index 0
  -                Subtract from
 #                 Length

Çok kaygan. Tabii ki karışık taban dönüşümüyle neler olup bittiğini tam olarak anladım. Dizenin sonunda neden ardışık sayıların sayısını sayar? Ayrıca, xdyad üzerinde belirtilen üslerin tümü 0 ve 1 ise, bu ne anlama geliyor? Bir baz 2 sayı basamak 0ve 1bir baz, böylece 1sayı basamak ... 0? o zaman 1bu bağlamda ne anlama geliyor? Ve 0sadece her zaman bir temel sayı 0mı?
Jonah

@Jonah Daha çok karma taban dönüşümünün nasıl yapıldığından kaynaklanmaktadır. x #. yilk hesaplamalar w =: */\. }. x , 1sonra döner+/ w * y
mil

Bu yüzden bunu #.kamu api yerine içsel uygulama detaylarına güvendiğiniz için meşru bir kullanımdan ziyade bir golf saldırısı olarak düşünür müsünüz?
Jonah

3

C # (.NET Core) , 64 60 bayt

T=a=>(a&a/2)>0?T(a&a/2):Math.Log(a,2)<0?0:(int)Math.Log(a,2)

Çevrimiçi deneyin!

@ Arnauld'un cevabının AC versiyonu

Teşekkür

Kevin Cruijssen sayesinde 4 byte kurtarıldı.

C # (.NET Core) , 131 123 + 18 = 141 bayt

a=>{string s=Convert.ToString(a,2),t=s.Split('0').OrderBy(x=>x.Length).Last();return a<1?0:s.Length-s.IndexOf(t)-t.Length;}

Çevrimiçi deneyin!

İçin +18 bayt using System.Linq;

Teşekkür

Grzegorz Puławski sayesinde 8 bayt kurtarıldı.

Degolfed

a=>{
    string s=Convert.ToString(a,2),      // Convert to binary
    t=s.Split('0')                       // get largest group of 1's
       .OrderBy(x=>x.Length)
       .Last();
    return 
        a<1?0:                          // handle 0 case
        s.Length-s.IndexOf(t)-t.Length; // get position in reversed string
}

C # (.NET Core) , 164 161 bayt

a=>{var s=Convert.ToString(a,2);int c=0,l=0,p=0,k=0,j=s.Length-1,i=j;for(;i>=0;i--){if(s[i]>'0'){if(i==j||s[i+1]<'1'){p=i;c=0;}if(++c>=l){l=c;k=p;}}}return j-k;}

Çevrimiçi deneyin!

Bir dışı Linqbir şey hemen belli olsa eminim çözüm, geliştirilebilir.

Degolfed

a=>{
    var s=Convert.ToString(a,2); // Convert to binary
    int c=0,l=0,p=0,k=0,j=s.Length-1,i=j;
    for(;i>=0;i--)               // Loop from end of string
    {
        if(s[i]>'0')             // if '1'
        {
            if(i==j||s[i+1]<'1') // if first digit or previous digit was '0'
            {
                p=i;             // set the position of the current group
                c=0;             // reset the count
            }
            if(++c>=l)           // if count is equal or greater than current largest count
            {
                l=c;             // update largest count
                k=p;             // store position for this group
            }
        }
    }
    return j-k;                  // as the string is reversed, return string length minus position of largest group
}

1
rİlk cevapta keserek
Grzegorz

Sen senin limanında iki bayt kaydedebilirsiniz Arnauld 'böyle s:T=a=>{int x=(int)Math.Log(a,2);return(a&=a/2)>0?T(a):x<0?0:x;}
Kevin Cruijssen

1
Hatta iki bayt daha kaydedildi ( 60 byte ):T=a=>(a&a/2)>0?T(a&a/2):Math.Log(a,2)<0?0:(int)Math.Log(a,2)
Kevin Cruijssen

2

Kabuğu , 12 bayt

→S§-€¤≠Lo▲gḋ

Çevrimiçi deneyin!

açıklama

                 Implicit input, e.g                           750
           ḋ     Convert to binary                             [1,0,1,1,1,0,1,1,1,0]
          g      Group equal elements                          [[1],[0],[1,1,1],[0],[1,1,1],[0]]
        o▲       Maximum                                       [1,1,1]
    €            Index of that substring in the binary number  3
     ¤≠L         Absolute difference of lengths                abs (3 - 10) = 7
 S§-             Subtract the two                              7 - 3 = 4
→                Increment                                     5

2

Jöle ,  14 13 12  11 bayt

Bµṣ0Ṫ$ƤMḢạL

Negatif olmayan tamsayıları alıp geri veren monadik bir bağlantı.

Çevrimiçi deneyin! veya test odasına bakın .

Nasıl?

Bµṣ0Ṫ$ƤMḢạL - Main link: number, n                   e.g. 750
B           - convert to a binary list                    [1,0,1,1,1,0,1,1,1,0]
 µ          - monadic chain separation, call that b
      Ƥ     - map over prefixes:  (i.e. for [1], [1,0], [1,0,1], [1,0,1,1],...)
     $      -   last two links as a monad:                e.g.: [1,0,1,1,1,0,1,1]
   0        -     literal zero                                   0
  ṣ         -     split (prefix) at occurrences of (0)           [[1],[1,1,1],[1,1]]
    Ṫ       -     tail                                                        [1,1]
       M    - maximal indices                             [5,9]
        Ḣ   - head                                        5
          L - length (of b)                               10
         ạ  - absolute difference                         5

Benzer bir çözüm buldum ama ŒrṪPöneklerde kullandım.
mil

2

Jöle , 19 bayt

BŒgḄṀB
BwÇɓÇL+ɓBL_‘

Çevrimiçi deneyin!

Jonathan Allan'a  4  6 byte kaydettiğin için teşekkürler !

Uzun sürmesine rağmen, bunu bırakmak için çok çalıştım. Gerçekten 1ikilik gösterimde en uzun alt dizgiyi arayan bir çözüm eklemek istedim ...

açıklama

BŒgḄṀB - Monadic yardımcı bağlantı. Bir sonraki linkte Ç ile birlikte kullanılacak.

B - İkili gösterim.
 Œg - Ardışık eşit elemanların grup çalışması.
   Bin - İkili değerden tamsayıya dönüştürün.
    Ṁ - Maksimum değer.
     B - tamsayıdan ikiliye dönüştür.


BwÇɓÇL + ɓBL_ '- Ana link.

B - İkili gösterim (girişin).
  Ç - Monad olarak son link. Giriş tamsayısını alır.
 w - İlk alt liste dizini.
   separate - Ayrı bir ikili zincir başlat. Argümanları tersine çevirir.
    Ç - Monad olarak son link.
     L - Uzunluk
      + - Ekleme
       separate - Ayrı bir ikili zincir başlat. Argümanları tersine çevirir.
        B - İkili.
         L - Uzunluk
          _ '- Çıkarıp sonucu arttırın (çünkü Jelly 1 indeksleme kullanıyor).
              - Örtük çıktı.

Yardımcı bağlantınız BŒgḄṀBbunun yerine olabilir
Jonathan Allan

@JonathanAllan Oh vay teşekkür ederim!
Bay Xcoder

Ana bağlantınız olabilirBwÇɓÇL+ɓBL_‘
Jonathan Allan

@JonathanAllan Vay, tekrar teşekkürler!
Bay Xcoder

2

Kotlin , 77 bayt

{val b=it.toString(2)
b.reversed().lastIndexOf(b.split(Regex("0+")).max()!!)}

Beautified

{
    val b = it.toString(2)
    // Find the left position of the first instance of
    b.reversed().lastIndexOf(
            // The largest group of 1s
            b.split(Regex("0+")).max()!!)
}

Ölçek

var s:(Int)->Int =
{val b=it.toString(2)
b.reversed().lastIndexOf(b.split(Regex("0+")).max()!!)}
fun main(args: Array<String>) {
    r(0, 0)
    r(142, 1)
    r(48, 4)
    r(750, 5)
}

fun r(i: Int, i1: Int) {
    var v = s(i)
    println("$i -> $v [$i1] ${i1 == v}")
}

Test etmedim ama bunun da skalada çalıştığını düşünüyorum.
V. Courtois

2

Haskell , 101 98 96 75 bayt

snd.maximum.(`zip`[0..]).c
c 0=[0]
c n|r<-c$div n 2=sum[r!!0+1|mod n 2>0]:r

Çevrimiçi deneyin!Kullanımı: snd.maximum.(`zip`[0..]).c $ 142verim 1.

Açıklama:

  • cgirişi bir ikiliye dönüştürür, aynı zamanda bir çizginin uzunluğunu sayarak sonuçları bir listede toplar. çizginin geçerli uzunluğunu eklerken, bu listenin r<-c$div n 2kalanını yinelemeli olarak hesaplar . Liste anlama , mevcut ikili hanenin bir olup olmadığını kontrol eder ve eğer öyleyse, önceki satırın uzunluğunu alır (ilk eleman ) ve bir tane ekler. Aksi taktirde liste kavrama boş ve sonuç verir . Örnek giriş için listeyi verir .rsum[r!!0+1|mod n 2>0]:rrmod n 2>0rsum[]0c 142[0,3,2,1,0,0,0,1,0]

  • (`zip`[0..])pozisyonu, bir önceki listenin her elemanına bir tupleın ikinci bileşeni olarak ekler. Örneğin bu verir[(0,0),(3,1),(2,2),(1,3),(0,4),(0,5),(0,6),(1,7),(0,8)] .

  • maximumBu listedeki leksikografik olarak maksimum tuple bulur; Bu (3,1)örnekte verim sağlar ve snddemetin ikinci bileşenini döndürür.




2

MS SQL Server, 437 426 407 398 bayt

SQL Fiddle

Satır sonlarını vb. Kaldırabileceğime eminim, ancak bu yapmak istediğim kadar küçük:

create function j(@ int)
returns int
as BEGIN
declare @a varchar(max)='',@b int,@c int=0,@d int=0,@e int=0,@f int=0,@g int=0,@h int=0
while @>0 BEGIN SELECT @a=cast(@%2 as char(1))+@a,@=@/2
END
SET @b=len(@a)
while @<@b
BEGIN
select @c=@d,@d=cast(substring(@a,@b-@,1)as int)
IF @d=1
BEGIN IF @c=0
SELECT @e=@,@g=1
else SET @g+=1 END
IF @g>=@h BEGIN select @h=@g,@f=@e END
SET @+=1
END
return @f
END

İşte daha okunaklı bir sürüm:

create function BinaryString(@id int)
returns int
as BEGIN
  declare @bin varchar(max)
  declare @binLen int
  declare @pVal int = 0
  declare @Val int = 0
  declare @stC int = 0 --start of current string of 1s
  declare @stB int = 0 --start of biggest string of 1s
  declare @lenC int = 0 --length of current string of 1s
  declare @lenB int = 0 --length of biggest string of 1s

  set @bin = ''

    while @id>0
      BEGIN
        SET @bin = cast(@id%2 as varchar(1)) + @bin
        SET @id = @id/2
      END

    SET @binLen = len(@bin)

    while @id<@binLen
      BEGIN
        set @pVal = @Val
        set @Val = cast(substring(@bin,@binLen-@id,1) as int)
        IF @Val = 1 and @pVal = 0
          BEGIN 
            SET @stC = @id
            SET @lenC = 1
          END
        IF @Val = 1 and @pVal = 1
          BEGIN 
            SET @lenC = @lenC + 1
          END
        IF @lenC >= @lenB
          BEGIN
            set @lenB = @lenC
            set @StB = @StC
          END

        SET @id = @id + 1 
      END

  return @StB
END

Asıl püf noktası, bulabildiğim kadarıyla, bir sayıyı ondalık sayıdan ikili dosyaya dönüştürecek hiçbir yerel SQL işlevi bulunmuyor. Sonuç olarak, çevrimi ikilik olarak el ile kodlamak zorunda kaldım, sonra doğru sayıyı bulana kadar her seferinde bir karakter dize olarak karşılaştırabilirdim.

Eminim bunu yapmanın daha iyi bir yolu var, ama (n) bir SQL cevabı görmedim, bu yüzden onu oraya atacağımı düşündüm.


Daha fazla golf oynayabilirseniz, lütfen yapın. Ama aksi takdirde, bu harika! PPCG'ye Hoşgeldiniz!
NoOneIsHere

@Hayır! Teşekkürler! İşlev ismimi de kısaltabileceğimi farkettim;)
phroureo

2

APL (Dyalog Unicode) , 22 karakter = 53 bayt

⎕IO←0Birçok sistemde varsayılan olanı gerektirir .

⊃⌽⍸(∨⌿↑⊆⍨b)⍷⌽b2⊥⍣¯1⊢⎕

Çevrimiçi deneyin!

 giriş istemi

 verim ki (ayırır ¯1gelen )

2⊥⍣¯1 Temel-2'ye dönüştürün, gerektiği kadar pozisyon kullanarak

b← olarak sakla b( b inary için)

 ters

() Aşağıdakilerin başlangıç ​​pozisyonlarını şununla işaretleyin:

⊆⍨b kendi kendine bölünme b(yani 1-çizgileri b)

 mix (listeyi matris halinde yapın, sıfırlarla doldurun)

∨⌿ dikey VEYA azaltma (en uzun çizgiyi verir)

ɩ başlangıç pozisyonlarının ndices

 ters

 ilkini seç (mevcut değilse sıfır verir)


io

@ ngn Doğru.
Adam

1

MATL , 15 bayt

`tt2/kZ&t]xBnq&

Çevrimiçi deneyin!

Yarım ve AND fikrini kullanır. kSadece için sonlandırmak yapmak için gerekli olan 1nedense, 1 VE 0.5 getiri 1 için, sonsuz döngüye neden -.

(alternatif çözüm: BtnwY'tYswb*&X>)-ikili ve çalışma boyu kodlamaya dönüştürerek)


1

Google Sayfaları, 94 bayt

=Len(Dec2Bin(A1))-Find(MAX(Split(Dec2Bin(A1),0)),Dec2Bin(A1))-Len(MAX(Split(Dec2Bin(A1),0)))+1

Hayır, çok hoş değil. Saklamak çok güzel olurduDec2Bin(A1)Referans olarak bir değişken olarak .

Anahtar nokta: Excel gibi, Dec2Binfonksiyonun da maksimum giriş değeri vardır 511. Bundan daha büyük olan herhangi bir şey, aşağıda görüldüğü gibi hata verir.

Sonuçlar


1

R, 117 Bayt

z=rev(Reduce(function(x,y)ifelse(y==1,x+y,y),strtoi(intToBits(scan())),,,T));ifelse(!sum(z),0,33-which.max(z)-max(z))

104 bayt! Bunun yerine , sağdan biriktirmek için revkullanın Reduce(...,T,T)( x,yfonksiyon tanımlamasında geçiş ). Sonra 1+max(z)-which.max(z)sonuç biraz farklı olduğundan kullanın . Kullanım "if"yerine "ifelse"biz vektörelleştirmeyi gerek olmadığı; aaand any(z)yerine kullanırsanız !sum(z)bir bayt bırakın.
Giuseppe

Bence bunu 100 bayttan daha azına koymalıyız.
Giuseppe

@giuseppe Sizden önce burada olduğum için biraz aldatıcı hissediyorum! Bir demet tnx kez yapacak!
Zahiro Mor

Ama güzel bir yaklaşım hayır?
Zahiro Mor

1
Endişelenme, bunu daha önce görmüştüm ama cevap vermek istemiyordum, çünkü R bit operasyonlarında çok kötü ... Evet, iyi iş çıkardın, +1
Giuseppe

1

Excel VBA, 54 44 Bayt

@EngineerToast sayesinde -10 bayt

Menzilden giriş alan [A1]ve VBE giriş penceresine çıkış yapan anonim VBE giriş penceresi işlevi

?Instr(1,StrReverse([Dec2Bin(A1)]),1)+[A1>0]

1
Gözetim C1yerine hala var olan gözetimin yanında, sonuçları sıfır giriş düzeltmesi için doğrudan çevirerek elde A1edebileceğinizi düşünüyorum Instr: ?Instr(1,StrReverse([Dec2Bin(A1)]),1)+([A1]>0)(46 bayt). Doğru = -1 çünkü ... VBA.
Mühendis Toast

@EngineerToast - Tatlı! Bunu görmeliydim; Notasyonu >0ekleyerek 2 byte düşürmeyi [A1]
Taylor Scott



0

R, 66 Bayt

function(i){a=rle(intToBits(i));max(0,a[[1]][which(a[[2]]==1)])}

Açıklama:

function(i){
  a = rle(                  # Run-length encode
    intToBits(i)            # The bits in i
  );                        # And assign it to a.
  max(0,                    # Return the maximum of zero and
      a[[1]][               # The lengths of a,
        which(a[[2]]==1)    # But only those where the repeated bit is 1
        ])
}

1
Bu, pozisyonunun değil en uzun çizginin uzunluğunu döndürür. Test durumlarına ve üstteki özelliklere karşı kontrol edin.
user2390246 18:17

Bu cevap düzeltildikten sonra, aşağı oyumu bir oyla değiştireceğim. Ayrıca, not kendinizin kullanabileceği a$lyerine a[[1]]ve a$vyerine a[[2]]yanı sıra bazı bayt :) kurtarmak için >0yerine ==1.
Giuseppe


0

Javascript, 54 karakter

f=i=>i.toString(2).split(0).sort().reverse()[0].length
  • i.toString(2) tamsayı için ikili dize alır.
  • .split(0)Bir dizi elemanı, her bir ardışık olanlar parçasını alır.
  • .sort().reverse() bize ilk olarak en yüksek değeri verir.
  • Bu [0].lengthbize bu ilk değerin uzunluğunu verir.

the starting position of number of largest consecutive 1's
L3viathan

0

Perl 5, 45 + 1 (-p)

(sprintf"%b",$_)=~/(1+)(?!.*1\1)/;$_=length$'

Bunu çoğu merminin komut satırına yazarsanız, şunu yazmanız gerekebilir:

perl -pE'(sprintf"%b",$_)=~/(1+)(?!.*1\1)/;$_=length$'"'"

Sonunda yapılan alıntıların dansı, sadece 'kabuğun tüketebileceği bir perl görmektir .


0

Retina , 52 43 bayt

İkili dosyaya dönüştürün, ardından en büyük dizenin izini sürenin uzunluğuyla değiştirin.

.*
$*
+`(1+)\1
$+0
01
1

$'¶
O`
A-3`
^1+

.

Çevrimiçi deneyin - tüm test durumları

Martin sayesinde 9 bayt kurtardı.


Sen kullanabilirsiniz $+için ${1}. Ancak, son aşamayı bunun gibi bir grup aşama ile değiştirerek daha da tasarruf edebilirsiniz: tio.run/##K0otycxL/K/…
Martin Ender

@MartinEnder Tamam. Bu ${1}Github hakkındaki öğreticinizden kopyalandı.
mbomb007 18:17
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.