Bitflip dan negasikan


42

Diberikan bilangan bulat, buat ekspresi yang menghasilkannya 0menggunakan negasi unary -dan komplemen bitwise ~( ~n= -n-1), dengan operator diterapkan dari kanan ke kiri.

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

Ekspresi Anda harus sesingkat mungkin, yang berarti tidak ada bagian berlebihan dari ~~, --, -0, atau 00. Keluarkan atau cetak ekspresi sebagai string atau urutan karakter.


11
Jadi ... Anda ingin kami meletakkan barang kami, balik dan balikkan ?
Jordan

1
spasi antara ~ dan 0 diizinkan?
Adám

Tidak, menghasilkan string dengan tepat.
xnor

Jawaban:


17

Python, 32 byte

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

Fungsi lambda anonim. Diberikan bilangan bulat x menulis "- ~" abs (x) kali dan menghapus karakter pertama jika x negatif, maka nol ditambahkan ke akhir.


Ah, pukul aku sampai di situ.
mbomb007

Saya hanya menulis yang sama juga - dengan ndi tempat xdan 'di tempat ":)
Jonathan Allan

2
@ JonathanAllan Maka Anda dapat dengan aman menganggapnya sebagai penipuan.
Erik the Outgolfer

16

JavaScript (ES6), 33 31 byte

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

Rekursi <built-in <loop (setidaknya dalam kasus ini). Pada dasarnya tidak mengevaluasi input:

  • jika kurang dari 0, balik dan tambahkan ~ke string;
  • jika lebih dari 0, negasikan dan tambahkan -ke string;
  • jika tepat 0, kembalikan 0.

Mengambil keuntungan dari pola ini:

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

test suite

Memutuskan untuk mencoba Pyth, jadi saya menerjemahkan jawaban python saya untuk itu. Selamat datang bantuan!

Penjelasan:

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

Gunakan input implisit di akhir untuk menyimpan satu byte: >0alih-alih<Q0
Steven H.

@ SevenH. Terima kasih! Sekarang kita berada dalam ikatan dengan jawaban terpendek!
KarlKastor

2
Solusi yang sangat berbeda (yang, sayangnya, tidak menyimpan byte):tW>0Q_+0sm"~-
Steven H.

2
@ SevenH. Menambah solusi Anda menjadi 12: _<>0Q+0sm"~-Saya harap Anda baik-baik saja dengan saya menambahkan ini ke solusi saya.
KarlKastor

8

C, 46 byte

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

Tidak seperti kebanyakan (semua?) Jawaban lain, yang satu ini mengeluarkan operator ~dan -satu per satu.


7

05AB1E , 14 13 byte

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

Penjelasan

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

Cobalah online!



7

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

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

-13 terima kasih kepada Dada


Anda mungkin bermaksud -pbukannya -r. Anda juga dapat menyingkirkan tanda kurung terakhir dan titik koma: if$h<0sudah cukup.
Dada

Sudah, terima kasih. Saya sudah menulis terlalu banyak jawaban di sed kurasa.
Riley

Mungkin ya. (Singkirkan 2 kurung terakhir juga)
Dada

Anda juga dapat menyimpan 2 byte dengan melakukan $h<0&&s;.;alih - alih s/.// if $h<0. ( -pMenambahkan ;pada akhir kode, sehingga tidak perlu untuk yang terakhir ;dari s;.;;Dan. a if bKira-kira setara dengan b && a, tetapi dalam kasus ini menghemat satu byte karena Anda dapat menghapus ruang)
Dada

Terima kasih, saya tidak tahu -p menambahkan ;juga.
Riley

6

Dyalog APL , 18 byte

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

'0',⍨ karakter nol ditambahkan ke

0∘> negativeness (yaitu 1 untuk angka di bawah 0; 0 untuk nol dan ke atas)

dijatuhkan dari

'-~'⍴⍨ string "~ -" membentuk ulang secara siklis menjadi panjang

