Bitflip et nier

42

Étant donné un entier, créez une expression qui la produit en 0utilisant la négation unaire -et le complément au niveau du bit ~( ~n= -n-1), avec les opérateurs appliqués de droite à gauche.

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

Votre expression doit être aussi courte que possible, ce qui signifie pas de pièces redondantes ~~, --, -0ou 00. Générez ou imprimez l'expression sous forme de chaîne ou de séquence de caractères.

Xnor
la source
11
Alors ... tu veux que nous posions notre chose, la retournions et l'inversions ?
Jordanie
1
espaces entre ~ et 0 autorisés?
Adám
Non, affichez les chaînes exactement.
xnor
2
Obligatoire xkcd.com/153
Jared Smith

Réponses:

17

Python, 32 octets

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

Fonction lambda anonyme. Étant donné un entier x écrit "- ~" abs (x) fois et supprime le premier caractère si x est négatif, un zéro est ajouté à la fin.

KarlKastor
la source
Aw, me battre à elle.
mbomb007
Je viens d'écrire la même chose - avec nà la place de xet 'à la place de ":)
Jonathan Allan
2
@ JonathanAllan Ensuite, vous pouvez sans risque considérer cela comme une dupe.
Erik the Outgolfer
16

JavaScript (ES6), 33 31 octets

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

Récursivité <intégrés <boucles <(du moins dans ce cas). Fondamentalement non l'évaluation de l'entrée:

  • s'il est inférieur à 0, retournez-le et ajoutez a ~à la chaîne;
  • s'il est supérieur à 0, annulez-le et ajoutez a -à la chaîne;
  • si c'est exactement 0, retourne 0.

Profite de ce modèle:

 0         = 0
-1 = ~( 0) = ~0
+1 = -(-1) = -~0
-2 = ~(+1) = ~-~0
+2 = -(-2) = -~-~0
-3 = ~(+2) = ~-~-~0
+3 = -(-3) = -~-~-~0
etc.
ETHproductions
la source
11

Pyth, 14 13 12 octets

_<>0Q+0sm"~-

-2 octets grâce à @StevenH.

suite de tests

Décidé d'essayer Pyth, j'ai donc traduit ma réponse en python . Toute aide bienvenue!

Explication:

_<>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
la source
Utilisez une entrée implicite à la fin pour sauvegarder un octet: >0au lieu de<Q0
Steven H.
@StevenH. Merci! Maintenant, nous sommes à égalité avec la réponse la plus courte!
KarlKastor
2
Solution très différente (qui, malheureusement, ne sauve aucun octet):tW>0Q_+0sm"~-
Steven H.
2
@StevenH. Golfé votre solution à 12: _<>0Q+0sm"~-J'espère que votre accord avec moi d'ajouter ceci à ma solution.
KarlKastor
8

C, 46 octets

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

Contrairement à la plupart (tous?) D' autres réponses, celui - ci sort les opérateurs ~et -un par un.

anatolyg
la source
7

05AB1E , 14 à 13 octets

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

Explication

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

Essayez-le en ligne!

Emigna
la source
7

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

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

-13 grâce à Dada

Riley
la source
Vous avez probablement voulu dire -pau lieu de -r. Aussi, vous pouvez vous débarrasser de ces dernières parenthèses et points-virgules: cela if$h<0suffit.
Dada
Je l'ai fait, merci. J'ai écrit trop de réponses dans sed je suppose.
Riley
Probablement oui. (Débarrassez-vous aussi des 2 dernières parenthèses)
Dada
Vous pouvez également enregistrer 2 octets en faisant $h<0&&s;.;au lieu de s/.// if $h<0. ( -pajoute un ;à la fin du code, donc pas besoin du dernier ;de s;.;;. Et a if best à peu près équivalent à b && a, mais dans ce cas, cela vous économise un octet car vous pouvez supprimer l'espace)
Dada
Merci, je ne savais pas -p ajouté un ;aussi.
Riley
6

Dyalog APL , 18 octets

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

'0',⍨ caractère zéro ajouté à

0∘> caractère négatif (c.-à-d. 1 pour les nombres inférieurs à 0; 0 pour le zéro et le plus élevé)

est tombé de

'-~'⍴⍨ la chaîne "~ -" cycliquement remise en forme

