Bitflip và phủ nhận


42

Cho một số nguyên, tạo một biểu thức tạo ra nó từ 0việc sử dụng phủ định đơn phương -và bổ sung bitwise ~( ~n= -n-1), với các toán tử được áp dụng từ phải sang trái.

...
-3  = ~-~-~0
-2  = ~-~0
-1  = ~0
 0  = 0
 1  = -~0
 2  = -~-~0
 3  = -~-~-~0
...

Biểu hiện của bạn phải càng ngắn càng tốt, có nghĩa là không có bộ phận dư thừa ~~, --, -0, hoặc 00. Xuất hoặc in biểu thức dưới dạng chuỗi hoặc chuỗi ký tự.



1
khoảng trắng giữa ~ và 0 được phép?
Adám

Không, đầu ra chuỗi chính xác.
xnor

Câu trả lời:


17

Python, 32 byte

lambda x:("-~"*abs(x))[x<0:]+"0"

Chức năng lambda ẩn danh. Cho một số nguyên x ghi "- ~" abs (x) lần và loại bỏ char đầu tiên nếu x âm, sau đó một số 0 được thêm vào cuối.


Aw, đánh tôi với nó
mbomb007

Tôi cũng chỉ viết như vậy - với nvị trí x'ở vị trí của ":)
Jonathan Allan

2
@Jonathan ALLan Sau đó, bạn có thể coi đó là một bản sao một cách an toàn.
Erik the Outgolfer

16

JavaScript (ES6), 33 31 byte

f=x=>x<0?"~"+f(~x):x&&"-"+f(-x)

Đệ quy <xây dựng <vòng lặp (ít nhất là trong trường hợp này). Về cơ bản đánh giá đầu vào:

  • nếu nó nhỏ hơn 0, lật nó và thêm a ~vào chuỗi;
  • nếu nó nhiều hơn 0, phủ nhận nó và thêm a -vào chuỗi;
  • nếu chính xác là 0, trả về 0.

Tận dụng lợi thế của mẫu này:

 0         = 0
-1 = ~( 0) = ~0
+1 = -(-1) = -~0
-2 = ~(+1) = ~-~0
+2 = -(-2) = -~-~0
-3 = ~(+2) = ~-~-~0
+3 = -(-3) = -~-~-~0
etc.

11

Pyth, 14 13 12 byte

_<>0Q+0sm"~-

-2 byte nhờ vào @StevenH.

bộ kiểm tra

Quyết định dùng thử Pyth, vì vậy tôi đã dịch câu trả lời python của mình cho nó. Bất kỳ trợ giúp chào mừng!

Giải trình:

_<>0Q+0sm"~-     
        m"~-     # Map "~-" onto the input (= a list of n times "~-").
       s         # Join the list to a string.
     +0          # Add "0" in front. 
 <>0Q            # Slice off the last char if the input is negative.
_                # Reverse the whole thing.

Sử dụng đầu vào ẩn ở cuối để lưu một byte: >0thay vì<Q0
Steven H.

@StevenH. Cảm ơn bạn! Bây giờ chúng tôi đang ở trong một tie với câu trả lời ngắn nhất!
KarlKastor

2
Giải pháp rất khác nhau (thật không may, không lưu bất kỳ byte nào):tW>0Q_+0sm"~-
Steven H.

2
@StevenH. Đánh golf giải pháp của bạn xuống còn 12: _<>0Q+0sm"~-Tôi hy vọng bạn đồng ý với tôi thêm giải pháp này vào giải pháp của tôi.
KarlKastor

8

C, 46 byte

m(x){putchar(x?x<0?126:45:48);x&&m(-x-(x<0));}

Không giống như hầu hết (tất cả?) Các câu trả lời khác, câu trả lời này đưa ra các toán tử ~-từng cái một.




7

Perl 38 35 33 (23 + 1 cho -p) 24

s/\d+/"-~"x$&.0/e;s;--;

