Keluarkan tanda

67

Diberi angka N, mengeluarkan tanda N:

  • Jika N positif, output 1
  • Jika N negatif, output -1
  • Jika N adalah 0, hasilkan 0

N akan menjadi bilangan bulat dalam kisaran bilangan bulat yang dapat direpresentasikan dalam bahasa pilihan Anda.

Mego
sumber
45
Ini adalah tantangan sepele dengan banyak solusi sepele. Namun ada beberapa solusi non-sepele juga. Kepada para pemilih: Harap baca kalimat pertama dari posting meta ini sebelum meningkatkan fungsi bawaan.
Stewie Griffin
8
Ini mungkin menggunakan papan peringkat.
Martin Ender
2
@MrLister mendukung bagaimana Anda inginkan, tetapi Anda harus mencari kreativitas alih-alih panjang kode.
FlipTack
3
@ Lipup Oh, saya pikir itu codegolf.
Tn. Lister
3
@ Tuanister itulah kriteria kemenangan yang objektif. tetapi apakah itu benar-benar membutuhkan lebih banyak usaha untuk mengetik standa builtin, atau menggunakan beberapa bithifting / matematika pintar untuk menyelesaikannya? Lihatlah postingan meta ini
FlipTack

Jawaban:

46

Retina , 9 byte

[1-9].*
1

Cobalah online!

Mengganti digit yang bukan nol dan semuanya setelahnya 1. Ini meninggalkan potensi terkemuka -utuh dan mengubah semua angka kecuali 0itu sendiri ke nilai absolut 1.

Martin Ender
sumber
Ini sangat pintar :)
Mego
Apakah ini berfungsi dengan notasi ilmiah bilangan bulat (seperti 0.42e2)?
Egor Skriptunoff
@EgorSkriptunoff Tidak, tapi itu bukan keharusan.
Martin Ender
9
@EgorSkriptunoff itu tidak mendukung angka Romawi juga. Kecuali tantangannya secara eksplisit menyebutkan format non-standar tertentu yang perlu didukung, asumsi umum adalah boleh saja berurusan dengan format tunggal yang wajar dalam bahasa pilihan Anda.
Martin Ender
3
@EgorSkriptunoff Retina tidak memiliki konsep angka sama sekali. Ini adalah bahasa murni berbasis string.
Martin Ender
42

C (GCC), 24 23 22 18 byte

Terima kasih kepada @aross dan @Steadybox untuk menghemat satu byte!

f(n){n=!!n|n>>31;}

Tidak dijamin bekerja di semua sistem atau kompiler, bekerja di TIO .

betseg
sumber
7
@ Betseg Itu karena upvotes pada built-in sekarang disukai.
Erik the Outgolfer
4
Menyimpan 1 byte dengan inireturn n>>16|!!n;
aross
5
@GB Ukuran int mungkin 2 (16, x86) atau 4 (32, x86_64) tetapi ingat, yang diperlukan hanyalah arsitektur yang valid. Ini bukan Stack Overlflow, portabilitas tidak penting.
kucing
2
f(n){n=n>>31|!!n;}bekerja juga. Tapi ini hanya kekhasan kompiler, bukan fitur bahasa.
GB
2
@GB Compiler quirks benar-benar valid, selama dapat dibuktikan bahwa ada kompiler di mana quirk bekerja. Untungnya, gcc memiliki kekhasan.
Mego
34

Mathematica, 4 byte

Clip

Bagaimana kalau tidak menggunakan built-in Signdan masih mencetak 4 byte? ;)

Clipdengan klip argumen tunggal (atau klem) nilai input antara -1dan 1. Karena input hanya berupa bilangan bulat, ini sama dengan menggunakan Sign.

Martin Ender
sumber
29

SAP, 225 213 201 byte

oomMOOmoOmoOmoOmoOMoOMoOmOomOomOoMoOMMMmoOMMMMOOMOomOo
mOoMOomoOmoOmoomOomOoMMMmoOmoOmoOMMMMOOOOOmoOMOoMOomOo
mOomOoMoOMMMmoOMMMMOOMOomOomOoMoOmoOmoOmoomoOmoomOomOo
mOomoomoOMOOmoOmoOmoOMOoMMMOOOmooMMMOOM

Cobalah online!

Cara kode ini bekerja adalah ia menentukan tanda dengan bergantian menambah dan mengurangi angka yang lebih besar, dan melihat mana yang terakhir. Dengan bilangan bulat nol, kurangi 1, lalu tambah 2, kurangi 3, dll, dan akhirnya Anda akan mencapai 0. Lacak status Anda dengan menambahkan dan mengurangi 2 secara bergantian ke nilai yang dimulai dari 0. Untuk contoh:

-5  - 1  = -6  (current state: 0 + 2 = 2)
-6  + 2  = -4  (current state: 2 - 2 = 0)
-4  - 3  = -7  (current state: 0 + 2 = 2)
-7  + 4  = -3  (current state: 2 - 2 = 0)
-3  - 5  = -8  (current state: 0 + 2 = 2)
-8  + 6  = -2  (current state: 2 - 2 = 0)
-2  - 7  = -9  (current state: 0 + 2 = 2)
-9  + 8  = -1  (current state: 2 - 2 = 0)
-1  - 9  = -10 (current state: 0 + 2 = 2)
-10 + 10 =  0  (current state: 2 - 2 = 0)
value is now at 0.  state - 1 = 0 - 1 = -1
sign of original number is -1

