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.



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.


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.

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.

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.


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!



7

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

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

-13 dzięki Dadzie


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!


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


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

5

JavaScript (ES6), 39 37 bajtów

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

Zaoszczędź 2 bajty dzięki @Neil


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.

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

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


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.


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)

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.

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`

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


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

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

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)

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.


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

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, 58 bajtów

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

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.

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!


1
Nie musisz drukować 2 = , tylko -~-~0.
xnor

1
Możesz użyć {(;}*0zamiast {(;}{}if 0.
Dennis,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.