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.

xnor
fuente
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.

KarlKastor
fuente
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.
ETHproducciones
fuente
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.
KarlKastor
fuente
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.

anatolyg
fuente
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!

Emigna
fuente
7

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

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

-13 gracias a Dada

Riley
fuente
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!

Adán
fuente
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

Alondra
fuente
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
DJMcMayhem
fuente
5

JavaScript (ES6), 39 37 bytes

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

Guardado 2 bytes gracias a @Neil

Huntro
fuente
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.
Dennis
fuente
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
QBrute
fuente
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
5

Ruby, 34 bytes

->x{("-~"*x.abs+?0)[2[0<=>x]..-1]}
cia_rana
fuente
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.


fuente
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)
pajonk
fuente
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.
Martin Ender
fuente
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`
Maltysen
fuente
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])
pajonk
fuente
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 > $_
}
Brad Gilbert b2gills
fuente
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
Jonathan Allan
fuente
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)
Sp3000
fuente
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.

mathreadler
fuente
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
alinarezrangel
fuente
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, 61 bytes

if(0>$n=$argv[1]){echo"~";$n=~$n;}echo str_repeat("-~",$n),0;
Jörg Hülsermann
fuente
1

PHP, 58 bytes

<?=((0<$a=$argv[1])?'-':'').str_pad('0',2*abs($a),'~-',0);
Cripto
fuente
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.
Martin Ender
fuente
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!

FedeWar
fuente
1
No tiene que imprimir el 2 = , solo el -~-~0.
xnor
1
Puedes usar en {(;}*0lugar de {(;}{}if 0.
Dennis