Trao đổi chẵn lẻ


22

Bài tập

Cho một số nguyên dương n, đầu ra n+1nếu nlà số lẻ và đầu ra n-1nếu nlà số chẵn.

Đầu vào

Một số nguyên dương. Bạn có thể cho rằng số nguyên nằm trong khả năng xử lý của ngôn ngữ.

Đầu ra

Một số nguyên dương, được chỉ định ở trên.

Tủ thử

input output
    1      2
    2      1
    3      4
    4      3
    5      6
    6      5
    7      8
    8      7
  313    314
  314    313

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.

Tiêu chuẩn áp dụng.

Tài liệu tham khảo


Chúng ta có thể lấy đầu vào là unary?
Kritixi Lithos

2
Điều này sẽ đáng ngạc nhiên, dễ dàng hơn rất nhiều nếu nó là cách khác trong một số ngôn ngữ
MildlyMilquetoast

3
@MistahFiggins Điều đó đủ nổi tiếng đến nỗi tôi khá chắc chắn OP đã cố tình làm điều này như thế này.
Ørjan Johansen

Câu trả lời:


24

C, 20 byte

f(x){return-(-x^1);}

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


7
@LeakyNun Tôi không viết một hàm thiếu câu lệnh return.
frageum

18
@EriktheOutgolfer Số Không. NUH uh. Số
frageum

10
@Sisyphus Nhưng đây là môn đánh gôn và nó hoạt động trên liên kết TIO của tôi, vì vậy nó hợp lệ.
Erik the Outgolfer

7
@EriktheOutgolfer Điều tôi đang nói là câu lệnh của bạn ("gán cho đối số đầu tiên tương đương với câu lệnh return") thực tế không chính xác. Liệu mã như vậy có thể tạo ra một câu trả lời hoạt động trong một số trường hợp nhất định hay không là một câu hỏi khác (mà tôi đã giải quyết trong bình luận đầu tiên của mình bằng cách nói rằng tôi dự định không đăng bất kỳ mã nào như vậy).
frageum

8
@EriktheOutgolfer Nếu một câu trả lời dựa trên hành vi cụ thể của việc triển khai, thì nó sẽ chỉ định việc thực hiện. Câu trả lời này không, vì vậy mã sẽ không hợp lệ.
Sisyphus

17

Mèo xếp chồng , 3 + 3 ( -n) = 6 byte

-*-

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

Cần -ncờ để làm việc với đầu vào và đầu ra số.

Giải trình

Mèo Stack thường không có khả năng cạnh tranh, vì bộ lệnh hạn chế của nó (tất cả đều là tiêm và hầu hết là liên quan) và vì mọi chương trình đều cần phải có tính đối xứng gương. Tuy nhiên, một trong những liên quan là chuyển đổi bit có ý nghĩa nhỏ nhất của một số và chúng ta có thể bù giá trị bằng phủ định đơn phương cũng tồn tại. May mắn thay, điều đó mang lại cho chúng tôi một chương trình đối xứng, vì vậy chúng tôi không cần phải lo lắng về bất cứ điều gì khác:

-   Multiply the input by -1.
*   Toggle the least significant bit of the value (i.e. take it XOR 1).
-   Multiply the result by -1.

Đầu vào và đầu ra được ẩn ở đầu và cuối chương trình, bởi vì lấy đầu vào và đầu ra sản xuất không phải là một hoạt động có thể đảo ngược, vì vậy chúng không thể là các lệnh.


1
Có phải các cờ luôn được tính với không gian bổ sung, tôi không nghĩ rằng tôi đã thấy các câu trả lời khác sử dụng cờ (như Perl) làm điều đó? EDIT: Ok nvm, tìm thấy bài meta có liên quan . " Tôi tính chúng là một sự khác biệt về số lượng ký tự với lời gọi tương đương ngắn nhất mà không có chúng. " ... " perl -nle 'stuff'nhiều hơn 2 ký tự perl -e 'stuff', vì vậy nó tính thêm 2 ký tự ". Vì vậy, (space)-nnhiều hơn 3 byte so với không có cờ.
Kevin Cruijssen