-13 cảm ơn Dada


Bạn có thể có nghĩa là -pthay vì -r. Ngoài ra, bạn có thể thoát khỏi dấu ngoặc đơn và dấu chấm phẩy cuối cùng: if$h<0là đủ.
Dada

Tôi đã làm, cảm ơn. Tôi đã viết quá nhiều câu trả lời trong sed tôi đoán.
Riley

Có lẽ, phải (Loại bỏ 2 dấu ngoặc đơn cuối cùng quá)
Dada

Bạn cũng có thể lưu 2 byte bằng cách thực hiện $h<0&&s;.;thay vì s/.// if $h<0. ( -pthêm một ;phần cuối của mã, vì vậy không cần đến phần cuối ;của s;.;;. Và a if bgần tương đương với b && a, nhưng trong trường hợp này, nó giúp bạn tiết kiệm một byte vì bạn có thể xóa khoảng
trắng

Cảm ơn, tôi không biết -p thêm một ;.
Riley

6

APL Dyalog , 18 byte

'0',⍨0∘>↓'-~'⍴⍨2×|

'0',⍨ ký tự số 0 được thêm vào

0∘> tính tiêu cực (tức là 1 cho các số dưới 0; 0 cho số 0 trở lên)

rơi từ

'-~'⍴⍨ chuỗi "~ -" được định hình lại theo chiều dài

hai lần

| giá trị tuyệt đối

+ thêm

0∘< tính tích cực (tức là 1 cho các số trên 0)

Dùng thử trực tuyến!


6

Haskell, 41 byte

f n=['-'|n>0]++(tail$[1..abs n]>>"-~")++"0"

f n|n<0=tail$f(-n)|x<-[1..n]>>"-~"=x++"0"

Cảm ơn nimi cho 3 byte


tailthất bại cho n=0. Bạn có thể sử dụng drop 1thay thế.
nimi

@nimi Cảm ơn; Tôi không biết làm thế nào tôi đã bỏ lỡ điều đó ..
BlackCap

1
Đừng lãng phí bảo vệ khác : f n|n<0=tail.f$abs n|x<-[1..n]>>"-~"=x++"0".
nimi

1
2 byte để lưu : ...|n<0=tail$f(-n)|....
nimi

5

V , 21 byte

/ä
é
D@"ña-~ñá0kgJó--

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

V có hỗ trợ số rất hạn chế và thực tế nó không có khái niệm về số âm. Điều này có nghĩa là để hỗ trợ tiêu cực (hoặc thậm chí 0), chúng tôi phải sử dụng một số cách giải quyết khác.

Giải trình:

/ä                  "Move forward to the first digit
é                   "And enter a newline
D                   "Delete this number, into register '"'
 @"                 "That number times:
   ñ   ñ            "Repeat the following:
    a               "  Append the string:
     -~             "  '-~'
        á0          "Append a 0
          k         "Move up a line
           gJ       "And join these two lines together
             ó--    "Remove the text '--', if it exists

5

JavaScript (ES6), 39 37 byte

x=>"-~".repeat(x<0?-x:x).slice(x<0)+0

Đã lưu 2 byte nhờ @Neil


5

Thạch , 10 byte

A⁾-~ẋḊẋ¡N0

Đây là một chương trình đầy đủ. Hãy thử trực tuyến!

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

A⁾-~ẋḊẋ¡N0  Main link. Argument: n

A           Take the absolute value of n.
 ⁾-~ẋ       Repeat the string "-~" that many times. Result: s
       ¡    Conditional application:
     Ḋ        Dequeue; remove the first element of s...
      ẋ N     if s, repeated -n times, is non-empty.
         0  Print the previous return value. Set the return value to 0.
            (implicit) Print the final return value.

5

Java 7, 95 79 byte

79 byte:

String s(int x){String t=x<0?"~":"";while((x<0?++x:x--)!=0)t+="-~";return t+0;}

Ung dung:

String s(int x) {
    String t = x<0 ? "~" : "";
    while((x<0 ? ++x : x--) != 0)
        t += "-~";
    return t+0;
}

Phiên bản cũ (95 byte):

String s(int x){return new String(new char[x<0?-x:x]).replace("\0","-~").substring(x<0?1:0)+0;}

Sử dụng:

class A {
    public static void main(String[]a) {
        System.out.println(s(-3));
        System.out.println(s(-2));
        System.out.println(s(-1));
        System.out.println(s(0));
        System.out.println(s(1));
        System.out.println(s(2));
        System.out.println(s(3));
    }
    static String s(int x){String t=x<0?"~":"";while((x<0?++x:x--)!=0)t+="-~";return t+0;}
}

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

Đầu ra:

~-~-~0
~-~0
~0
0
-~0
-~-~0
-~-~-~0

Xin chào, và chào mừng đến với PPCG! Bài đăng đầu tiên rất hay!
Rɪᴋᴇʀ

Chào mừng đến với PPCG! Hmm, đó là một giải pháp ngắn hơn của tôi, vì vậy tôi sẽ xóa câu trả lời của tôi và thay vào đó là giải pháp của bạn. :)
Kevin Cruijssen


3

EXCEL: 55 33 byte

=REPT("-~",IF(A1>0,A1,ABS(A1)-1))&"0"

Đầu vào ở dạng đặt một số trong ô A1. Công thức có thể đi bất cứ nơi nào ngoại trừ A1.


Tôi không nghĩ rằng nó hoạt động cho các số âm ...
pyjama

3

T-SQL, 87 byte

select substring(replicate('-~',abs(x)),case when x<0then 2 else 1 end,x*x+1)+'0'from #

Điều x*x+1kiện trong chuỗi con là đủ, vì x^2+1>=2*abs(x)tất cả x.

Như thường lệ trong SQL, đầu vào được lưu trữ trong một bảng:

create table # (x int)

insert into # values (0)
insert into # values (1)
insert into # values (-1)
insert into # values (2)
insert into # values (-2)

3

CJam , 18 14 byte

Lấy một số cảm hứng từ câu trả lời của Emigna để tiết kiệm 4 byte.

li_z"-~"*\0<>0

Hãy thử trực tuyến! (Là một bộ thử nghiệm được phân tách theo dòng.)

Giải trình

li      e# Read input and convert to integer N.
_z      e# Duplicate and get |N|.
"-~"*   e# Repeat this string |N| times.
\0<     e# Use the other copy of N to check if it's negative.
>       e# If so, discard the first '-'.
0       e# Put a 0 at the end.

3

Vim - 31 tổ hợp phím

Golf vim đầu tiên, prolly bỏ lỡ một tấn công cụ.

`i-~<esc>:s/-\~-/\~-/dwp<left>ii<esc><left>d$@"<esc>a0`

Rất vui được chào mừng đến với câu lạc bộ! :) Bạn có thể làm :s/^-thay vì :s/-\~/\~-Dthay vìd$
DJMcMayhem

Bây giờ tôi nghĩ về nó, tôi không nghĩ rằng điều này xử lý 0. Bạn có thể khắc phục điều này bằng cách tăng trước khi xóa <C-a>và sau đó xóa hai ký tự khỏi cuối.
DJMcMayhem

@DJMcMayhem oh, 0ikhông hoạt động?
Maltysen

Không, tiếc là không. 0di chuyển con trỏ đến ký tự đầu tiên trên hàng hiện tại. Bạn có thể sắp xếp sử dụng 0 làm số đếm trong V mặc dù.
DJMcMayhem

2

Matlab, 61 byte

x=input('');A=repmat('-~',1,abs(x));disp([A((x<0)+1:end) 48])


2

Perl 6 , 25 byte

{substr '-~'x.abs~0,0>$_}

Giải trình:

