Ters (ikili) bit numarası nedir?


33

Yani size bir POZİTİF verilir taban 10 (ondalık) numarası verilir. İşiniz, ikili sayıları tersine çevirmek ve bu 10 sayıyı geri döndürmektir.

Örnekler:

1 => 1 (1 => 1)
2 => 1 (10 => 01)
3 => 3 (11 => 11)
4 => 1 (100 => 001)
5 => 5 (101 => 101)
6 => 3 (110 => 011)
7 => 7 (111 => 111)
8 => 1 (1000 => 0001)
9 => 9 (1001 => 1001)
10 => 5 (1010 => 0101)

Bu bir mücadelesidir, bu nedenle en az bayt kullanan çözüm kazanır.

Bu, OEIS’deki A030101 .


2
"Bitleri ters çevir" demek, ikili rakamlarını tersine çevirmek anlamına mı geliyor? Bazen her bit ters çevirme anlamına da gelebilir .
— ETHproductions

Evet. Belirsiz olduğum için üzgünüm.
— juniorRubyist

Bu ve bu veeeeery benzer.
— Geobits


1
"temel 10" Herhangi bir özel sebep neden?
— Hesap MakinesiFeline

Yanıtlar:


20

Python , 29 bayt

lambda n:int(bin(n)[:1:-1],2)

Çevrimiçi deneyin!

Bu, sonucu döndüren adsız, adsız bir işlevdir.


İlk olarak, bin(n)argümanı ikili bir dizgeye dönüştürür. Biz bunu normal olarak dilim notasyonu ile tersine çevirirdik [::-1]. Bu dizgeyi -1 adım , yani geriye doğru okur . Bununla birlikte, Python'daki ikili karakter dizileri a ile ön eklenmiştir 0bve bu nedenle dilimlemenin ikinci argümanını 1 olarak veririz , Python'a indeks 1'de sonlanan geriye doğru okumasını söyler , böylece indeksleri 1 ve 0 okumaz .

Şimdi geriye doğru ikili dizgiye sahip olduğumuza int(...), ikinci argümanla 2 olarak geçiyoruz . Bu, dizgiyi bir baz 2 tamsayı olarak okur, bu daha sonra lambda ifadesi tarafından döndürülen dolaylıdır.


2
Seni 9 saniye geç.
— mbomb007


6
@ mbomb007 bu yüzden cevabım geçersiz çünkü elden 9 saniye önce posta düğmesini tıkladım? Sırf aynı golfe aynı anda varmamız, cevapları silmemiz gerektiği anlamına gelmiyor. Bir şey olursa, 0 çaba sorusunu suçlayın.
— FlipTack

3
Geçersiz değil, ama kesinlikle anlamsız. Daha yavaş olsaydım, benimkini siler ve daha hızlı bulduğum bir yorum yazardım.
— mbomb007

1
@steenbergh kimin umrunda? Aynı kod, aynı skor.
— mbomb007


13

JavaScript (ES6), 30 28 bayt

@Arnauld sayesinde 2 bayt kaydedildi

f=(n,q)=>n?f(n>>1,q*2|n%2):q

Bu temelde bir kerede bir bitin tersini hesaplar: q = 0 ; iken n biz çarpın, pozitif q kapalı son bit sever, 2 ile n ile n>>1ve eklemek q ile |n%2. Zaman , n ulaşır 0, sayı başarılı bir şekilde tersine, ve geri edilmiştir q .

JS'nin yerleşik isimleri sayesinde bu zorluğu çözmenin kolay yolu 44 byte alır:

n=>+[...n.toString(2),'0b'].reverse().join``

Özyineleme ve bir dize kullanarak, aynı şeyi yapan 32 baytlık bir çözüm elde edebilirsiniz:

f=(n,q='0b')=>n?f(n>>1,q+n%2):+q

f=(n,q)=>n?f(n>>1,q*2|n%2):qneredeyse çalışıyor. Ama ne yazık ki için değil n=0.
— Arnauld

@Arnauld OP, girişin her zaman pozitif olup olmayacağı konusunda henüz bir cevap vermedi, ancak öyleyse, 0'ın ele alınması gerekmez.
— FlipTack

Bu gecikmiş bir takiptir, ancak girişin her zaman pozitif olduğu bilinmektedir.
— Arnauld

@Arnauld Teşekkürler!
— ETH

10

Java 8, 53 47 46 45 bayt

  • Titus sayesinde -4 bayt
  • Kevin Cruijssen sayesinde -1 bayt

