Kekerasan Bilangan Bulat Digital

26

Untuk menemukan kekerasan digital dari sebuah bilangan bulat, ambil representasi binernya, dan hitung berapa kali sebuah leading dan trailing 1dapat dihilangkan sampai ia memulai atau diakhiri dengan a 0. Jumlah total bit yang dihapus adalah kekerasan digitalnya.

Itu penjelasan yang cukup bertele-tele - jadi mari kita uraikan dengan contoh yang berhasil.

Untuk contoh ini, kita akan menggunakan nomor 3167. Dalam biner, ini adalah:

110001011111

(Perhatikan bahwa, selama konversi ke biner, Anda harus memastikan untuk menghapus nol di depan)

Itu tidak dimulai atau diakhiri dengan 0, jadi kami menghapus 1 pasang bit:

1  1000101111  1

Dan satu lagi:

11  00010111  11

Tapi sekarang ada 0 di awal, jadi kami tidak bisa menghapus 1pasangan lagi . Secara total, 4 bit kami lepaskan, dan 4 adalah kekerasan digital 3167.

Namun, untuk angka yang dapat ditulis sebagai 2 n -1 untuk n positif (yaitu hanya berisi 1dalam representasi biner), 0 tidak akan pernah tercapai, dan dengan demikian semua bit dapat dihapus. Ini berarti bahwa kekerasan hanyalah panjang bit bilangan bulat.


Tantangan

Tugas Anda adalah menulis program atau fungsi yang, diberi bilangan bulat non-negatif n >= 0 , menentukan kekerasan digitalnya.

Anda dapat mengirimkan program lengkap yang menjalankan I / O, atau fungsi yang mengembalikan hasilnya. Kiriman Anda harus berfungsi untuk nilai-nilai ndalam rentang integer standar bahasa Anda.


Uji Kasus

Harap beri tahu saya jika ada yang salah, atau jika Anda ingin menyarankan case edge untuk ditambahkan.

0     -> 0
1     -> 1
8     -> 0
23    -> 2
31    -> 5
103   -> 4
127   -> 7
1877  -> 2
2015  -> 10

Inilah solusi Python yang tidak diklik yang saya gunakan untuk menghasilkan kasus uji ini (tidak dijamin bug-kurang):

def hardness(num) -> int:
    binary = bin(num)[2:]

    if binary.count('0') == 0:
        return num.bit_length()

    revbin = binary[::-1]

    return min(revbin.find('0'), binary.find('0')) * 2
FlipTack
sumber
1
Bagaimana 1mengembalikan 1 ketika tidak ada 0di dalamnya sama sekali? Maksud saya, Anda tidak dapat menghapus cukup 1 dari string untuk memulai atau mengakhiri 0.
busukxuan
2
@busukxuan Baca paragraf tepat sebelum tajuk "The Challenge": untuk angka yang dapat ditulis sebagai 2 ^ n-1 (yaitu hanya berisi 1 dalam representasi biner), 0 tidak akan pernah tercapai, sehingga semua bit dapat dihapus . Ini berarti bahwa kekerasan hanyalah panjang bit bilangan bulat.
FlipTack
2
@busukxuan Anda dapat menganggapnya sebagai jumlah yang masing-masing sisi diisi, sebelum nol tercapai.
FlipTack
2
Untuk downvoter yang jelas-jelas tidak menyukai kasing tepi: Kekerasannya adalah jumlah bit padat (1) yang diisi - jika semuanya padat, maka tentunya ia memiliki kekerasan 100%, panjang bit keseluruhannya?
FlipTack
1
@FlipTack Saya tidak ingin terlalu banyak mempengaruhi, ini tantangan Anda. Saya awalnya memahami "kekerasan" sebagai jumlah maksimum pasangan yang luar yang bisa dihilangkan, satu dari setiap sisi. Tapi Anda mungkin benar, jika ada satu yang tersisa di akhir, mungkin itu harus dihitung
Luis Mendo