{
  substr
    # string repeat 「-~」 by the absolute value of the input
    '-~' x .abs

    # concatenate 0 to that
    ~ 0

    ,

    # ignore the first character of the string if it is negative
    0 > $_
}

2

Thạch, 14 12 byte

-2 byte nhờ @Dennis (trả về 0 thay vì ghép "0", làm cho đây chỉ là một chương trình đầy đủ.)

0>‘
A⁾-~ẋṫÇ0

Kiểm tra nó tại TryItOnline

Làm sao?

0>‘      - link 1 takes an argument, the input
0>       - greater than 0? 1 if true 0 if false
  ‘      - increment

A⁾-~ẋṫÇ0 - main link takes an argument, the input
      Ç  - y = result of previous link as a monad
A        - x = absolute value of input
 ⁾-~     - the string "-~"
    ẋ    - repeat the sting x times
     ṫ   - tail repeatedString[y:] (y will be 1 or 2, Jelly lists are 1-based)
       0 - implicit print then return 0

2

> <>, 18 + 3 = 22 byte

:?!n0$-:0):1go-
-~

Hãy thử trực tuyến! +3 byte cho ​ -vcờ để khởi tạo ngăn xếp với đầu vào. Nếu giả sử rằng STDIN trống thì không sao, thì sau đây là một byte ngắn hơn:

:?!ni*:0):1go-
-~

Chương trình tiếp tục lật đầu vào nkhi cần thiết cho đến khi nó về 0, sau đó nó bị lỗi.

[Loop]
:?!n      If n is 0, output it as a num. If this happens then the stack is now
          empty, and the next subtraction fails
0$-       Subtract n from 0
:0)       Push (n > 0)
:1go      Output the char at (n>0, 1) which is a char from the second line
-         Subtract, overall updating n -> -n-(n>0)

2

Octave, 51 byte

