Bitflip i negacja

42

Biorąc pod uwagę liczbę całkowitą, utwórz wyrażenie, które tworzy ją z 0użycia jednoargumentowej negacji -i uzupełniania bitowego ~( ~n= -n-1), z operatorami stosowanymi od prawej do lewej.

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

Twój wyrażenie musi być jak najkrótszy, co oznacza brak zbędnych części ~~, --, -0, lub 00. Wyprowadź lub wydrukuj wyrażenie jako ciąg znaków lub ciąg znaków.

xnor
źródło
11
Więc ... chcesz, żebyśmy odłożyli naszą rzecz, odwrócili ją i odwrócili ?
Jordan
1
dozwolone białe spacje między ~ a 0?
Adám
Nie, wypisz dokładnie łańcuchy.
xnor
2
Obowiązkowe xkcd.com/153
Jared Smith

Odpowiedzi:

17

Python, 32 bajty

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

Anonimowa funkcja lambda. Biorąc pod uwagę liczbę całkowitą x zapisuje "- ~" abs (x) razy i usuwa pierwszy znak, jeśli x jest ujemny, wówczas zero jest dodawane na końcu.

KarlKastor
źródło
Aw, pobij mnie do tego.
mbomb007,
Właśnie napisałem to samo - z nw miejscu xi 'zamiast ":)
Jonathan Allan,
2
@JonathanAllan Następnie możesz bezpiecznie uznać to za dupe.
Erik the Outgolfer
16

JavaScript (ES6), 33 31 bajtów

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

Rekurencja <wbudowane <pętle (przynajmniej w tym przypadku). Zasadniczo nie docenia danych wejściowych:

  • jeśli jest mniejszy niż 0, odwróć go i dodaj a ~do łańcucha;
  • jeśli jest większy niż 0, zaneguj go i dodaj a -do łańcucha;
  • jeśli jest dokładnie 0, zwróć 0.

Wykorzystuje ten wzór:

 0         = 0
-1 = ~( 0) = ~0
+1 = -(-1) = -~0
-2 = ~(+1) = ~-~0
+2 = -(-2) = -~-~0
-3 = ~(+2) = ~-~-~0
+3 = -(-3) = -~-~-~0
etc.
ETHprodukcje
źródło
11

Pyth, 14 13 12 bajtów

_<>0Q+0sm"~-

-2 bajty dzięki @StevenH.

pakiet testowy

Postanowiłem wypróbować Pyth, więc przetłumaczyłem na to moją odpowiedź w języku Python . Każda pomoc mile widziana!

Wyjaśnienie:

_<>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
źródło
Użyj niejawnego wejścia na końcu, aby zapisać jeden bajt: >0zamiast<Q0
Steven H.
@StevenH. Dziękuję Ci! Teraz mamy remis z najkrótszą odpowiedzią!
KarlKastor,
2
Zupełnie inne rozwiązanie (które niestety nie oszczędza żadnych bajtów):tW>0Q_+0sm"~-
Steven H.
2
@StevenH. Rozgrywka z golfem do rozwiązania: _<>0Q+0sm"~-Mam nadzieję, że nic mi nie jest, gdy dodam to do mojego rozwiązania.
KarlKastor,
8

C, 46 bajtów

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

W przeciwieństwie do większości (wszystkich?) Innych odpowiedzi, ta wypisuje operatorów ~i -jeden po drugim.

anatolig
źródło
7

05AB1E , 14 13 bajtów

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

Wyjaśnienie

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

Wypróbuj online!

Emigna
źródło
7

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

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

-13 dzięki Dadzie

Riley
źródło
Prawdopodobnie miałeś na myśli -pzamiast -r. Możesz także pozbyć się tych ostatnich nawiasów i średników: if$h<0wystarczy.
Dada,
Zrobiłem dzięki. Chyba napisałem zbyt wiele odpowiedzi.
Riley,
Prawdopodobnie tak. (Pozbądź się także 2 ostatnich nawiasów)
Dada
Możesz również zapisać 2 bajty, wykonując $h<0&&s;.;zamiast s/.// if $h<0. ( -pDodaje ;na końcu kodu, więc nie ma potrzeby ostatni ;z s;.;;I. a if bOdpowiada w przybliżeniu b && a, ale w tym przypadku to zaoszczędzić jeden bajt, ponieważ można usunąć przestrzeń)
Dada
Dzięki, nie wiedziałem -p też dodał ;.
Riley,
6

Dyalog APL , 18 bajtów

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

'0',⍨ znak zero dołączony do

0∘> negatywność (tj. 1 dla liczb poniżej 0; 0 dla zera i więcej)

spadł z