@KevinCruijssen Nó phụ thuộc vào số lượng byte bạn thực sự cần thêm vào một lệnh gọi thông thường. Trong Perl và nhiều ngôn ngữ sản xuất khác, bạn có thể gọi mã bằng -e "code"và sau đó chèn các cờ bổ sung trước e, ví dụ -pe "code". Sau đó, -pcờ chỉ có một byte. Tuy nhiên, Stack Mèo không có -eđối số như vậy , vì vậy bạn luôn cần thêm toàn bộ <sp>-nvào lệnh và do đó là ba byte.
Martin Ender

12

Hội x86, 9 byte (cho mục nhập cạnh tranh)

Tất cả mọi người đang thực hiện thử thách này bằng các ngôn ngữ cấp cao đều bỏ lỡ niềm vui thực sự của việc thao túng các bit thô. Có rất nhiều biến thể tinh tế trong cách thực hiện điều này, đó là sự điên rồ và rất nhiều điều thú vị để suy nghĩ. Dưới đây là một vài giải pháp mà tôi đã nghĩ ra trong ngôn ngữ lắp ráp x86 32 bit.

Tôi xin lỗi trước rằng đây không phải là câu trả lời golf-code điển hình. Tôi sẽ lan man rất nhiều về quá trình suy nghĩ tối ưu hóa lặp (cho kích thước). Hy vọng rằng điều đó thú vị và mang tính giáo dục cho đối tượng lớn hơn, nhưng nếu bạn là loại TL; DR, tôi sẽ không bị xúc phạm nếu bạn bỏ qua đến cuối.

Giải pháp rõ ràng và hiệu quả là kiểm tra xem giá trị là số lẻ hay số chẵn (có thể được thực hiện hiệu quả bằng cách xem xét bit có ý nghĩa nhỏ nhất), sau đó chọn giữa n + 1 hoặc n 1 tương ứng. Giả sử rằng đầu vào được truyền dưới dạng tham số trong thanh ECXghi và kết quả được trả về trong thanh EAXghi, chúng ta có được hàm sau:

F6 C1 01  |  test  cl, 1                      ; test last bit to see if odd or even
8D 41 01  |  lea   eax, DWORD PTR [ecx + 1]   ; set EAX to n+1 (without clobbering flags)
8D 49 FF  |  lea   ecx, DWORD PTR [ecx - 1]   ; set ECX to n-1 (without clobbering flags)
0F 44 C1  |  cmovz eax, ecx                   ; move in different result if input was even
C3        |  ret

(13 byte)

Nhưng đối với mục đích chơi gôn mã, những LEAhướng dẫn đó không tuyệt vời, vì chúng mất 3 byte để mã hóa. Một đơn giản DECRe-ment của ECXsẽ ngắn hơn nhiều (chỉ có một byte), nhưng điều này ảnh hưởng đến cờ, vì vậy chúng ta phải có một chút khéo léo trong cách chúng tôi sắp xếp các mã. Chúng ta có thể thực hiện giảm dần trước và thử nghiệm lẻ / chẵn thứ hai , nhưng sau đó chúng ta phải đảo ngược kết quả của thử nghiệm lẻ / chẵn.

Ngoài ra, chúng ta có thể thay đổi lệnh di chuyển có điều kiện sang một nhánh, điều này có thể làm cho mã chạy chậm hơn (tùy thuộc vào mức độ dự đoán của nhánh đó nếu đầu vào thay thế không nhất quán giữa lẻ và chẵn, một nhánh sẽ chậm hơn; mẫu, nó sẽ nhanh hơn), sẽ tiết kiệm cho chúng ta một byte khác.

Trong thực tế, với sửa đổi này, toàn bộ hoạt động có thể được thực hiện tại chỗ, chỉ sử dụng một thanh ghi duy nhất. Điều này thật tuyệt nếu bạn đặt nội dung mã này ở đâu đó (và rất có thể, bạn sẽ như vậy, vì nó quá ngắn).

    48     |  dec  eax          ; decrement first
    A8 01  |  test al, 1        ; test last bit to see if odd or even
    75 02  |  jnz  InputWasEven ; (decrement means test result is inverted)
    40     |  inc  eax          ; undo the decrement...
    40     |  inc  eax          ; ...and add 1
  InputWasEven:                 ; (two 1-byte INCs are shorter than one 3-byte ADD with 2)