Setelah selesai, kurangi 1 dari kondisi Anda dan Anda mendapat tanda, positif atau negatif. Jika angka aslinya adalah 0, maka jangan repot-repot melakukan ini dan cukup cetak 0.

Penjelasan detail:

oom                                        ;Read an integer into [0]
MOO                                        ;Loop while [0] is non-empty
    moOmoOmoOmoOMoOMoOmOomOomOo            ;    Decrement [4] twice
    MoOMMMmoOMMM                           ;    Increment [1], then copy [1] to [2]
    MOO                                    ;    Loop while [2] is non-empty
        MOomOomOoMOomoOmoO                 ;        Decrement [0] and [2]
    moo                                    ;    End loop now that [2] is empty
    mOomOoMMMmoOmoOmoOMMM                  ;    Navigate to [0], and copy to [3]
    MOO                                    ;    Perform the next steps only if [3] is non-zero
        OOOmoOMOoMOomOomOomOoMoOMMMmoOMMM  ;        Clear [3], increment [4] twice, increment [1], and copy it to [2]
        MOO                                ;        Loop while [2] is non-empty
            MOomOomOoMoOmoOmoO             ;            Decrement [2] and increment [0]
        moo                                ;        End loop now that [2] is empty
    moO                                    ;        Navigate back to [3]
    moo                                    ;    End the condition
    mOomOomOo                              ;    Navigate back to [0]
moo                                        ;End loop once [0] is empty.
moO                                        ;Navigate to [1]. If [1] is 0, then input was 0.  Otherwise, [4] contains (sign of [0] + 1)
MOO                                        ;Perform the next steps only if [1] is non-zero
    moOmoOmoOMOoMMMOOO                     ;    Navigate to [4], copy it to the register, and clear [4].
moo                                        ;End condition
MMMOOM                                     ;If the register contains something (which is true iff the condition ran), paste it and print it.  Otherwise, no-op and print 0.

Saya masih bereksperimen dengan bermain golf (Anda akan terkejut mengetahui bahwa bermain golf di COW agak sulit), jadi ini mungkin akan turun beberapa byte lagi di masa mendatang.

Gabriel Benamy
sumber
1
Dan ada 'moo' - bahasa? ...
Mukul Kumar
1
@MukulKumar Ini adalah turunan brainfuck bernama COW yang memungkinkan beberapa hal yang tidak dilakukan
Gabriel Benamy
Bisa juga menyebut ini bahasa "bad mage". OUT OF MANA!!!
Magic Gurita Guci
18

Cubix , 10 byte