Deux fois

| la valeur absolue

+ plus

0∘< positivité (1 pour les nombres supérieurs à 0)

TryAPL en ligne!

Adam
la source
6

Haskell, 41 octets

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

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

Merci à nimi pour 3 octets

BlackCap
la source
tailéchoue pour n=0. Vous pouvez utiliser à la drop 1place.
nimi
@nimi merci; Je ne sais pas du tout comment j'ai raté ça.
BlackCap
1
Ne pas perdre la garde autrement : f n|n<0=tail.f$abs n|x<-[1..n]>>"-~"=x++"0".
nimi
1
2 octets pour sauver: ...|n<0=tail$f(-n)|....
nimi
5

V , 21 octets

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

Essayez-le en ligne!

V a un support de nombre très limité, et il n’a en fait aucune notion de nombre négatif. Cela signifie que pour supporter les négatifs (ou même 0), nous devons utiliser certaines solutions de contournement.

Explication:

/ä                  "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
la source
5

JavaScript (ES6), 39 37 octets

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

2 octets sauvés grâce à @Neil

Huntro
la source
5

Gelée , 10 octets

A⁾-~ẋḊẋ¡N0

Ceci est un programme complet. Essayez-le en ligne!

Comment ça marche

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
la source
5

Java 7, 95 à 79 octets

79 octets:

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

Ungolfed:

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

Ancienne version (95 octets):

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

Usage:

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

Essayez-le ici!

Sortie:

~-~-~0
~-~0
~0
0
-~0
-~-~0
-~-~-~0
QBrute
la source
Bonjour et bienvenue sur PPCG! Nice premier post!
Rɪᴋᴇʀ
Bienvenue chez PPCG! Hmm, c'est une solution plus courte que la mienne, je vais donc supprimer ma réponse et faire passer votre vote à la place. :)
Kevin Cruijssen le
5

Ruby, 34 octets

->x{("-~"*x.abs+?0)[2[0<=>x]..-1]}
cia_rana
la source
3

EXCEL: 55 33 octets

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

La saisie consiste à mettre un nombre dans la cellule A1. La formule peut aller n'importe où sauf A1.


la source
Je ne pense pas que cela fonctionne pour les nombres négatifs ...
pajonk
3

T-SQL, 87 octets

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

La x*x+1condition dans la sous-chaîne est suffisante, car x^2+1>=2*abs(x)pour tous x.

Comme d'habitude en SQL, l'entrée est stockée dans une table:

create table # (x int)

insert into # values (0)
insert into # values (1)
insert into # values (-1)
insert into # values (2)
insert into # values (-2)
pyjonk
la source
3

CJam , 18 14 octets

J'ai pris l'inspiration de la réponse d' Emigna pour économiser 4 octets.

li_z"-~"*\0<>0

Essayez-le en ligne! (En tant que suite de tests séparés par un saut de ligne.)

Explication

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
la source
3

Vim - 31 frappes

First vim golf, a malheureusement manqué une tonne de choses.

`i-~<esc>:s/-\~-/\~-/dwp<left>ii<esc><left>d$@"<esc>a0`
Maltysen
la source
Nice, bienvenue au club! :) Vous pourriez faire :s/^-au lieu :s/-\~/\~-et à la Dplace ded$
DJMcMayhem
Maintenant que j'y pense, je ne pense pas que cela gère le 0. Vous pouvez contourner ce problème en incrémentant avant de supprimer avec <C-a>, puis de supprimer deux caractères de la fin.
DJMcMayhem
@DJMcMayhem oh, 0iça ne marche pas?
Maltysen
Non, malheureusement non. 0déplace le curseur sur le premier caractère de la ligne en cours. Vous pouvez toutefois utiliser 0 comme un compte dans V.
DJMcMayhem
2

Matlab, 61 octets

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

Pyke, 14 à 13 octets

X,"-~"*Q0<>0+

Essayez-le ici!

Bleu
la source
2

Perl 6 , 25 octets

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

Explication:

