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.

Tidak
sumber
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
2
Wajib xkcd.com/153
Jared Smith

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.

KarlKastor
sumber
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.
Produksi ETH
sumber
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.
KarlKastor
sumber
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.

anatolyg
sumber
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!

Emigna
sumber
7

Retina, 19 17 byte

Ganti nomor dengan unary, dengan nol di ujungnya. Ganti masing 1- masing dengan -~. Hapus negatif ganda jika ada.

\d+
$*10
1
-~
--

Cobalah online

Semua kasus uji sekaligus (program sedikit dimodifikasi untuk mendukung beberapa kasus uji)

mbomb007
sumber
2
17: retina.tryitonline.net/...
Martin Ender
7

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

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

-13 terima kasih kepada Dada

Riley
sumber
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!

Adm
sumber
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

BlackCap
sumber
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
DJMcMayhem
sumber
5

JavaScript (ES6), 39 37 byte

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

Disimpan 2 byte berkat @Neil

Huntro
sumber
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.
Dennis
sumber
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
QBrute
sumber
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
5

Ruby, 34 byte

->x{("-~"*x.abs+?0)[2[0<=>x]..-1]}
cia_rana
sumber
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.


sumber
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)
pajonk
sumber
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.
Martin Ender
sumber
3

Vim - 31 penekanan tombol

Golf vim pertama, prolly melewatkan banyak hal.

`i-~<esc>:s/-\~-/\~-/dwp<left>ii<esc><left>d$@"<esc>a0`
Maltysen
sumber
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])
pajonk
sumber
2

Pyke, 14 13 byte

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

Coba di sini!

Biru
sumber
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 > $_
}
Brad Gilbert b2gills
sumber
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
Jonathan Allan
sumber
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)
Sp3000
sumber
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.

pembaca matematika
sumber
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
alinarezrangel
sumber
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, 61 byte

if(0>$n=$argv[1]){echo"~";$n=~$n;}echo str_repeat("-~",$n),0;
Jörg Hülsermann
sumber
1

PHP, 58 byte

<?=((0<$a=$argv[1])?'-':'').str_pad('0',2*abs($a),'~-',0);
Crypto
sumber
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.
Martin Ender
sumber
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!

FedeWar
sumber
1
Anda tidak perlu mencetak 2 = , cukup -~-~0.
xnor
1
Anda bisa menggunakan {(;}*0bukan {(;}{}if 0.
Dennis