Jawaban:

6

Jelly , 11 10 byte

BµQL××Ṛa\S

Cobalah online!

Bagaimana itu bekerja

BµQL××Ṛa\S  Main link. Argument: n

B           Binary; convert n to base 2.
 µ          Begin a new, monadic chain. Argument: A (array of binary digits)
  Q         Unique; deduplicate the digits.
   L        Length; count the unique digits.
    ×       Multiply each digit by the result.
     ×Ṛ     Multiply the results by reversed A.
       a\   Cumulative reduce by logical AND.
            This zeroes out all elements after the first zero.
         S  Compute the sum of the result.
Dennis
sumber
8

Python , 76 69 68 63 62 60 57 byte

f=lambda n,k=0:n>>k&(n&n>>k>n>>k+1)and(n&n+1>0)-~f(n,k+1)

Cobalah online!

Bagaimana itu bekerja

Ini adalah solusi rekursif yang mengambil input n dan terus meningkatkan k - mulai dari 0 - sementara LSB k (n) (bit pada indeks k dari kanan) dan MSB k (n) (bit pada indeks k dari kiri) diatur. Setelah selesai, ia mengembalikan k jika semua bit n diatur dan 2k jika tidak.

Mari kita mulai dengan menulis ulang lambda f sebagai fungsi bernama F , dengan variabel bantu t .

def F(n, k = 0):
    t = n >> k
    return t & (n & t > t >> 1) and (n & (n + 1) > 0) + 1 + F(n, k + 1)

Dalam setiap doa F , pertama-tama kita menggeser- n sejumlah k unit ke kanan dan menyimpan hasilnya dalam t . Dengan cara ini, LSB 0 (t) = LSB k (n) , jadi t aneh jika dan hanya jika LSB k (n) diatur.

Menentukan apakah MSB k (n) diatur sedikit lebih rumit; inilah yang n & t > t >> 1mencapai. Untuk menggambarkan cara kerjanya, mari kita pertimbangkan bilangan bulat n = 1αβγδεζη 2 dari bit-length 8 dan menganalisis panggilan fungsi F (n, 3) , yaitu, k = 3 .

Kami mencoba menentukan apakah MSB 3 (n) = set diatur dengan memeriksa nilai kebenaran perbandingan (n & t> t >> 1) = (1αβγδεζη 2 & 1αβγδ 2 > 1αβγ 2 ) . Mari kita periksa bilangan bulat yang terlibat.

MSB-index  012k4567

n          1αβγδεζη
t             1αβγδ

t >> 1         1αβγ

Kami mengklaim bahwa γ = 1 jika dan hanya jika n & t> t >> 1 .

  • Jika γ = 1 , maka n & t memiliki panjang bit 5 sedangkan t >> 1 memiliki panjang bit 4 , jadi n & t> t >> 1 .

    Ini membuktikan bahwa γ = 1 menyiratkan n & t> t >> 1 .

  • Jika n & t> t >> 1 , ada dua opsi: baik γ = 1 atau γ = 0 . Dalam kasus pertama, tidak ada yang tersisa untuk dibuktikan.

    Dalam kasus kedua, kita memiliki αβγδ 2 ≥ n & t> t >> 1 = 1αβγ 2 .

    Karena αβγδ 2 > 1αβγ 2 , kita harus memiliki MSB 0 (αβγδ 2 ) ≥ MSB 0 (1αβγ 2 ) , artinya α = 1 .

    Dengan cara ini, 1βγδ 2 > 11βγ 2 , jadi kita harus memiliki MSB 1 (1βγδ 2 ) ≥ MSB 1 (11βγ 2 ) , artinya β = 1 .

    Pada gilirannya, ini menyiratkan bahwa 11γδ 2 > 111γ 2 . Mengingat bahwa γ = 0 dalam kasus kedua, kita mendapatkan ketimpangan 110δ 2 > 1110 2 , yang salah karena MSB 2 (110δ 2 ) = 0 <1 = MSB 2 (1110 2 ) .

    Dengan demikian, hanya kasus pertama yang mungkin dan n & t> t >> 1 menyiratkan γ = 1 .