(nội tuyến: 7 byte; dưới dạng hàm: 10 byte)

Nhưng nếu bạn muốn làm cho nó một chức năng thì sao? Không có quy ước gọi tiêu chuẩn nào sử dụng cùng một thanh ghi để truyền các tham số giống như cho giá trị trả về, vì vậy bạn cần thêm một MOVlệnh đăng ký đăng ký vào đầu hoặc cuối của hàm. Điều này hầu như không có chi phí về tốc độ, nhưng nó có thêm 2 byte. ( RETHướng dẫn cũng thêm một byte và có một số chi phí được đưa ra bởi nhu cầu thực hiện và trả về từ một lệnh gọi hàm, có nghĩa đây là một ví dụ trong đó nội tuyến tạo ra cả lợi ích về tốc độ kích thước, thay vì chỉ là tốc độ cổ điển -cho không gian trao đổi.) Trong tất cả, được viết dưới dạng hàm, mã này nở ra 10 byte.

Chúng ta có thể làm gì khác trong 10 byte? Nếu chúng ta quan tâm đến tất cả về hiệu suất (ít nhất là hiệu suất có thể dự đoán được ), sẽ rất tốt nếu thoát khỏi nhánh đó. Đây là một giải pháp xoay vòng không phân nhánh, có cùng kích thước tính theo byte. Tiền đề cơ bản rất đơn giản: chúng tôi sử dụng XOR bitwise để lật bit cuối cùng, chuyển đổi một giá trị lẻ thành một số chẵn và ngược lại. Nhưng có một niggle đối với các đầu vào lẻ, mang lại cho chúng ta n-1 , trong khi đối với các đầu vào chẵn, nó mang lại cho chúng ta n + 1 - hoàn toàn ngược lại với những gì chúng ta muốn. Vì vậy, để khắc phục điều đó, chúng tôi thực hiện thao tác trên một giá trị âm, lật hiệu quả.

8B C1     |  mov eax, ecx   ; copy parameter (ECX) to return register (EAX)
          |
F7 D8     |  neg eax        ; two's-complement negation
83 F0 01  |  xor eax, 1     ; XOR last bit to invert odd/even
F7 D8     |  neg eax        ; two's-complement negation
          |
C3        |  ret            ; return from function

(nội tuyến: 7 byte; dưới dạng hàm: 10 byte)

Khá bóng bẩy; thật khó để thấy điều đó có thể được cải thiện như thế nào. Mặc dù vậy, có một điều khiến tôi chú ý: hai NEGhướng dẫn 2 byte đó . Thành thật mà nói, hai byte có vẻ như một byte quá nhiều để mã hóa một phủ định đơn giản, nhưng đó là tập lệnh chúng ta phải làm việc với. Có cách giải quyết nào không? Chắc chắn rồi! Nếu chúng ta XORbằng -2, chúng ta có thể thay thế hành tây thứ hai NEGbằng một INCrement:

8B C1     |  mov eax, ecx
          |
F7 D8     |  neg eax
83 F0 FE  |  xor eax, -2
40        |  inc eax
          |
C3        |  ret

(nội tuyến: 6 byte; dưới dạng hàm: 9 byte)

Một một trong những điểm kỳ quặc của các tập lệnh x86 là sự đa năng LEAhướng dẫn , có thể làm một động thái đăng ký-đăng ký, một bổ sung đăng ký-đăng ký, bù đắp bởi một hằng số, và mở rộng quy mô tất cả trong một chỉ dẫn duy nhất!

8B C1        |  mov eax, ecx
83 E0 01     |  and eax, 1        ; set EAX to 1 if even, or 0 if odd
8D 44 41 FF  |  lea eax, DWORD PTR [ecx + eax*2 - 1]
C3           |  ret

(10 byte)

