En anlamlı bitin bir tamsayıdan temizlenmesi


29

Giriş

Giriş, tek bir pozitif tamsayıdır. n

Çıktı

Çıkış, nen önemli biti olarak ayarlanmıştır 0.

Test Kılıfları

1 -> 0
2 -> 0
10 -> 2
16 -> 0
100 -> 36
267 -> 11
350 -> 94
500 -> 244

Örneğin: 350İkilidir 101011110. (Yani en soldaki en önemli bitin 1için bit) 0dönüşler o içine 001011110hangi ondalık tamsayı eşdeğerdir 94, çıkış. Bu OEIS A053645 .


19
En önemli biti temizleme 10açıkçası verir 0: D
clabacchio

@clabacchio I .. o ... er ... wha? (güzel olan)
Baldrickk

12
Bana öyle geliyor ki sıfırlar en az onlar kadar önemli. "En önemli bit" derken, "birine ayarlanmış en önemli bit" anlamına gelir.
Michael Kay,

Yanıtlar:


12

C (gcc) , 49 44 40 39 bayt

i;f(n){for(i=1;n/i;i*=2);return n^i/2;}

Çevrimiçi deneyin!


1
-1 bayt i<=nile değiştirebilirsiniz n/i. Bu benim golfum değil, başkası yazınızı düzenlemeye çalıştı ama ben geri aldım çünkü golf oynamak için yapılan düzenlemeler topluluk kurallarımıza göre kabul edilmiyor.
HyperNeutrino,

1
@HyperNeutrino Bu düzenlemeyi şimdi gördüm ve onayladım. Bu kuralın farkında değildim ama bu güzel bir golf ipucu!
cleblanc

Ah tamam. Evet, genellikle insanların golf ipuçlarına yorum yazması gerekir ve OP de düzenlemeleri yapmalıdır, ancak kabul ederseniz, bu gerçekten bir sorun değil. :)
HyperNeutrino


9

05AB1E , 5 bayt

.²óo-

Çevrimiçi deneyin!

Bir tamsayıdan en önemli bit çıkarılması , N mesafeyi bulmak eşdeğerdir N yüksek tamsayıdır gücüne 2 daha düşük , N .

Böylece N - 2 kat formülünü kullandım (log 2 N) :

  • - Baz 2 ile logaritma .
  • ó - Bir tamsayıya zemin.
  • o- 2 , yukarıdaki sonucun gücüne yükseldi.
  • - - Fark.

1
b¦Cayrıca çalışır ... değil mi? İkili dosyaya dönüştürün, MSB her zaman dizin 1'dedir, MSB'yi çıkarın, geri dönüştürün.
Magic Octopus Urn,

2
@ MagicOctopusUrn Hayır bu yanlış, başarısız 1!
Bay Xcoder,

8

Jöle , 3 bayt

BḊḄ

Çevrimiçi deneyin!

açıklama

BḊḄ  Main Link
B    Convert to binary
 Ḋ   Dequeue; remove the first element
  Ḅ  Convert from binary

2
Değil ve iki bayt kod noktaları? Bu, toplam boyutu 5 bayta değiştirir.
Bartek Banachewicz

3
@BartekBanachewicz Jelly , bu karakterlerin yalnızca 1 bayt olduğu kendi kod sayfasını kullanır .
steenbergh

1
Bunu sorduğunuz ve yanıtladığınız için teşekkür ederiz, bu beni uzun zamandır rahatsız ediyor!
Ukko

8

C (gcc) - 59 bayt

main(i){scanf("%d",&i);return i&~(1<<31-__builtin_clz(i));}

Bu gcc cevabı sadece bitsel ve aritmetik işlemleri kullanır. Burada logaritma yok! 0 girişi ile ilgili sorunları olabilir ve tamamen taşınabilir değildir.

Bu sitedeki ilk cevabım, bu yüzden geri bildirim ve iyileştirmeler yapmak isterim. Bitsel ifadeleri öğrenmekle çok eğlendim.


1
PPCG'ye hoş geldiniz ve ilk büyük cevap! Umarız daha birçok zorluğa katılmaktan zevk
alırsınız

Tam bir programa ihtiyacınız yok main, bir fonksiyon geçerli bir sunumdur . Bunu bir işleve değiştirmek ve girdiyi bahsedilen işleve argüman olarak almak , 18 bayt kazandırır .
Steadybox

1
İki bayt daha kaydetmek için bir makro olarak bile yazabilirsiniz .
Steadybox

