Tamsayıların Dijital Sertliği


26

Bulmak için dijital sertlik , bir tam sayı, bunun ikili gösterimini almak ve kez sayısını hem lider ve arka 1bu başlamak ya da bir ile sona erene kadar çıkarılabilir 0. Çıkarılan toplam bit sayısı, dijital sertliğidir.

Bu oldukça endişe verici bir açıklama - öyleyse çalışmış bir örnekle parçalayalım.

Bu örnek için, 3167 sayısını kullanacağız. İkilik olarak, bu:

110001011111

(İkili dosyaya dönüştürme sırasında baştaki sıfırları sıyrtığınızdan emin olmanız gerekir)

Başlamaz veya bitmez 0, bu yüzden 1 bit bit kaldırırız:

1  1000101111  1

Ve başka:

11  00010111  11

Ama şimdi başlangıçta 0 var, bu yüzden artık 1çiftleri kaldıramıyoruz . Toplamda 4 bit çıkardık ve bu yüzden 4 3167'nin dijital sertliği .

Bununla birlikte, pozitif n için 2 n -1 olarak yazılabilecek sayılar için (yani sadece ikili gösterimi içerir), 0'a asla erişilmez ve böylece tüm bitler kaldırılabilir. Bu, sertliğin basitçe tamsayının bit uzunluğu olduğu anlamına gelir.1


Meydan okuma

Göreviniz, negatif olmayan bir tamsayı verildiğinde n >= 0dijital sertliğini belirleyen bir program veya işlev yazmaktır .

G / Ç gerçekleştiren tam bir program veya sonucu veren bir işlev gönderebilirsiniz. Gönderiniz n, dilinizin standart tamsayı aralığında değerler için çalışmalıdır .


Test Kılıfları

Bunlardan herhangi biri yanlışsa veya eklenecek herhangi bir son durumu önermek isterseniz lütfen bana bildirin.

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

İşte bu test senaryolarını oluşturmak için kullandığım ungolfed Python çözümü:

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

1
İçinde 1hiç olmadığı zaman 1'i nasıl döndürür 0? Demek istediğim, dizgeden başlaması veya bitmesi için yeterince 1'i kaldıramazsınız 0.
busukxuan

2
@ busukxuan "The Challenge" başlığından hemen önceki paragrafı okuyun: 2 ^ n-1 olarak yazılabilecek numaralar için (yani, ikili gösterime sadece 1 içeren), 0'a asla ulaşılmaz ve böylece tüm bitler kaldırılabilir . Bu, sertliğin basitçe tamsayının bit uzunluğu olduğu anlamına gelir.
FlipTack

2
@ busukxuan, sıfıra ulaşılmadan önce her bir tarafın yastığının sayısı olarak düşünebilirsiniz.
FlipTack

2
Açıkçası kenar kasaları beğenmemiş olan düşürücü için: Sertlik , doldurulduğu katı (1) bit sayısıdır - eğer her şey katı ise, o zaman kesinlikle% 100 sertliğe, tüm bit uzunluğuna sahiptir?
FlipTack

1
@FlipTack Çok fazla etki etmek istemiyorum, bu senin görevin. Başlangıçta "sertliği" her iki taraftan birinden alınabilecek maksimum dış çift ​​çifti olarak anladım . Fakat haklı olabilirsin, eğer sonunda bir tane kalırsa, belki de sayılmalıdır
Luis Mendo

Yanıtlar:


6

Jöle , 11 10 bayt

BµQL××Ṛa\S

Çevrimiçi deneyin!

Nasıl çalışır

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.

8

Python , 76 69 68 63 62 60 57 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

Bu, n girişini alan ve artımlı k - 0'dan başlayarak - yineleyen bir çözümdür ; hem LSB k (n) ( sağdan k dizininde bit ) hem de MSB k (n) ( soldan k indeksinde bit ) ayarlanır. Bitmiş sonra, döner k tüm eğer n 'nin bit var ve olan 2k değilse.

Lambda f'yi F olarak adlandırılan bir fonksiyon olarak , t yardımcı değişkeniyle yeniden yazalım .

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

F'nin her çağrışmasında, önce toplam k birimi n olarak sağa kaydırır ve sonucu t olarak kaydederiz . Bu şekilde, LSB 0 (t) = LSB k (n) , yani yalnızca LSB k (n) ayarlanmışsa t tuhaf olur .

