İkili basitleştir


20

Meydan okuma

Herhangi bir yolla girdi olarak bir ikili sayı verildiğinde, sayıyı tam bir program veya işlev kullanarak "basitleştirin".

Giriş

[binary]
  • binary ikili sayı 0'dan büyük bir sayıdır.

Çıktı

Girişi alın, bir yerleşik kullanmadan taban 10'a dönüştürün, sonra bu sayı sadece 1s ve 0s içeriyorsa, başka bir ikili sayı gibi bir taban 10 numarasına dönüştürün. Sayı ikili olarak okunamayana kadar bu işlemi tekrarlayın ve bu sayının çıktısını alın.

Diğer bilgiler

  • Giriş 1 ise, basitçe çıktı alın 1. Programınız sonsuz basitleştirmeye devam etmemelidir 1.

  • Bu kod golf, 17 Kasım Salı günü bayt cinsinden en kısa cevap kazanır.

  • Kafa karıştırıcı bir şey varsa, neyi temizlemem gerektiğini belirten bir yorum bırakın, buna göre düzenleyeceğim.

  • Temel dönüşüm için yerleşik yapılara izin verilmez.

Örnekler

     Input | Output

         1 | 1
      1010 | 2
      1011 | 3
   1100100 | 4
   1100101 | 5
1111110011 | 3

4
Birkaç test senaryosu kullanabilir.
isaacg

Giriş bir ASCII dizesi mi, yoksa aslında 1'ler mi ve 0'lar mı?
Tom Carpenter

@TomCarpenter 1s ve 0s.
The_Basset_Hound

@isaacg 1-5 olarak çıktı almanın yolları eklendi.
The_Basset_Hound

Bir dizeyi belirli bir tabana dönüştüren işlevlere izin veriliyor mu?
isaacg

Yanıtlar:


14

Pyth, 20 16 bayt

u?-GTG`u+yNsTG0z

Jakube sayesinde 4 bayt

Kodun ( u+yNsTG0) yarısı temel dönüşüm kodudur.

Test odası

u?-GTG`u+yNsTG0z
                    z = input() (The string of 1s and 0s)
                    T = 10
u              z    Apply until the value stops changing, starting with z
                    G is the current value, a string of 0s and 1s.
 ?-GT               If G - T, e.g., G with the digits 1 and 0 removed is not empty,
     G              Return G, to end the iteration.
       u     G0     Else, reduce over G with initial value 0.
         yN         Double the running total
        +  sT       and add the next digit, cast to an int.
      `             Convert to string.

Girdi 1, udeğerin değişmeyi durdurduğunu fark etmesi gerçeğiyle işlenir .


4
Tebrikler, Dennis'i geride bıraktınız! Şimdilik ...
Conor O'Brien

9
@ CᴏɴᴏʀO'Bʀɪᴇɴ Sırrı Pyth.
isaacg

8

CJam, 24 23 bayt

q{:~{1$++}*s__,(As*-!}g

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

q                        Read all input.
 {                   }g  Do:
  :~                       Evaluate each character. Maps '0' -> 0 and '1' -> 1.
    {    }*                Fold; for each integer but the first:
     1$                      Copy the second-topmost integer.
       ++                    Add all three integers on the stack.
           s__             Cast to string and push two copies.
              ,(           Calculate string length and subtract 1.
                As         Push the string "10".
                  *        Repeat the string length-1 times.
                   -       Remove its elements from the string representation
                           of the integer.
                    !      Apply logical NOT.
                         If `!' pushed 1, repeat the loop.

"10"Dize length-1zamanlarını tekrarlamak zorunda mısınız yoksa azalmayı atlayabilir misiniz?
DLosc

Uzunluğu 1 çıkarılarak döner "10"içine ""tam sayı bir rakamı varsa. Bu, kodun sonsuz bir döngüye girmemesini sağlar.
Dennis

2
Büyüleyici, kaptan. }: ^ |
DLosc

7

Pip, 28 27 bayt

Ta=1|aRMta:$+(^a)*2**RV,#aa

Girdiyi komut satırı bağımsız değişkeni olarak alır. Biz gelene kadar döngü istiyoruz a=1veya a0 ve 1 kullanılarak yanında bazı karakter (ler) içeriyor. Bu ikinci koşul, RMiçindeki tüm karakterler t= 10den alınarak test edilir a. Geriye kalan bir şey varsa, durum doğrudur.