7

MATL , 8 6 bayt

B0T(XB

Çevrimiçi deneyin!

Cinaski sayesinde iki bayt kurtardı. Referans indeksleme yerine ödev indekslemeye geçiş 2 bayt daha kısa oldu :)

Açıklama:

          % Grab input implicitly: 267
B         % Convert to binary: [1 0 0 0 0 1 0 1 1]
 0T(      % Set the first value to 0: [0 0 0 0 0 1 0 1 1]
    XB    % Convert to decimal: 11

1
Eğer kullandıysanız, (aynı zamanda 6 bayt için) kullanılan referans indeksleme olabilir 4Lziyade [2J]. Başka bir eğlenceli 6 bayt: tZlcW-(yalnızca MATLAB'da çalışır, TIO /
Octave'da

6

Java (OpenJDK 8) , 23 bayt

n->n^n.highestOneBit(n)

Çevrimiçi deneyin!

Üzgünüz, yerleşik: - /


.NET ve Python gibi diğer popüler dillerin sahip olmadığı bir yerleşik Java ile ?! o. Yapıları olmadan daha uzun bir şey göndermek üzereydi .. Sizinki 15 bayt daha kısa. XD
Kevin Cruijssen

@KevinCruijssen Gibi bir şey n->n^1<<(int)Math.log2(n)işe yarayacak ve büyük olasılıkla 38 bayttan kısadır. Biri uygun şekilde çalışmasaydı benim ikinci (henüz denenmemiş) fikrimdi highestOneBit. Meraktan, çözümün neydi
Olivier Grégoire

Benimki n->n^1<<(int)(Math.log(n)/Math.log(2))çünkü Math.log2Java'da yoktu. P Sadece Math.log, Math.log10ve Math.loglpmevcuttur.
Kevin Cruijssen

2
Aynısını gönderecektim, sadece xor yerine eksi. Dan yöntemi Anıldı bu
JollyJoker

1
@KevinCruijssen Oops, Math.log2gerçekten yok ... Benim hatam. Görmek? Bir güzel yöntem ( highestOneBit) var, diğeri yok ( Math.log2). Java garip ;-)
Olivier Grégoire

6

Kabuğu , 3 bayt

ḋtḋ

Çevrimiçi deneyin!

Açıklama:

    -- implicit input, e.g. 350
  ḋ -- convert number to list of binary digits (TNum -> [TNum]): [1,0,1,0,1,1,1,1,0]
 t  -- remove first element: [0,1,0,1,1,1,1,0]
ḋ   -- convert list of binary digits to number ([TNum] -> TNum): 94

Jelly çözümüne benzer şekilde, bu aslında 5 byte, 3 değil gibi görünüyor.
Bartek Banachewicz 15:17

1
Benzer şekilde Jelly @BartekBanachewicz, Kabuk bu yüzden, kendi kod sayfası kullanır olan P: aslında 3 byte
HyperNeutrino

@BartekBanachewicz Kod sayfası için buraya bakın: github.com/barbuz/Husk/wiki/Codepage
Laikoni


5

Python 2,27 bayt

lambda n:n-2**len(bin(n))/8

Çevrimiçi deneyin!

açıklama

lambda n:n-2**len(bin(n))/8  # Lambda Function: takes `n` as an argument
lambda n:                    # Declaration of Lambda Function
              len(bin(n))    # Number of bits + 2
           2**               # 2 ** this ^
                         /8  # Divide by 8 because of the extra characters in the binary representation
         n-                  # Subtract this from the original

... tam da biraz matematik çalışıyorum. : P
19

@totallyhuman heh üzgünüm ama seni yendi: P
HyperNeutrino

2**len(bin(n))/8ayrıca yazılabilir 1<<len(bin(n))-3ve ardından hem 2 hem de 3'te çalışır (kaydedilmiş / eklenmemiş bayt yok).
Mego

@Mego Cool, ekleme için teşekkürler!
HyperNeutrino,

5

Python 3 , 30 bayt

Caird coinheringaahing sayesinde -8 bayt. Bunu bellekten yazdım. :O

lambda n:int('0'+bin(n)[3:],2)

Çevrimiçi deneyin!



A) bu 1 ' de hata yapar , b) Bunu düşünmeyecek kadar aptalım. Ama ufak bir değişiklikle düzelttim. Teşekkürler!
tamamen insan