MSB k (n) ' nin ayarlanmış olup olmadığını belirlemek biraz daha zor; bu nedir n & t > t >> 1başarır. Nasıl çalıştığını göstermek için , bit uzunluğu 8'in n = 1αβγδεζη 2 tamsayısını düşünelim ve F (n, 3) fonksiyon çağrısını analiz edelim , yani k = 3 .

Karşılaştırmaların gerçeğe uygun değerlerini inceleyerek MSB 3 (n) = γ ayarının yapılıp yapılmayacağını belirlemeye çalışıyoruz (n & t> t >> 1) = (1αβγδεζη 2 & 1αβγδ 2 > 1αβγ 2 ) . İlgili integerleri inceleyelim.

MSB-index  012k4567

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

t >> 1         1αβγ

Γ = 1 olduğunu iddia ediyoruz ve eğer sadece n & t> t >> 1 ise .

  • Eğer γ = 1 ise , n & t bit uzunluğu 5'tir , t >> 1 bit uzunluğu 4 ise n & t> t >> 1 olur .

    Bu, γ = 1'in n & t> t >> 1 anlamına geldiğini kanıtlar .

  • Eğer n & t> t >> 1 , iki seçenek vardır: ya γ = 1 veya γ = 0 . İlk durumda, kanıtlayacak bir şey kalmadı.

    İkinci durumda, söz konusu olması αβγδ 2 ≥ n T> T >> 1 = 1αβγ 2 .

    Yana αβγδ 2 > 1αβγ 2 biz olmalıdır MSB 0 (αβγδ 2 ) ≥ MSB 0 (1αβγ 2 ) , yani bu a = 1 .

    Bu şekilde, 1βγδ 2 > 11βγ 2 , bu nedenle 1 = 1 anlamına gelen MSB 1 (1βγδ 2 ) ≥ MSB 1 (11β 2 ) olmalıdır .

    Bu da, 11γδ 2 > 111γ 2 olduğu anlamına gelir . İkinci durumda γ = 0 olduğunu hatırladığınızda, MSB 2 (110δ 2 ) = 0 <1 = MSB 2 (1110 2 ) den beri yanlış olan 110δ 2 > 1110 2 eşitsizliğini elde ediyoruz .

    Bu nedenle, sadece ilk durum mümkündür ve n & t> t >> 1 , γ = 1 anlamına gelir .

Her iki takdirde, özetlersek LSB k (n) ve MSB k (n) ayarlanır, t garip olacak ve n & t 1> t >> olacak Doğru , bu yüzden (>> 1 n & t> t) t & olacak verim 1 . Bununla birlikte, eğer LSB k (n) veya MSB k (n) ayarlanmamışsa (veya her ikisi de ise), t bile olacak veya n & t> t >> 1 False olacaktır , bu nedenle t & (n & t> t> > 1) 0 verecektir .

Arayan F bir tek argüman alan başlatır k = 0 . Daha önce tartıştığımız koşul andgeçerliyken, (diğer şeylerin yanı sıra) art arda k'yi artan F olarak çağıran sonraki kod yürütülür .

Bir kez LSB k (n) veya MSB k (n) ayarlanmazsa, koşul sağlanmayacak ve F (n, k) döndürür 0 . Önceki k işlevinin her biri adlandırma çağırır (n & (n + 1)> 0) + 1 - F (n, k) = 0 , bu nedenle F (n) döndürür ((n & (n + 1)> 0) + 1) k .

Şimdi, eğer n'nin bütün bitleri eşitse (yani, n'nin ya 0 olması ya da bütün bitlerinin ayarlanması durumunda) n + 1 , n ile ortak hiçbir bit içermez , yani n & (n + 1) = 0 ve F (n) , k değerini döndürür . Bununla birlikte, eğer n hem ayarlanmış hem de ayarlanmamış bitlere sahipse, n & (n + 1)> 0 ve F (n) 2k değerini döndürür .


2
Python'da özyinelemeli çözümler son zamanlarda çok iyi puan alıyor gibi görünüyor.
mbomb007

En azından yinelemeli çözümlerle karşılaştırıldığında, her zaman var. input(),, whileve printzaten 17 bayt ...
Dennis

Evet, ama onları yazmak daha zor buluyorum.
mbomb007

1
Yeterince adil. Aynı fikrin basit yinelemeli bir uygulaması ancak 5 byte daha uzun olacaktır. tio.run/nexus/… Birkaç püf noktası ile 2 bayt daha kaydedilebilir. tio.run/nexus/python2#JY1BDsIgFAXX7SnepgUUI1BNm1K4jKVJQ/…
Dennis