(W0^I?>O2@

Uji secara online!

Kode ini dibungkus dengan jaring kubus berikut:

    ( W
    0 ^
I ? > O 2 @ . .
. . . . . . . .
    . .
    . .

Kode ini kemudian dijalankan dengan IP (penunjuk instruksi) mulai dari I, menghadap ke timur. Imemasukkan bilangan bulat yang ditandatangani dari STDIN, mendorongnya ke tumpukan.

Perintah selanjutnya adalah ?, yang mengubah arah IP tergantung pada tanda item teratas. Jika inputnya 0, ia terus bergerak ke arah yang sama, berjalan melalui kode berikut:

  • >- Arahkan IP ke timur. (No-op karena kita sudah pergi ke timur.)
  • O - Keluarkan item teratas sebagai integer.
  • 2- Dorong 2 ke tumpukan. Ini praktis no-op, karena ...
  • @ - Menghentikan program.

Jika input negatif, IP belok kiri di ?; karena ini adalah sebuah kubus, IP bergerak ke dalam 0di baris kedua, menuju ke timur. 0mendorong 0 literal, maka kode ini dijalankan:

  • ^ - Arahkan IP utara.
  • W - "Sidestep" IP satu tempat ke kiri.
  • ( - Mengurangi item teratas.

TOS sekarang -1, dan IP membungkus kubus melalui sekelompok no-ops .sampai hits >. Ini menjalankan kode output yang sama yang disebutkan di atas, keluaran -1.

Jika input positif, hal yang sama terjadi dengan input negatif, dengan satu pengecualian: IP berbelok ke kanan dan bukan ke kiri di ?, dan membungkus kubus ke 2, yang mendorong literal 2. Ini kemudian dikurangi menjadi 1 dan dikirim ke keluaran.

Produksi ETH
sumber
4
Animasi aliran program sangat bagus!
Luis Mendo
Bahasa yang bagus. Mungkinkah lebih pendek? Kontrol 4 aliran tampaknya jauh. Dalam operasi-hitung bisa 8 byte dengan memperkenalkan yang lain?, Tapi sekarang menggunakan bagian bawah kubus: ..1nI? ..> O @ .........?
BlackShift
Enam dimungkinkan jika kita mengabaikan keluaran setelah yang pertama: / I? NO1 Ngomong-ngomong, ini hanya berfungsi karena saya mengembalikan -1 pada juru bahasa online alih-alih 0 menurut spesifikasi.
BlackShift
@ BlackShift Terima kasih atas minat Anda! Saya suka saran Anda, tetapi saya tidak yakin bagaimana memperbaikinya. Sangat mungkin untuk menggunakan lebih sedikit instruksi; bagian yang sulit adalah menggunakan lebih sedikit kubus ... ;-) Dan terima kasih telah menunjukkan bahwa bug -1, saya akan segera memperbaikinya.
ETHproductions
@ ETHproductions IMO Ini bukan bug, masuk akal untuk Imengembalikan -1 ketika input berakhir seperti halnya huruf kecil i.
FlipTack
16

JavaScript (ES6), 9 byte

Math.sign

Mudah.

Non-builtin terpendek adalah 13 byte:

n=>n>0|-(n<0)

Berkat @Neil, ini dapat dipatenkan dengan byte, tetapi dengan biaya hanya bekerja pada bilangan bulat 32-bit:

n=>n>0|n>>31

Atau Anda bisa melakukannya

n=>n>0?1:!n-1

yang tampaknya lebih golf, tetapi saya tidak yakin bagaimana caranya.

Produksi ETH
sumber
2
Non-builtin di 12 bytes untuk 32-bit integer ditandatangani n: n=>n>>31|!!n.
Neil
@ Neil n>>31benar-benar pintar, terima kasih!
Produk ETH
Saya tidak berpikir solusi ketiga valid, karena Javascript menggunakan float presisi ganda untuk angka. Tapi, saya bisa saja salah.
Mego
@Mego Anda benar. Saya sudah mengklarifikasi hal ini di posting.
ETHproductions
1
@Mego Maaf, saya ketinggalan komentar Anda. Saat menggunakan operator bitwise, JS secara implisit melemparkan operan mereka ke bilangan bulat 32-bit, sehingga solusi ketiga berfungsi, tetapi hanya pada angka dari -2147483648 hingga 2147483647.
ETHproduksi
15

APL (Dyalog APL) , 1 byte

Berfungsi untuk bilangan kompleks juga, mengembalikan 1∠ θ :

×

TryAPL online!


Tanpa built-in itu, untuk bilangan bulat (sesuai OP):

¯11⌊⊢

¯1⌈ yang terbesar dari yang negatif dan

1⌊ yang terkecil dari satu dan

argumen

TryAPL online!

... dan yang umum:

>∘0-<∘0

>∘0 lebih dari nol

- minus

<∘0 kurang dari nol

TryAPL online!

Adm
sumber
1
Anda benar-benar melakukannya dalam SATU byte ... Anda pak, adalah legenda. Saya yakin Jon Skeet akan bangga.
@ Kango Anda bercanda, bukan? Ada beberapa jawaban byte tunggal untuk tantangan ini.
Adám
1
Saya sedang menyindir, juga saya katakan karena ini adalah jawaban byte pertama yang saya lihat.
14

> <> , 9 8 byte

Terima kasih kepada Sp3000 untuk menghemat satu byte.

'i$-%n/

Ada yang tidak patut 0x01sebelum /.

Cobalah online!

Penjelasan

Ini adalah port dari jawaban Labirin berdasarkan kode karakter saya .

'     Push the entire program (except ' itself) onto the stack, which ends 
      with [... 1 47].
i     Read the first character of the input.
$-    Subtract the 47.
%     Take the 1 modulo this value.
n     Output the result as an integer.
0x01  Unknown command, terminates the program.
Martin Ender
sumber
Saya pikir Anda bisa menggunakan legal ;bukan yang tidak patut 0x01untuk menghentikan program dengan benar :)
Erik the Outgolfer
@EriktheOutgolfer Saya perlu 0x01mendorong suatu 1.
Martin Ender
2
Oh, sepertinya saya hanya menguji saran saya dengan 123. Hal yang dipelajari: tes dengan lebih banyak kasus.
Erik the Outgolfer
14

Vim, 22 byte

xVp:s/-/-1^M:s/[1-9]/1^M

Disimpan satu byte berkat @DJMcMayhem !

Di sini, ^Madalah baris baru literal.

Seperti yang ditunjukkan oleh @ nmjcman101 dalam komentar, sebuah regex tunggal dapat digunakan ( :s/\v(-)=[^0].*/\11^M, 20 byte), tetapi karena ini pada dasarnya sama dengan jawaban Retina, saya tetap menggunakan metode saya sendiri.

Penjelasan:

xVp                        Delete everything except the first character. If the number is negative, this leaves a -, a positive leaves any number between 1 and 9, and 0 leaves 0.
   :s/-/-1^M               Replace a - with a -1
            :s/[1-9]/1^M   Replace any number between 1 and 9 with 1.

Berikut ini gif dari itu berjalan dengan angka negatif (versi lama):

Berjalan dengan negatif

Ini dia berjalan dengan 0:

Berjalan dengan nol

Berjalan dengan positif:

Berjalan dengan positif

Loovjo
sumber
1
Saya sangat suka metode Anda, tetapi mungkin dalam satu regex::s/\v(-)=[^0].*/\11
nmjcman101
GIF konsol ragu-ragu ... ??
Desty
12

///, 52 36 byte