Ringkasnya, jika LSB k (n) dan MSB k (n) diatur, t akan menjadi aneh dan n & t> t >> 1 akan Benar , jadi t & (n & t> t >> 1) akan hasil 1 . Namun, jika LSB k (n) atau MSB k (n) tidak disetel (atau jika keduanya), t akan genap atau n & t> t >> 1 akan salah , jadi t & (n & t> t> > 1) akan menghasilkan 0 .

Memanggil F dengan argumen tunggal menginisialisasi k = 0 . Sementara kondisi yang telah kita bahas sebelumnya berlaku, kode setelah anddijalankan, yang (antara lain) secara rekursif memanggil F dengan k bertambah .

Setelah LSB k (n) atau MSB k (n) tidak disetel, kondisi gagal dan F (n, k) mengembalikan 0 . Setiap panggilan fungsi k sebelumnya menambahkan (n & (n + 1)> 0) + 1 ke F (n, k) = 0 , jadi F (n) mengembalikan ((n & (n + 1)> 0) + 1) k .

Sekarang, jika semua bit n sama (yaitu, jika n adalah 0 atau semua bitnya ditetapkan), n +1 tidak akan memiliki bit yang sama dengan n , jadi n & (n +1) = 0 dan F (n) mengembalikan k . Namun, jika n memiliki bit set dan unset, n & (n + 1)> 0 dan F (n) mengembalikan 2k .

Dennis
sumber
2
Solusi rekursif dalam Python tampaknya mencetak sangat baik belakangan ini.
mbomb007
Setidaknya dibandingkan dengan solusi berulang, mereka selalu punya. input(),, whiledan printsudah 17 byte ...
Dennis
Ya, tapi saya merasa mereka jauh lebih sulit untuk menulis.
mbomb007
1
Cukup adil. Implementasi iteratif langsung dari ide yang sama hanya akan menjadi 5 byte lebih lama. tio.run/nexus/… 2 byte lagi dapat disimpan dengan beberapa trik. tio.run/nexus/python2#JY1BDsIgFAXX7SnepgUUI1BNm1K4jKVJQ/…
Dennis
6

MATL , 13 12 byte

Btv`6L&)}x@q

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Kode ini mengulangi setiap digit biner, dan menghitung berapa kali dimungkinkan untuk menghapus dua digit luar.

B        % Input number (implicit). Horizontal vector of binary digits
tv       % Duplicate and concatenate vertically
`        % Do...while
  6L&)   %   Flatten the array if needed (in column-major order), and split it
         %   into two subarrays: one with the inner entries, and another
         %   with the two outer entries. The latter will be used for deciding
         %   if the loop continues or is exited
}        % Finally (execute before exiting the loop)
  x      %   Delete last subarray of inner entries
  @q     %   Push last iteration index minus 1
         % End (implicit). The next iterarion is executed if the array at the
         % top of the stack is non-empty and only contains nonzero values. 
         % Otherwise the loop is exited, executing the "finally" block first
         % Display (implicit)
Luis Mendo
sumber
6

Python, 82 byte

Saya merasa masih bisa bermain golf, tetapi saya menghabiskan beberapa waktu untuk mencoba metode yang berbeda dan ini adalah yang terpendek.

def f(n):b=bin(n)[2:];x=min(b.find('0'),b[::-1].find('0'));print(x<0)*len(b)or x*2

Cobalah online

Meskipun ini bekerja mirip dengan program Python OP, saya membuat ini sebelum pertanyaan diposting, setelah melihat pertanyaan di Sandbox, yang tidak mengandung program semacam itu.

mbomb007
sumber
6

Python 2, 66 byte

s=bin(input())[2:].split('0')
print len(min(s[-1],s[0]))<<1%len(s)