{
  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
la source
2

Gelée, 14 à 12 octets

-2 octets grâce à @Dennis (renvoie 0 plutôt que de concaténer "0", ce qui en fait un programme complet uniquement.)

0>‘
A⁾-~ẋṫÇ0

Testez-le sur TryItOnline

Comment?

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
la source
2

> <>, 18 + 3 = 22 octets

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

Essayez-le en ligne! +3 octets pour le ​ -vdrapeau pour initialiser la pile avec l'entrée. Si supposer que STDIN est vide est acceptable, alors l'octet suivant est plus court:

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

Le programme continue à retourner l'entrée nsi nécessaire jusqu'à ce qu'il atteigne 0, après quoi une erreur est générée.

[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
la source
2

Octave, 51 octets

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

Copiez d'abord ouvertement l'approche Matlab par @pajonk, puis modifiez certains détails, réécrivez en tant que "produit extérieur" entre un vecteur de uns et les caractères "- ~" et abusez de l'indexation à la volée (ou de ce qu'elle pourrait être). appelé) nous permet d’économiser quelques octets. Cela me fait encore mal de ne pas pouvoir obtenir que l'expression d'index prenne moins d'octets.

Octave permet à (i1) (i2) ou même à (...) (i1) (i2) d'indexer où Matlab voudrait que nous stockions des variables entre les indexations.

((x<0)+1:end)

est beaucoup trop long pour décrire "sauter d'abord si". Il doit y avoir un meilleur moyen.

mathreadler
la source
2

PseudoD , 688 579 521 octets

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
la source
1
Bienvenue chez PPCG! Est-ce aussi petit que possible? Je vois de longs identifiants que vous pourriez probablement raccourcir ("relleno" à "r", menos relleno: P). Je pense que vous pouvez supprimer les importations pour la bibliothèque standard s'il ne s'agit que d'un fragment de fonction ou de code. Il ne demande pas de fin de nouvelle ligne à la sortie, alors vous pouvez peut-être remplacer le dernier EscribirLinea par Escribir. Pouvez-vous attribuer des fonctions à des noms plus courts ( adquirir e``fijar p a Escribir)?
fede s.
1

PHP, 61 octets

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

PHP, 58 octets

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

Labyrinthe , 25 octets

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

Essayez-le en ligne!

Explication

J'aime beaucoup le flux de contrôle dans celui-ci. L'adresse IP se présente sous la forme d'un chiffre 8 (ou en réalité d'un, je suppose) à travers le code pour réduire lentement l'entrée à l' 0impression des caractères correspondants.

Le code commence dans le coin supérieur gauche en allant à droite. Le `ne fait rien pour le moment. ?lit l'entrée et l' +ajoute au zéro implicite ci-dessous. Bien sûr, cela ne fait rien non plus, mais lorsque nous repasserons sur ce code, ?nous appuierons sur un zéro (car nous en sommes à l'EOF), puis +nous nous débarrasserons de ce zéro.

Ensuite, la #profondeur de la pile est augmentée, simplement pour s’assurer qu’il ya une valeur positive sur la pile pour que l’IP se retourne au sud, et la ;rejette à nouveau.

Le "est un no-op et agit comme la branche principale du code. Il y a trois cas à distinguer:

  • Si la valeur actuelle est positive, l’IP tourne à droite (ouest) et termine un tour de la boucle de gauche:

    _45.`?+
    _45      Push 45.
       .     Print as character '-'.
        `    Negate the current value (thereby applying the unary minus).
         ?+  Does nothing.
    
  • Si la valeur actuelle est négative, l'IP tourne à gauche (est) et le code suivant est exécuté:

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

    Notez que ces deux fonctions alternent (car les deux modifient le signe de l'entrée) jusqu'à ce que la valeur d'entrée soit réduite à zéro. À ce moment...

  • Lorsque la valeur actuelle est égale à zéro, l’IP continue de se déplacer vers le sud, puis exécute le !, puis tourne à l’ouest sur le @. !imprime le 0et @termine le programme.
Martin Ender
la source
1

GolfScript ,30 24 20 octets

  • Sauvegardé 6 octets grâce à xnor.
  • Sauvegardé 4 octets grâce à Dennis.

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

Contribution: -5

Sortie: -5 = ~-~-~-~-~0

Explication

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

Essayez-le en ligne!

FedeWar
la source
1
Vous n'êtes pas obligé d'imprimer le 2 = , mais le -~-~0.
xnor
1
Vous pouvez utiliser {(;}*0au lieu de {(;}{}if 0.
Dennis