dua kali

| nilai absolut

+ plus

0∘< kepositifan (yaitu 1 untuk angka lebih dari 0)

TryAPL online!


6

Haskell, 41 byte

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

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

Terima kasih kepada nimi selama 3 byte


tailgagal untuk n=0. Anda bisa menggunakannya drop 1.
nimi

@nimi Terima kasih; Saya tidak tahu bagaimana saya melewatkannya ..
BlackCap

1
Jangan buang sebaliknya guard : f n|n<0=tail.f$abs n|x<-[1..n]>>"-~"=x++"0".
nimi

1
2 byte untuk menyimpan: ...|n<0=tail$f(-n)|....
nimi

5

V , 21 byte

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

Cobalah online!

V memiliki dukungan angka yang sangat terbatas, dan sebenarnya tidak memiliki konsep angka negatif. Ini berarti untuk mendukung negatif (atau bahkan 0), kita harus menggunakan beberapa solusi hacky.

Penjelasan:

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

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

Disimpan 2 byte berkat @Neil


5

Jelly , 10 byte

A⁾-~ẋḊẋ¡N0

Ini adalah program lengkap. Cobalah online!

Bagaimana itu bekerja

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 byte

79 byte:

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

Tidak Disatukan:

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

Versi lama (95 byte):

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

Pemakaian:

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

Coba di sini!

Keluaran:

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

Hai, dan selamat datang di PPCG! Posting pertama yang bagus!
Rɪᴋᴇʀ

Selamat datang di PPCG! Hmm, itu solusi yang lebih pendek dari saya, jadi saya akan menghapus jawaban saya dan mengunggah jawaban Anda. :)
Kevin Cruijssen


3

EXCEL: 55 33 byte

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

Input dalam bentuk menempatkan nomor di sel A1. Formula bisa kemana saja kecuali A1.


Saya tidak berpikir itu berfungsi untuk angka negatif ...
pajonk

3

T-SQL, 87 byte

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

The x*x+1kondisi substring cukup, karena x^2+1>=2*abs(x)untuk semua x.

Seperti biasanya dalam SQL, input disimpan dalam tabel:

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 byte

Mengambil beberapa inspirasi dari jawaban Emigna untuk menghemat 4 byte.

li_z"-~"*\0<>0

Cobalah online! (Sebagai rangkaian uji yang dipisahkan dengan linefeed.)

Penjelasan

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 penekanan tombol

Golf vim pertama, prolly melewatkan banyak hal.

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

Bagus, selamat datang di klub! :) Anda bisa melakukan :s/^-alih - alih :s/-\~/\~-dan Dbukannyad$
DJMcMayhem

Sekarang saya berpikir tentang hal itu, saya tidak berpikir ini menangani 0. Anda bisa menyiasatinya dengan menambahkan sebelum menghapus <C-a>dan kemudian menghapus dua karakter pada akhirnya.
DJMcMayhem

@DJMcMayhem oh, 0itidak berhasil?
Maltysen

Tidak, sayangnya tidak. 0memindahkan kursor ke karakter pertama pada baris saat ini. Anda dapat mengurutkan menggunakan 0 sebagai hitungan dalam V sekalipun.
DJMcMayhem

2

Matlab, 61 byte

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


2

Perl 6 , 25 byte

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

Penjelasan:

