Bitflip y negate


42

Dado un número entero, cree una expresión que la produzca 0mediante el uso de la negación unaria -y el complemento a nivel de bits ~( ~n= -n-1), con los operadores aplicados de derecha a izquierda.

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

Su expresión debe ser lo más corto posible, lo que significa que no hay partes redundantes de ~~, --, -0, o 00. Imprima o imprima la expresión como una cadena o una secuencia de caracteres.


11
Entonces ... ¿quieres que dejemos lo nuestro, lo volteemos y lo invirtamos ?
Jordania

1
espacio en blanco entre ~ y 0 permitido?
Adám

No, genera las cadenas exactamente.
xnor

2
Obligatorio xkcd.com/153
Jared Smith

Respuestas:


17

Python, 32 bytes

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

Función lambda anónima. Dado un entero, x escribe "- ~" abs (x) veces y elimina el primer carácter si x es negativo, luego se agrega un cero al final.


Aw, venceme.
mbomb007

Acabo de escribir lo mismo también - con nen lugar de xy 'en lugar de ":)
Jonathan Allan

2
@JonathanAllan Entonces puedes considerarlo un tonto con seguridad.
Erik the Outgolfer

16

JavaScript (ES6), 33 31 bytes

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

Recursion <built-ins <loops (al menos en este caso). Básicamente no evalúa la entrada:

  • si es menor que 0, voltéelo y agregue un ~a la cadena;
  • si es más de 0, niegue y agregue un -a la cadena;
  • si es exactamente 0, devuelve 0.

Aprovecha este patrón:

 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 bytes

_<>0Q+0sm"~-

-2 Bytes gracias a @StevenH.

Banco de pruebas

Decidí probar Pyth, así que traduje mi respuesta de Python . Cualquier ayuda bienvenida!

Explicación:

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

Utilice la entrada implícita al final para guardar un byte: en >0lugar de<Q0
Steven H.

@StevenH. ¡Gracias! ¡Ahora estamos en un empate con la respuesta más corta!
KarlKastor

2
Solución muy diferente (que, desafortunadamente, no guarda ningún byte):tW>0Q_+0sm"~-
Steven H.

2
@StevenH. Golfed tu solución hasta 12: _<>0Q+0sm"~-espero que estés de acuerdo conmigo agregando esto a mi solución.
KarlKastor

8

C, 46 bytes

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

A diferencia de la mayoría (¿todas?) Otras respuestas, esta da salida a los operadores ~y -una por una.


7

05AB1E , 14 13 bytes

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

Explicación

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

Pruébalo en línea!



7

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

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

-13 gracias a Dada


Probablemente quisiste decir en -plugar de -r. También puedes deshacerte de esos últimos paréntesis y punto y coma: if$h<0es suficiente.
Dada

Lo hice, gracias. He estado escribiendo demasiadas respuestas en sed, supongo.
Riley

Probablemente sí. (Deshágase de los últimos 2 paréntesis también)
Dada

También puede guardar 2 bytes haciendo en $h<0&&s;.;lugar de s/.// if $h<0. ( -pAñade una ;al final del código, así que no hay necesidad de que el último ;de s;.;;Y. a if bEs más o menos equivalente a b && a, pero en este caso le ahorra un byte porque se puede quitar el espacio)
Dada

Gracias, no lo sabía -p agregó ;también.
Riley

6

Dyalog APL , 18 bytes

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

'0',⍨ carácter cero agregado a

0∘> negatividad (es decir, 1 para números inferiores a 0; 0 para cero y superiores)

caido de

'-~'⍴⍨ la cadena "~ -" se reformó cíclicamente a la longitud

dos veces

| el valor absoluto

+ más

0∘< positividad (es decir, 1 para números superiores a 0)

TryAPL en línea!


6

Haskell, 41 bytes

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

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

Gracias a nimi por 3 bytes


tailfalla por n=0. Puedes usar drop 1en su lugar.
nimi

@nimi Gracias; No tengo idea de cómo me perdí eso ..
BlackCap

1
No pierda la guardia de otro modo : f n|n<0=tail.f$abs n|x<-[1..n]>>"-~"=x++"0".
nimi

1
2 bytes para ahorrar: ...|n<0=tail$f(-n)|....
nimi

5

V , 21 bytes

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

Pruébalo en línea!

V tiene un soporte de número muy limitado, y en realidad no tiene un concepto de números negativos. Esto significa que para admitir negativos (o incluso 0), tenemos que usar algunas soluciones alternativas.

Explicación:

/ä                  "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 bytes

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

Guardado 2 bytes gracias a @Neil


5

Jalea , 10 bytes

A⁾-~ẋḊẋ¡N0

Este es un programa completo. Pruébalo en línea!

Cómo funciona

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 bytes

79 bytes:

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

Sin golf:

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

Versión anterior (95 bytes):

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

Uso:

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

Pruébalo aquí!

Salida:

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

Hola y bienvenidos a PPCG! Bonito primer post!
Rɪᴋᴇʀ

Bienvenido a PPCG! Hmm, esa es una solución más corta que la mía, por lo que eliminaré mi respuesta y votaré en su lugar. :)
Kevin Cruijssen


3

EXCEL: 55 33 bytes

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

La entrada es en forma de poner un número en la celda A1. La fórmula puede ir a cualquier parte excepto a A1.


