Bitflip und negieren


42

Erstellen Sie für eine Ganzzahl einen Ausdruck, der sich aus der 0Verwendung einer unären Negation -und eines bitweisen Komplements ~( ~n= -n-1) zusammensetzt, wobei die Operatoren von rechts nach links angewendet werden.

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

Ihr Ausdruck muss so kurz wie möglich sein, was bedeutet , dass keine redundanten Teile ~~, --, -0, oder 00. Den Ausdruck als Zeichenfolge oder Zeichenfolge ausgeben oder drucken.


11
Also ... möchten Sie, dass wir unser Ding ablegen, umdrehen und umkehren ?
Jordanien

1
Leerzeichen zwischen ~ und 0 erlaubt?
Adám

Nein, die Strings genau ausgeben.
Xnor

2
Obligatorisch xkcd.com/153
Jared Smith

Antworten:


17

Python, 32 Bytes

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

Anonyme Lambda-Funktion. Bei einer gegebenen Ganzzahl schreibt x "- ~" abs (x) mal und entfernt das erste Zeichen. Wenn x negativ ist, wird am Ende eine Null hinzugefügt.


Oh, schlag mich.
mbomb007

Das gleiche habe ich auch geschrieben - mit nanstelle von xund 'anstelle von ":)
Jonathan Allan

2
@ JonathanAllan Dann können Sie es sicher als eine Betrug betrachten.
Erik der Outgolfer

16

JavaScript (ES6), 33 31 Bytes

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

Rekursion <eingebaute <Schleifen (zumindest in diesem Fall). Wertet die Eingabe grundsätzlich aus:

  • Wenn der Wert kleiner als 0 ist, drehen Sie ihn um und fügen Sie ~der Zeichenfolge ein hinzu.
  • Wenn der Wert größer als 0 ist, negieren Sie ihn und fügen Sie -der Zeichenfolge ein hinzu.
  • Wenn es genau 0 ist, geben Sie 0 zurück.

Nutzt dieses Muster:

 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 dank @StevenH.

Testsuite

Beschlossen, Pyth auszuprobieren, so übersetzte ich meine Python-Antwort darauf. Jede Hilfe willkommen!

Erläuterung:

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

Verwenden Sie die implizite Eingabe am Ende, um ein Byte zu speichern: >0statt<Q0
Steven H.

@StevenH. Danke! Jetzt haben wir die kürzeste Antwort!
KarlKastor

2
Ganz andere Lösung (die leider keine Bytes speichert):tW>0Q_+0sm"~-
Steven H.

2
@StevenH. Golfed Ihre Lösung auf 12: _<>0Q+0sm"~-Ich hoffe, dass Sie damit einverstanden sind, wenn ich dies zu meiner Lösung hinzufüge.
KarlKastor

8

C 46 Bytes

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

Anders als die meisten (alle?) Andere Antworten gibt dieses an die Betreiber ~und -eins nach dem anderen.


7

05AB1E , 14 13 Bytes

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

Erläuterung

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

Probieren Sie es online!



7

Perl 38 35 33 (23 + 1 für -p) 24

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

-13 danke an Dada


Du meintest wahrscheinlich -pstatt -r. Sie können auch die letzte Klammer und das Semikolon entfernen: if$h<0reicht aus.
Dada

Ich habe, danke. Ich habe wohl zu viele Antworten in sed geschrieben.
Riley

Wahrscheinlich ja. (Werde auch die letzten 2 Klammern los)
Dada

Sie können $h<0&&s;.;stattdessen auch 2 Bytes sparen s/.// if $h<0. ( -pfügt ein ;am Ende des Codes, so dass keine Notwendigkeit für die letzte ;von s;.;;. Und a if bentspricht in etwa b && a, aber in diesem Fall spart es Ihnen ein Byte, weil Sie das Leerzeichen entfernen können)
Dada

Danke, ich wusste nicht, dass -p auch eine hinzufügte ;.
Riley

6

Dyalog APL , 18 Bytes

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

'0',⍨ Zeichen Null angehängt an