x=input('');[("-~"'*[1:abs(x)>0])((x<0)+1:end),'0']

Đầu tiên, sao chép một cách trắng trợn cách tiếp cận Matlab bằng cách @pajonk và sau đó sửa đổi một số chi tiết, viết lại như một "sản phẩm bên ngoài" giữa một vectơ của các ký tự và các ký tự "- ~" và lạm dụng lập chỉ mục khi đang bay (hoặc nó có thể là gì được gọi) cho phép chúng tôi lưu một số byte. Tôi vẫn hơi đau một chút rằng tôi không thể lấy biểu thức chỉ mục để lấy ít byte hơn.

Octave cho phép một (i1) (i2) hoặc thậm chí (...) (i1) (i2) để lập chỉ mục trong đó Matlab muốn chúng ta lưu trữ các biến ở giữa các chỉ mục.

((x<0)+1:end)

là quá dài để mô tả "bỏ qua đầu tiên nếu". Phải có cách tốt hơn.


2

Giả , 688 579 521 byte

utilizar mate.pseudo
utilizar entsal.pseudo
adquirir n
adquirir a
adquirir r
adquirir i
fijar n a llamar LeerPalabra finargs
si son iguales n y CERO
escribir {0}
salir
fin
fijar a a llamar ValorAbsoluto n finargs
fijar i a CERO
si comparar Importar.Ent.Comparar n < CERO
fijar r a {~}
sino
fijar r a {-}
fin
mientras comparar Importar.Ent.Comparar i < a
escribir r finargs
si son iguales r y {~}
fijar r a {-}
Importar.Ent.Sumar i UNO i
sino
fijar r a {~}
fin
finbucle
si son iguales r y {~}
escribir {~}
fin
escribir {0}

Giải thích:

Read a number from STDIN;
If the number is zero (0); Then:
    Writes 0 to STDOUT and exits;
End If;
If the number is less than zero (0); Then:
    Set the fill character to "~";
Else:
    Set the fill character to "-";
End If;
For i = 0; While i is less than abs(number); do:
    Write the fill character to STDOUT;
    If the fill character is "~":
        Set the fill character to "-"
        Increment i by one
    Else:
        Set the fill character to "~"
    End if;
End for;
If the fill character is "~"; Then:
    Write "~" to STDOUT;
End If;
Write "0" to STDOUT

1
Chào mừng đến với PPCG! Là nó nhỏ như nó được? Tôi thấy một số định danh dài mà bạn có thể rút ngắn ("relleno" thành "r", menos relleno: P). Tôi nghĩ bạn có thể bỏ nhập khẩu cho lib tiêu chuẩn nếu đó chỉ là một đoạn mã hoặc đoạn mã. Nó không yêu cầu theo dõi dòng mới trên đầu ra, vì vậy có lẽ bạn có thể thay đổi E fouirLinea cuối cùng thành E fouir. Bạn có thể gán hàm cho tên ngắn hơn ( adquirir e``fijar p a Escribir) không?
fede s.



1

Mê cung , 25 byte

`?+#~.
.  ; 6
54_"#2
  @!

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

Giải trình

Tôi thực sự thích dòng điều khiển trong cái này. IP chạy trong hình 8 (hoặc thực tế là, tôi đoán vậy) thông qua mã để giảm đầu vào từ từ 0trong khi in các ký tự tương ứng.

Mã bắt đầu ở góc trên bên trái đi bên phải. Các `không làm bất cứ điều gì ngay bây giờ. ?đọc đầu vào và +thêm nó vào số 0 ẩn bên dưới. Tất nhiên điều đó cũng không làm gì cả, nhưng khi chúng ta chạy lại mã này, ?sẽ đẩy số 0 (vì chúng ta đang ở EOF), và +sau đó sẽ thoát khỏi số 0 đó.

Tiếp theo, #đẩy độ sâu của ngăn xếp, chỉ cần đảm bảo rằng có một giá trị dương trên ngăn xếp để làm cho IP quay về hướng nam và ;loại bỏ nó một lần nữa.

Đây "là một no-op và hoạt động như nhánh chính của mã. Có ba trường hợp để phân biệt:

  • Nếu giá trị hiện tại là dương, IP sẽ rẽ phải (hướng tây) và hoàn thành một vòng của vòng lặp bên trái:

    _45.`?+
    _45      Push 45.
       .     Print as character '-'.
        `    Negate the current value (thereby applying the unary minus).
         ?+  Does nothing.
    
  • Nếu giá trị hiện tại là âm, IP sẽ rẽ trái (hướng đông) và đoạn mã sau được chạy:

    #26.~
    #        Push stack depth, 1.
     26      Turn it into a 126.
       .     Print as character '~'.
        ~    Bitwise NOT of the current value (applying the ~).
    

    Lưu ý rằng hai cái này sẽ thay thế (vì cả hai đều thay đổi dấu hiệu của đầu vào) cho đến khi giá trị đầu vào giảm xuống bằng không. Tại thời điểm đó...

  • Khi giá trị hiện tại bằng 0, IP chỉ cần tiếp tục di chuyển về phía nam và thực hiện !và sau đó quay về hướng tây lên @. !in 0@chấm dứt chương trình.

1

GolfScript ,30 24 20 byte

  • Đã lưu 6 byte nhờ xnor.
  • Đã lưu 4 byte nhờ Dennis.

~."-~"\abs*\0<{(;}*0

Đầu vào: -5

Đầu ra: -5 = ~-~-~-~-~0

Giải trình

~.     # Input to integer and duplicate
"-~"   # We shall output a repetition of this string
\abs   # Move the input onto the stack and computes abs
*      # Multiply "-~" for abs(input) times
\      # Copy onto the stack the input
0<     # Is it less than 0?
{(;}*  # Yes: remove first '-' from the output
0      # Push 0

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


1
Bạn không cần phải in 2 = , chỉ là -~-~0.
xnor

1
Bạn có thể sử dụng {(;}*0thay vì {(;}{}if 0.
Dennis
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.