No creo que funcione para números negativos ...
pajonk

3

T-SQL, 87 bytes

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

La x*x+1condición en la subcadena es suficiente, ya que x^2+1>=2*abs(x)para todos x.

Como generalmente en SQL, la entrada se almacena en una tabla:

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 bytes

Se inspiró en la respuesta de Emigna para guardar 4 bytes.

li_z"-~"*\0<>0

Pruébalo en línea! (Como un conjunto de pruebas separado por salto de línea).

Explicación

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 pulsaciones de teclas

Primero vim golf, prolly se perdió un montón de cosas.

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

Bien, bienvenido al club! :) Podrías hacerlo en :s/^-lugar de :s/-\~/\~-y en Dlugar ded$
DJMcMayhem

Ahora que lo pienso, no creo que esto maneje 0. Puede solucionar esto incrementando antes de eliminar con <C-a>y luego eliminando dos caracteres del final.
DJMcMayhem

@DJMcMayhem oh, 0i¿no funciona?
Maltysen

No, desafortunadamente no. 0mueve el cursor al primer carácter en la fila actual. Sin embargo, puede usar 0 como recuento en V.
DJMcMayhem

2

Matlab, 61 bytes

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


2

Perl 6 , 25 bytes

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

Explicación:

{
  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

Jalea, 14 12 bytes

-2 bytes gracias a @Dennis (devuelve 0 en lugar de concatenar "0", haciendo de este un programa completo solamente).

0>‘
A⁾-~ẋṫÇ0

Pruébelo en TryItOnline

¿Cómo?

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 bytes

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

Pruébalo en línea! +3 bytes para que la ​ -vbandera inicialice la pila con la entrada. Si asumir que STDIN está vacío está bien, entonces el siguiente es un byte más corto:

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

El programa sigue volteando la entrada nsegún sea necesario hasta que llega a 0, después de lo cual falla.

[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

Octava, 51 bytes

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

Al principio, copiando descaradamente el enfoque de Matlab por @pajonk y luego modificando algunos detalles, reescribiendo como un "producto externo" entre un vector de unos y los caracteres "- ~" y abusando de la indexación sobre la marcha (o lo que podría ser llamado) nos permite guardar algunos bytes. Todavía me duele un poco que no pueda hacer que la expresión de índice tome menos bytes.

Octave permite un (i1) (i2) o incluso (...) (i1) (i2) para indexar donde Matlab quiera que almacenemos variables entre las indexaciones.

((x<0)+1:end)

es demasiado largo para describir "saltar primero si". Tiene que haber una mejor manera.


2

PseudoD , 688 579 521 bytes

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}

Explique:

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
Bienvenido a PPCG! ¿Es tan pequeño como se pone? Veo algunos identificadores largos que probablemente podría acortar ("relleno" a "r", menos relleno: P). Creo que puede eliminar las importaciones de lib estándar si también es solo una función o fragmento de código. No solicita una nueva línea final en la salida, por lo que tal vez pueda cambiar la última EscribirLinea a Escribir. ¿Se pueden asignar funciones a nombres más cortos ( adquirir e``fijar p a Escribir)?
fede s.


1

PHP, 58 bytes

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

1

Laberinto , 25 bytes

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

Pruébalo en línea!

Explicación

Realmente me gusta el flujo de control en este. La IP se ejecuta en una figura 8 (o en realidad un ∞, supongo) a través del código para reducir la entrada lentamente 0mientras se imprimen los caracteres correspondientes.

El código comienza en la esquina superior izquierda hacia la derecha. El `no hace nada ahora. ?lee la entrada y la +agrega al cero implícito a continuación. Por supuesto, eso tampoco hace nada, pero cuando volvamos a ejecutar este código, ?presionaremos un cero (porque estamos en EOF), y +luego eliminaremos ese cero.

Luego, #empuja la profundidad de la pila, simplemente para asegurarse de que haya un valor positivo en la pila para que la IP gire hacia el sur, y la ;descarta nuevamente.

El "es un no-op y actúa como la rama principal del código. Hay tres casos para distinguir:

  • Si el valor actual es positivo, la IP gira a la derecha (oeste) y completa una ronda del bucle izquierdo:

    _45.`?+
    _45      Push 45.
       .     Print as character '-'.
        `    Negate the current value (thereby applying the unary minus).
         ?+  Does nothing.
    
  • Si el valor actual es negativo, la IP gira a la izquierda (este) y se ejecuta el siguiente código:

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

    Tenga en cuenta que estos dos se alternarán (ya que ambos cambian el signo de la entrada) hasta que el valor de entrada se reduzca a cero. En ese punto...

  • Cuando el valor actual es cero, el IP simplemente sigue moviéndose hacia el sur, ejecuta el !y luego gira hacia el oeste @. !imprime 0y @finaliza el programa.

1

GolfScript ,30 24 20 bytes

  • Guardado 6 bytes gracias a xnor.
  • Guardado 4 bytes gracias a Dennis.

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

Entrada: -5

Salida: -5 = ~-~-~-~-~0

Explicación

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

Pruébalo en línea!


1
No tiene que imprimir el 2 = , solo el -~-~0.
xnor

1
Puedes usar en {(;}*0lugar de {(;}{}if 0.
Dennis
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.