/a/\/1\/\///2a3a4a5a6a7a8a9a10a11/1/

Tidak dikumpulkan, penjelasan:

/2/1/
/3/1/
/4/1/
/5/1/
/6/1/
/7/1/
/8/1/
/9/1/
/10/1/
/11/1/

Pada dasarnya ini adalah implementasi MapReduce, yaitu ada dua fase:

  • Ganti semua kemunculan digit 2- 9oleh 1, mis. 1230405->1110101
  • Mengurangi pasang 11atau 10untuk 1berulang kali, misalnya 1110101->1

Jika ada -di depan pada awalnya, itu akan tetap dan hasilnya akan -1. Satu 0tidak pernah diganti, sehingga menghasilkan dirinya sendiri.

Pembaruan: Simpan tambahan 16 byte dengan aliasing //1/dengan a, terima kasih kepada Martin Ender.

Cobalah online, dengan uji kasus

Cedric Reichenbach
sumber
2
Ini sangat pintar!
Mego
11

Python 2 , 17 byte

lambda n:cmp(n,0)

Cobalah online!

Dennis
sumber
5
Oh, Anda ninja saya.
Jonathan Allan
1
Aduh. Maaf ...
Dennis
5
Sayang sekali Anda tidak bisa melakukan (0).__rcmp__...
Sp3000
1
Anda bisa melakukannya -(0).__cmp__.
nyuszika7h
1
@ nyuszika7h Tidak cukup. Mencoba menggunakannya sebagai fungsi memunculkan TypeError .
Dennis
11

Labirin , 10 byte

?:+:)%:(%!

Cobalah online!

Penjelasan

Semantik aliran kontrol Labyrinth sebenarnya memberi Anda cara "bebas" untuk menentukan tanda angka, karena jalur yang dipilih pada garpu 3-arah tergantung pada apakah tanda itu negatif, nol atau positif. Namun, saya belum dapat menyesuaikan program dengan persimpangan menjadi kurang dari 12 byte sejauh ini (meskipun mungkin).

Sebaliknya, inilah solusi bentuk tertutup, yang tidak memerlukan cabang apa pun:

Code    Comment             Example -5      Example 0       Example 5
?       Read input.         [-5]            [0]             [5]
:+      Double.             [-10]           [0]             [10]
:)      Copy, increment.    [-10 -9]        [0 1]           [10 11]
%       Modulo.             [-1]            [0]             [10]
:(      Copy, decrement.    [-1 -2]         [0 -1]          [10 9]
%       Modulo.             [-1]            [0]             [1]
!       Print.              []              []              []

Penunjuk instruksi kemudian mengenai jalan buntu, berbalik dan berakhir ketika %sekarang mencoba pembagian dengan nol.

Menggandakan input diperlukan untuk membuat ini bekerja dengan input 1dan -1, jika tidak salah satu dari dua operasi modulo sudah akan mencoba pembagian dengan nol.

Martin Ender
sumber
1
Kode Anda senang dan berubah menjadi sedih:D
Stefan
2
@Stefan Anda dapat mengubah urutan jika diinginkan. ;)
Martin Ender
9

PHP, 16 byte

Menggunakan operator pesawat ruang angkasa baru.

<?=$argv[1]<=>0;
Alex Howansky
sumber
Jangan lupa untuk menyebutkan bahwa ini adalah jawaban PHP7 saja. Dan karena Anda menggunakan <?=, Anda harus menggunakan $_GET[n], yang tidak membutuhkan byte lagi. Untuk menggunakannya <?=, Anda harus berada di dalam server web (seperti Apache), dan di sana Anda tidak akan memiliki akses $argv. Anda dapat mencoba menjalankan <?php var_dump($argv);dari file PHP, diakses melalui Apache, dan itu akan ditampilkan NULL.
Ismael Miguel
1
"Untuk menggunakan <? =, Anda harus berada di dalam server web (seperti Apache)," Tidak. <?=Operator bekerja dengan baik dari baris perintah.
Alex Howansky
Lari, php -r '<?=1'saya mengerti PHP Parse error: syntax error, unexpected '<' in Command line code on line 1. Tetapi tampaknya berfungsi dengan baik dari file. Saya kira Anda benar.
Ismael Miguel
The -rbendera adalah dengan menjalankan potongan kode. Ini sumber lengkap. Simpan ke file dan kemudian jalankanphp file.php
Alex Howansky
Saya sudah menemukan jawabannya. Saya benar-benar tidak tahu itu bekerja dari file, menggunakan -fparameter (implisit) .
Ismael Miguel
9

Brain-Flak 74 42 40 Bytes

Disimpan 2 byte berkat 1000000000

{([({}<([()])>)]<>(())){({}())<>}}{}({})

Cobalah secara Online!

Penjelasan:

{                                }       # if 0 do nothing
   (          )                          # push:                           
    {}<     >                            # the input, after 
       (    )                            # pushing:
        [  ]                             # negative:
         ()                              # 1

 (                    )                  # Then push:
  [            ]                         # the negative of the input
                <>                       # on the other stack with:
                   ()                    # a 1 
                  (  )                   # pushed under it

                       {        }        # while 1: 
                        ({}())           # increment this stack and...
                              <>         # switch stacks

                                 {}      # pop the top (the counter or 0 from input)
                                   (  )  # push:
                                    {}   # the top (this is a no-op, or pushes a 0)
