Tam sayıları bölme, çevirme ve yeniden birleştirme


16

Arka fon

Matematikte tamsayıların, tamsayı çiftleriyle birebir yazışma yapabileceği iyi bilinmektedir. Bunu yapmanın birçok olası yolu vardır ve bu meydan okumada, bunlardan birini ve ters çalışmasını uygulayacaksınız .

Görev

Girişiniz pozitif bir tamsayıdır n > 0. Benzersiz negatif olmayan tamsayı var olduğu bilinmektedir a, b ≥ 0, öyle ki . Çıktınız pozitif tamsayının "çevrilmiş hali" dir .n == 2a * (2*b + 1)n2b * (2*a + 1)

Giriş ve çıktının dilinizin standart işaretsiz tam sayı veri tipine uyduğunu varsayabilirsiniz.

Kurallar ve puanlama

Tam bir program veya bir işlev yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez.

Test senaryoları

Bunlar formatta verilir in <-> out, çünkü uygulanacak fonksiyon kendi tersidir: Çıktıyı geri beslerseniz, orijinal girişi almalısınız.

1 <-> 1
2 <-> 3
4 <-> 5
6 <-> 6
7 <-> 8
9 <-> 16
10 <-> 12
11 <-> 32
13 <-> 64
14 <-> 24
15 <-> 128
17 <-> 256
18 <-> 48
19 <-> 512
20 <-> 20
28 <-> 40
30 <-> 384
56 <-> 56
88 <-> 224
89 <-> 17592186044416

Liderler Sıralaması

İşte hem düzenli bir skor tablosu hem de kazananları dile göre gözden geçirmek için bir Yığın Parçacığı. Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

## Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğinizde), gerçek puanın başlıktaki son sayı olduğundan emin olun :

## Perl, 43 + 2 (-p flag) = 45 bytes

Dil adını, daha sonra skor tablosu snippet'inde görünecek bir bağlantı da yapabilirsiniz:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes



@feersum Oh, farkında değildim. Ne tesadüf.
Zgarb

2
Zorunlu xkcd.com/153
corsiKa

Yanıtlar:


11

Jöle , 17 16 15 bayt

BUi1µ2*³:2*×Ḥ’$

Çevrimiçi deneyin!

Nasıl çalışır

BUi1µ2*³:2*×Ḥ’$    Main link. Input: n

B                  Convert n to base 2.
 U                 Reverse the array of binary digits.
  i1               Get the first index (1-based) of 1.
                   This yields a + 1.
    µ              Begin a new, monadic chain. Argument: a + 1
     2*            Compute 2 ** (a+1).
       ³:          Divide n (input) by 2 ** (a+1).
                   : performs integer division, so this yields b.
         2*        Compute 2 ** b.
              $    Combine the two preceding atoms.
            Ḥ      Double; yield 2a + 2.
             ’     Decrement to yield 2a + 1.
           ×       Fork; multiply the results to the left and to the right.

Bekleyin, Jelly'e operatörleri soruna uyduruyor musunuz? Bu durumda LOL
Alexander Torstling

Ben değilim. Sadece işlemek bu meydan belgelerin bir güncelleme oldu gönderilmiş ve bu cevap kullanılan tüm operatör en az bir ay süreyle uygulanmıştır sonra Jelly için. Doğrulamaktan çekinmeyin
Dennis

Endişeye gerek yok, kurallara veya başka bir şeye aşina değilim, sadece golfün kendi dillerini icat eden insanlara gelmesinin harika olduğunu düşündüm!
Alexander Torstling


10

Pyth, 16 15 bayt

*hyJ/PQ2^2.>QhJ

Dennis sayesinde 1 bayt

Test odası

Açıklama:

*hyJ/PQ2^2.>QhJ
                    Implicit: Q = eval(input())
     PQ             Take the prime factorization of Q.
    /  2            Count how many 2s appear. This is a.
   J                Save it to J.
  y                 Double.
 h                  +1.
          .>QhJ     Shift Q right by J + 1, giving b.
        ^2          Compute 2 ** b.
*                   Multiply the above together, and print implicitly.

7

MATL , 22 bayt

Yft2=XK~)pq2/2w^Ks2*Q*

Çevrimiçi deneyin!

açıklama

Yf      % factor
t       % duplicate
2=      % compare to 2 (yields a logical array)
XK      % save a copy of that to variable K
~)      % keep only values != 2 in the factors array
p       % multiply that factors
q2/     % product - 1 / 2
2w^     % 2^x

K       % load variable K (the logical array)
s       % sum (yields the number of 2s)
2*Q     % count * 2 + 1

*       % multiply both values

Çok hoş! Sen kullanabilirsiniz Qiçin 1+(bu yeni yürürlüğe girmiştir) ve qiçin 1-. Bu da bir yerden tasarruf sağlar ( Hyine de tasarruf edebilirsiniz ). Buraya
Luis Mendo

@LuisMendo Teşekkürler. Bu özelliği bilmiyordum.
Rainer P.