Döngü içinde dönüşüm aşağıdaki gibi çalışır:

a:$+(^a)*2**RV,#a

              ,#a  range(len(a))
            RV     reversed
         2**       2 to the power of each element
    (^a)*          multiplied item-wise with each digit in split(a)
  $+               Sum
a:                 and assign back to a

aSonuna koymak otomatik olarak yazdırır.

28 baytta özyinelemeli bir çözüm:

a<2|aRMt?a(f$+(^a)*2**RV,#a)

6

Python 2, 52

f=lambda n:n>1<'2'>max(`n`)and f(n%10+2*f(n/10))or n

Bunu iki özyinelemeli işlev olarak düşünmek daha kolaydır:

g=lambda n:n and n%10+2*g(n/10)
f=lambda n:n>1<'2'>max(`n`)and f(g(n))or n

İşlev gondalık değeri ikilik biçime dönüştürür ve bağımsız değişkeni 0 ve 1 ( ) basamaklarından oluştuğu ve olmadığı gibi sürekli olarak fuygulanır . Golfed kod tanımını sokulmasıyla tek bir işlev içine çökmesi için , özyinelemeli çağrı değiştirilmesi ile . Temel vakag'2'>max(`n`)1g(n)f(n)gfn=0 arasında gotomatik çekle ele alınır n>1.


Güzel :) tek şey zamanki sorun başvurur - sinir bozucu Lgelen repr...
SP3000

4

Prolog, 220 212 bayt

:-use_module(library(clpfd)).
x(B,N):-reverse(B,C),foldl(y,C,0-0,_-N).
y(B,J-M,I-N):-B in 0..1,N#=M+B*2^J,I#=J+1.
b(N,I):-N>47,N<50,I is(N-48).
p(N):-N>1,number_codes(N,L),maplist(b,L,Y),x(Y,B),p(B);write(N).