Pisahkan representasi biner dari input menjadi bilangan 1. Hitung angka 1 di bilangan kecil pertama dan terakhir, lalu gandakan, kecuali ada satu bidak yang akan dikalikan dua kali.

Tidak
sumber
Pintar, tapi tetap mudah dimengerti. Saya suka itu!
mbomb007
5
@ mbomb007 Anggap saja sebagai pemanasan untuk memahami Dennis's :)
xnor
3

PowerShell , 109 106 byte

$a=[convert]::ToString($args[0],2)-split0;(((($b=$a[0].length),$a[-1].length|sort)[0]*2),$b)[$a.count-eq1]

Cobalah online!

Mengambil input $args[0], menggunakan panggilan .NET untuk convertitu toStringdengan basis 2(yaitu, buatlah biner), lalu -splits string itu di 0s, simpan yang ke dalam$a . Penting untuk dicatat: panggilan .NET tidak menghasilkan nol di depan, jadi digit pertama selalu a 1.

Jadi ada dua kemungkinan - string biner adalah semua, atau setidaknya ada satu nol. Kami membedakan antara mereka yang memiliki pseudo-ternary yang diindeks oleh $a.count-eq1. Jika biner memiliki setidaknya satu nol, case kiri, kami mengambil minimum dari panjang [0]string pertama 1s dan [-1]string terakhir (ditemukan oleh |sortdan kemudian [0]). Yang lebih pendek adalah pasangan terbanyak yang bisa kita hapus, jadi kita kalikan dengan 2. Perhatikan bahwa jika string biner asli berakhir dengan 0, seperti untuk input 8, maka [-1].lengthjuga akan menjadi 0(karena itu string kosong), yang ketika dikalikan dengan 2masih 0.

Jika tidak, dengan semua string biner, kita hanya mengambil $b(yang sebelumnya ditetapkan sebagai panjang dari [0]string pertama , dalam hal ini, keseluruhan dari string biner).

Dalam situasi apa pun, hasil itu ditinggalkan di jalur pipa dan hasilnya tersirat.

AdmBorkBork
sumber
3

JavaScript (ES6), 57 byte

f=
n=>n.toString(2).replace(/^(1*)(.*(\1))?$/,'$1$3').length
<input oninput=o.value=1/this.value?f(+this.value):''><input id=o readonly>

Mengambil biner dan mencoba untuk mencocokkan semua 1satau gagal dalam jumlah yang sama dari memimpin dan mengikuti 1s.

Neil
sumber
2

Retina , 48 byte

.+
$*
+`(1+)\1
$1o
o1
1
m(+`^1(.*)1$
xx¶$1
x|^1$

Cobalah online

Penjelasan:

.+              # Convert to unary
$*
+`(1+)\1        # Convert to binary (but with `o` instead of `0` -- it's shorter)
$1o
o1
1
m(+`^1(.*)1$    # Replace pairs of surrounding ones with `xx`
xx¶$1
x|^1$,          # Count x's, including the possibility of a single remaining `1`
mbomb007
sumber
2

C #, 133 byte

Fungsi yang mengembalikan kekerasan. Mengambil integer dari argumen.

int h(int b){var n=Convert.ToString(b,2);for(b=0;;){if(n[0]+n[n.Length-1]==98)n=n.Substring(1,n.Length-2);else break;b+=2;}return b;}

Nah, hari ini saya temukan '1' + '1' = 98di C #.

lebih kaya
sumber
1
Itu karena '1'ASCII char 49, dan 49 + 49 = 98.
FlipTack
Saya benar-benar menghabiskan 10 menit mencari tahu mengapa saya 1 + 1 = 2tidak berhasil. @FlipTack
devRicher
2

C, 89 88 85 byte

Disimpan dua byte karena @FlipTack menunjukkan pernyataan yang tidak berguna.

Panggil f()dengan nomor untuk menguji, output dikembalikan dari fungsi.