Riley
sumber
Anda dapat menyimpan 2 byte dengan menghapus monad nol di sekitar(())
0
8

C, 24 20 19 18 byte

Saya menyalahgunakan dua eksploitasi C untuk menurunkan ini; Ini dalam C (GCC).

f(a){a=a>0?:-!!a;}

Cobalah online!


Riwayat Revisi:

1) f(a){return(a>0)-(a<0);}// 24 byte

2) f(a){a=(a>0)-(a<0);}// 20 byte

3) f(a){a=a>0?:-1+!a;}// 19 byte

4) f(a){a=a>0?:-!!a;}// 18 byte


Revisi 1: Upaya pertama. Logika sederhana

Revisi 2: Menyalahgunakan bug memori / tumpukan di GCC di mana, sejauh yang saya tahu, fungsi yang tidak kembali akan mengembalikan variabel set terakhir dalam kasus-kasus tertentu.

Revisi 3: Menyalahgunakan perilaku terner di mana hasil yang tidak terdefinisi akan mengembalikan hasil bersyarat (itulah sebabnya pengembalian sejati pada ternary saya adalah nihil)

Revisi 4: Kurangi bool cast ( !!) dari subtitusi kondisional ternary untuk nildireferensikan dalam revisi 2.

Albert Renshaw
sumber
7

Ruby, 10 byte

->x{x<=>0}
GB
sumber
Apakah 0.<=>juga berfungsi, atau bisakah Anda tidak merujuk metode seperti itu di Ruby?
Nic Hartley
.<=>mengharapkan 1 argumen, jadi itu akan berakhir 0.<=> x, yang lebih panjang.
Seims
@QPaysTaxes yang Anda perlukan 0.method:<=>karena pemanggilan metode dalam ruby ​​tidak menggunakan tanda kurung dan 0.<=>akan ditafsirkan sebagai pemanggilan metode dengan terlalu sedikit argumen.
Cyoce
7

Perl, 9 byte

Membutuhkan -Etanpa biaya tambahan.

say<><=>0

Pemakaian

perl -E 'say<><=>0' <<< -9999
-1
perl -E 'say<><=>0' <<< 9999
1
perl -E 'say<><=>0' <<< -0
0

Saya senang dengan operator ikan!

Dom Hastings
sumber
1
Itu tidak benar-benar "memerlukan" -E, itu hanya jika Anda memanggilnya dari CLI daripada file, itu sebabnya saya kira Anda mengatakan tidak ada biaya tambahan.
nyuszika7h
@ nyuszika7h memang, mengharuskan saya menebak cara pengujian via -etidak akan berfungsi, tetapi -Editerima tidak lebih dari -e. Sesuai konsensus tentang meta. Saya harap itu sedikit membantu!
Dom Hastings
Ya, saya tidak menyarankan memerlukan biaya tambahan untuk itu, karena berfungsi dengan baik ketika skrip dieksekusi secara normal dari file.
nyuszika7h
7

Stack Cats , 6 + 4 = 10 bytes

_[:I!:

+4 byte untuk ​ -nmbendera. nadalah untuk numerik I / O, dan karena Stack Cats membutuhkan program untuk menjadi palindromic, msecara implisit mencerminkan kode sumber untuk memberikan sumber aslinya

_[:I!:!I:]_

Cobalah online! Seperti pada dasarnya semua golf Stack Cats yang baik, ini ditemukan oleh brute force, mengalahkan setiap upaya manual dengan tembakan panjang, dan tidak dapat dengan mudah dimasukkan ke dalam program yang lebih besar.

Tambahkan Dbendera jika Anda ingin melihat jejak program langkah demi langkah, yaitu dijalankan dengan -nmDdan periksa STDERR / debug.


Stack Cats menggunakan pita tumpukan yang secara implisit diisi dengan angka nol di bagian bawah. Pada awal program, semua input didorong ke tumpukan input, dengan a -1di pangkalan untuk memisahkan input dari nol tersirat. Pada akhir program, tumpukan saat ini adalah keluaran, kecuali basis -1jika ada.

Perintah yang relevan di sini adalah:

_           Perform subtraction [... y x] -> [... y y-x], where x is top of stack
[           Move left one stack, taking top of stack with you
]           Move right one stack, taking top of stack with you
:           Swap top two of stack
I           Perform [ if top is negative, ] if positive or don't move if zero. Then
                negate the top of stack.
!           Bitwise negate top of stack (n -> -n-1)

Perhatikan bahwa semua perintah ini tidak dapat dibalik, dengan kebalikannya adalah cermin dari perintah. Ini adalah premis dari Stack Cats - semua program terminasi nontrivial memiliki panjang yang aneh, karena bahkan program yang panjang membatalkan sendiri.

Kita mulai dengan

               v
               n
              -1
...  0    0    0    0    0  ...

_kurangi, jadikan teratas -1-n, dan [pindahkan hasilnya ke kiri satu tumpukan:

           v
       -1-n   -1
...  0    0    0    0    0  ...

:menukar dua teratas dan Itidak melakukan apa-apa, karena puncak tumpukan sekarang nol. !kemudian bitwise meniadakan nol atas menjadi -1dan :menukar dua atas kembali. !kemudian bitwise meniadakan bagian atas, -1-nkembali menjadi n:

          v
          n
         -1   -1
...  0    0    0    0    0  ...

Sekarang kami cabang berdasarkan I, yang diterapkan ke aslinya n:

  • Jika nnegatif, kami bergerak ke kiri satu tumpukan dan berakhir dengan -nnol secara implisit. :swap, menempatkan nol di atas, dan ]memindahkan nol di atas -1kita baru saja pindah. _kemudian kurangi, biarkan seperti tumpukan terakhir [-1 -1], dan hanya satu -1yang keluar karena basis -1diabaikan.

  • Jika nnol, kita tidak bergerak dan :bertukar, menempatkan -1di atas. ]kemudian gerakkan ini ke kiri -1di atas kanan -1, dan _kurangi, meninggalkan tumpukan akhir seperti [-1 0], menghasilkan nol dan mengabaikan basis -1.

  • Jika npositif, kami bergerak ke kanan satu tumpukan dan diakhiri dengan -npada a -1. :swap, menempatkan -1di atas, dan ]bergerak ini ke -1kanan, di atas nol implisit. _kemudian kurangi, beri 0 - (-1) = 1dan tinggalkan stack final like [1], yaitu output.

