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.