{
  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 byte

-2 byte terima kasih kepada @Dennis (kembalikan 0 daripada menyatukan "0", menjadikan ini program penuh saja.)

0>‘
A⁾-~ẋṫÇ0

Uji di TryItOnline

Bagaimana?

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 byte

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

Cobalah online! +3 byte untuk ​ -vflag untuk menginisialisasi stack dengan input. Jika menganggap bahwa STDIN kosong tidak apa-apa, maka yang berikut ini adalah byte yang lebih pendek:

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

Program terus membalikkan input nseperlunya hingga mencapai 0, setelah itu kesalahan keluar.

[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

Oktaf, 51 byte

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

Pada awalnya secara terang-terangan menyalin pendekatan Matlab oleh @pajonk dan kemudian memodifikasi beberapa detail, menulis ulang sebagai "produk luar" antara vektor yang dan karakter "- ~" dan menyalahgunakan pengindeksan saat terbang (atau apa yang bisa menjadi disebut) memungkinkan kita menyimpan beberapa byte. Masih sedikit menyakitkan saya bahwa saya tidak bisa mendapatkan ekspresi indeks untuk mengambil lebih sedikit byte.

Oktaf memungkinkan (i1) (i2) atau bahkan (...) (i1) (i2) untuk pengindeksan di mana Matlab ingin kita menyimpan variabel di antara pengindeksan.

((x<0)+1:end)

terlalu panjang untuk menggambarkan "lewati dulu jika". Pasti ada cara yang lebih baik.


2

PseudoD , 688 579 521 byte

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}

Menjelaskan:

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
Selamat datang di PPCG! Apakah sekecil itu? Saya melihat beberapa pengidentifikasi panjang yang mungkin bisa dipersingkat ("relleno" menjadi "r", menos relleno: P). Saya pikir Anda dapat menjatuhkan impor untuk lib standar jika itu hanya potongan fungsi atau kode juga. Itu tidak meminta trailing baris baru pada output, jadi mungkin Anda dapat mengubah EscribirLinea terakhir ke Escribir. Bisakah Anda menetapkan fungsi ke nama yang lebih pendek ( adquirir e``fijar p a Escribir)?
fede s.


1

PHP, 58 byte

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

1

Labirin , 25 byte

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

Cobalah online!

Penjelasan

Saya sangat suka aliran kontrol yang satu ini. IP berjalan dalam angka 8 (atau sebenarnya ∞, saya kira) melalui kode untuk mengurangi input secara perlahan 0saat mencetak karakter yang sesuai.

Kode dimulai di sudut kiri atas ke kanan. Mereka `tidak melakukan apa-apa sekarang. ?membaca input dan +menambahkannya ke nol implisit di bawah ini. Tentu saja itu tidak melakukan apa-apa juga, tetapi ketika kita menjalankan kode ini lagi, ?akan mendorong nol (karena kita berada di EOF), dan +kemudian akan menghilangkan nol itu.

Selanjutnya #dorongan kedalaman tumpukan, hanya untuk memastikan bahwa ada nilai positif pada tumpukan untuk membuat IP berbelok ke selatan, dan ;membuangnya lagi.

Ini "adalah no-op dan bertindak sebagai cabang utama dari kode. Ada tiga kasus untuk dibedakan:

  • Jika nilai saat ini positif, IP berbelok ke kanan (barat) dan menyelesaikan satu putaran dari loop kiri:

    _45.`?+
    _45      Push 45.
       .     Print as character '-'.
        `    Negate the current value (thereby applying the unary minus).
         ?+  Does nothing.
    
  • Jika nilai saat ini negatif, IP belok kiri (timur) dan kode berikut dijalankan:

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

    Perhatikan bahwa keduanya akan bergantian (karena keduanya mengubah tanda input) hingga nilai input dikurangi menjadi nol. Pada saat itu ...

  • Ketika nilai saat ini adalah nol, IP hanya terus bergerak ke selatan, dan mengeksekusi !dan kemudian berbelok ke barat ke @. !mencetak 0dan @mengakhiri program.

1

GolfScript ,30 24 20 byte

  • Disimpan 6 byte berkat xnor.
  • Disimpan 4 byte berkat Dennis.

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

Memasukkan: -5

Keluaran: -5 = ~-~-~-~-~0

Penjelasan

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

Cobalah online!


1
Anda tidak perlu mencetak 2 = , cukup -~-~0.
xnor

1
Anda bisa menggunakan {(;}*0bukan {(;}{}if 0.
Dennis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.