Sp3000
sumber
7

TI-Basic, 8 byte

median({1,Ans,~1

Solusi alternatif (jangan ragu untuk menyarankan lebih banyak):

max(~1,min(Ans,1               8  bytes
0:If Ans:Ans/abs(Ans           9  bytes
(Ans>0)-(Ans<0                 10 bytes
Timtech
sumber
Apa yang ~seharusnya?
Conor O'Brien
@ ConorO'Brien Simbol negatif, untuk membedakan antara simbol pengurangan TI-Basic. Saya tahu bahwa Cemetech SC juga digunakan ~untuk mewakili token ini.
Timtech
Oh keren. Saya tidak tahu.
Conor O'Brien
@ ConorO 'Brien Nah, sekarang Anda tahu. Terima kasih telah bertanya :)
Timtech
1
Ini tidak valid - menggunakan Anskarena input tidak memenuhi kriteria sebagai metode I / O default yang valid (tidak memiliki dua kali lebih banyak upvote dibandingkan downvotes - saat ini di + 19 / -12).
Mego
7

MATL , 6 byte

0>EGg-

Input mungkin berupa angka atau array. Hasilnya adalah angka atau array dengan nilai yang sesuai.

Cobalah online! Atau uji beberapa kasus menggunakan input array.

Penjelasan

Ini menghindari menggunakan fungsi tanda builtin ( ZS).

0>   % Take input implicitly. Push 1 if positive, 0 otherwise
E    % Multiply by 2
Gg   % Push input converted to logical: 1 if nonzero, 0 otherwise
-    % Subtract. Implicitly display
Luis Mendo
sumber
MATL lebih panjang dari Matlab dan Oktaf ?!
Adem
4
Dia juga bisa menggunakan built-in ZSseperti yang dikatakan dalam jawabannya.
Stewie Griffin
6

Jelly , 1 byte

TryItOnline!

Tanda monadik atom , , tidak persis apa yang ditentukan untuk input integer, baik sebagai program penuh atau sebagai link monadik (fungsi mengambil satu argumen).

Jonathan Allan
sumber
6

Mathematica, 4 byte

Sign

Persis seperti yang tertulis di kaleng

Greg Martin
sumber
Simpan satu byte dengansgn
Adem
3
WolframAlpha tidak sama dengan Mathematica; itu termasuk interpretasi otomatis dari input bahasa alami / ambigu.
Greg Martin
Jadi saya harus mengirimkan jawaban terpisah ini?
Adem
tampaknya masuk akal bagi saya ...
Greg Martin
6

Oktaf, 26 24 byte

f=@(x)real(asin(x))/pi*2

Ini adalah jawaban pertama saya Octave, setiap kiat bermain golf dihargai!

Cobalah online!

Ide untuk mengambil asinberasal dari pertanyaan di mana katanya output the sign:)

Penjelasan

Catatan: membagi angka dengan pidan mengalikannya dengan 2itu sama dengan membagi seluruh angka denganpi/2

Kasus 0:

asin(0)hasil panen 0. Mengambil bagian yang sebenarnya dan membaginya dengan pi/2tidak ada bedanya dengan output.

Kasus positive:

asin(1)hasil panen pi/2. asindari angka berapa pun yang lebih besar dari 1akan memberikan pi/2+ nomor kompleks. Mengambil bagian yang sebenarnya dari memberi pi/2dan membaginya dengan pi/2memberi1

Kasus negative:

asin(-1)hasil panen -pi/2. asindari angka berapa pun yang lebih kecil dari -1akan memberikan -pi/2+ nomor kompleks. Mengambil bagian yang sebenarnya dari memberi -pi/2dan membaginya dengan pi/2memberi-1

Kritixi Lithos
sumber
@LuisMendo N will be an integerSaya beruntung itu mengatakan bahwa dalam pertanyaan :)
Kritixi Lithos
Oh, saya belum baca bagian itu :)
Luis Mendo
1
C l e v e r!!
flawr
Anda tidak perlu f=jika sisanya adalah ekspresi fungsi yang valid, non-rekursif.
Cyoce
@Cyoce Maaf, tapi saya tidak suka fungsi anonim
Kritixi Lithos
6

Sebenarnya 1 byte

s

Cobalah online!

Kasus lain persis apa yang tertulis di kaleng - sadalah fungsi tanda.

Tanpa builtin (4 byte):

;A\+

Cobalah online!

;A\membagi nilai absolut dari input dengan input. Ini menghasilkan -1input negatif dan 1input positif. Sayangnya, karena penanganan kesalahan Sebenarnya (jika terjadi kesalahan, perintah diabaikan), 0karena input meninggalkan dua 0s di tumpukan. +memperbaiki ini dengan menambahkannya (yang menyebabkan kesalahan dengan hal lain, sehingga diabaikan).

Mego
sumber
6

Piet, 188 53 46 41 byte

5bpjhbttttfttatraaearfjearoaearbcatsdcclq

Penerjemah online tersedia di sini.

Kode piet ini melakukan standar (n>0)-(n<0), karena tidak ada tanda yang memeriksa builtin. Faktanya, tidak ada yang kurang dari builtin, jadi deskripsi yang lebih akurat dari metode ini adalah (n>0)-(0>n).

Teks di atas mewakili gambar. Anda dapat menghasilkan gambar dengan menempelkannya ke kotak teks pada halaman penerjemah. Untuk kenyamanan saya berikan gambar di bawah ini di mana ukuran codel adalah 31 piksel. Kotak ada di sana untuk dibaca dan bukan bagian dari program. Perhatikan juga bahwa program ini tidak melewati kode putih apa pun; ikuti kode warna di sekitar gambar untuk mengikuti alur program.

Penjelasan

Program

Instruction    Δ Hue   Δ Lightness   Stack
------------   -----   -----------   --------------------
In (Number)    4       2             n
Duplicate      4       0             n, n
Push [1]       0       1             1, n, n
Duplicate      4       0             1, 1, in, in
Subtract       1       1             0, in, in
Duplicate      4       0             0, 0, in, in
Push [4]       0       1             4, 0, 0, in, in
Push [1]       0       1             1, 4, 0, 0, in, in
Roll           4       1             0, in, in, 0
Greater        3       0             greater, in, 0
Push [3]       0       1             3, greater, in, 0
Push [1]       0       1             1, 3, greater, in, 0
Roll           4       1             in, 0, greater
Greater        3       0             less, greater
Subtract       1       1             sign
Out (Number)   5       1             [Empty]
[Exit]         [N/A]   [N/A]         [Empty]

Untuk mengurangi filesize lebih jauh, saya harus benar-benar mengubah program (terkesiap) daripada hanya mengompresi file seperti yang telah saya lakukan. Saya ingin menghapus satu baris yang akan menurunkan golf ini ke 36. Saya juga dapat mengembangkan juru bahasa saya sendiri yang akan memiliki format input yang jauh lebih kecil, karena sebenarnya mengubah kode untuk membuatnya lebih kecil bukan tentang apa itu golf code.

Para mod mengatakan kepada saya bahwa keseluruhan filesize adalah yang diperhitungkan untuk kode Piet. Karena penerjemah menerima teks sebagai input yang valid dan teks mentah memiliki jumlah byte yang jauh lebih kecil daripada gambar apa pun, teks adalah pilihan yang jelas. Saya minta maaf karena kurang ajar tentang hal ini tetapi saya tidak membuat aturan. The meta diskusi tentang hal ini membuat pendapat saya tentang masalah tersebut jelas.

Jika Anda berpikir bahwa itu bertentangan dengan semangat Piet atau ingin membahas ini lebih lanjut dengan alasan apa pun, silakan periksa diskusi tentang meta .

Mike Bufardeci
sumber
2
Saya percaya konvensi untuk Piet adalah untuk menghitung semua kode.
SuperJedi224
@ SuperJedi224 Bukan itu yang diputuskan dalam meta post, sepertinya jumlah byte dalam gambar adalah apa yang akan saya ikuti.
Mike Bufardeci
6

Pushy , 7 byte

Ini mungkin program yang paling aneh yang pernah saya tulis ...

&?&|/;#

Cobalah online!

Ini digunakan sign(x) = abs(x) / x, tetapi dengan eksplisit sign(0) = 0untuk menghindari kesalahan pembagian nol.

          \ Take implicit input
&?   ;    \ If the input is True (not 0):
  &|      \  Push its absolute value
    /     \  Divide
      #   \ Output TOS (the sign)

Ini bekerja karena x / abs(x)adalah 1 saat x positif dan -1 ketika x negatif. Jika inputnya 0, program akan melompat ke perintah output.


4 byte (tidak bersaing)

Karena liburan dan terlalu banyak waktu, saya telah menulis ulang juru bahasa Pushy sepenuhnya. Program di atas masih berfungsi, tetapi karena 0 / 0sekarang default ke 0, berikut ini lebih pendek:

&|/#

Cobalah online!

FlipTack
sumber
1
Saya juga berpikir tentang menggunakan abs, tetapi tidak tahu apa yang harus dilakukan dengan 0. Sudah selesai dilakukan dengan baik!
Kritixi Lithos
5

R, 25 byte

'if'(x<-scan(),x/abs(x),0)

Membawa nomor tersebut ke STDIN. Kemudian periksa apakah nol, jika tidak, mengembalikan x/|x|yang mana 1dari -1, dan menghasilkan 0 jika x=0.

Ini tanpa menggunakan builtin signtentu saja.

JAD
sumber
1
Menggunakan builtin ini tentu saja lebih pendek, tapi kurang menyenangkan: sign(scan()).
Billywob
Maaf, seharusnya disebutkan secara eksplisit menghindari builtin
JAD
5

V 14 12 byte

Terima kasih @DJMcMayhem untuk 2 byte. Menggunakan reg-ex untuk melakukan substitusi. Agak menyenangkan, karena itu bukan built-in. Saya memiliki fungsi yang lebih menyenangkan, tetapi tidak berfungsi seperti yang saya harapkan.

ͨ-©½0]/±1

Verifikasi Kasus Uji

Ini hanya menerjemahkan :%s/\v(-)=[^0].*/\11yang cocok dengan satu atau lebih -diikuti oleh apa pun kecuali 0, diikuti oleh apa pun beberapa kali. Itu diganti dengan pertandingan pertama (jadi a -atau tidak sama sekali) dan a 1. Regex tidak cocok dengan 0, sehingga tetap dengan sendirinya.

The More Fun Way (21 byte)

é
Àé12|DkJòhé-òó^$/a

TryItOnline

Ini menerima input sebagai argumen daripada di buffer.

é<CR> Masukkan baris baru.

Àjalankan argumen sebagai kode V. a -akan memindahkan kursor ke baris sebelumnya, dan nomor apa pun akan menjadi hitungan untuk perintah selanjutnya

é1menyisipkan (count) 1's

2| pindah ke kolom kedua

D hapus semuanya dari kolom kedua dan seterusnya (hanya menyisakan satu karakter)

kJ Gabungkan kedua baris bersama.

òhé-òditerjemahkan menjadi: "jalankan hé-sampai putus". Jika 1 berada di baris kedua, ini akan langsung rusak setelah jam h. Jika berada di baris pertama, itu akan memasukkan -sebelum putus.

ó^$/aIni perbaikan fakta bahwa -1, 0, 1akan meninggalkan kosong, dan menggantikan kosong dengan argumen mendaftar.

nmjcman101
sumber
Saya tahu saya seharusnya membaca halaman itu dengan lebih baik. Ini sebenarnya tidak lebih pendek - saya lupa 0, tetapi saya mencoba untuk mengambil nomor sebagai argumen dan kemudian Àé1. Angka positif memberikan string yang, angka negatif HARUS memberikan string yang satu baris ke atas, dan 0 tidak akan memberikan apa pun. Bit angka negatif tidak bekerja dengan À, tetapi melakukannya dengand$@"
nmjcman101
Ah. Nah alasan yang tidak berhasil adalah karena tidak ada deretan lain untuk digunakan. Jika Anda menambahkannya é<cr>akan memiliki dua baris kosong dan kemudian itu berfungsi . Saya tidak yakin apakah Anda dapat menggunakannya untuk mendapatkan jawaban lengkap
DJMcMayhem
Saya memang memiliki garis lain untuk sampai, hanya saja tidak secara eksplisit mengatakan itu dalam komentar saya. Apa --argumen yang Anda tambahkan?
nmjcman101
1
Itu berarti "opsi akhir". Sejak -6dimulai dengan flag, docopt (pustaka python untuk opsi baris perintah) menganggapnya sebagai flag baris perintah daripada argumen. Menambahkan --hanya sinyal bahwa itu argumen bukan pilihan. Kalau tidak, itu tidak akan berjalan sama sekali karena doa baris perintah tidak valid.
DJMcMayhem
5

C #, 16 15 byte

Solusi yang ditingkatkan berkat Neil

n=>n>0?1:n>>31;

Atau, metode bawaan adalah 1 byte lebih lama:

n=>Math.Sign(n);

Program lengkap dengan kasus uji:

using System;

public class P
{
    public static void Main()
    {
        Func<int,int> f =
        n=>n>0?1:n>>31;

        // test cases:
        for (int i=-5; i<= 5; i++)
            Console.WriteLine(i + " -> " + f(i));
    }
}
adrianmp
sumber
2
Coba n>>31alih-alih n<0?-1:0.
Neil
1
Agak menyedihkan ketika builtin bahkan bukan solusi terpendek.
Mego
Katakanlah C # dikenal agak bertele-tele ...
adrianmp
1
A) Saya pikir Anda tidak perlu mengekor ;karena lambda adalah ekspresi, bukan pernyataan. B) apakah Math.Signatau Math::Signsesuatu yang serupa akan menjadi pengajuan yang valid? Tidak yakin bagaimana C # menangani metode tertentu. Pada dasarnya, apakah x = Math.Sign;pernyataan C # yang valid jika xdiinisialisasi dengan tipe yang tepat?
Cyoce