Bu ETH'in cevabıyla aynı prensibe sahip bir lambda ifadesidir (özyineleme Java'da çok ayrıntılı olsa da, bunun yerine döngü yapıyoruz):

x->{int t=0;for(;x>0;x/=2)t+=t+x%2;return t;}

Çevrimiçi deneyin!

Bu atanabilir IntFunction<Integer> f = ...ve sonra ile çağrılabilir f.apply(num). Expanded, ungolfed ve yorumladı, şöyle görünüyor:

x -> { 
    int t = 0;           // Initialize result holder   
    while (x > 0) {      // While there are bits left in input:
        t <<= 1;         //   Add a 0 bit at the end of result
        t += x%2;        //   Set it to the last bit of x
        x >>= 1;         //   Hack off the last bit of x
    }              
    return t;            // Return the final result
};

1
Bu hesaplamayı döngü başlığından döngü gövdesine taşıyarak bir bayt t*2yerine 3 bayt tasarruf edin (t<<1). Bu koşul xyerine kullanabilir x>0misiniz?
— Titus

2
@Titus açıkça bir boole alçaltıcı değil, ancak diğer ipuçları için teşekkürler! Ayrıca otomatik olarak tamsayı bölümü olacağı x>>=1için değiştirilebileceğini de farkettim x/=2.
— FlipTack

45 byte (Değişik t=t*2+için t+=t+.)
— Kevin Cruijssen

@KevinCruijssen güzel bir!
— FlipTack

9

J, 6 bayt

|.&.#:

|. ters

&. altında

#: taban 2




7

Labirent, 23 bayt

?_";:_2
  :   %
 @/2_"!

Eh, bu garip ... bu BINARY sayısını tersine döndürür ... Hem hatamı hem de ID 10T hatamı gösterdiği için teşekkürler @Martin Ender. Yani bu işe yaramazsa, başka bir çözüm bulmam gerekecek.


1
PPCG'ye hoş geldiniz ve güzel bir mesaj Sadece Labyrinth gibi bir dilde mücadeleyi tamamlamak çok zor olabilir. Buralarda, genellikle bir başlık olarak gösterilmesini sağlamak için bir ya da iki # Labyrinth, 89 bytes
— kareli

1
Yanlışlıkla ikinci sıradaki baştaki boşluğu atladın mı? Olduğu gibi, program sadece ilk satırda ileri geri sıçrama olacaktır çünkü _kavşaklarda vardır.
— Martin Ender

Ne yazık ki, bunun ne olursa olsun geçerli olmadığını fark ettim, çünkü zorluk, tersine çevrilmiş sayının taban-10 gösterimini ister, ikili gösterimini değil.
— Martin Ender

6

C, 48 44 43 42 bayt

Gurka sayesinde -1 bayt ve anatolyg sayesinde -1 bayt:

r;f(n){for(r=n&1;n/=2;r+=r+n%2);return r;}

Önceki 44 baytlık çözüm:

r;f(n){r=n&1;while(n/=2)r=2*r+n%2;return r;}

Önceki 48 baytlık çözüm:

r;f(n){r=0;while(n)r=2*(r+n%2),n/=2;return r/2;}

Ungolfed ve kullanım:

r;
f(n){
 for(
  r=n&1;
  n/=2;
  r+=r+n%2
 );
 return r;}
}


main() {
#define P(x) printf("%d %d\n",x,f(x))
P(1);
P(2);
P(3);
P(4);
P(5);
P(6);
P(7);
P(8);
P(9);
P(10);
}