Các ANDhướng dẫn cũng giống như TESThướng dẫn chúng tôi sử dụng trước đó, trong đó cả hai làm một Bitwise-AND và bộ cờ cho phù hợp, nhưng ANDthực sự cập nhật các điểm đến toán hạng. Sau LEAđó, lệnh này chia tỷ lệ này bằng 2, thêm giá trị đầu vào ban đầu và giảm đi 1. Nếu giá trị đầu vào là số lẻ, điều này sẽ trừ 1 (2 × 0 - 1 = 1) từ nó; nếu giá trị đầu vào là chẵn, điều này sẽ thêm 1 (2 × 1 - 1 = 1) cho nó.

Đây là một cách rất nhanh và hiệu quả để viết mã, vì phần lớn việc thực thi có thể được thực hiện ở mặt trước, nhưng nó không mua cho chúng ta nhiều theo cách của byte, vì phải mất rất nhiều để mã hóa một phức tạp LEAchỉ dẫn. Phiên bản này cũng không hoạt động tốt cho mục đích nội tuyến, vì nó yêu cầu giá trị đầu vào ban đầu phải được giữ nguyên làm đầu vào của LEAhướng dẫn. Vì vậy, với nỗ lực tối ưu hóa cuối cùng này, chúng tôi thực sự đã đi lùi, cho thấy có lẽ đã đến lúc phải dừng lại.


Do đó, đối với mục cạnh tranh cuối cùng, chúng ta có hàm 9 byte lấy giá trị đầu vào trong thanh ECXghi ( quy ước gọi dựa trên thanh ghi bán chuẩn trên 32 bit x86) và trả về kết quả trong thanh EAXghi (như với tất cả các quy ước gọi x86):

           SwapParity PROC
8B C1         mov eax, ecx
F7 D8         neg eax
83 F0 FE      xor eax, -2
40            inc eax
C3            ret
           SwapParity ENDP

Sẵn sàng để lắp ráp với MASM; gọi từ C là:

extern int __fastcall SwapParity(int value);                 // MSVC
extern int __attribute__((fastcall)) SwapParity(int value);  // GNU   

Sẽ không chỉ dec eax; xor eax, 1; inc eaxlàm việc và tiết kiệm thêm một byte?
Ilmari Karonen


11

Python3, 20 18 byte

lambda n:n-1+n%2*2

Khá đơn giản. Đầu tiên chúng ta tính n-1 và quyết định có thêm 2 vào nó hay không.

Nếu n chẵn -> n mod 2 sẽ là 0, do đó chúng ta sẽ thêm 2 * 0 vào n-1 , dẫn đến n-1 .

Nếu n là số lẻ -> n mod 2 sẽ là 1, do đó chúng tôi sẽ thêm 2 * 1 vào n-1 , dẫn đến n + 1 .

Tôi thích một lời giải thích mà tôi đã thực hiện với MS paint & touchpad máy tính xách tay ... Giải thích trực quan


10

Python, 16 byte

lambda x:-(-x^1)

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


3
Buộc Brute không tìm thấy bất kỳ giải pháp ngắn hơn bằng cách sử dụng các ký tự trong "x+-012~|&^()*/%".
xnor

@xnor Điều tốt là tôi đã nhận nó rồi!
sagiksp

1
Và có vẻ như không có giải pháp nào có cùng chiều dài ngoại trừ việc sắp xếp lại tầm thường -(1^-x).
xnor

8

MATL , 7 byte

Q:HePG)

Điều này tránh bất kỳ hoạt động số học. Hãy thử trực tuyến!

Giải trình

Hãy xem xét đầu vào 4là một ví dụ.

Q    % Implicit input. Add 1
     % STACK: 5
:    % Range
     % STACK: [1 2 3 4 5]
He   % Reshape with 2 rows in column-major order. Pads with a zero if needed
     % STACK: [1 3 5;
               2 4 0]
P    % Flip vertically
     % STACK: [2 4 0;
               1 3 5]
G    % Push input again
     % STACK: [2 4 0;
               1 3 5], 4
)    % Index, 1-based, in column major order. Implicitly display
     % STACK: 3

1
Tốt đẹp! Thích nó!
Stewie Griffin

6

Braingolf v0.1 , 11 10 byte

.1>2,%?+:-