'-~'⍴⍨ ciąg „~ -” cyklicznie przekształcany na długość

dwa razy

| wartość bezwzględna

+ plus

0∘< dodatni (tj. 1 dla liczb powyżej 0)

Wypróbuj APL online!

Adám
źródło
6

Haskell, 41 bajtów

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

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

Dzięki nim za 3 bajty

Gajówka
źródło
tailzawodzi za n=0. Zamiast tego możesz użyć drop 1.
nimi
@nimi Dzięki; Nie mam pojęcia, jak mi tego brakowało ...
BlackCap
1
Nie trać skądinąd strażnika : f n|n<0=tail.f$abs n|x<-[1..n]>>"-~"=x++"0".
nimi
1
2 bajty zapisać: ...|n<0=tail$f(-n)|....
nimi
5

V , 21 bajtów

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

Wypróbuj online!

V ma bardzo ograniczoną obsługę liczb i faktycznie nie ma pojęcia liczb ujemnych. Oznacza to, że w celu obsługi negatywów (lub nawet 0) musimy zastosować pewne hackerskie obejścia.

Wyjaśnienie:

/ä                  "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
źródło
5

JavaScript (ES6), 39 37 bajtów

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

Zaoszczędź 2 bajty dzięki @Neil

Huntro
źródło
5

Galaretka , 10 bajtów

A⁾-~ẋḊẋ¡N0

To jest pełny program. Wypróbuj online!

Jak to działa

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
źródło
5

Java 7, 95 79 bajtów

79 bajtów:

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

Nie golfowany:

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

Stara wersja (95 bajtów):

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

Stosowanie:

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

Wypróbuj tutaj!

Wynik:

~-~-~0
~-~0
~0
0
-~0
-~-~0
-~-~-~0
QBrute
źródło
Cześć, witamy w PPCG! Miły pierwszy post!
Rɪᴋᴇʀ
Witamy w PPCG! Hmm, to jest krótsze rozwiązanie niż moje, więc usunę moją odpowiedź i głosuję za nią. :)
Kevin Cruijssen
5

Rubinowy, 34 bajty

->x{("-~"*x.abs+?0)[2[0<=>x]..-1]}
cia_rana
źródło
3

EXCEL: 55 33 bajtów

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

Dane wejściowe mają postać umieszczenia liczby w komórce A1. Formuła może iść wszędzie poza A1.


źródło
Nie sądzę, żeby to
zadziałało
3

T-SQL, 87 bajtów

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

x*x+1Stan w podciągu jest wystarczająca, ponieważ x^2+1>=2*abs(x)dla wszystkich x.

Jak zwykle w SQL, dane wejściowe są przechowywane w tabeli:

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
źródło
3

CJam , 18 14 bajtów

Inspiracją dla odpowiedzi Emigny było zaoszczędzenie 4 bajtów.

li_z"-~"*\0<>0

Wypróbuj online! (Jako zestaw testów oddzielony od linii).

Wyjaśnienie

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
źródło
3

Vim - 31 klawiszy

Pierwszy vim golf, często brakowało mnóstwa rzeczy.

`i-~<esc>:s/-\~-/\~-/dwp<left>ii<esc><left>d$@"<esc>a0`
Maltysen
źródło
Fajnie, witaj w klubie! :) Możesz zrobić :s/^-zamiast :s/-\~/\~-i Dzamiastd$
DJMcMayhem
Teraz, gdy o tym myślę, nie sądzę, aby to zajmowało 0. Można to obejść, zwiększając przed usunięciem, <C-a>a następnie usunięciem dwóch znaków na końcu.
DJMcMayhem
@DJMcMayhem oh, 0inie działa?
Maltysen
Nie, niestety nie. 0przesuwa kursor do pierwszego znaku w bieżącym wierszu. Możesz jednak użyć 0 jako liczby w V.
DJMcMayhem
2

Matlab, 61 bajtów

x=input('');A=repmat('-~',1,abs(x));disp([A((x<0)+1:end) 48])
pajonk
źródło
2

Pyke, 14 13 bajtów

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

Wypróbuj tutaj!

niebieski
źródło
2

Perl 6 , 25 bajtów

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

Wyjaśnienie:

