Ejderha Eğrisi dizisi


23

Dragon eğri dizisi (veya normal kağıt katlama dizisi), bir ikili dizisidir. a(n)En az kayda değer olan 1'in bıraktığı bitin ihmali ile verilir n. Mesela hesaplamak a(2136)için önce binary'e dönüştürelim:

100001011000

En az anlamlı parçamızı bulduk

100001011000
        ^

Biraz soluna git

100001011000
       ^

Ve olumsuzluğunu iade et

0

Görev

Girdi olarak çıktı olarak pozitif bir tamsayı verilir a(n). (Tamsayı veya boolean tarafından çıktı alabilirsiniz). Kodunuzu bayt ile ölçüldüğü kadar küçük kılmayı amaçlamalısınız.

Test Kılıfları

İşte ilk 100 giriş

1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 1


9
En az anlamlı 100001011000olan a 0. En az anlamlı olanı 1mı kastediyorsun ?
scatter

Yanıtlar:


16

Mathematica 25 Bayt

1/2+JacobiSymbol[-1,#]/2&

Bunu yapmanın diğer yolları:

56 bayt

(v:=1-IntegerDigits[#,2,i][[1]];For[i=1,v>0,i++];i++;v)&

58 bayt

1-Nest[Join[#,{0},Reverse[1-#]]&,{0},Floor@Log[2,#]][[#]]&

3
Vaov! Bir matematiğin cevabı ve sadece yerleşik değil. Olumlu oy ver!
KeyWeeUsr

2
Bu cevabı daha da iyi yapabilecek tek şey neden ve nasıl çalıştığıyla ilgili bir açıklamadır. : P
Martin Ender

2
@MartinEnder arxiv.org/pdf/1408.5770.pdf Örnek 13'ten sonraki açıklamaya bakın.
alephalpha

7

Python 3 , 22 21 bayt

ETHproductions ile 1 bayt.

lambda n:n&2*(n&-n)<1

Çevrimiçi deneyin!

Bitsel aritmetik ftw.


2
"Tamsayı veya boolean tarafından çıktısını alabilirsiniz" yani sanırım ihtiyacınız yok 0+(...)?
Martin Ender

Buradaki operasyonların sırası beni gerçekten şaşırtıyor. Could n&1parantez içinde konulur? Yoksa 1+(n^~-n)<1parantez içine alınabilir mi? Yoksa öyle mi 1+(n^~-n)?
ETHproductions

aman tanrım ne. aradığım şey buydu: o güzel!
HyperNeutrino

&en düşük önceliğe sahip, öyleyse öyle1+(n^~-n)
Leaky Nun

Ah, öncelik tablosunu buldum. Şimdi her şey mantıklı geliyor: P
ETHproductions

6

retina ,38 34 29 bayt

\d+
$*
+`^(1+)\1$|1111
$1
^1$

Çevrimiçi deneyin!

Martin ve Leaky bu fikirle ortaya çıktı, 5 bayt daha!

Girdiyi unary'e dönüştürür ve ardından aşamalı olarak 2'ye bölünür. Bunu artık eşit şekilde yapamadığı zaman (yani sayı tuhaf) sonra son işlem modunun sonucunu hesaplayarak girişten 4 yamasını kaldırır. Son olarak, bu, sonucun 1 olup olmadığını kontrol eder; bu, en az anlamlı 1 bitin solundaki rakamın sıfır olduğu anlamına gelir. Bu doğruysa, nihai sonuç 1 olur, aksi takdirde sıfırdır.



İkili dönüşümden kaçınmanın bir yolunu buldum ve bunun yerine sadece 2 faktörünü böldüm
Martin Ender

@MartinEnder aslında benim algoritmam ... 2 bayt kapalı
Leaky Nun

@LeakyNun Oh evet, ikisi de aynı fikir. Büyük beyinler ve eşyalar ...;)
Martin Ender

Bunu düzenleyeceğim, ancak
ikinizden

6

Jöle , 5 bayt

&N&HṆ

Çevrimiçi deneyin!

Nasıl çalışır

&N&HṆ  Main link. Argument: n

 N     Negate; yield -n.
&      Bitwise AND; compute n&-n.
       This yields the highest power of 2 that divides n evenly.
   H   Halve; yield n/2.
  &    Bitwise AND; compute n&-n&n/2. This rounds n/2 down if n is odd.
    Ṇ  Take the logical NOT of the result.

4

Alice , 8 bayt

I2z1xnO@

Çevrimiçi deneyin!

Unicode karakterinin kod noktası olarak girdi alır ve sonucu buna göre 0x00 veya 0x01 bayt olarak verir.

Test edilebilirlik için, tam olarak aynı algoritmayı kullanan 12 baytlık bir ondalık giriş / çıkış versiyonu (sadece giriş / çıkış farklı):

/o
\i@/2z1xn

Çevrimiçi deneyin!

Eğer Alice bir golf 2z1xndiliydi ve açık G / Ç ve program sonlandırması gerektirmiyorsa, bu hem 05AB1E hem de Jelly'i yenen sadece 5 byte ( ) olacaktır.

açıklama

I    Read input.
2z   Drop all factors of 2 from the input, i.e. divide it by 2 as long
     as its even. This shifts the binary representation to the right
     until there are no more trailing zeros.
1x   Extract the second-least significant bit.
n    Negate it.
O    Output it.
@    Terminate the program.


3

Bilge , 28 20 16 bayt

::-~^~-&:[?>]~-^

Çevrimiçi deneyin!

açıklama

Bu, Sızdıran Rahibe'nin Python cevabının limanı. Ne yazık ki TIO'da çalışmıyor çünkü TIO'nun tercüman sürümü biraz modası geçmiş.

Girdiimizin 3 kopyasını ile başlayarak başlıyoruz ::, sonra üst kopyayı 1'e düşürüyoruz. Bu, tüm bitleri ilk 1'e kadar çevirir. Sonra bunu girdilerimizin başka bir kopyasıyla gideriz. Girdideki ilk 1'e kadar olan bitlerin tümü çevrildiğinden, bu, sonuçta tüm bitlerin sonuçlanmasına neden olacaktır. Sonucuna bir tane eklersek , en az 1 değerimizin solundaki~- yerde tek bir 1 alırız. Şimdi o bitin kapalı olduğunu ve o bitin açık olduğunu 2'nin gücüne sahip olacağımızı, bunu bir tekli veya beraberinde değiştirebiliriz . Bu yapıldıktan sonra sadece biti yok etmeye ihtiyacımız var ve bitti.010:[?>]~-^



3

Haskell , 45 43 39 bayt

Nimi sayesinde 6 bayt kaydedildi

f x|d<-div x 2=[f d,mod(1+d)2]!!mod x 2

Çevrimiçi deneyin!


Sen kullanabilirsiniz divyerine quot.
nimi

Daha da iyisi: divMod:f x|(d,m)<-divMod x 2=[mod(1+d)2,f d]!!m
nimi

@ nimi Nasıl çalıştığını bile anlamadım. Muhtemelen sadece kendin göndermelisin.
Buğday Sihirbazı,

Hala aynı algoritma, ancak şube almaya sadece farklı bir yolu. Öylesine içinde düzenlemek bunun için çekinmeyin, (yinelemeli baz durumda vs yine f call) |(d,m)<-divMod x 2bir olan desen bekçi bağlama için diçin div x 2ve miçin mod x 2. mİki eleman listesini indekslemek için kullanıyoruz [...,...]!!m. Geri m==0dönmemiz mod(1+d)2durumunda ve durumunda m==1 f d.
nimi

1
Oh, üzgünüm, liste elemanlarını çevirmek zorunda: [f d,mod(1+d)2]. Çevrimiçi deneyin! .
nimi

3

x86 Makine Kodu, 17 16 15 bayt:

Parametrelerin yığına itildiği ve dönüş değerinin ALkayıt defterinde olduğu bir ABI varsayar .

8B 44 24 04 0F BC C8 41 0F BB C8 0F 93 C0 C3

Bu şu şekilde demonte edilir:

_dragoncurve:
  00000000: 8B 44 24 04        mov         eax,dword ptr [esp+4]
  00000004: 0F BC C8           bsf         ecx,eax
  00000007: 41                 inc         ecx
  00000008: 0F BB C8           btc         eax,ecx
  0000000B: 0F 93 C0           setae       al
  0000000E: C3                 ret

1
@PeterTaylor Cevabım için CPU komutunun bayt cinsinden boyutunu sayıyorum; bu, PPCG'de montaj cevapları için oldukça yaygın bir uygulamadır.
Govind Parmar

1
Ne kadar yaygın olduğunu söyleyemedim ama kesinlikle yanlıştı
Peter Taylor,

1
Sadece bilgiçlik değil, aynı zamanda anlamsız. Bir bilgisayar söz konusu olduğunda "makine kodu" ile "montaj kodu" arasında bir fark yoktur. Fark sadece yorumlardan biridir. İnsanların okumasını kolaylaştırmak için makine kod baytlarına anımsatıcılar atadık. Başka bir deyişle, anlaşılmasını kolaylaştırmak için baytları serbest bırakırız .
Cody Gray,

3
Bu konu dışı, @Peter. Montaj kodu sadece makine kodunun insan tarafından okunabilir bir çevirisidir. Bunlar tam olarak aynı dildir, sadece iki farklı biçimde / temsilde. Bu yaygın olduğu kabul edilmektedir TI BASIC, farklı değil biz saymak belirteçleri bu içten nasıl sistem depolar, çünkü yerine karakter bayt. Aynı şey assembly dili için de geçerliydi: komut anımsatıcıları ayrı karakterler olarak saklanmıyor, daha çok eşdeğer makine kodunun baytları olarak temsil ediliyor.
Cody Gray,

2
Ayrıca, pratik olarak konuşmak gerekirse, neden kimse olurdu hiç bir kod-golf müsabakasında montaj dil anımsatıcılarını genişletilmiş enter, onlar giriş ücretsiz kısa olması sağlanır% 100 eşdeğer makine koduna, çevirir ne zaman? Bu tek başına, tamamen saçma değilse, iki anlamsız arasında bir ayrım yapar.
Cody Gray,

3

JavaScript (ES6), 17 14 bayt

f=
n=>!(n&-n&n/2)
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

Düzenleme: Boolean çıktısının kabul edilebilir olduğunu fark ettikten sonra @ Dennis'in cevabını taşıyarak 3 bayt kaydedildi.


3

C (gcc) , 20 bayt

f(n){n=!(n&-n&n/2);}

Çevrimiçi deneyin!


Bu aslında "işe yaramaz"; belirli bir mimariyi hedefleyen derleyicinin belirli bir sürümü için kod üretecinin bir tuhaflığına güveniyorsunuz, burada ara hesaplamalar geri dönüş değerleri için kullanılan aynı kayıt defterinde gerçekleştiriliyor. Herhangi bir en iyileştirme türünü etkinleştirmek, hedef mimariyi değiştirmek veya farklı bir GCC sürümü kullanmak bunu bozacaktır. "Yığınımdaki çöp, 13 Ekim'de dolunay olduğunda doğru çıktıyı içeriyor" diyebilirsiniz.
Cody Gray,

Söylediğiniz her şey doğru ve bunun gibi bir kod asla üretim kodunda kullanılmazken, dilleri kod golf uygulamaları için kendi uygulamalarıyla tanımlarız. Ek bayraklar olmadan, bu, gcc ve tcc'nin tüm son sürümlerinde çalışır ve geçerli sayılması için yalnızca bir sürümde çalışması gerekir.
Dennis,

“Dilleri kod golf amacıyla uygulamaları ile tanımlıyoruz” Bekle, ne? Yani her derleyici bayrağı ve GCC'nin her sürümü farklı bir dil mi tanımlar? Bunun çılgınca olduğunun farkındasın, değil mi? C dili standardı dili tanımlayan şeydir.
Cody Gray

Burada değil. Eğer bir C standardı vardı ama uygulama yoksa, onu bir dil olarak bile düşünemeyiz. Daha önce de söylediğim gibi , derleyici dili tanımlar . Sonuç olarak tanımsız davranışa güvenmek mümkündür . Farklı bir bayrak kümesi farklı bir dil olarak kabul edilmez, ancak bunları bayt sayınıza eklemediğiniz sürece tüm cevaplar standart derleme bayraklarını kullanır.
Dennis

Vay. Bu delirmiş. Bunu diyordun anlarım olabilir ki uygulama tanımlı davranış izin verilir, ancak tanımsız davranıştır değil uygulanması ile tanımlanır. Kelimenin tam anlamıyla tanımsız. Uygulamanın her seferinde rastgele şeyler yapmasına izin verilir. Ve bu "standart derleme bayrakları" nosyonu yeni icat ettiğiniz bir şeydir. Benim standart derleme bayrakları kodunuzu kırmak olduğunu birkaç içerir. Ve optimizer'ın standart olmadığını düşünüyorum. Açıkçası, bu site benim için değil.
Cody Gray,

3

ARA , 50 bayt

DOWRITEIN.1DO.1<-!?1~.1'~#1DOREADOUT.1PLEASEGIVEUP

INTERCAL'lerin unary operatörleri bunun için oldukça uygundur, bu yüzden ilk yazımı yazmaya karar verdim.

DO WRITE IN .1
DO .1 <- !?1~.1'~#1
DO READ OUT .1
PLEASE GIVE UP



2

,,, , 10 9 bayt

::0-&2*&¬

açıklama

Örneğin, girişi 3 olarak alın.

::0-&2*&1≥
               implicitly push command line argument       [3]
::             duplicate twice                             [3, 3, 3]
  0            push 0 on to the stack                      [3, 3, 3, 0]
   -           pop 0 and 3 and push 0 - 3                  [3, 3, -3]
    &          pop -3 and 3 and push -3 & 3 (bitwise AND)  [3, 1]
     2         push 2 on to the stack                      [3, 1, 2]
      *        pop 2 and 1 and push 2 * 1                  [3, 2]
       &       pop 2 and 3 and push 2 & 3                  [2]
        ¬      pop 2 and push ¬ 2 (logical NOT)            [0]
               implicit output                             []


2

Oktav , 34 bayt

@(x)~(k=[de2bi(x),0])(find(k,1)+1)

Çevrimiçi deneyin!

Açıklama:

@(x)                               % Anonymous function taking a decimal number as input
    ~....                          % Negate whatever comes next
     (   de2bi(x)   )              % Convert x to a binary array that's conveniently 
                                   % ordered with the least significant bits first
        [de2bi(x),0]               % Append a zero to the end, to avoid out of bound index
     (k=[de2bi(x),0])              % Store the vector as a variable 'k'
                     (find(k,1)    % Find the first '1' in k (the least significant 1-bit)
                               +1  % Add 1 to the index to get the next bit
     (k=[de2bi(x),0])(find(k,1)+1) % Use as index to the vector k to get the correct bit

Nasıl oluyor da hiç de2bi duymadım ...: O
Sanchises

1

Gönderme:

Python 2 , 41 39 bayt

x=input()
while~-x&1:x/=2
print 1-x/2%2

Çevrimiçi deneyin!

FryAmTheEggman sayesinde -2 bayt

İlk Çözüm:

Python 2 , 43 bayt

lambda x:1-int(bin(x)[bin(x).rfind('1')-1])

Çevrimiçi deneyin!


Hangisi sizin gönderiminiz?
Sızdıran Rahibe

@LeakyNun İlki kısa olduğu için; ikincisi benim orijinal sunumumdu. Onları ayrı ayrı göndermeli miyim?
HyperNeutrino

~-x&1Bence süre koşulu yerine çalışıyor sanırım.
FryAmTheEggman

(Kullanıcı adını unuttum); Düzenlemenizi reddettim, çünkü PPCG'de diğer kişilerin kodlarını golf ile ilgili düzenlemeler tavsiye edilmiyor. Önerilerinizi gönderebilirsiniz (btw, thanks @FryAmTheEggman), ancak lütfen golf düzenlemeleri yapmayın. Teşekkürler!
HyperNeutrino

@StewieGriffin Ah evet, teşekkürler. Maalesef düzenleme reddedildiği için kullanıcıya ping atamıyorum.
HyperNeutrino

1

Matl , 11 10 bayt

t4*YF1)Z.~

Çevrimiçi deneyin! Veya ilk 100 çıkışı görün .

açıklama

t    % Implicit input. Duplicate
4*   % Multiply by 4. This ensures that the input is a multiple of 2, and
     % takes into account that bit positions are 1 based
YF   % Exponents of prime factorization
1)   % Get first exponent, which is that of factor 2
Z.   % Get bit of input at that (1-based) position
~    % Negate. Implicit display


1

Befunge-98 , 19 bayt

&#;:2%\2/\#;_;@.!%2

Çevrimiçi deneyin!

&#                       Initial input: Read a number an skip the next command
  ;:2%\2/\#;_;           Main loop: (Direction: East)
   :2%                    Duplicate the current number and read the last bit
      \2/                 Swap the first two items on stack (last bit and number)
                          and divide the number by two => remove last bit
         \                swap last bit and number again
          #;_;            If the last bit is 0, keep going East and jump to the beginning of the loop
                          If the last bit is 1, turn West and jump to the beginning of the loop, but in a different direction.
&#;           @.!%2      End: (Direction: West)
&#                        Jump over the input, wrap around
                 %2       Take the number mod 2 => read the last bit
               .!         Negate the bit and print as a number
              @          Terminate

1

SCALA, 99 (78?) Karakter, 99 (78?) Bayt

if(i==0)print(1)else
print(if(('0'+i.toBinaryString).reverse.dropWhile(x=>x=='0')(1)=='1')0 else 1)

igiriş nerede .

Gördüğünüz gibi sıfıra bakmazsam 21 byte tasarruf ediyorum (yazarın test durumunda yaptığı gibi):

print(if(('0'+i.toBinaryString).reverse.dropWhile(x=>x=='0')(1)=='1')0 else 1)

Bu benim ilk codegolf bu yüzden umarım iyi yaptım :)

Çevrimiçi deneyin! Lol hesaplamak oldukça uzun olmasına rağmen.


Siteye Hoşgeldiniz!
DJMcMayhem


1

Java 8, 17 bayt

n->(n&2*(n&-n))<1

LeakyNun'un Python 3 cevabının basit limanı . Daha kısa bir çözüm görmek için bitsel işlemler ve operatör önceliği konusunda yeterince bilgi sahibi değilim; belki fazladan parantezden kaçınmanın bir yolu var mı?


0

Japt , 10 8 9 bayt

!+¢g¢a1 É

Çevrimiçi deneyin!

açıklama

!+¢   g    a1 É
!+Us2 gUs2 a1 -1 # Implicit input (U) as number
!+               # Return the boolean NOT of
      g          #   the character at index
       Us2       #     the input converted to binary
           a1    #     the index of its last 1
              -1 #     minus 1
      g          #   in string
  Us2            #     the input converted to binary

Bu falseher şey için döner çünkü karakter (0 veya 1) daima bir dizedir.
Shaggy,

Hata! Şunu fark etmeliydim ... Şimdi düzeltildi
Luke,

Şimdilik başarısız1 gibi görünüyor .
Shaggy,

0

JavaScript (ES6), 53 34 bayt

a=>eval("for(;~a&1;a/=2);~a>>1&1")

42 bytes:a=>!+(a=a.toString(2))[a.lastIndexOf(1)-1]
Shaggy

Zaten daha kısa (matematiksel) bir çözüm buldum ...
Luke

Güzel :) Bu 42 bayt gönderir misin?
Shaggy

@Shaggy, hiç değil
Luke



0

Çip , 93 bayt

HZABCDEFG,t
 ))))))))^~S
H\\\\\\\/v~a
G\\\\\\/v'
F\\\\\/v'
E\\\\/v'
D\\\/v'
C\\/v'
B\/v'
A/-'

Girdiyi küçük endian bayt olarak alır. (TIO'da bunu sizin için yapan bir miktar python var). Çıktıyı 0x0veya olarak verir 0x1. (TIO, değeri incelemek için xxd kullanır).

Çevrimiçi deneyin!

Bu nasıl?

Chip her seferinde bir byte'a bakıyor, bu yüzden çok baytlı girişleri kullanmak biraz topluyor, ama korktuğum kadar yakın değil.

Hadi içine girelim:

HZABCDEFG

Bunlar HZ , önceki baytın yüksek bit (varsa biri) ve A- Ggüncel byte yedi alt biti. Bunlar, sayının en düşük ayarlanan bitini bulmak için kullanılır.

        ,t
))))))))^~S

En düşük ayar biti bulunduğunda, yapmamız gereken birkaç şey var. Bu ilk yığın derhal "eğer belli bir parçamız varsa) ler) varsa, sonra Sda çıktıyı tbastırmayı bırak ve cevabı bastırdıktan sonra etkisizleş.

H\\\\\\\/v~a
G\\\\\\/v'
...
A/-'

Geçerli bayttan ( A- H) hangisi bitse bir kaç sıfırdan önce gelir, sonra bir tane ( \ve /: bunlar doğrudan kuzeyin bitlerine bakar; önceki tüm bitlerin sıfır olduğuna emin olabiliriz) doğru ( v,' ...), o zaman hangi değeri ters çevrilir ve çıktının düşük biti ( ~a) olarak verilir.

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.