Hãy thử trực tuyến! (Đối số thứ hai là mã Braingolf, đối số thứ ba là đầu vào)

Đã lưu một byte nhờ Neil

Câu trả lời đầu tiên cạnh tranh braingolf: D

Giải trình:

.            Duplicate the top of the stack
 1>          Push 1 to the bottom of the stack
   2         Push 2 to stack
    ,%       Pop last 2 items, mod them and push result
      ?      If last item > 0
       +     Add the 1 to the input
        :    Else
         -   Subtract the 1 from the input

             No semicolon in code so print last item

Braingolf v0.2 , 9 byte [không cạnh tranh]

.2%?1+:1-

Hãy thử trực tuyến! (Đối số thứ hai là mã Braingolf, đối số thứ ba là đầu vào)

Xem ở trên để giải thích. Chỉ có sự khác biệt là trong Braingolf v0.2, hành vi mặc định của các toán tử diadic và chức năng của công cụ ,sửa đổi, bị đảo ngược, có nghĩa là 2 dấu phẩy trong câu trả lời v0.1 không còn cần thiết nữa.

Tuy nhiên v0.2 đã được phát hành sau thử thách, vì vậy đây không phải là đối thủ


5
Chúc mừng ngôn ngữ mới của bạn!
Leaky Nun

.1<2,%?+:-làm những gì tôi nghĩ nó làm?
Neil

@ Không hoàn toàn, bạn cần có dấu phẩy trước khi -thực hiện thao tác đúng cách, trong trường hợp đó vẫn có cùng độ dài với câu trả lời của tôi
Skidsdev

@Mayube Tôi đã mong đợi <để xoay 1bên dưới đầu vào, để nó ở đúng vị trí rồi.
Neil

@Neil nếu đầu vào là một số chẵn, vào thời điểm nó đạt đến -ngăn xếp trông như thế này: các [n,1]toán tử braingolf bị đảo ngược, do đó, nó sẽ thực hiện 1 - n, dẫn đến kết quả -(n-1)mong muốn chỉ đơn giản làn-1
Skidsdev

5

Hình khối , 10 9 byte

cO1)I(//@

Dùng thử trực tuyến

Giải trình

Phiên bản mạng

    c O
    1 )