0∘> Negativität (dh 1 für Zahlen unter 0; 0 für Null und höher)

heruntergefallen von

'-~'⍴⍨ Die Zeichenfolge "~ -" wird zyklisch in Länge geändert

zweimal

| der absolute Wert

+ Plus

0∘< Positivität (dh 1 für Zahlen über 0)

TryAPL online!


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"

Danke an nimi für 3 Bytes


tailscheitert für n=0. Sie können drop 1stattdessen verwenden.
nimi

@ nimi Danke; Ich habe keine Ahnung, wie ich das verpasst habe.
BlackCap

1
Vergeuden Sie nicht die sonst Wache : f n|n<0=tail.f$abs n|x<-[1..n]>>"-~"=x++"0".
nimi

1
2 Bytes zu speichern: ...|n<0=tail$f(-n)|....
nimi

5

V , 21 Bytes

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

Probieren Sie es online!

V hat nur eine sehr eingeschränkte Unterstützung für Zahlen, und es gibt eigentlich kein Konzept für negative Zahlen. Dies bedeutet, dass wir zur Unterstützung von Negativen (oder sogar 0) einige hackige Workarounds verwenden müssen.

Erläuterung:

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

2 Bytes dank @Neil gespeichert


5

Gelee , 10 Bytes

A⁾-~ẋḊẋ¡N0

Dies ist ein volles Programm. Probieren Sie es online!

Wie es funktioniert

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

Ungolfed:

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

Alte Version (95 Bytes):

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

Verwendungszweck:

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

Probieren Sie es hier aus!

Ausgabe:

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

Hallo und willkommen bei PPCG! Schöner erster Beitrag!
8.

Willkommen bei PPCG! Hmm, das ist eine kürzere Lösung als meine, also werde ich meine Antwort löschen und stattdessen deine verbessern. :)
Kevin Cruijssen


3

EXCEL: 55 33 Bytes

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

Die Eingabe erfolgt in Form einer Zahl in die A1-Zelle. Formel kann überall außer A1 gehen.


Ich glaube nicht, dass es bei negativen Zahlen funktioniert ...
pajonk

3

T-SQL, 87 Bytes

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

Die x*x+1Bedingung in substring ist x^2+1>=2*abs(x)für alle ausreichend x.

Wie in SQL üblich, wird die Eingabe in einer Tabelle gespeichert:

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

Hat sich von Emignas Antwort inspirieren lassen , um 4 Bytes zu sparen.

li_z"-~"*\0<>0

Probieren Sie es online! (Als durch Zeilenvorschub getrennte Testsuite.)

Erläuterung

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 Tastenanschläge

Erste Vim Golf, viel verpasst.

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

Schön, willkommen im Club! :) Sie könnten :s/^-anstelle von :s/-\~/\~-und Danstelle vond$
DJMcMayhem

Jetzt, wo ich darüber nachdenke, glaube ich nicht, dass dies mit 0 umgeht. Sie könnten dies umgehen, indem Sie vor dem Löschen mit inkrementieren <C-a>und dann zwei Zeichen am Ende löschen.
DJMcMayhem

@ DJMcMayhem oh, 0ifunktioniert nicht?
Maltysen

Nein, leider nicht. 0Bewegt den Cursor zum ersten Zeichen in der aktuellen Zeile. Sie können in V aber auch 0 als Zählung verwenden.
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>$_}

Erläuterung:

{
  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

Jelly, 14 12 Bytes

-2 Bytes dank @Dennis (geben Sie 0 zurück, anstatt "0" zu verketten, so dass dies nur ein vollständiges Programm ist.)

0>‘
A⁾-~ẋṫÇ0

Testen Sie es bei TryItOnline

Wie?

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

Probieren Sie es online! +3 Bytes für das ​ -vFlag, um den Stack mit der Eingabe zu initialisieren. Wenn angenommen wird, dass STDIN leer ist, ist Folgendes ein Byte kürzer:

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

Das Programm kippt die Eingabe nbei Bedarf so lange, bis 0 erreicht ist, woraufhin ein Fehler auftritt.

[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

Oktave, 51 Bytes

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

Zuerst den Matlab-Ansatz von @pajonk offen kopieren und dann einige Details modifizieren, als "äußeres Produkt" zwischen einem Vektor von Einsen und den Zeichen "- ~" umschreiben und on-the-fly-Indizierung (oder was es sein könnte) missbrauchen aufgerufen) lassen Sie uns einige Bytes sparen. Es schmerzt mich immer noch ein wenig, dass ich den Indexausdruck nicht dazu bringen kann, weniger Bytes zu nehmen.

Octave erlaubt ein (i1) (i2) oder sogar (...) (i1) (i2) für die Indizierung, wo Matlab Variablen zwischen den Indizierungen speichern soll.

((x<0)+1:end)

ist viel zu lang, um "zuerst überspringen, wenn" zu beschreiben. Es muss einen besseren Weg geben.


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}

Erklären:

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
Willkommen bei PPCG! Ist das so klein wie es nur geht? Ich sehe einige lange Bezeichner, die Sie wahrscheinlich verkürzen könnten ("relleno" bis "r", menos relleno: P). Ich denke, Sie können die Importe für die Standard-Lib fallen lassen, wenn es auch nur eine Funktion oder ein Code-Snippet ist. Es wird kein Zeilenumbruch bei der Ausgabe verlangt, daher können Sie möglicherweise den letzten EscribirLinea-Wert in Escribir ändern. Können Sie kürzeren Namen Funktionen zuweisen ( adquirir e``fijar p a Escribir)?
fede s.


1

PHP, 58 Bytes

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

1

Labyrinth , 25 Bytes

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

Probieren Sie es online!

Erläuterung

Ich mag den Kontrollfluss in diesem wirklich. Die IP läuft in einer Zahl 8 (oder eigentlich einem ∞, denke ich) durch den Code, um die Eingabe 0beim Drucken der entsprechenden Zeichen langsam auf zu reduzieren .

Der Code beginnt in der oberen linken Ecke und geht nach rechts. Der `macht gerade nichts. ?Liest die Eingabe und +fügt sie der impliziten Null hinzu. Natürlich macht das auch nichts, aber wenn wir diesen Code noch einmal ?durchlaufen , wird eine Null gedrückt (weil wir bei EOF sind), und +dann wird diese Null beseitigt.

Als nächstes wird die #Stapeltiefe verschoben, um sicherzustellen, dass der Stapel einen positiven Wert aufweist, damit sich die IP nach Süden dreht, und ;es wird wieder verworfen.

Das "ist ein No-Op und fungiert als Hauptzweig des Codes. Es sind drei Fälle zu unterscheiden:

  • Wenn der aktuelle Wert positiv ist, dreht sich die IP nach rechts (nach Westen) und beendet eine Runde der linken Schleife:

    _45.`?+
    _45      Push 45.
       .     Print as character '-'.
        `    Negate the current value (thereby applying the unary minus).
         ?+  Does nothing.
    
  • Wenn der aktuelle Wert negativ ist, dreht sich die IP nach links (nach Osten) und der folgende Code wird ausgeführt:

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

    Beachten Sie, dass sich diese beiden abwechseln (da beide das Vorzeichen der Eingabe ändern), bis der Eingabewert auf Null reduziert wird. An diesem Punkt...

  • Wenn der aktuelle Wert Null ist, bewegt sich die IP einfach weiter nach Süden und führt die aus !und dreht sich dann nach Westen auf die @. !druckt das 0und @beendet das Programm.

1

GolfScript ,30 24 20 Bytes

  • 6 Bytes gespart dank xnor.
  • 4 Bytes gespart dank Dennis.

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

Eingang: -5

Ausgabe: -5 = ~-~-~-~-~0

Erläuterung

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

Probieren Sie es online!


1
Sie müssen das nicht drucken 2 = , nur das -~-~0.
Xnor

1
Sie können {(;}*0anstelle von verwenden {(;}{}if 0.
Dennis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.