t,h;f(l){for(t=l;t&&~t&1<<30;t*=2);for(h=0;t&1<<30&&l&1;t*=2,l/=2)++h;return h<<!!l;}

Cobalah di ideone .

owacoder
sumber
2

JavaScript (ES6), 59 58 byte

f=(n,m=1<<30)=>m>n?f(n,m/2):m>1?n&m&&n&1&&2+f(n/2,m/4):n&1

Uji kasus

Arnauld
sumber
2

C, 137 132 122 119 117 114 98 94 92 87 85 Bytes

Saatnya mulai bermain golf B-)

i,j;f(n){for(i=1<<30;i&~n;i/=2);for(j=0;n&i;n/=2,i/=4)j+=~n&1?i=0:2;return j-=n<1*j;}

Inilah buktinya

main()
{
  printf("%d %d\n", 0, f(0));
  printf("%d %d\n", 1, f(1));
  printf("%d %d\n", 8, f(8));
  printf("%d %d\n", 23, f(23));
  printf("%d %d\n", 31, f(31));
  printf("%d %d\n", 103, f(103));
  printf("%d %d\n", 127, f(127));
  printf("%d %d\n", 1877, f(1877));
  printf("%d %d\n", 2015, f(2015));
  printf("%d %d\n", 3167, f(3167));
} 

dan hasilnya;

0 0
1 1
8 0
23 2
31 5
103 4
127 7
1877 2
2015 10
3167 4 
Cleblanc
sumber
1

Java (OpenJDK) , 181 156 150 byte

n->{int i=0;String s=n.toString(n,2);if(s.matches("1*"))i=s.length();else for(;!s.matches("(.*0)|(0.*)");s=s.substring(1,s.length()-1))i+=2;return i;}

Cobalah online!

Pavel
sumber
1

Mathematica, 63 56 byte