I ( / / @ . . .
. . . . . . . .
    . .
    . .

Các nhân vật được thực hiện là

I(1c)O@
I          Input
 (         Decrement
  1c       XOR with 1
    )      Increment
     O@    Output and exit

4

Python, 68 byte

lambda x:[m.floor(x-m.cos(m.pi*x)) for m in [__import__('math')]][0]

Trong tinh thần của một cách tiếp cận độc đáo. Biểu đồ sau đây cho thấy chức năng (với các chấm màu tím đại diện cho 10 trường hợp đầu tiên). Về lý thuyết, có thể xây dựng một giải pháp cho câu hỏi này dựa trên hầu hết (tất cả?) Các hàm tuần hoàn (ví dụ: sin, tan, giây). Trong thực tế, việc thay thế cos trong giây như mã sẽ hoạt động.

Hàm biểu đồ


3

PHP, 15 byte

<?=-(-$argn^1);

2
Làm thế nào để tôi chạy cái này? Tôi đang cố kiểm tra xem ;có bắt buộc không, và đã thử sử dụng một .phptệp và cũng lặp lại trực tiếp vào php (php7 cli.) Mỗi ​​lần tôi được bảo đó $argnlà một biến không xác định.
Andrakis

2
@Andrakis Với Fcờ và đường ống : echo 42 | php -F script.php.
dùng63956

3

Javascript, 17 12 byte

x=>x-(-1)**x

f=x=>x-(-1)**x;
<input id=i oninput=o.innerText=f(this.value) type=number><pre id=o>

Một cách tiếp cận khác, 10 byte bị đánh cắp từ câu trả lời C (sssshhh)

x=>-(-x^1)

f=x=>-(-x^1)
<input id=i oninput=o.innerText=f(this.value) type=number><pre id=o>


1. bạn không cần bao gồm dấu chấm phẩy; 2.x=>x-(-1)**x
Nữ tu bị rò rỉ

Tại sao |0? Cả hai giải pháp trông như thể chúng sẽ tự động chuyển đổi chuỗi thành số. (Đối với giải pháp đầu tiên, nếu bạn muốn tránh số thập phân, hãy sử dụng <input type=number>.)
Neil

@Neil Cảm ơn bạn đã thông báo cho tôi!
Matthew Roh

3

JavaScript (ES6), 14 13 12 10 byte

n=>-(-n^1)
  • Lưu 1 byte nhờ Luke .
  • 2 byte được lưu bằng cách chuyển giải pháp C của frageum . (Nếu điều đó gây khó chịu, xin vui lòng cho tôi biết và tôi sẽ quay lại giải pháp trước đây của mình bên dưới)

Thử nó

f=
n=>-(-n^1)
i.addEventListener("input",_=>o.innerText=f(+i.value))
<input id=i type=number><pre id=o>


Bản gốc, 12 byte

n=>n-1+n%2*2

2

Python, 20 byte

lambda n:n+(n%2or-1)

n%2or-1sẽ trả về 1 nếu là số lẻ, nhưng nếu là số chẵn, n%2là "sai" (0), do đó, nó sẽ trả về -1. Sau đó, chúng tôi chỉ cần thêm nó vàon .

Giải pháp trước đó, 23 byte

lambda n:[n-1,n+1][n%2]

n%2tính phần còn lại khi nđược chia cho 2. Nếu là số chẵn, giá trị này trả về 0 và phần tử 0 trong danh sách này là n-1. Nếu là số lẻ, giá trị này trả về 1 và phần tử 1 trong danh sách này là n+1.


1
Sử dụng lambda:lambda n:[n-1,n+1][n%2]
Leaky Nun

À đúng rồi, nên nó ngắn hơn trong trường hợp này. Xong rồi, cảm ơn!
numbermaniac

2

Võng mạc , 21 byte

.+
$*
^11(?=(11)*$)


Hãy thử trực tuyến! Câu trả lời Retina đầu tiên của tôi với hai dòng mới! Giải thích: Hai dòng đầu tiên chuyển đổi từ thập phân sang đơn nguyên. Dòng thứ ba và thứ tư trừ hai từ số chẵn. Dòng cuối cùng chuyển đổi thành số thập phân, nhưng cũng thêm một dòng.



2

Khối , 11 byte

u%2!I(/+@O<

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

Giải trình

Phiên bản mạng:

    u %
    2 !
I ( / + @ O < .
. . . . . . . .
    . .
    . .

Các ký tự được thực hiện theo thứ tự sau:

I(2%!+O@
I        # Take a number as input
 (       # Decrement it
  2%     # Take the parity of the decremented number
         # (0 if the input is odd, 1 if it's even)
    !    # If that number is zero:
     +   #   Add 2
      O  # Output the number
       @ # Terminate the program

2

Brain-Flak , 36 byte

(({})(())){({}[()]<([{}])>)}{}({}{})

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

Cá nhân tôi thực sự hài lòng với câu trả lời này vì nó ngắn hơn rất nhiều so với những gì tôi cho là một phương pháp truyền thống để giải quyết vấn đề này.

Giải trình

Đoạn mã đầu tiên

(({})(()))

chuyển đổi ngăn xếp từ chỉ nsang

n + 1
  1
  n

Sau đó, trong khi đỉnh của ngăn xếp khác không, chúng ta giảm nó và lật dấu của số bên dưới nó

{({}[()]<([{}])>)}

Chúng tôi loại bỏ số 0 và thêm hai số còn lại

{}({}{})

2

Toán học, 22 19 byte

Lưu được 3 byte nhờ Greg Martin!

#-1[-1][[#~Mod~2]]&

Câu trả lời trước, 22 byte

#+{-1,1}[[#~Mod~2+1]]&

Giải thích (cho câu trả lời trước)

Mathematica có một tính năng tuyệt vời là các hoạt động như số học tự động xâu chuỗi các danh sách.

Trong trường hợp này, chúng tôi Mod[#,2]sẽ trả về 0 hoặc 1, nhưng chúng tôi cần thêm 1 vì danh sách Mathicala được lập chỉ mục 1. Nếu nó chẵn , điều này xuất hiện đến 1, vì vậy #-1được trả lại. Nếu nó là số lẻ , điều này xuất hiện thành 2, vì vậy #+1được trả lại.


2
Bạn có thể lưu ba byte bằng cách lạm dụng [[0]]khả năng của Mathematica : #-1[-1][[#~Mod~2]]&.
Greg Martin

Điều đó thật điên rồ, sẽ không bao giờ nghĩ về điều đó. Xong rồi, cảm ơn!
numbermaniac

2

Khôn ngoan , 8 byte

-::^~-^-

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

Giải trình

Nếu đây là cách khác, (giảm nếu lẻ, tăng nếu chẵn), sẽ khá dễ dàng để làm điều này.

Chúng tôi sẽ chỉ lật bit cuối cùng.

::^~-^

Cách khắc phục ở đây là chúng ta lật bit cuối cùng trong khi âm. Các số âm là 1 tắt từ phủ định của các số~ vì vậy điều này tạo ra một phần bù giải quyết vấn đề.

Vì vậy, chúng tôi chỉ cần đưa ra chương trình và gói nó vào -.

-::^~-^-

1

Java 8, 16 10 byte

n->-(-n^1)

Java 7, 34 28 byte

int c(int n){return-(-n^1);}

Các cổng nhàm chán của câu trả lời C tuyệt vời của @feersum .
Hãy thử nó ở đây.


Câu trả lời cũ:

Java 8, 16 byte

n->n%2<1?n-1:n+1

Java 7, 34 byte

int c(int n){return--n%2>0?n:n+2;}

Giải thích (về câu trả lời Java 7 cũ):

Hãy thử nó ở đây.

Câu trả lời ở trên là một biến thể ngắn hơn int c(int n){return n%2<1?n-1:n+1;}bằng cách loại bỏ không gian.

int c(int n){     // Method with integer parameter and integer return-type
  return--n%2>0?  //  If n-1 mod-2 is 1:
    n             //   Return n-1
   :              //  Else:
    n+2;          //   Return n+1
}                 // End of method



1

Befunge 93 , 18 byte

&:2%#v_1+.@
@.-1 <

Tôi chưa chơi golf này (tôi hy vọng).


Mẹo chơi gôn: Befunge 98 có khả năng sử dụng kv(hoặc jvnếu đúng là 1 hoặc 0) thay vì #v_. Ngoài ra, nếu bạn đang sử dụng Dùng thử trực tuyến (và tôi khuyên bạn nên dùng nó), bạn có thể kết thúc chương trình bằng một chương trình khác &(mặc dù sẽ mất 60 giây), vì vậy bạn có thể thoát khỏi @dòng đầu tiên nếu bạn sử dụng. đây là danh sách đầy đủ các lệnh cho Befunge-98 , mặc dù chúng có thể không được thực hiện chính xác trong TIO, như &kết thúc chương trình thay vì đảo ngược trên EOF.
MildlyMilquetoast

Ngoài ra, có vẻ như bạn đang sử dụng befunge 93 thay vì 98, có ít lệnh hơn. Bạn có thể muốn sửa tên liên kết của mình nếu nó thực sự là 93 chứ không phải 98
MildlyMilquetoast

@MistahFiggins, ah vâng, bạn đúng Tôi đã sử dụng 93.
Daniel


1

R, 17 byte

(n=scan())-(-1)^n

trong đó n=scan()có giá trị chữ số.


Tôi nghĩ rằng bạn cần -(-1)^nchứ không phải +(-1)^nvì chúng tôi cần phải trở lại n-1nếu nlà chẵn
Giuseppe

@Giuseppe oh, vâng, tất nhiên, sai lầm ngu ngốc
Nutle

1

Casio-Basic, 27 byte

piecewise(mod(n,2),1,-1)+n

26 byte cho hàm, +1 để nhập nvào hộp tham số.




0

Mẻ, 20 byte

@cmd/cset/a"-(1^-%1)

Độc lập tái khám phá thuật toán của @ frageum, trung thực!

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.