6

Matl , 13 12 bayt

Btv`6L&)}x@q

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

Kod her ikilik basamağı tekrar eder ve iki dış olanı çıkarmak için kaç kez mümkün olduğunu sayar.

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)

6

Python, 82 bayt

Hala golf oynayabileceğimi hissediyorum, ancak bir süre farklı yöntemler denemekle geçirdim ve bu en kısa sürdü.

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

Çevrimiçi deneyin

Bu OP'nin Python programına benzer şekilde çalışsa da, soruyu göndermeden önce, soruyu böyle bir program içermeyen Sandbox'ta görüntüledikten sonra oluşturdum.


6

Python 2, 66 bayt

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

Girişin ikili gösterimini 1'in parçalarına böler. İlk ve son öbekten küçük olan 1'lerin sayısını sayar, daha sonra iki katına çıkacak tek bir öbek olmadıkça ikiye katlar.


Zeki, ama anlaşılması kolay. Bunu sevdim!
mbomb007

5
@ mbomb007 Dennis's'i anlamak için bir ısınma olarak kabul et :)
xnor

3

PowerShell , 109 106 bayt

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

Çevrimiçi deneyin!

Girişi alır $args[0], için .NET çağrısı kullanır convertbununla toStringtabanı ile 2, daha sonra (yani, bu ikili olun) -splito dize s 0, mağazalar olduğunu içine s $a. Unutulmaması gereken önemli: .NET çağrısı baştaki sıfırları döndürmez, bu nedenle ilk basamak her zaman a olur 1.

Dolayısıyla iki olasılık vardır - ikili dize hepsidir, ya da en az bir sıfır vardı. Tarafından dizine eklenmiş bir sahte üçlüsü olanları ayırt ediyoruz $a.count-eq1. İkili en az bir sıfıra sahipse, soldaki durumda, ilk s [0]dizesinin uzunluğunu 1ve son [-1]dizgiyi ( |sortve sonra bulunur [0]) alırız . Bunlardan daha kısa olanı kaldırabileceğimiz en çiftler, bu yüzden bunu çarpıyoruz 2. Orijinal ikili dizge 0giriş için olduğu gibi a ile bitiyorsa 8, [-1].lengthbununla da 0(boş bir dize olduğundan) çarpılacak olanın 2hala olacağına dikkat edin 0.

Aksi halde, her biri ikili dizgiyle, sadece alırız $b(bu daha önce ilk [0]dizginin uzunluğu olacaktı, bu durumda, ikili dizgenin tamamıydı).

Her iki durumda da, bu sonuç boru hattında bırakılır ve çıktı kesindir.


3

JavaScript (ES6), 57 bayt

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>

İkili 1ssayıyı alır ve hepsiyle eşleşmeye çalışır ya da eşit sayıda öncülük ve takip edememekte başarısız olur 1s.


2

Retina , 48 bayt

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

Çevrimiçi deneyin

Açıklama:

.+              # 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`

2

C #, 133 bayt

Sertlik veren işlev. Bağımsız değişkenden tamsayıyı alır.

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

Evet, bugün '1' + '1' = 98C # 'da öğrendim .


1
Bunun nedeni '1'ASCII karakter 49 ve 49 + 49 =
98'dir.

Kelimenin tam anlamıyla neden 1 + 1 = 2işe yaramadığını bulmak için tam anlamıyla 10 dakika geçirdim . @FlipTack
devRicher

2

C, 89 88 85 bayt

@FlipTack nedeniyle gereksiz baytlara işaret eden iki bayt kurtarıldı.

f()Test edilecek numara ile arayın , işlevden çıktı döndürülür.

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

Ideone üzerinde deneyin .


2

JavaScript (ES6), 59 58 bayt

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

Test durumları



2

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

Golf oynamaya başlama zamanı 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;}

İşte kanıtı

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

ve çıktı;

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


1

Mathematica, 63 56 bayt

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

açıklama

l=#~IntegerDigits~2

A ile sarılmış girişin base-2 gösterimini oluşturun List. Bunu saklal

(2-Min[...])

Min elemanı l1 ise, çıkış 1 ise. Değilse, çıkış 2.

Split[l]

Koşuya lbölün.

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

İlk ve son elemanı al.

Tr/@ ...

İkisinin toplamını al.

Min[ ... ]

İkisi arasında daha küçük olanı bulun.