{
  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
źródło
2

Galaretka, 14 12 bajtów

-2 bajty dzięki @Dennis (zwraca 0 zamiast konkatenacji „0”, dzięki czemu jest to pełny program tylko).

0>‘
A⁾-~ẋṫÇ0

Przetestuj w TryItOnline

W jaki sposób?

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
źródło
2

> <>, 18 + 3 = 22 bajtów

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

Wypróbuj online! +3 bajty, aby ​ -vflaga zainicjowała stos za pomocą wejścia. Jeśli założenie, że STDIN jest pusty, jest w porządku, to następujący bajt jest krótszy:

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

Program przesuwa wejście ntak długo, jak to konieczne, aż osiągnie 0, po czym wyskakuje błąd.

[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
źródło
2

Oktawa, 51 bajtów

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

Najpierw rażąco kopiując podejście Matlaba przez @pajonk, a następnie modyfikując niektóre szczegóły, przepisując jako „produkt zewnętrzny” między wektorem jedynek a znakami „- ~” i nadużywając indeksowania w locie (lub co to może być o nazwie) pozwala nam zaoszczędzić trochę bajtów. Nadal boli mnie lekko, że nie mogę uzyskać wyrażenia indeksu zajmującego mniej bajtów.

Oktawa pozwala na indeksowanie (i1) (i2) lub nawet (...) (i1) (i2), gdzie Matlab chciałby, abyśmy przechowywali zmienne pomiędzy indeksowaniami.

((x<0)+1:end)

jest zdecydowanie za długi, aby opisać „najpierw pomiń, jeśli”. Musi być lepszy sposób.

matematyk
źródło
2

PseudoD , 688 579 521 bajtów

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}

Wyjaśnić:

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
źródło
1
Witamy w PPCG! Czy to jest tak małe, jak się robi? Widzę kilka długich identyfikatorów, które prawdopodobnie możesz skrócić („relleno” do „r”, menos relleno: P). Myślę, że możesz usunąć import do standardowej biblioteki, jeśli jest to tylko funkcja lub fragment kodu. Nie pyta o końcowy znak nowej linii na wyjściu, więc może możesz zmienić ostatnią EscribirLinea na Escribir. Czy możesz przypisać funkcje do krótszych nazw ( adquirir e``fijar p a Escribir)?
fede s.
1

PHP, 61 bajtów

if(0>$n=$argv[1]){echo"~";$n=~$n;}echo str_repeat("-~",$n),0;
Jörg Hülsermann
źródło
1

PHP, 58 bajtów

<?=((0<$a=$argv[1])?'-':'').str_pad('0',2*abs($a),'~-',0);
Crypto
źródło
1

Labirynt , 25 bajtów

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

Wypróbuj online!

Wyjaśnienie

Naprawdę podoba mi się przepływ sterowania w tym. Adres IP przebiega przez cyfrę 8 (a właściwie ∞, jak sądzę) przez kod, aby powoli zmniejszać liczbę wprowadzanych danych 0podczas drukowania odpowiednich znaków.

Kod zaczyna się w lewym górnym rogu od prawej. W `tej chwili nic nie robi. ?odczytuje dane wejściowe i +dodaje je do ukrytego zera poniżej. Oczywiście to też nic nie robi, ale kiedy ponownie ?przejdziemy przez ten kod, wypchniemy zero (ponieważ jesteśmy przy EOF), a +następnie pozbędziemy się tego zera.

Następnie #przesuwa głębokość stosu, po prostu upewniając się, że wartość dodatnia na stosie powoduje, że IP skręca na południe i ;odrzuca go ponownie.

"Jest no-op i działa jako głównej gałęzi kodu. Można wyróżnić trzy przypadki:

  • Jeśli bieżąca wartość jest dodatnia, IP skręca w prawo (na zachód) i kończy jedną rundę lewej pętli:

    _45.`?+
    _45      Push 45.
       .     Print as character '-'.
        `    Negate the current value (thereby applying the unary minus).
         ?+  Does nothing.
    
  • Jeśli bieżąca wartość jest ujemna, adres IP skręca w lewo (wschód) i uruchamiany jest następujący kod:

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

    Zauważ, że te dwa będą się na przemian (ponieważ oba zmieniają znak wejścia), dopóki wartość wejściowa nie zostanie zmniejszona do zera. W tym momencie...

  • Gdy bieżąca wartość wynosi zero, adres IP po prostu przesuwa się na południe, wykonuje polecenie, !a następnie skręca na zachód w kierunku @. !wypisuje 0i @kończy program.
Martin Ender
źródło
1

GolfScript ,30 24 20 bajtów

  • Zaoszczędzono 6 bajtów dzięki xnor.
  • Zaoszczędzono 4 bajty dzięki Dennisowi.

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

Wejście: -5

Wynik: -5 = ~-~-~-~-~0

Wyjaśnienie

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

Wypróbuj online!

FedeWar
źródło
1
Nie musisz drukować 2 = , tylko -~-~0.
xnor
1
Możesz użyć {(;}*0zamiast {(;}{}if 0.
Dennis,