5
MATL kullanarak Luis yenerek!
Stewie Griffin

6

Python 2, 39 bayt

lambda n:2*len(bin(n&-n))-5<<n/2/(n&-n)

n & -nbölen 2'nin en büyük gücünü verir n. Çalışır, çünkü ikinin tamamlayıcı aritmetiğinde -n == ~n + 1. Eğer k sondaki sıfırlar varsa n, tamamlayıcısını almak k sonrakilerin olmasına neden olur . Sonra 1 ekleme sıfır tüm sondaki olanları değiştirmek ve değişecek 2 ^ k Yani 0'dan 1'e bit ardından 1'den uçlarına k 0 en (tıpkı ters bit yerken,) bütün yüksek yerlerde.-nnn


kısaca nasıl n&-nçalıştığını açıklayabilir misiniz ? bu hile ne yapıyorum ama nasıl değil :(
Erwan

n&-nbölen 2'nin en yüksek gücünü verir n.
Neil

@Erwan hakkında açıkladım n & -n.
feersum

Anarchy golf ilgili programı aldım n=1;exec"c=n&-n;print n,':',2*len(bin(c))-5<<n/2/c;n+=1;"*100, ama en iyi çözümün arkasında iki karakter var.
xnor

@xnor İpucu: 59 baytlık çözüm (en azından benim) tüm değerleri için çalışmaz n.
feersum

6

MATL , 25 26 bayt

:qt2w^w!2*Q*G=2#f2*q2bq^*

Bu , dilin / derleyicinin geçerli sürümünü (10.2.1) kullanır .

Çevrimiçi deneyin!

açıklama

Kaba kuvvete dayanarak oldukça basit. A ve b'nin tüm kombinasyonlarını dener , uygun olanı seçer ve gerekli hesaplamayı yapar.

:q          % implicit input "n". Generate row vector [0,1,...,n-1], say "x"
t2w^        % duplicate and compute 2^x element-wise
w!2*Q       % swap, transpose to column vector, compute 2*x+1
*           % compute all combinations of products. Gives 2D array
G=2#f       % find indices where that array equals n
2*q2bq^*    % apply operation to flipped values

1
Hah! :-P Kendi dilinizde dövüldü ... ilk kez mi?
Stewie Griffin

@StewieGriffin Evet! Güzel bir kilometre taşı :-)
Luis Mendo

5

Julia, 41 bayt

n->2^(n>>(a=get(factor(n),2,0)+1))*(2a-1)

Bu, bir tamsayıyı kabul eden ve bir tam sayı döndüren anonim bir işlevdir. Bunu çağırmak için bir değişkene atayın.

Biz ' ain asal çarpanlarına ayırması için 1 + 2 üssü olarak tanımlarız n. Yana factordöner bir Dictkullanabileceğimiz getdurumda 0 varsayılan değeri ile asal çarpanlara 2. Doğru bit shift içermiyor ntarafından ave bu güce çekim 2. Sonucu 2a-1elde etmek için bunu çarparız .


4

Perl 5, 40 bayt

38 bayt artı 2 -p

$i++,$_/=2until$_%2;$_=2*$i+1<<$_/2-.5

-pdeğişkeni STDIN okur $_.

$i++,$_/=2until$_%2artışlar $i(0 ile başlayan) ve sıfır olmayan mod 2'ye $_kadar yarıya $_iner. Bundan sonra $_, orijinal sayının garip faktörü ve $i2'nin üssüdür.

$_=2*$i+1<<$_/2-.5- 'nin sağ tarafı, =aranan sayının sadece formülüdür: {2'nin üssünün iki katından fazla}} {{tuhaf faktörün yarısı eksi yarım}} gücüne. Ancak "kez {2…… 'in gücüne" "biti sola doğru kaydırarak…" olarak golf oynar. Ve o sağ taraf atandı $_.

Ve -p baskılar $_.



2

JavaScript ES6, 36 33 bayt

n=>63-2*Math.clz32(b=n&-n)<<n/b/2

Anladığım kadarıyla bununla Math.clz32uğraşmaktan daha kısa olacak toString(2).length.

Düzenleme: @ user81655 sayesinde 3 bayt kaydedildi.


Güzel. Ayrıca n&-nbir değişkene ayarlayarak birkaç bayt kaydedebilirsiniz :n=>63-2*Math.clz32(x=n&-n)<<n/x/2
user81655

@ user81655 Teşekkürler; Keşke sadece kullanabilseydim n&=-n, ama ntekrar ihtiyacım var ...
Neil

1

PARI / GP , 38 bayt

f(n)=k=valuation(n,2);(2*k+1)<<(n>>k\2)

Aynı önceliğe sahip olduğunu >>ve \soldan sağa hesaplandığını unutmayın, böylece son bölüm daha n>>k\2ziyade olabilir (n>>k)\2. Çözülmemiş sürüm şu ksözcüklerle sözlü hale gelir my:

f(n)=
{
  my(k=valuation(n,2));
  (2*k+1) << ((n>>k)\2);
}
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.