(İlk sonucu (1 veya 2) bu sonuçla çarpın).


1

Octave, 56 54 bayt

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

Çevrimiçi Deneyin!

Açıklama:

d=dec2bin(n)-48

ikili gösterimi n

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

Kümülatif min d ve klilatif min çevirilmiş sayınd

res = cumd * cumfd ';

matris çarpımı yapmak

out = res*2^!all(d)

Tüm basamaklar 1 ise 2 ile çarpın;


@FlipTack Teşekkürler, bağlantı güncellendi!
rahnema1

1

Pyth, 18 bayt

?*FJjQ2lJyhSxR0_BJ

Bir tamsayı girişi alan ve sonucu basan bir program.

Test paketi (Biçimlendirme için ilk satır)

Nasıl çalışır

?*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

1

APL, 26 bayt

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

Test durumları:

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

Açıklama:

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

                         ⊢ giriş
                    2⊥⍣¯1 ikili gösterime dönüştür
   ()
        (⊢ ¨⌽) her bir bit ve diğer ucundaki eşleme biti için
            (∧) mantıksal ve her iki bitin de
             , her iki bitin bir listesini yapın,
              ∧ daha sonra listeyi ve
         Array sonuçtaki diziyi düzleştirmek
      First ↑ yalnızca ilk N bitini alır, N ise
                                orijinal bit listesinin uzunluğu
    ∧ \ çalışan bir mantıksal alın ve (yalnızca
                                Başlayanlar)
+ / ∘ toplamı

1

J, 22 bayt

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

Bu, bu mücadeleden öğrenilen düzgün numaralara dayanmaktadır .

Çevrimiçi deneyin!

açıklama

(#<.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

1

PHP, 83 74 bayt

Jörg tarafından kaydedilen 3 + 6 bayt

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

STDIN'den girdi alır; ile koş -nR.

Yıkmak

<?=                     # 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)

1
<?=~($s=decbin($argn))[$a=strspn($s,1)]?2*min($a,strspn(strrev($s),1)):$a;
Jörg Hülsermann

0

JavaScript (ES6), 83 Bayt

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

Ungolfed:

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

0

Mathematica, 62 bayt

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

#İlk argümanı temsil eden saf işlev .

(h=0;...;h)&ayarlar h=0, bir sürü şey yapar ..., sonra geri döner h(sertlik). Bir sürü şeye bakalım:

#~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

Greg Martin'e beni bu numarayla tanıştırdığı için teşekkürler .


0

Haskell , 94 92 bayt

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

Çevrimiçi deneyin! Kullanımı:

Prelude> sum.h.b $ 3167
4

Açıklama:
b bir sayıyı ikiliye dönüştürür ve ilk önce en az anlamlı bit olan sıfır ve sıfır listesini gösterir. İçinde h, bu liste tersine çevrilir ve eleman şeklinde orijinal listeyle çarpılır, sonra span(>0)ilk harflerden sonra ayrılır 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])

Ortaya çıkan tanımlama grubu ile eşleşti kalıptır (c,_:_)nerede _:_nedenle, herhangi bir boş olmayan liste eşleşir c = [1,1]. Çünkü baytlar önden ve arkadan çıkarılır, geri c++c = [1,1,1,1]gönderilir ve son olarak dijital sertliği elde etmek için toplanır .

İkinci kısmın listesi boşsa, ikili gösterimler sadece bunlardan ibarettir ve onlardan birinin sayısı dijital sertliktir. Desen eşleştirme başarısız sayesinde hsadece döner n, hangi tekrar toplanır.


0

Perl, 61 bayt

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

Bunun kalbi /^(1+).*\1$/, uzunluğun 2 katı uzunluğundaki $1cevaptır. Kodun geri kalan kısmı ek yük ve hepsi 1'in özel durumu ile ilgili.


Parantezleri sprintfargümanların etrafında atlayabilirsiniz . Ayrıca, -pbayrak kullanmak , atlayabileceğinizden, işlevinizden daha kısa olacak bir program yazmanıza izin verir sub f{...}(bunun yerine bitirmeniz gerekir, $_=...ancak bu 4 baytlık bir iyileştirmedir). Sonunda senin yerine length(...), yapabilirsin /0/&&s/^(1+).*\1$/$1$1/;$_=y///c. Bu sizi 51 bayta ulaştırır.
Dada


0

CJam, 14 bayt

ri2b_0#\W%0#e<

Açıklama:

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
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.