Bitflip和求反


42

给定一个整数,请创建一个表达式,该表达式0使用一元求反-和按位补码~~n= -n-1)生成,并将运算符从右向左应用。

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

您的表达式必须是尽可能地短,这意味着没有冗余部分~~---0,或00。将表达式输出或打印为字符串或字符序列。


11
所以...您想让我们放下我们的东西,翻转并反转它吗?
约旦

1
允许〜到0之间的空格?
2013年

不,完全输出字符串。
xnor

Answers:


17

Python,32个字节

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

匿名lambda函数。给定一个整数x,它写“-〜” abs(x)次,如果x为负,则删除第一个字符,然后在末尾加一个零。


噢,击败我。
mbomb007'9

用-我只是写了相同太n在的地方x,并'在的地方":)
乔纳森·艾伦

2
@JonathanAllan然后,您可以放心地将其视为骗子。
Erik the Outgolfer '16

16

JavaScript(ES6),33 31字节

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

递归<内置<循环(至少在这种情况下)。基本上不评估输入:

  • 如果小于0,则将其翻转并~在字符串中添加a ;
  • 如果大于0,则将其取反并-在字符串中添加a ;否则,
  • 如果正好是0,则返回0。

利用这种模式:

 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字节

_<>0Q+0sm"~-

-2字节感谢@StevenH。

测试套件

决定尝试Pyth,因此我翻译了python答案。任何帮助欢迎!

说明:

_<>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.

最后使用隐式输入保存一个字节:>0而不是<Q0
Steven

@StevenH。谢谢!现在,我们的答案最短!
KarlKastor

2
非常不同的解决方案(不幸的是,不保存任何字节):tW>0Q_+0sm"~-
Steven H.

2
@StevenH。将您的解决方案降低到12:_<>0Q+0sm"~-我希望您可以将其添加到我的解决方案中。
KarlKastor

8

C,46字节

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

与大多数(所有?)其他答案不同,这一答案输出运算符,~-一一输出。


7

05AB1E14 13字节

Ä„-~×¹0‹i¦}0J

说明

 „-~           # the string "-~"
Ä   ×          # repeated abs(input) times
     ¹0‹i¦}    # if input is negative, remove the first char
           0J  # join with 0

在线尝试!



7

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

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

-13感谢Dada


您可能-p不是-r。您也可以摆脱那些最后的括号和分号:if$h<0就足够了。
达达

我做到了,谢谢。我猜我在sed中写了太多答案。
莱利

可能是的 (也摆脱了最后2个括号)
达达(Dada

您也可以通过$h<0&&s;.;代替来节省2个字节s/.// if $h<0。(在代码末尾-p添加a ;,因此不需要末尾;s;.;;。并且a if b大致等效于b && a,但是在这种情况下,它可以节省一个字节,因为您可以删除空格)
Dada

谢谢,我不知道-p也添加了;
莱利2016年

6

Dyalog APL,18 字节

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

'0',⍨ 字符零附加到

0∘> 负数(即1表示0以下的数字; 0表示零以上的数字)

'-~'⍴⍨ 字符串“〜-”循环调整为长度

两次

| 绝对值

+

0∘< 积极性(即大于0的数字为1)

在线尝试APL!



5

V,21字节

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

在线尝试!

V的数字支持非常有限,实际上它没有负数的概念。这意味着为了支持负数(甚至是0),我们必须使用一些棘手的解决方法。

说明:

/ä                  "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字节

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

@Neil节省了2个字节


5

果冻,10 字节

A⁾-~ẋḊẋ¡N0

这是一个完整程序。在线尝试!

这个怎么运作

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字节

79个字节:

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

取消高尔夫:

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

旧版本(95字节):

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

用法:

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;}
}

在这里尝试!

输出:

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

嗨,欢迎来到PPCG!不错的第一篇文章!
Rɪᴋᴇʀ

欢迎来到PPCG!嗯,那是比我的解决方案更短的解决方案,所以我将删除我的答案,然后投票给您。:)
Kevin Cruijssen


3

EXCEL:55 33个字节

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

输入形式是在A1单元格中输入数字。公式可以去A1以外的任何地方。


我认为它不适用于负数...
pajonk 16/09/9

3

T-SQL,87个字节

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

