Số nguyên chia, lật và kết hợp lại


16

Lý lịch

Trong toán học, người ta biết rằng các số nguyên có thể được đưa vào một sự tương ứng một-một với các cặp số nguyên. Có nhiều cách có thể để làm điều này, và trong thử thách này, bạn sẽ thực hiện một trong số chúng thao tác nghịch đảo của nó.

Nhiệm vụ

Đầu vào của bạn là một số nguyên dương n > 0. Được biết, tồn tại số nguyên không âm duy nhất a, b ≥ 0như vậy . Đầu ra của bạn là "phiên bản lật" của , số nguyên dương .n == 2a * (2*b + 1)n2b * (2*a + 1)

Bạn có thể giả sử rằng đầu vào và đầu ra phù hợp với kiểu dữ liệu số nguyên không dấu tiêu chuẩn của ngôn ngữ của bạn.

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.

Các trường hợp thử nghiệm

Chúng được đưa ra trong định dạng in <-> out, vì hàm được triển khai là nghịch đảo của chính nó: nếu bạn đưa đầu ra trở lại cho nó, bạn sẽ nhận được đầu vào ban đầu.

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

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ. Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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


1
Thật

@feersum Ồ, tôi không biết. Thật là một sự trùng hợp.
Zgarb

Câu trả lời:


11

Thạch , 17 16 15 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

Đợi đã, bạn đang triển khai các toán tử trong Jelly cho phù hợp với vấn đề? Trong trường hợp đó LOL
Alexander Torstling

Tôi không. Các chỉ cam kết để Jelly sau thách thức này đã được đăng là một bản cập nhật các tài liệu, và tất cả các nhà điều hành được sử dụng trong câu trả lời này đã được thực hiện trong vòng ít nhất một tháng. Vui lòng xác minh
Dennis

Đừng lo lắng, tôi không quen thuộc với các quy tắc hay bất cứ điều gì, tôi chỉ nghĩ thật tuyệt khi chơi golf đã đến với những người phát minh ra ngôn ngữ của họ!
Alexander Torstling


10

Bình thường, 16 15 byte

*hyJ/PQ2^2.>QhJ

1 byte nhờ Dennis

Bộ kiểm tra

Giải trình:

*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 byte

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

Hãy thử trực tuyến!

Giải trình

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

Rất đẹp! Bạn có thể sử dụng Qcho 1+(điều này đã được giới thiệu gần đây) và qcho 1-. Điều đó cũng tiết kiệm một không gian (mà bạn có thể tiết kiệm bằng Hmọi cách). Xem tại đây
Luis Mendo

@LuisMendo Cảm ơn. Không biết tính năng đó.
Rainer P.

5
Hoàn thành tốt việc đánh bại Luis bằng MATL!
Stewie Griffin

6

Python 2, 39 byte

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

n & -ncho sức mạnh lớn nhất bằng 2 mà chia n. Nó hoạt động bởi vì trong số học bổ sung của hai , -n == ~n + 1. Nếu nk số 0 ở cuối, lấy phần bổ sung của nó sẽ làm cho nó có các số 0 theo sau. Sau đó, thêm 1 sẽ thay đổi tất cả các dấu sau thành số 0 và thay đổi bit 2 ^ k từ 0 thành 1. Vì vậy, -nkết thúc bằng 1 theo sau là k 0 (giống như n), trong khi có bit ngược lại nở tất cả các vị trí cao hơn.


bạn có thể giải thích ngắn gọn về cách n&-nlàm việc không? tôi thấy thủ thuật này làm gì nhưng không phải như thế nào :(
Erwan

n&-ntrả về công suất cao nhất của 2 divdes đó n.
Neil

@Erwan tôi giải thích về n & -n.
frageum

Tôi đã nhận được chương trình tương ứng trên sân gôn Anarchy n=1;exec"c=n&-n;print n,':',2*len(bin(c))-5<<n/2/c;n+=1;"*100, nhưng đó là hai ký tự đằng sau giải pháp tốt nhất.
xnor

@xnor Gợi ý: giải pháp 59 byte (tốt, ít nhất là của tôi) không hoạt động với tất cả các giá trị của n.
frageum

6

MATL , 25 26 byte

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

Điều này sử dụng bản phát hành hiện tại (10.2.1) của ngôn ngữ / trình biên dịch.

Hãy thử trực tuyến!

Giải trình

Khá đơn giản, dựa trên lực lượng vũ phu. Thử tất cả các kết hợp của ab , chọn một kết hợp thích hợp và thực hiện tính toán cần thiết.

: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
Hừ! :-P Bị đánh bằng ngôn ngữ của bạn ... lần đầu tiên?
Stewie Griffin

@StewieGriffin Đúng! Một cột mốc đẹp :-)
Luis Mendo

5

Julia, 41 byte

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

Đây là một hàm ẩn danh chấp nhận một số nguyên và trả về một số nguyên. Để gọi nó, gán nó cho một biến.

Chúng tôi xác định alà 1 + số mũ của 2 trong hệ số nguyên tố của n. Kể từ khi factortrở lại một Dict, chúng ta có thể sử dụng getvới một giá trị mặc định 0 trong trường hợp các nguyên tố không chứa 2. Chúng tôi thay đổi chút đúng nbởi a, và mất 2 quyền lực này. Chúng tôi nhân nó 2a-1để có được kết quả.


4

Perl 5, 40 byte

38 byte cộng với 2 cho -p

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

-pđọc STDIN vào biến $_.

$i++,$_/=2until$_%2gia số $i(bắt đầu từ 0) và giảm một nửa $_cho đến khi $_không phải là mod 2. Sau đó, $_là hệ số lẻ của số ban đầu và $ilà số mũ của 2.

$_=2*$i+1<<$_/2-.5- Phía bên phải của =chỉ là công thức cho số được tìm kiếm: {1 nhiều hơn hai lần số mũ của 2} lần {2 với sức mạnh của {một nửa hệ số lẻ trừ một nửa}}. Nhưng "lần {2 với sức mạnh của V}}" được đánh giá là "bit-shift dịch chuyển sang trái bởi". Và phía bên tay phải được chỉ định $_.

-pin $_.



2

JavaScript ES6, 36 33 byte

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

Sự hiểu biết của tôi Math.clz32là sẽ ngắn hơn so với loay hoay với toString(2).length.

Chỉnh sửa: Đã lưu 3 byte nhờ @ user81655.


Đẹp. Bạn cũng có thể lưu một vài byte bằng cách đặt n&-nthành một biến:n=>63-2*Math.clz32(x=n&-n)<<n/x/2
user81655

@ user81655 Cảm ơn; Tôi chỉ ước mình có thể sử dụng n&=-n, nhưng tôi cần nmột lần nữa ...
Neil

1

PARI / GP , 38 byte

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

Lưu ý rằng >>\có cùng mức ưu tiên và được tính từ trái sang phải, vì vậy phần cuối cùng có thể n>>k\2thay vì (n>>k)\2. Phiên bản không được chỉnh sửa sẽ tạo ra ktừ vựng với my:

f(n)=
{
  my(k=valuation(n,2));
  (2*k+1) << ((n>>k)\2);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.