Is not rzaten burada sıfıra başlatıldı r;f(n){r=0;örneğin, r=0;gereksiz? Ayrıca küçük yazım hatası: "Önceki 48 bayt çözüm"
— simon

1
@ gurka İşlev yeniden kullanılabilir olmalıdır.
— Karl Napf

1
Bence fordöngüler her zaman en az whiledöngü kadar kısa ve genellikle daha kısadır.
— anatolyg

Böyle bir şey @anatolyg: r;f(n){for(r=n&1;n/=2;r=2*r+n%2);return r;}? 1 bayt daha kısa, ancak geçerli C (C99) olup olmadığından emin değilim.
— Simon

Evet; Ayrıca, dönüş =içine +=daha kısa ve daha Karartılmış yapmak
— anatolyg

5

Ruby, 29 28 bayt

->n{("%b"%n).reverse.to_i 2}

"% b"% n, n girdisini ikili bir dize olarak biçimlendirir, geri çevirir, sonra sayıya dönüştürür

Kullanım / Test kılıfları:

m=->n{("%b"%n).reverse.to_i 2}
m[1] #=> 1
m[2] #=> 1
m[3] #=> 3
m[4] #=> 1
m[5] #=> 5
m[6] #=> 3
m[7] #=> 7
m[8] #=> 1
m[9] #=> 9
m[10] #=> 5

@Titus, bence cevabı yanlış anladınız. 2dönüştürdüğü temel ve ngirdidir. ->args{return value}ruby lambda sözdizimi nedir
— Cyoce

Parantezleri çıkarabilir misiniz .to_i(2)?
— Cyoce

@Cyoce yeterince emin, teşekkürler.
— Alexis Andersen


4

Java (OpenJDK) , 63 bayt

a->a.valueOf(new StringBuffer(a.toString(a,2)).reverse()+"",2);

Çevrimiçi deneyin!

-12 bayt için dürtme ve -8 bayt için Cyoce için teşekkür ederiz!


REPL gönderimlerine izin verilmesine rağmen, girdilerin önceden tanımlanmış değişkenlerde olduğunu a
— varsayamayacağınız

@FlipTack Hata! Aslen repl'nin var olduğunu hatırlamadan önce başlangıçta bir işlevdi
— Pavel

1
Ayrıca, ileride kullanmak printyerine println:) golf için
— FlipTack

1
StringBufferbir bayt üzerine kaydederStringBuilder
— Poke

1
Yapabileceğin +""yerine .toString()?
— Cyoce,

3

Perl 6 , 19 bayt

{:2(.base(2).flip)}

Girdi nerede?
— Titus

Bu tek bir parametre alan bir fonksiyondur $_. Adından bahsedilmedi, ancak baseyöntem üzerinde çağrılır.
— Sean

2
Perl 6'daki @Titus a Block, çağrılabilir bir nesne olduğunu söyleyen bir kod türüdür. Yukarıdakiler, başka bir dilde bir işlev veya lambda gibi bir değişkene alabileceğiniz ve atayabileceğiniz veya doğrudan {:2(.base(2).flip)}(10)REPL'de arayabileceğiniz bir ifadedir. 5 yazacaktır.
— Ocaklar

3

Haskell, 36 bayt

0!b=b
a!b=div a 2!(b+b+mod a 2)
(!0)

ETHproductions'un JavaScript cevabı ile aynı algoritma (ve uzunluk!) .



3

PHP, 33 bayt

<?=bindec(strrev(decbin($argn)));

base2'ye dönüştür, string ters, ondalık için dönüştür. Dosyaya kaydedin ve ile boru olarak çalıştırın -F.

yerleşik değil:

yinelemeli, 41 bayt

for(;$n=&$argn;$n>>=1)$r+=$r+$n%2;echo$r;

Girdi bitleri ayarlamış olsa da girişten biraz çıkıp çıkana kadar itin. İle boru olarak çalıştırın -nR.

özyinelemeli, 52 bayt

function r($n,$r=0){return$n?r($n>>1,$r*2+$n%2):$r;}

@ JörgHülsermann 44 bayt var $r+=$r. Ama bunu neden öne koyduğumu hatırlamıyorum.
— Titus

2

MATL , 4 bayt

BPXB

Çevrimiçi deneyin!

açıklama

B     % Input a number implicitly. Convert to binary array
P     % Reverse array
XB    % Convert from binary array to number. Display implicitly



2

Scala, 40 bayt

i=>BigInt(BigInt(i)toString 2 reverse,2)

Kullanımı:

val f:(Int=>Any)=i=>BigInt(BigInt(i)toString 2 reverse,2)
f(10) //returns 5

Açıklama:

i =>          // create an anonymous function with a parameter i
  BigInt(       //return a BigInt contructed from
    BigInt(i)     //i converted to a BigInt
    toString 2    //converted to a binary string
    reverse       //revered
    ,           
    2             //interpreted as a binary string
  )



1

CJam, 8 bytes

ri2bW%2b

Try it online!

Explanation

ri          e# Read integer
  2b        e# Convert to binary array
    W%      e# Reverse array
      2b    e# Convert from binary array to number. Implicitly display

1

Batch, 62 bytes

@set/an=%1/2,r=%2+%1%%2
@if %n% gtr 0 %0 %n% %r%*2
@echo %r%

Explanation: On the first pass, %1 contains the input parameter while %2 is empty. We therefore evaluate n as half of %1 and r as +%1 modulo 2 (the % operator has to be doubled to quote it). If n is not zero, we then call ourselves tail recursively passing in n and an expression that gets evaluated on the next pass effectively doubling r each time.


