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
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.
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 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.
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:
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.
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.
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.
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.
' 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.
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):
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:
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.
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) .
{ } # 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)
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.
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.
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.
+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.
@ 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).
Tanda monadik atom , Ṡ, tidak persis apa yang ditentukan untuk input integer, baik sebagai program penuh atau sebagai link monadik (fungsi mengambil satu argumen).
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
;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).
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
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 .
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:
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.
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.
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.
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.
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));
}
}
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?
s
tanda builtin, atau menggunakan beberapa bithifting / matematika pintar untuk menyelesaikannya? Lihatlah postingan meta iniJawaban:
Retina , 9 byte
Cobalah online!
Mengganti digit yang bukan nol dan semuanya setelahnya
1
. Ini meninggalkan potensi terkemuka-
utuh dan mengubah semua angka kecuali0
itu sendiri ke nilai absolut1
.sumber
0.42e2
)?C (GCC),
24232218 byteTerima kasih kepada @aross dan @Steadybox untuk menghemat satu byte!
Tidak dijamin bekerja di semua sistem atau kompiler, bekerja di TIO .
sumber
return n>>16|!!n;
f(n){n=n>>31|!!n;}
bekerja juga. Tapi ini hanya kekhasan kompiler, bukan fitur bahasa.Mathematica, 4 byte
Bagaimana kalau tidak menggunakan built-in
Sign
dan masih mencetak 4 byte? ;)Clip
dengan klip argumen tunggal (atau klem) nilai input antara-1
dan1
. Karena input hanya berupa bilangan bulat, ini sama dengan menggunakanSign
.sumber
SAP,
225213201 byteCobalah 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:
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:
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.
sumber
OUT OF MANA!!!
Cubix , 10 byte
Uji secara online!
Kode ini dibungkus dengan jaring kubus berikut:
Kode ini kemudian dijalankan dengan IP (penunjuk instruksi) mulai dari
I
, menghadap ke timur.I
memasukkan 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 dalam0
di baris kedua, menuju ke timur.0
mendorong 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 ke2
, yang mendorong literal 2. Ini kemudian dikurangi menjadi 1 dan dikirim ke keluaran.sumber
I
mengembalikan -1 ketika input berakhir seperti halnya huruf kecili
.JavaScript (ES6), 9 byte
Mudah.
Non-builtin terpendek adalah 13 byte:
Berkat @Neil, ini dapat dipatenkan dengan byte, tetapi dengan biaya hanya bekerja pada bilangan bulat 32-bit:
Atau Anda bisa melakukannya
yang tampaknya lebih golf, tetapi saya tidak yakin bagaimana caranya.
sumber
n
:n=>n>>31|!!n
.n>>31
benar-benar pintar, terima kasih!APL (Dyalog APL) , 1 byte
Berfungsi untuk bilangan kompleks juga, mengembalikan 1∠ θ :
TryAPL online!
Tanpa built-in itu, untuk bilangan bulat (sesuai OP):
¯1⌈
yang terbesar dari yang negatif dan1⌊
yang terkecil dari satu dan⊢
argumenTryAPL online!
... dan yang umum:
>∘0
lebih dari nol-
minus<∘0
kurang dari nolTryAPL online!
sumber
> <> ,
98 byteTerima kasih kepada Sp3000 untuk menghemat satu byte.
Ada yang tidak patut
0x01
sebelum/
.Cobalah online!
Penjelasan
Ini adalah port dari jawaban Labirin berdasarkan kode karakter saya .
sumber
;
bukan yang tidak patut0x01
untuk menghentikan program dengan benar :)0x01
mendorong suatu1
.123
. Hal yang dipelajari: tes dengan lebih banyak kasus.Vim, 22 byte
Disimpan satu byte berkat @DJMcMayhem !
Di sini,
^M
adalah 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:
Berikut ini gif dari itu berjalan dengan angka negatif (versi lama):
Ini dia berjalan dengan 0:
Berjalan dengan positif:
sumber
:s/\v(-)=[^0].*/\11
///,
5236 byteTidak dikumpulkan, penjelasan:
Pada dasarnya ini adalah implementasi MapReduce, yaitu ada dua fase:
2
-9
oleh1
, mis.1230405
->1110101
11
atau10
untuk1
berulang kali, misalnya1110101
->1
Jika ada
-
di depan pada awalnya, itu akan tetap dan hasilnya akan-1
. Satu0
tidak pernah diganti, sehingga menghasilkan dirinya sendiri.Pembaruan: Simpan tambahan 16 byte dengan aliasing
//1/
dengana
, terima kasih kepada Martin Ender.Cobalah online, dengan uji kasus
sumber
Python 2 , 17 byte
Cobalah online!
sumber
(0).__rcmp__
...-(0).__cmp__
.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:
Penunjuk instruksi kemudian mengenai jalan buntu, berbalik dan berakhir ketika
%
sekarang mencoba pembagian dengan nol.Menggandakan input diperlukan untuk membuat ini bekerja dengan input
1
dan-1
, jika tidak salah satu dari dua operasi modulo sudah akan mencoba pembagian dengan nol.sumber
:D
PHP, 16 byte
Menggunakan operator pesawat ruang angkasa baru.
sumber
<?=
, 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 ditampilkanNULL
.<?=
Operator bekerja dengan baik dari baris perintah.php -r '<?=1'
saya mengertiPHP Parse error: syntax error, unexpected '<' in Command line code on line 1
. Tetapi tampaknya berfungsi dengan baik dari file. Saya kira Anda benar.-r
bendera adalah dengan menjalankan potongan kode. Ini sumber lengkap. Simpan ke file dan kemudian jalankanphp file.php
-f
parameter (implisit) .Brain-Flak
74 4240 BytesDisimpan 2 byte berkat 1000000000
Cobalah secara Online!
Penjelasan:
sumber
(())
J , 1 byte
Coba online (dengan test case)!
sumber
C,
24201918 byteSaya menyalahgunakan dua eksploitasi C untuk menurunkan ini; Ini dalam C (GCC).
Cobalah online!
Riwayat Revisi:
1)
f(a){return(a>0)-(a<0);}
// 24 byte2)
f(a){a=(a>0)-(a<0);}
// 20 byte3)
f(a){a=a>0?:-1+!a;}
// 19 byte4)
f(a){a=a>0?:-!!a;}
// 18 byteRevisi 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 untuknil
direferensikan dalam revisi 2.sumber
Ruby, 10 byte
sumber
0.<=>
juga berfungsi, atau bisakah Anda tidak merujuk metode seperti itu di Ruby?.<=>
mengharapkan 1 argumen, jadi itu akan berakhir0.<=> x
, yang lebih panjang.0.method:<=>
karena pemanggilan metode dalam ruby tidak menggunakan tanda kurung dan0.<=>
akan ditafsirkan sebagai pemanggilan metode dengan terlalu sedikit argumen.Perl, 9 byte
Membutuhkan
-E
tanpa biaya tambahan.Pemakaian
Saya senang dengan operator ikan!
sumber
-E
, itu hanya jika Anda memanggilnya dari CLI daripada file, itu sebabnya saya kira Anda mengatakan tidak ada biaya tambahan.-e
tidak akan berfungsi, tetapi-E
diterima tidak lebih dari-e
. Sesuai konsensus tentang meta. Saya harap itu sedikit membantu!Stack Cats , 6 + 4 = 10 bytes
+4 byte untuk
-nm
bendera.n
adalah untuk numerik I / O, dan karena Stack Cats membutuhkan program untuk menjadi palindromic,m
secara implisit mencerminkan kode sumber untuk memberikan sumber aslinyaCobalah 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
D
bendera jika Anda ingin melihat jejak program langkah demi langkah, yaitu dijalankan dengan-nmD
dan 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
-1
di pangkalan untuk memisahkan input dari nol tersirat. Pada akhir program, tumpukan saat ini adalah keluaran, kecuali basis-1
jika ada.Perintah yang relevan di sini adalah:
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
_
kurangi, jadikan teratas-1-n
, dan[
pindahkan hasilnya ke kiri satu tumpukan::
menukar dua teratas danI
tidak melakukan apa-apa, karena puncak tumpukan sekarang nol.!
kemudian bitwise meniadakan nol atas menjadi-1
dan:
menukar dua atas kembali.!
kemudian bitwise meniadakan bagian atas,-1-n
kembali menjadin
:Sekarang kami cabang berdasarkan
I
, yang diterapkan ke aslinyan
:Jika
n
negatif, kami bergerak ke kiri satu tumpukan dan berakhir dengan-n
nol secara implisit.:
swap, menempatkan nol di atas, dan]
memindahkan nol di atas-1
kita baru saja pindah._
kemudian kurangi, biarkan seperti tumpukan terakhir[-1 -1]
, dan hanya satu-1
yang keluar karena basis-1
diabaikan.Jika
n
nol, kita tidak bergerak dan:
bertukar, menempatkan-1
di atas.]
kemudian gerakkan ini ke kiri-1
di atas kanan-1
, dan_
kurangi, meninggalkan tumpukan akhir seperti[-1 0]
, menghasilkan nol dan mengabaikan basis-1
.Jika
n
positif, kami bergerak ke kanan satu tumpukan dan diakhiri dengan-n
pada a-1
.:
swap, menempatkan-1
di atas, dan]
bergerak ini ke-1
kanan, di atas nol implisit._
kemudian kurangi, beri0 - (-1) = 1
dan tinggalkan stack final like[1]
, yaitu output.sumber
TI-Basic, 8 byte
Solusi alternatif (jangan ragu untuk menyarankan lebih banyak):
sumber
~
seharusnya?~
untuk mewakili token ini.Ans
karena 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).MATL , 6 byte
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
).sumber
ZS
seperti yang dikatakan dalam jawabannya.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).sumber
Mathematica, 4 byte
Persis seperti yang tertulis di kaleng
sumber
sgn
Oktaf,
2624 byteIni adalah jawaban pertama saya kode-golf Octave, setiap kiat bermain golf dihargai!
Cobalah online!
Ide untuk mengambil
asin
berasal dari pertanyaan di mana katanyaoutput the sign
:)Penjelasan
Catatan: membagi angka dengan
pi
dan mengalikannya dengan2
itu sama dengan membagi seluruh angka denganpi/2
Kasus
0
:asin(0)
hasil panen0
. Mengambil bagian yang sebenarnya dan membaginya denganpi/2
tidak ada bedanya dengan output.Kasus
positive
:asin(1)
hasil panenpi/2
.asin
dari angka berapa pun yang lebih besar dari1
akan memberikanpi/2
+ nomor kompleks. Mengambil bagian yang sebenarnya dari memberipi/2
dan membaginya denganpi/2
memberi1
Kasus
negative
:asin(-1)
hasil panen-pi/2
.asin
dari angka berapa pun yang lebih kecil dari-1
akan memberikan-pi/2
+ nomor kompleks. Mengambil bagian yang sebenarnya dari memberi-pi/2
dan membaginya denganpi/2
memberi-1
sumber
N will be an integer
Saya beruntung itu mengatakan bahwa dalam pertanyaan :)f=
jika sisanya adalah ekspresi fungsi yang valid, non-rekursif.Sebenarnya 1 byte
Cobalah online!
Kasus lain persis apa yang tertulis di kaleng -
s
adalah fungsi tanda.Tanpa builtin (4 byte):
Cobalah online!
;A\
membagi nilai absolut dari input dengan input. Ini menghasilkan-1
input negatif dan1
input positif. Sayangnya, karena penanganan kesalahan Sebenarnya (jika terjadi kesalahan, perintah diabaikan),0
karena input meninggalkan dua0
s di tumpukan.+
memperbaiki ini dengan menambahkannya (yang menyebabkan kesalahan dengan hal lain, sehingga diabaikan).sumber
Piet,
188534641 bytePenerjemah 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
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 .
sumber
Pushy , 7 byte
Ini mungkin program yang paling aneh yang pernah saya tulis ...
Cobalah online!
Ini digunakan
sign(x) = abs(x) / x
, tetapi dengan eksplisitsign(0) = 0
untuk menghindari kesalahan pembagian nol.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 / 0
sekarang default ke 0, berikut ini lebih pendek:Cobalah online!
sumber
abs
, tetapi tidak tahu apa yang harus dilakukan dengan0
. Sudah selesai dilakukan dengan baik!R, 25 byte
Membawa nomor tersebut ke STDIN. Kemudian periksa apakah nol, jika tidak, mengembalikan
x/|x|
yang mana1
dari-1
, dan menghasilkan 0 jikax=0
.Ini tanpa menggunakan builtin
sign
tentu saja.sumber
sign(scan())
.V
1412 byteTerima 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.
Verifikasi Kasus Uji
Ini hanya menerjemahkan
:%s/\v(-)=[^0].*/\11
yang 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 a1
. Regex tidak cocok dengan 0, sehingga tetap dengan sendirinya.The More Fun Way (21 byte)
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é1
menyisipkan (count)1
's2|
pindah ke kolom keduaD
hapus semuanya dari kolom kedua dan seterusnya (hanya menyisakan satu karakter)kJ
Gabungkan kedua baris bersama.òhé-ò
diterjemahkan menjadi: "jalankanhé-
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.ó^$/a
Ini perbaikan fakta bahwa-1
,0
,1
akan meninggalkan kosong, dan menggantikan kosong dengan argumen mendaftar.sumber
Àé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$@"
é<cr>
akan memiliki dua baris kosong dan kemudian itu berfungsi . Saya tidak yakin apakah Anda dapat menggunakannya untuk mendapatkan jawaban lengkap--
argumen yang Anda tambahkan?-6
dimulai 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.C #,
1615 byteSolusi yang ditingkatkan berkat Neil
Atau, metode bawaan adalah 1 byte lebih lama:
Program lengkap dengan kasus uji:
sumber
n>>31
alih-alihn<0?-1:0
.;
karena lambda adalah ekspresi, bukan pernyataan. B) apakahMath.Sign
atauMath::Sign
sesuatu yang serupa akan menjadi pengajuan yang valid? Tidak yakin bagaimana C # menangani metode tertentu. Pada dasarnya, apakahx = Math.Sign;
pernyataan C # yang valid jikax
diinisialisasi dengan tipe yang tepat?