açıklama
p ana işlevdir ve aşağıdaki adımları gerçekleştirir (b, x, y'nin yardımıyla):

  • mevcut sayının 1'den büyük olup olmadığını kontrol eder
  • tamsayıyı basamakların ascii temsili listesine dönüştürür
  • tüm sayıların 0 veya 1 olup olmadığını kontrol eder
  • ASCII listesini ikili tamsayı listesine dönüştürür
  • ikili tamsayı listesini ondalık sayıya dönüştürür
  • recurses
  • yüklem başarısız olduğunda yazdırır.

Düzenleme: P yan tümcelerini OR ile birleştirerek 8 bayt kaydetti.


3

Mathematica 107 106

DLosc tarafından kaydedilmiş bir bayt ile.

j@d_:=(p=0;v=IntegerDigits@d;
Which[d<2,1,Complement[v,{0,1}]=={},j@Fold[#+#2 2^p++&,0,Reverse@v],1<2,d])

Girdiyi rakamlarına bölün. Giriş 1 ise, çıkış 1.

Giriş 0 ve 1'lerden oluşan bir sayı ise, bunu ondalığa dönüştürün ve tekrar çalıştırın.

Aksi takdirde, girişi iade edin.


j[1]

1


j[11010001]

209


j[1111110001]

1009


j[1111110011]

3

İlk adım 1011'i verir, bu da 3'ü verir.


Burada 1011 ile başlayarak test ediyoruz.

j[1011]

3


3

Javascript, 132 , 123 bayt

Bu en iyi cevap değil, ama ..

Bilginize, geçersiz bir giriş verilirse, kullanıcı için aynı görüntülenir.

function c(x){while(x!=0&&!/[2-9]/.test(x)){for(i=r=0;x;i++)r+=x%10*Math.pow(2,i),x=parseInt(x/10);x=r}alert(x)}c(prompt())


1
Sen olabilir kurtarmak 19 bayt kullanarak foryerine while(bu aynı zamanda bazı azaltır ve açıklamada doğrudan değerlerini ayarlayarak {}bazı atarak) ;, artım ES6 fonksiyon tanımını kullanarak, iinline. Böyle bakacağız: c=x=>{for(r=0;x&&!/[2-9]/.test(x);x=r)for(i=0;x>0;r+=x%10*Math.pow(2,i++),x=parseInt(x/10));alert(x)};c(prompt()).
insertusernameburada

1
114:function c(x){while(x^0&&!/[2-9]/.test(x)){for(i=r=0;x;i++)r+=x%10*Math.pow(2,i),x=0|x/10;x=r}alert(x)}c(prompt())
Mama Fun Roll

@insertusernameburada, öneri için teşekkürler, ancak c=x=>başlangıçta anlamadım, Chrome veya Firefox konsolunda çalışmadı. :( @ ן nɟuɐɯɹɐ ן oɯ, XOR koşulu kafamı sarmak olamazdı ve x=0|x/10‌yerine parseInt, ben değişikliklerin geri kalanını dahil ettik Teşekkür ...
LearningDeveloper

@GauthamPJ Üzgünüm, bir şekilde kod kopyalanırken kırıldı ve yazdırılamayan karakterler içeriyordu. İşte doğru sürümü: c=x=>{for(r=0;x!=0&&!/[2-9]/.test(x);x=r)for(i=r=0;x;)r+=x%10*Math.pow(2,i++),x=parseInt(x/10);alert(x)};c(prompt()). Kesinlikle Firefox 42'de çalışır, bu kemanı deneyin . Bu daha golf versiyonunun ve orijinal kodunuzun işe yaramadığını 1ve sonsuz bir döngüye gireceğini unutmayın. c=x=>gibi function c(x){}"bakın Ok fonksiyonları ".
insertusernameburada

2

JavaScript ES6, 52

İşlev olarak. İşlev bağımsız değişkeni bir ikili basamak dizesi veya ondalık gösterimi yalnızca 1 ve 0 içeren bir sayı olmalıdır.

Aşağıdaki snippet'i EcmaScript 6 uyumlu bir tarayıcıda çalıştırmayı test edin - ok işlevlerini, şablon dizelerini ve forma operatörünü uygulama (Firefox kullanıyorum)

f=s=>s<2|[...s+''].some(c=>(n+=+c+n,c>1),n=0)?s:f(n)

// To test
console.log=(...x)=>O.innerHTML+=x+'\n';

// Basic test cases
;[[1,1],[1010,2],[1011,3],[1100100,4],[1100101,5],[1111110011,3]]
.forEach(t=>console.log(t[0]+' -> '+f(t[0])+' expected '+t[1]))

function longtest() {
  var o=[],i;
  for (i=1;i<1e6;i++)
    b=i.toString(2),v=f(b),v!=i?o.push(b+' '+v):0;
  O.innerHTML=o.join`\n`
}
Click to run the long test <button onclick="longtest()">go</button>
<pre id=O></pre>


1
Gerçekten n+=+c+nikili dönüşüm için sevme . Çok zarif ...
nderscore

2

Mathematica, 62 59 55 48 bayt

Martin Büttner sayesinde 7 bayt tasarruf etti.

#//.a_/;Max[b=IntegerDigits@a]<2:>Fold[#+##&,b]&

1

Javascript (ES7) 87 80 78 77 74 bayt

Tarayıcıları desteklemek için snippet demosu (şu anda yalnızca Firefox her gece üstel operatörü desteklemektedir)

f=x=>[...x].reverse(i=y=j=0).map(z=>(j|=z,y+=z*2**i++))&&j<2&y>1?f(y+[]):x
<input type="text" id="x" value="1111110011"><button onclick="o.innerHTML=f(x.value)">Run</button><div id="o"></div>

f=x=>
[...x].reverse(i=y=j=0) // reverse string as array, initialize vars
.map(z=>( // iterate over the all chatacters
    j|=z, // keep track of whether a digit higher than 1 is encountered
    y+=z*2**i++ // build decimal result from binary
))&&
j<2&y>1? // if we encountered only 1's and 0's and result > 1
    f(y+[]) // then call recursively and cast to a string
    :x // else return x

Javascript (ES6) 81 bayt

Tarayıcıları desteklemek için snippet demosu

f=x=>[...x].reverse(i=y=j=0).map(z=>y+=z*Math.pow(2,i++,j|=z))&&j<2&y>1?f(y+[]):x
<input type="text" id="x" value="1111110011"><button onclick="o.innerHTML=f(x.value)">Run</button><div id="o"></div>




1

PHP, 210 204 bayt

Buraya ilk kez gönderiyorum, umarım hoşunuza gidecektir! Açıkçası yazmanın en iyi yolu olmasa bile, burada göstermekten memnuniyet duyuyorum!

Kod

<?function j($a){$c=0;if($a==1){return 1;}else{if(preg_match("#^[01]+$#",$a)){$b=strlen($a);$a=str_split($a);foreach($a as$d){$c+=($d==0?0:2**($b-1));$b--;}return j($c);}else{return$a;}}}echo j($_GET[0]);

Ben ilk giriş 1 eşit olup olmadığını kontrol edecek bir özyinelemeli işlev "j" yaptım Eğer öyleyse, işlev beklendiği gibi 1 döndürür, aksi takdirde ondalık değeri hesaplamak için bir dizideki sayıyı böler, ama sadece sayı ikili sayı ise. Değilse, numarayı olduğu gibi döndürür.

Kod çözülmemiş kod

<?
function j($a) {
  $c = 0;
  if ($a == 1) {
    return 1;
  }
  else {
    if (preg_match("#^[01]+$#", $a) {
      $b = strlen($a);
      $a = str_split($a);
      foreach ($a as $d) {
        $c += ($d == 0 ? 0 : 2 ** ($b - 1));
        $b--;
      }
      return j($c);
    }
    else {
      return $a;
    }
  }
}
echo j($_GET[0]);

İlk 6 için bir "foreach" deyimi kullandım ve bana 6 baytlık bir kazanç sağladım, ancak daha yapılacak çok şey olduğundan eminim.


1

PHP, 114112 bayt

için de çalışır 0. İle çalıştırın -r.

for($n=$argv[1];count_chars($s="$n",3)<2&$s>1;)for($i=$n=0;""<$c=$s[$i++];)$n+=$n+$c;echo$s;

count_chars($s,3)dizeden tüm karakterleri içeren bir dize döndürür ( array_uniquedizilerde olduğu gibi ). İkili sayı için, bu olacak 0, 1ya da 01. Diğer sayılar için, bu rakam daha büyük bir rakam içerecektir, bu 1yüzden <2sadece ikili sayılar için true değerini döndürecektir.

&$s>1özel durum için gereklidir 1.

Gerisi düz ileri: Değeri kaydırarak ve geçerli biti ekleyerek bitler arasında dolaşın, son olarak dış döngü testi için sayıyı (dizeye yayın) $ s'ye kopyalayın.


0

CoffeeScript, 92 89 bayt

f=(x)->x>1&/^[01]+$/.test(x)&&f(''+x.split('').reverse().reduce ((p,v,i)->p+v*2**i),0)||x

JavaScript (ES6), 105 101 90 bayt

f=y=>y>1&/^[01]+$/.test(y)?f(''+[...y].reverse().reduce(((p,v,i)=>p+v*Math.pow(2,i)),0)):y

gösteri

Yalnızca Firefox ve Microsoft Edge gibi ES6 uyumlu tarayıcılarda çalışır

f=y=>y>1&/^[01]+$/.test(y)?f(''+[...y].reverse().reduce(((p,v,i)=>p+v*Math.pow(2,i)),0)):y

// Snippet stuff
$(`form`).submit((e) => {
  document.getElementById(`y`).textContent = f(document.getElementById(`x`).value);
  e.preventDefault()
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <label>Input:
    <input pattern=^[01]+$ required id=x>
  </label>
  <button type=submit>Go</button>
  <p>Output:
    <output id=y></output>
  </p>
</form>


Eval kullanırsanız, örtük bir getiri çekebilirsiniz.
Mama Fun Roll

Eval

@ ן nɟuɐɯɹɐ ן oɯ Herhangi bir nedenden dolayı değerlendirilen işlev çalışmıyor 1. çünkü sanırım döngüye
girmiyor

1
@nderscore Teşekkürler, ancak özyineleme 4 bayt daha kısa :-)
rink.attendant.6

0

Scala, 128 bayt

def b(s:String):String=if(s.matches("[10]{2,}"))b(""+s.reverse.zipWithIndex.collect{case('1',i)=>Math.pow(2,i)}.sum.toInt)else s

0

Matlab (115)

@(a)num2str(sum((fliplr(a)-48).*arrayfun(@(x)2^x,0:nnz(a)-1)));a=ans(input('','s'));while(find(a<50))a=ans(a);end,a

  • Anonim işlev sayı türü dönüştürmedir ( bin2dec)
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.