x*x+1子字符串中的条件就足够了,因为x^2+1>=2*abs(x)对于所有x

与通常在SQL中一样,输入存储在表中:

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

CJam18 14字节

Emigna的答案中得到一些启发,以节省4个字节。

li_z"-~"*\0<>0

在线尝试!(作为换行分隔的测试套件。)

说明

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次击键

第一次参加高尔夫运动,就错过了很多东西。

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

尼斯,欢迎加入俱乐部!:)你可以做:s/^-的,而不是:s/-\~/\~-D替代d$
DJMcMayhem

现在,我考虑了一下,我认为它不会处理0。您可以通过在用删除之前递增<C-a>,然后在末尾删除两个字符来解决这个问题。
DJMcMayhem

@DJMcMayhem哦,0i行不通吗?
Maltysen

不,不幸的是没有。0将光标移动到当前行的第一个字符。您可以使用0作为V中的计数。
DJMcMayhem

2

Matlab,61个字节

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


2

Perl 6,25个字节

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

说明:

{
  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

果冻,14 12字节

@Dennis表示-2个字节(返回0而不是连接“ 0”,仅使它成为完整程序。)

0>‘
A⁾-~ẋṫÇ0

TryItOnline上进行测试

怎么样?

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字节

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

在线尝试!+3个字节的​ -v标志用于使用输入初始化堆栈。如果假设STDIN为空是可以的,那么以下内容要短一个字节:

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

程序会n根据需要不断翻转输入,直到达到0,然后输出错误。

[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

八度,51字节

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

首先,用@pajonk粗暴地复制Matlab方法,然后修改一些细节,将其改写为一个矢量和一个字符“-〜”之间的“外部产品”,并滥用即时索引(或可能是什么)称为)可以节省一些字节。我无法让索引表达式占用更少的字节数仍然让我有些痛苦。

八度允许a(i1)(i2)甚至(...)(i1)(i2)进行索引,而Matlab希望我们在索引之间存储变量。

((x<0)+1:end)

描述“如果先跳过”太长了。一定会有更好的办法。


2

PseudoD688个 579 521字节

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}

说明:

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
欢迎来到PPCG!那会变小吗?我看到一些可能会缩短的长标识符(“ relleno”到“ r”,menos relleno:P)。我认为如果它只是一个函数或代码片段,也可以删除标准库的导入。它不要求在输出中尾随换行符,因此也许您可以将最后一个EscribirLinea更改为Escribir。可以为短名称(adquirir e``fijar p a Escribir)分配功能吗?
fede s。


1

PHP,58字节

<?=((0<$a=$argv[1])?'-':'').str_pad('0',2*abs($a),'~-',0);

1

迷宫,25字节

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

在线尝试!

说明

我真的很喜欢这一节中的控制流程。IP在代码中以数字8(或者我想实际上是∞)运行,以0在打印相应字符时将输入缓慢减小。

代码从右上角的左上角开始。目前`不执行任何操作。?读取输入+并将其添加到下面的隐式零。当然,这也不做任何事情,但是当我们再次运行此代码时,?将推零(因为我们处于EOF),然后+将其除掉。

接下来,#推动堆栈深度,只是为了确保堆栈上有一个正值,以使IP向南移动,然后;再次将其丢弃。

"是一个空操作,并作为代码的主分支。可以区分三种情况:

  • 如果当前值为正,则IP向右转(向西)并完成一圈左循环:

    _45.`?+
    _45      Push 45.
       .     Print as character '-'.
        `    Negate the current value (thereby applying the unary minus).
         ?+  Does nothing.
    
  • 如果当前值为负,则IP向左转(向东),并运行以下代码:

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

    请注意,这两个值将交替变化(因为两者都更改输入的符号),直到输入值减小为零为止。在那时候...

  • 当当前值为零时,IP继续向南移动,执行!,然后向西转到@!打印0@终止程序。

1

GolfScript30 24 20字节

  • 多亏了xnor,节省了6个字节。
  • 感谢Dennis,节省了4个字节。

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

输入: -5

输出: -5 = ~-~-~-~-~0

说明

~.     # 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

在线尝试!


1
您不必打印2 = ,而只需打印-~-~0
xnor

1
您可以使用{(;}*0代替{(;}{}if 0
丹尼斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.