(2-Min[l=#~IntegerDigits~2])Min[Tr/@Split[l][[{1,-1}]]]&

Penjelasan

l=#~IntegerDigits~2

Hasilkan representasi basis-2 input, dibungkus dengan a List. Simpan itu dil

(2-Min[...])

Jika elemen min ladalah 1, output 1. Jika tidak, output 2. Kalikan ini dengan ...

Split[l]

Dibagi lmenjadi run.

... [[{1,-1}]]

Ambil elemen pertama dan terakhir.

Tr/@ ...

Ambil total keduanya.

Min[ ... ]

Temukan yang lebih kecil di antara keduanya.

(Kalikan hasil pertama (1 atau 2) dengan hasil ini).

JungHwan Min
sumber
1

Oktaf, 56 54 byte

 @(n)cummin(d=dec2bin(n)-48)*cummin(flip(d))'*2^!all(d)

Cobalah secara Online!

Penjelasan:

d=dec2bin(n)-48

representasi biner dari n

cumd= cummin(d);
cumfd = cummin(flip(d));

Ambil min kumulatif d dan min kumulatif dibalikd

res = cumd * cumfd ';

lakukan perkalian matriks

out = res*2^!all(d)

kalikan dengan 2 jika semua digit adalah 1;

rahnema1
sumber
@FlipTack Terima kasih, tautan diperbarui!
rahnema1
1

Pyth, 18 byte

?*FJjQ2lJyhSxR0_BJ

Program yang mengambil input bilangan bulat dan mencetak hasilnya.

Suite uji (Baris pertama untuk pemformatan)

Bagaimana itu bekerja

?*FJjQ2lJyhSxR0_BJ  Program. Input: Q
?                   If
  F                 reducing
    jQ2             the binary representation of Q as a list
   J                (store in J)
 *                  by multiplication is truthy:
       lJ            Yield len(J)
                    Else:
          hS         Yield the minimum
            xR0      of the first index of zero
               _BJ   in J and its reverse
         y           * 2
                    Implicitly print
TheBikingViking
sumber
1

APL, 26 byte

+/∘(∧\≢↑(∊⊢(,∧∧)¨⌽))2⊥⍣¯1⊢

Kasus uji:

      ( +/∘(∧\≢↑(∊⊢(,∧∧)¨⌽))2⊥⍣¯1⊢ ) ¨ 0 1 8 23 31 103 127 1877 2015    
0 1 0 2 5 4 7 2 10

Penjelasan:

+ / ∘ (∧ \ ≢ ↑ (∊⊢ (, ∧∧) ¨⌽)) 2⊥⍣¯1⊢

                         ⊢ input
                    2⊥⍣¯1 dikonversi ke representasi biner
   ()
        (⊢ ¨⌽) untuk setiap bit dan bit yang cocok di sisi lain
            (∧) ambil logika dan kedua bit,
             , buat daftar kedua bit,
              ∧ kemudian ambil dan dari daftar dan dan
         ∊ meratakan array yang dihasilkan
      ≢ ↑ ambil hanya N bit pertama, dengan N adalah
                                panjang daftar asli bit
    ∧ \ mengambil logika yang berjalan dan (hanya menyisakan
                                yang memulai)
+ / ∘ jumlahkan itu
marinus
sumber
1

J, 22 byte

(#<.2*(<.&(#.~)|.))@#:

Ini didasarkan pada trik yang dipelajari dari tantangan ini .

Cobalah online!

Penjelasan

(#<.2*(<.&(#.~)|.))@#:  Input: integer n
                    #:  Binary digits of n
(                 )@    Operate on those digits D
               |.         Reverse D
       <.                 Take the minimum of
         &(#.~)           the "trailing truths" of D and reverse(D)
    2*                    Multiply by 2
 #                        The length of D
  <.                      Minimum of length and the previous result
mil
sumber
1

PHP, 83 74 byte

3 + 6 byte disimpan oleh Jörg

<?=(~$s=decbin($argn))[$a=strspn($s,1)]?min($a,strspn(strrev($s),1))*2:$a;

menerima input dari STDIN; jalankan bersama -nR.

kerusakan

<?=                     # print ...
(~
    $s=decbin($argn)        # $s = binary representation of input
)[
    $a=strspn($s,1)         # $a = number of leading `1`s
]                           # if $s has more than $a digits,
?   min($a,                     # 2. minimum of $a and
        strspn(strrev($s),1)    # 1. number of trailing `1`s
    )*2                         # 3. *2
:   $a                      # else $a (==strlen)
Titus
sumber
1
<?=~($s=decbin($argn))[$a=strspn($s,1)]?2*min($a,strspn(strrev($s),1)):$a;
Jörg Hülsermann
0

JavaScript (ES6), 83 Bytes

f=x=>(y=x.toString(2),y.match(/^1*$/)?y:([s,e]=y.match(/^1*|1*$/g),s<e?s:e)).length

Tidak Disatukan:

function f(n) {
    var binStr = n.toString(2);
    if(binStr.match(/^1*$/)) {
        // If binary representation is all 1s, return length of binary
        return binStr.length;
    } else {
        // Grab the starting and ending 1s in the binary representation
        var [start1s, end1s] = binStr.match(/^1*|1*$/g);
        var startHardness = start1s.length;
        var endHardness = end1s.length;
        return Math.min(startHardness, endHardness);
    }
}
Joshua David
sumber
0

Mathematica, 62 byte

(h=0;#~IntegerDigits~2//.{{1,m___,1}:>(h+=2;{m}),{1}:>h++};h)&

Fungsi murni di mana #merupakan argumen pertama.

(h=0;...;h)&set h=0, melakukan banyak hal ..., lalu mengembalikan h(kekerasan). Mari kita lihat banyak hal:

#~IntegerDigits~2                                     Binary representation of the input
                 //.                                  Apply the following list of rules repeatedly until there is no change
                    {                                 Start of the list of rules
                     {1,m___,1}                       If you see a list starting and ending with 1 with the sequence m (possibly empty) in between
                               :>(h+=2;{m}),            replace it with just {m} after incrementing h twice.
                                            {1}       If you see the singleton list {1}
                                               :>h++    replace it with h, then increment h.
                                                    } End of the list of rules

Terima kasih kepada Greg Martin karena memperkenalkan saya pada trik ini .

ngenisis
sumber
0

Haskell , 94 92 byte

b 0=[]
b n=mod n 2:b(div n 2)
h n|(c,_:_)<-span(>0)$zipWith(*)n$reverse n=c++c|1<3=n
sum.h.b

Cobalah online! Pemakaian:

Prelude> sum.h.b $ 3167
4

Penjelasan:
b mengonversi angka menjadi biner dan mengembalikan daftar nol dan angka dengan bit paling signifikan terlebih dahulu. Dalam h, daftar ini dibalik dan elemen-bijaksana dikalikan dengan daftar asli, lalu span(>0)terbelah setelah awal 1:

       b 3167 = [1,1,1,1,1,0,1,0,0,0,1,1] = n
    reverse n = [1,1,0,0,0,1,0,1,1,1,1,1] = m
zipWith(*)n m = [1,1,0,0,0,0,0,0,0,0,1,1] = z
   span(>0) z = ([1,1],[0,0,0,0,0,0,0,0,1,1])

Tupel yang dihasilkan adalah pola yang cocok dengan di (c,_:_)mana _:_cocok dengan daftar yang tidak kosong, jadi c = [1,1]. Karena byte dihapus di depan dan belakang, c++c = [1,1,1,1]dikembalikan dan akhirnya diringkas untuk menghasilkan kekerasan digital .

Jika daftar kedua tuple kosong, maka representasi biner hanya berisi satu, dan jumlahnya adalah kekerasan digital. Dengan pencocokan pola gagal hmengembalikan saja n, yang sekali lagi diringkas.

Laikoni
sumber
0

Perl, 61 byte

sub f{$_=sprintf('%b',pop);length(/0/?/^(1+).*\1$/&&$1x2:$_)}

Inti dari ini adalah regex di /^(1+).*\1$/mana 2 kali panjangnya $1adalah jawabannya. Sisa kode adalah overhead dan berurusan dengan kasus khusus semua 1.

cdlane
sumber
Anda dapat menghilangkan tanda kurung di sekitar sprintfargumen. Juga, menggunakan -pflag akan memungkinkan Anda untuk menulis program lengkap yang akan lebih pendek dari fungsi Anda karena Anda akan dapat menghilangkan sub f{...}(sebaliknya Anda harus mengakhiri dengan $_=...tetapi itu masih merupakan peningkatan 4 byte). Akhirnya, alih-alih Anda length(...), Anda bisa melakukannya /0/&&s/^(1+).*\1$/$1$1/;$_=y///c. Ini akan membuat Anda mencapai 51 byte.
Dada
0

PHP, 65 Bytes

<?=strlen(preg_filter('#^(1*)(.*(\1))?$#',"$1$3",decbin($argn)));

Versi Online

Jörg Hülsermann
sumber
0

CJam, 14 byte

ri2b_0#\W%0#e<

Penjelasan:

ri e# Read integer:      | 3167
2b e# Convert to binary: | [1 1 0 0 0 1 0 1 1 1 1 1]
_  e# Duplicate:         | [1 1 0 0 0 1 0 1 1 1 1 1] [1 1 0 0 0 1 0 1 1 1 1 1]
0# e# Index of first 0:  | [1 1 0 0 0 1 0 1 1 1 1 1] 2
\  e# Swap:              | 2 [1 1 0 0 0 1 0 1 1 1 1 1]
W% e# Reverse:           | 2 [1 1 1 1 1 0 1 0 0 0 1 1]
0# e# Index of first 0:  | 2 5
e< e# Minimum:           | 2
Buah Esolanging
sumber