Ben çalıştığını, böylece kodunu düzenledi (ve 4 bayt kaydeder) ettik
coinheringaahing Caird

Hala 1'de hata var .
tamamen insan

O @cairdcoinheringaahing benim oldu orijinal cevap , ama sonra o geçici çözüm basit XOR yöntemle daha uzun biter üzerinde 1. Hatalı fark
FlipTack


4

JavaScript, 22 20 bayt

Ovs sayesinde 2 bayt kaydedildi

a=>a^1<<Math.log2(a)

Çevrimiçi deneyin!

Başka bir yaklaşım, 32 bayt

a=>'0b'+a.toString`2`.slice`1`^0

Çevrimiçi deneyin!


haha ne .slice`1`^0zaman .slice(1)^0iyi çalışacağını neden yaptın haha
ETHproductions

@ETHproductions. Bu daha iyi görünüyor :)

4

J, 6 bayt

}.&.#:

Oldukça basit.

açıklama

}.&.#:
    #:  convert to list of binary digits
  &.    apply right function, then left, then the inverse of right
}.      behead


@Cyoce Me de ...
17:17

4

APL (Dyalog) , 10 bayt

Tam önek işlevi.

212∘⊥⍣¯1

Çevrimiçi deneyin!

2∘⊥… Baz-2'den kod çözme
 …… ⍣¯1 bir defa negatif (baz-2'de kodlama)

1↓ ilk biti bırak

2⊥ baz-2'den kod çözme


4

Ruby, 26 bayt

-7 Ventero sayesinde Bayt. Historicrat sayesinde -2 bayt.

->n{/./=~'%b'%n;$'.to_i 2}

İlk karakteri atlayarak ve gereksiz parantezleri bırakarak birkaç bayttan tasarruf edebilirsiniz:->n{n.to_s(2)[1..-1].to_i 2}
Ventero

->n{/./=~'%b'%n;$'.to_i 2}
histocrat

4

C (gcc), 38 bayt

Dahili gcc kullanılmış.

f(c){return c^1<<31-__builtin_clz(c);}

Değiştirme 31-ile ~iki bayt kaydetmek gerekir.

@ThePirateBay, kaymanın maskelenmiş olup olmadığına donanıma bağlıdır. Bilgisayarımda 0 çıkacak.
Colera Su

4

ARM Meclisi, 46 43 bayt

(Kaynakla aynı olduğunda, hedef kayıt defterini ekleyerek ihmal edebilirsiniz)

clz x1,x0
add x1,1
lsl x0,x1
lsr x0,x1
ret

Bu ARM montaj sözdiziminin tadı nedir? GNU montajcım anlamıyor shr/ shl/ retve bunun yerine lsr/ lsl/ gibi bir şey istiyor bx lr.
Ruslan

Büyük olasılıkla birden fazla sürümde sözdizimi karıştırmak (ret aarch64'dan), ancak montajcının bunları sizin için kullanacağını düşündüm. Buradaki amaçlar doğrultusunda, daha eski ve doğrudan lsl / lsr kullanmak muhtemelen doğrudur.
Michael Dorgan

Komik bir şey, 1 daha az işlemle yapabilirim, ancak bayt boyutu 2'ye kadar çıkıyor. Ah kod golf.
Michael Dorgan

3

Pyth, 5 bayt

a^2sl

Test odası.

Açıklama:

    l   Log base 2 of input.
   s    Cast ^ to integer (this is the position of the most significant bit.)
 ^2     Raise 2 to ^ (get the value of said bit)
a       Subtract ^ from input

3

Alice , 8 bayt

./-l
o@i

Çevrimiçi deneyin!

açıklama

.   Duplicate an implicit zero at the bottom of the stack. Does nothing.
/   Switch to Ordinal mode, move SE.
i   Read all input as a string.
l   Convert to lower case (does nothing, because the input doesn't contain letters).
i   Try reading all input again, pushes an empty string.
/   Switch to Cardinal mode, move W.
.   Duplicate. Since we're in Cardinal mode, this tries to duplicate an integer.
    To get an integer, the empty string is discarded implicitly and the input is 
    converted to the integer value it represents. Therefore, at the end of this,
    we get two copies of the integer value that was input.
l   Clear lower bits. This sets all bits except the MSB to zero.
-   Subtract. By subtracting the MSB from the input, we set it to zero. We could
    also use XOR here.
/   Switch to Ordinal, move NW (and immediately reflect to SW).
o   Implicitly convert the result to a string and print it.
/   Switch to Ordinal, move S.
@   Terminate the program.

3

Japt , 6 bayt

^2p¢ÊÉ

Çevrimiçi deneyin!

açıklama

^2p¢ÊÉ
   ¢     Get binary form of input
    Ê    Get length of that
     É   Subtract 1
 2p      Raise 2 to the power of that
^        XOR with the input

Giriş 1başarısız olursa: 4 bayt

¢Ån2

Çevrimiçi deneyin!

Açıklama : giriş binary ( ¢) olsun , ilk char ( Å) 'ı dilimleyin , bir sayıya ( n2) geri ikili olarak ayrıştırın .



3

APL (Dyalog Unicode) , 9 bayt

⊢-2*∘⌊2⍟⊢

Çevrimiçi deneyin!

Adam sayesinde -1 bayt


Tamamen doğru, her ne kadar TIO'yu benim için bir şablon oluşturmak için kullanmış olsam da . Neyse, ⊢-2*∘⌊2⍟⊢bir bayt kaydeder.
Adám

APL'nin temsil edilmediği için üzülmüştüm ve vardi, neredeyse kaydırmada kaybedildi! APL'yi özlüyorum.
cmm

@cmm APL canlı ve iyi durumda. Stack Exchange APL sohbet odasında takılmaktan çekinmeyin .
17:17

3

CJam , 7 bayt

{2b()b}

Çevrimiçi deneyin!

Açıklama:

{     }  Block:         267
 2b      Binary:        [1 0 0 0 0 1 0 1 1]
   (     Pop:           [0 0 0 0 1 0 1 1] 1
    )    Increment:     [0 0 0 0 1 0 1 1] 2
     b   Base convert:  11

Silmek zorunda kalmamak için MSB'yi (her zaman 1 olan) tekrar kullanın; Bu numara olmadan eşdeğer {2b1>2b}ya da olacaktır {2b(;2b}.


3

Retina , 15 13 bayt

^(^1|\1\1)*1

Çevrimiçi deneyin!

Tekli giriş ve çıkış (test paketi kolaylık sağlamak için onluk ve daha fazla sayıya dönüştürülebilir).

açıklama

Bu tekdüze yapmak oldukça kolaydır. Tek yapmak istediğimiz, girişteki en büyük 2 gücü silmek. Bazı ileri referanslar ile 2'nin gücünü eşleştirebiliriz. Bu formun değerleri eşleştirmek için aslında kolay 2 n -1 biz bunu ve bir maç olacak, böylece 1 ayrı:

^(^1|\1\1)*1

Grup 1tek maçları ya 1kapalı tekme şeyler başında veya buna son yineleme üzerinde yaptığımız iki kez eşleşir. Böylece eşleşir 1, o zaman 2, o zaman , 4vb. Bunlar eklendiğinden beri 1, sonunda belirlediğimiz her zaman 2 gücün bir eksikliğine sahibiz .

Sondaki satır beslemesi nedeniyle, eşleşme girişten kaldırılır.


3

R , 28 bayt

function(x)x-2^(log2(x)%/%1)

Çevrimiçi deneyin!

2 ^ floor(log2(x))R'de oldukça ayrıntılı olan temel dönüşümleri gerçekleştirmek yerine , en anlamlı bitini hesaplamak en kolayı


3

PARI / GP, 18 bayt

n->n-2^logint(n,2)

Alternatif çözüm:

n->n-2^exponent(n)

İlki yanlış cevaplar veriyor gibi görünüyor. Olmalı mı n->n-2^logint(n,2)? İkincisi, PARI / GP sürümünde veya tio.run tarafından kullanılan sürümde desteklenmiyor . Bu yeni bir fonksiyon mu?
Jeppe Stig Nielsen

@JeppeStigNielsen Hata, sabit - telefonumdan gönderdiğim şey bu. Evet, ikincisi yeni bir fonksiyondur.
Charles,

@JeppeStigNielsen Yeni kontrol ettim, exponent5 gün önce eklendi, bu meydan okumaya göre eklendi. :)
Charles



3

Excel, 36 31 bayt

-5 @ IanM_Matrix1 sayesinde bayt sayısı

=BIN2DEC(MID(DEC2BIN(A1),2,99))

İlginç bir şey yok.


REPLACE'i MID ile değiştirerek boyutu 31 bayta küçültün: = BIN2DEC (MID (DEC2BIN (A1), 2,99))
IanM_Matrix1
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.