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.



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.


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.

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.

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.


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!



7

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

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

-13 grâce à Dada


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!


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


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

5

JavaScript (ES6), 39 37 octets

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

2 octets sauvés grâce à @Neil


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.

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

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


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.


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)

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.

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`

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])


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 > $_
}

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

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)

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.


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

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, 58 octets

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

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.

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!


1
Vous n'êtes pas obligé d'imprimer le 2 = , mais le -~-~0.
xnor

1
Vous pouvez utiliser {(;}*0au lieu de {(;}{}if 0.
Dennis
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.