1

C #, 98 bayt

using System.Linq;using b=System.Convert;a=>b.ToInt64(string.Concat(b.ToString(a,2).Reverse()),2);

1

R, 55 bayt

sum(2^((length(y<-rev(miscFuncs::bin(scan()))):1)-1)*y)

Stdin'den girdi okur ve sonuç olarak ondalıktan ikili bir vektöre dönüştürmek biniçin miscFuncspaketten işlevi kullanır .


1

Pushy , 19 bayt

Yerleşik taban dönüşümü yok!

$&2%v2/;FL:vK2*;OS#

Çevrimiçi deneyin!

Pushy'nin iki yığını vardır ve bu cevap bu konuyu yoğun şekilde kullanır.

Bu programın iki bölümü var. İlk olarak, $&2%v2/;Fsayıyı ters ikili gösterimine dönüştürür:

            \ Implicit: Input is an integer on main stack.
$      ;    \ While i != 0:
 &2%v       \   Put i % 2 on auxiliary stack
     2/     \   i = i // 2 (integer division)
        F   \ Swap stacks (so result is on main stack)

Örnek 10 verildiğinde, her yinelemede yığınlar aşağıdaki gibi görünecektir:

1: [10]
2: []

1: [5]
2: [0]

1: [2]
2: [0, 1]

1: [1]
2: [0, 1, 0]

1: [0]
2: [0, 1, 0, 1]

Son yinelemenin 0, 1, 0, 1ardından ikinci yığında yaratıldığını görebiliriz - 10'un ters ikili basamağı 0b1010,.

Kodun ikinci kısmı, ikiliyi ondalık sayıyaL:vK2*;OS# dönüştüren önceki cevabımdan alınmıştır . Bu cevapta açıklanan ve açıklanan yöntemi kullanarak, yığındaki ikili sayıları 10 tabanlı bir tam sayıya dönüştürür ve sonucu yazdırır.


0

k, 18 bayt

{2/:|X@&|\X:0b\:x}

Örnek:

k){2/:|X@&|\X:0b\:x}6
3

0

C #, 167 bayt

 for(int i = 1; i <= 10; i++)
 {
 var bytes= Convert.ToString(i, 2);
 var value= Convert.ToInt32(byteValue.Reverse()); 
 console.WriteLine(value);
}

Açıklama:

Here I will iterate n values and each time iterated integer value is convert to byte value then reverse that byte value and that byte value is converted to integer value.


1
Welcome to the site! I don't know much about C# but you most certainly have a good deal of extra whitespace I would recommend removing. It also is not clear how I/O is dealt with in this submission. It is standard to either write a function or to use STDIN (I think that is console.Read() but you would probably know better than I would) and STDOUT. Anyway, welcome to the site if you want more experienced advice in golfing C# I would recommend codegolf.stackexchange.com/questions/173/…
— Wheat Wizard

I've downvoted this answer, because it doesn't work at all. .Reverse() returnes IEnumerable<char>. As Convert.ToInt32 doesn't have an overload for IEnumerable it throws an exception. Also the answer doesn't follow the rules for code golf: 1)As nothing is specified the submission has to be a full program or function not just a snippet. 2)using statements must be included in the byte count
— raznagul

0

c/c++ 136 bytes

uint8_t f(uint8_t n){int s=8*sizeof(n)-ceil(log2(n));n=(n&240)>>4|(n&15)<<4;n=(n&204)>>2|(n&51)<<2;n=(n&172)>>1|(n&85)<<1;return(n>>s);}

It's not going to win, but I wanted to take a different approach in c/c++ 120 bytes in the function

#include <math.h>
#include <stdio.h>
#include <stdint.h>

uint8_t f(uint8_t n){
    int s=8*sizeof(n)-ceil(log2(n));
    n=(n&240)>>4|(n&15)<<4;
    n=(n&204)>>2|(n&51)<<2;
    n=(n&172)>>1|(n&85)<<1;
    return (n>>s);
}

int main(){
    printf("%u\n",f(6));
    return 0;
}

To elaborate on what I am doing, I used the log function to determine the number of bits utilized by the input. Than a series of three bit shifts left/right, inside/outside, even/odd which flips the entire integer. Finally a bit shift to shift the number back to the right. Using decimals for bit shifts instead of hex is a pain but it saved a few bytes.


You do need to include the function declaration, so this is actually 163 bytes. Although, if you remove the extraneous whitespace, you could shorten it to 136.
— DJMcMayhem
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.