Saya ingin mengaktifkan variabel antara 0 dan 1. Jika 0, saya ingin mengaturnya ke 1, kalau tidak 1 saya ingin mengaturnya ke 0.
Ini adalah operasi mendasar yang saya tulis sangat sering sehingga saya ingin menyelidiki cara yang sesingkat dan sejelas mungkin untuk melakukannya. Inilah yang terbaik sejauh ini:
v = (v == 0 ? 1 : 0);
Bisakah Anda memperbaiki ini?
Sunting: pertanyaannya adalah bertanya bagaimana menulis pernyataan di atas dalam karakter paling sedikit sambil mempertahankan kejelasan - bagaimana ini 'bukan pertanyaan yang sebenarnya'? Ini tidak dimaksudkan untuk menjadi latihan kode-golf, meskipun beberapa jawaban menarik telah datang dari orang-orang yang mendekatinya sebagai golf - senang melihat golf digunakan dengan cara yang konstruktif dan merangsang pikiran.
sumber
v = +!v;
Jawaban:
Anda cukup menggunakan:
Ini tentu saja mengasumsikan bahwa variabel diinisialisasi dengan benar, yaitu hanya memiliki nilai 0 atau 1.
Metode lain yang lebih pendek tetapi menggunakan operator yang kurang umum:
Edit:
Untuk lebih jelas; Saya tidak pernah mendekati pertanyaan ini sebagai kode golf, hanya untuk menemukan cara singkat dalam melakukan tugas tanpa menggunakan trik yang tidak jelas seperti efek samping operator.
sumber
v ^= 1
harus berhenti pemrograman agak kasar saya pikir. Seperti yang dinyatakan sebelumnya itu bukan salah satu operator yang lebih umum dan tidak melakukan hal yang samav = v ^ 1
. Juga operator berarti sesuatu yang sama sekali berbeda dalam bahasa yang berbeda (VB). Ya, pencarian cepat akan memberi tahu Anda bahwa ini adalah operator XOR dan Anda akan mengerti apa yang dilakukannya, tetapi bagi banyak orang mungkin tidak jelas pada pandangan pertama. Saya tidak berpikir itu berarti Anda harus keluar dari pekerjaan Anda.Karena itu
0
adalahfalse
nilai dan1
adalahtrue
nilai.Jika Anda senang menggunakan
true
danfalse
bukannya angkaatau jika harus berupa angka:
sumber
+
sebelum itu!
. Ohhh itu terlihat sangat kotor! but cool: pswitch(v){ case 0 ...
atau jika (v == 0) atau jika v === 0. Anda mengubah hasilnya selain pendekatannya ....({v :+! v}).v
.+
tanda ajaib itu ! ¯ \ _ (ツ) _ / ¯v = (v ? 0 : 1)
JS yang jelas dan idiomatis.v = (v + 1) % 2
dan jika Anda perlu untuk siklus melalui nilai lebih hanya mengubah2
untuk(n + 1)
. Katakanlah Anda perlu siklus 0,1,2 lakukan sajav = (v + 1) % 3
.sumber
const
variabel sebagai pengganti angka ajaib 2, 3, ...++v % 3
jika Anda ingin menggilir 0, 1, 2Anda dapat menulis fungsi untuk itu dan menggunakannya seperti:
v = inv(v)
sumber
inv
fungsi: P)inv
sebagai nama deskriptif?Jika Anda tidak peduli dengan kemungkinan selain 1:
Dalam kasus di atas, v akan menjadi 1 jika v adalah 0, salah, tidak terdefinisi atau nol. Hati-hati menggunakan pendekatan semacam ini - v akan menjadi 0 bahkan jika v adalah "hello world".
sumber
v = v ? 0 : 1
.Garis suka
v = 1 - v
, atauv ^= 1
atauv= +!v
akan semua mendapatkan pekerjaan yang dilakukan, tetapi mereka merupakan apa yang saya sebut sebagai hacks. Ini bukan baris kode yang indah, tetapi trik murah untuk mendapatkan efek yang diinginkan.1 - v
tidak berkomunikasi "toggle nilai antara 0 dan 1". Ini membuat kode Anda kurang ekspresif dan memperkenalkan tempat (meskipun kecil) tempat pengembang lain harus menguraikan kode Anda.Sebagai gantinya memiliki fungsi seperti
v = toggle(v)
mengomunikasikan maksud dengan cepat.sumber
v=1-v
tidak mengomunikasikan beralih?1-v
memang bisa berkomunikasi toggle, tapi hanya itu yang berkomunikasi. Misalnya, ia juga dapat mengkomunikasikan garis dengan nol atv=1
, atau transformasi mirroring yang berpusat div=0.5
. Dalam pengertian ini relatif tidak jelas. Memang benar bahwa mengetahui ituv
hanya bisa0
atau1
membatasi makna yang dimaksudkan, tetapi itu memaksa pengembang lain (atau diri Anda di masa depan) untuk memahami konteks itu sebelum dapat memahami garis sederhana ini. Anda tidak bisa lebih jelas dariv = toggle(v)
v ^= 1
sangat jelas jika Anda memahami operasi logis, yang lebih baik jika Anda seorang programmer. Saya pikir itulah perbedaan antara itu danv=1-v
; satu operasi logis dan satu operasi aritmatika, dan kami berusaha untuk mewakili konsep logis bukan konsep matematika.v ^= 1
memiliki beberapa ambiguitas, karena dapat ditafsirkan sebagai bitwise-xor.( Kejujuran dan integritas matematis - mengingat jumlah suara pada "jawaban" ini - telah mengarahkan saya untuk mengedit jawaban ini. Saya menahan selama mungkin karena itu dimaksudkan sebagai gurauan singkat dan bukan sebagai sesuatu yang "dalam" sehingga memasukkan penjelasan apa pun tampaknya bertentangan dengan tujuan. Namun, komentar tersebut menjelaskan bahwa saya harus jelas untuk menghindari kesalahpahaman. )
Jawaban asli saya:
Kata-kata dari bagian spesifikasi ini:
menyiratkan bahwa solusi yang paling akurat adalah:
Pertama, pengakuan: Saya memang bingung fungsi delta saya. Delta Kronecker akan sedikit lebih tepat, tetapi tidak sebanyak yang saya inginkan dari sesuatu yang bebas domain (delta Kronecker terutama digunakan hanya untuk bilangan bulat). Tapi saya seharusnya tidak menggunakan fungsi delta sama sekali, saya seharusnya mengatakan:
Izinkan saya mengklarifikasi. Ingat bahwa fungsi adalah triple, (X, Y, f) , di mana X dan Y adalah set (disebut domain dan kodomain masing-masing) dan f adalah aturan yang ditunjuk unsur Y untuk setiap elemen X . Kami sering menulis triple (X, Y, f) sebagai f: X → Y . Diberikan subset dari X , katakanlah A , ada fungsi karakteristik yang merupakan fungsi χ A : X → {0,1}(itu juga dapat dianggap sebagai fungsi untuk codomain yang lebih besar seperti ℕ atau ℝ). Fungsi ini ditentukan oleh aturan:
χ A (x) = 1 jika x ∈ A dan χ A (x) = 0 jika x ∉ A .
Jika Anda menyukai tabel kebenaran, ini adalah tabel kebenaran untuk pertanyaan "Apakah elemen x dari X merupakan elemen dari subset A ?".
Jadi dari definisi ini, jelas bahwa fungsi karakteristik adalah apa yang diperlukan di sini, dengan X set besar berisi 0 dan A = {0} . Itu yang seharusnya saya tulis.
Dan begitu juga untuk delta fungsi. Untuk ini, kita perlu tahu tentang integrasi. Entah Anda sudah mengetahuinya, atau tidak. Jika tidak, tidak ada yang bisa saya katakan di sini yang akan memberi tahu Anda tentang seluk beluk teori ini, tetapi saya bisa memberikan ringkasan satu kalimat. Sebuah ukuran pada set X pada dasarnya "apa yang diperlukan untuk membuat rata-rata bekerja". Dengan kata lain, jika kita memiliki himpunan X dan ukuran μ pada himpunan itu maka ada kelas fungsi X → ℝ , yang disebut fungsi terukur yang ekspresi ∫ X f dμ masuk akal dan, dalam arti yang samar, "rata-rata" dari f lebih X .
Diberikan ukuran pada set, seseorang dapat mendefinisikan "ukuran" untuk himpunan bagian dari set itu. Ini dilakukan dengan menetapkan subset integral dari fungsi karakteristiknya (dengan asumsi bahwa ini adalah fungsi yang dapat diukur). Ini bisa tak terbatas, atau tidak terdefinisi (keduanya agak berbeda).
Ada banyak langkah di sekitar, tetapi ada dua yang penting di sini. Salah satunya adalah ukuran standar pada garis nyata, ℝ. Untuk ukuran ini, maka ∫ ℝ f dμ cukup banyak apa yang Anda dapatkan di sekolah (apakah kalkulus masih diajarkan di sekolah?): Jumlahkan persegi kecil dan ambil lebar yang lebih kecil dan lebih kecil. Dalam ukuran ini, ukuran interval adalah lebarnya. Ukuran suatu titik adalah 0.
Ukuran penting lainnya, yang bekerja pada set apa pun , disebut ukuran titik . Ini didefinisikan agar integral suatu fungsi adalah jumlah dari nilainya:
∫ X f dμ = ∑ x ∈X f (x)
Ukuran ini menetapkan untuk setiap singleton mengatur ukuran 1. Ini berarti bahwa subset memiliki ukuran terbatas jika dan hanya jika itu sendiri terbatas. Dan sangat sedikit fungsi memiliki integral yang terbatas. Jika suatu fungsi memiliki integral terbatas, itu harus bukan nol hanya pada jumlah poin yang dapat dihitung . Jadi sebagian besar fungsi yang mungkin Anda ketahui tidak memiliki integral hingga dalam ukuran ini.
Dan sekarang untuk fungsi delta. Mari kita ambil definisi yang sangat luas. Kami memiliki ruang terukur (X, μ) (jadi itu satu set dengan ukuran di atasnya) dan elemen sebuah ∈ X . Kami "mendefinisikan" fungsi delta (tergantung pada a ) menjadi "fungsi" δ a : X → ℝ dengan properti yang δ a (x) = 0 jika x ≠ a dan ∫ X δ a dμ = 1 .
Fakta paling penting tentang hal ini untuk ditahan adalah ini: Fungsi delta tidak harus berupa fungsi . Hal ini tidak benar didefinisikan: Saya belum mengatakan apa delta a (a) adalah.
Apa yang Anda lakukan pada titik ini tergantung pada siapa Anda. Dunia di sini terbagi menjadi dua kategori. Jika Anda seorang ahli matematika, Anda mengatakan yang berikut:
Jika Anda bukan ahli matematika, Anda mengatakan yang berikut:
Setelah menyinggung hadirin saya, saya akan melanjutkan.
The Dirac delta biasanya diambil menjadi fungsi delta dari titik (sering 0) di garis nyata dengan ukuran standar. Jadi mereka yang mengeluh dalam komentar tentang saya tidak tahu delta saya melakukannya karena mereka menggunakan definisi ini. Bagi mereka, saya minta maaf: walaupun saya bisa keluar dari itu dengan menggunakan pertahanan Matematik (seperti yang dipopulerkan oleh Humpty Dumpty : cukup mendefinisikan kembali semuanya sehingga itu benar), itu adalah bentuk yang buruk untuk menggunakan istilah standar untuk mengartikan sesuatu yang berbeda.
Tapi ada adalah fungsi delta yang tidak melakukan apa yang saya ingin lakukan dan itu adalah bahwa yang saya butuhkan di sini. Jika saya mengambil ukuran titik pada set X kemudian ada adalah fungsi asli δ sebuah : X → ℝ yang memenuhi kriteria untuk fungsi delta. Ini karena kita mencari fungsi X → ℝ yang nol kecuali pada a dan sedemikian rupa sehingga jumlah semua nilainya adalah 1. Fungsi tersebut sederhana: satu-satunya informasi yang hilang adalah nilainya di a , dan untuk mendapatkan jumlah menjadi 1 kita hanya menetapkan nilai 1. Ini tidak lain adalah fungsi karakteristik pada {a} . Kemudian:
∫ X δ a dμ = ∑ x ∈ X δ a (x) = δ a (a) = 1.
Jadi dalam hal ini, untuk himpunan tunggal, fungsi karakteristik dan fungsi delta setuju.
Kesimpulannya, ada tiga keluarga "fungsi" di sini:
Yang kedua adalah yang paling umum karena yang lain adalah contoh ketika menggunakan ukuran titik. Tetapi yang pertama dan ketiga memiliki keuntungan bahwa fungsi mereka selalu asli. Yang ketiga sebenarnya adalah kasus khusus yang pertama, untuk keluarga domain tertentu (bilangan bulat, atau sebagian daripadanya).
Jadi, akhirnya, ketika saya awalnya menulis jawaban yang saya tidak berpikir benar (saya tidak akan pergi sejauh mengatakan bahwa saya bingung , karena saya berharap saya baru saja menunjukkan saya tidak tahu apa yang saya bicarakan ketika Saya sebenarnya berpikir dulu, saya hanya tidak berpikir banyak). Arti yang biasa dari dirac delta bukanlah yang diinginkan di sini, tetapi salah satu poin dari jawaban saya adalah bahwa domain input tidak didefinisikan sehingga delta Kronecker juga tidak akan benar. Dengan demikian jawaban matematis terbaik (yang saya tuju) adalah fungsi karakteristik .
Saya harap itu semua jelas; dan saya juga berharap bahwa saya tidak perlu menulis karya matematika lagi menggunakan entitas HTML daripada makro TeX!
sumber
Anda bisa melakukannya
Penurunan menetapkan nilai ke 0 atau -1, dan kemudian
Math.abs
mengkonversi -1 ke +1.sumber
v = Math.round(Math.sin(Math.PI/(v+3)));
v = Math.round(Math.cos(Math.PI/((v*2+1)+2)-2*v));
: Dv = 1
kemudianv = Math.Abs(-1)
yang merupakan +1. Jikav = 0
kemudianv = Math.Abs(-0)
yang 0.secara umum setiap kali Anda perlu beralih antara dua nilai, Anda bisa mengurangi nilai saat ini dari jumlah dua nilai beralih:
sumber
v
menjadi rusak itu akan tiba-tiba mulai beralih di antara dua nilai yang berbeda. (Hanya sesuatu yang perlu dipertimbangkan ...)v
biasanya digunakan untuk mengeksekusi dua negara secara berurutan dari daftar tiga negara atau lebih, maka korupsiv
dapat menyebabkan program mengeksekusi dua negara yang sama sekali berbeda - ini dapat menghasilkan hasil yang tidak terduga dan tidak diinginkan. Pelajaran yang bisa diambil dari ini adalah: Selalu lakukan pemeriksaan masuk akal pada data Anda.Jika harus bilangan bulat 1 atau 0, maka cara Anda melakukannya baik-baik saja, meskipun tanda kurung tidak diperlukan. Jika ini akan digunakan sebagai boolean, maka Anda bisa melakukannya:
sumber
Cukup !
sumber
v = (v==0 ? 1 : 0);
" . Semua orang menemukan cara bermain golf yang berbeda; dan tidak benar-benar menjawab pertanyaan itu. Itu sebabnya saya memilih jawaban ini.Daftar solusi
Ada tiga solusi yang ingin saya usulkan. Semua dari mereka mengkonversi nilai apapun untuk
0
(jika1
,true
dll) atau1
(jika0
,false
,null
dll):v = 1*!v
v = +!v
v = ~~!v
dan satu tambahan, telah disebutkan, tetapi pintar dan cepat (meskipun hanya berfungsi untuk
0
s dan1
s):v = 1-v
Solusi 1
Anda dapat menggunakan solusi berikut:
Ini pertama akan mengkonversi bilangan bulat ke boolean berlawanan (
0
keTrue
dan nilai lain untukFalse
), maka akan memperlakukannya sebagai bilangan bulat ketika mengalikannya dengan1
. Akibatnya0
akan dikonversi ke1
dan nilai lainnya ke0
.Sebagai bukti lihat jsfiddle ini dan berikan nilai apa saja yang ingin Anda uji: jsfiddle.net/rH3g5/
Hasilnya adalah sebagai berikut:
-123
akan dikonversi ke integer0
,-10
akan dikonversi ke integer0
,-1
akan dikonversi ke integer0
,0
akan dikonversi ke integer1
,1
akan dikonversi ke integer0
,2
akan dikonversi ke integer0
,60
akan dikonversi ke integer0
,Solusi 2
Seperti yang dicatat mblase75, jAndy memiliki beberapa solusi lain yang berfungsi sebagai milik saya:
Itu juga pertama membuat boolean dari nilai asli, tetapi menggunakan
+
alih-alih1*
mengubahnya menjadi integer. Hasilnya persis sama, tetapi notasi lebih pendek.Solusi 3
Pendekatan lain adalah menggunakan
~~
operator:Ini sangat jarang dan selalu mengkonversi ke integer dari boolean.
sumber
+
mengonversinya menjadi angka, jadi+!v
sama dengan solusi Anda (solusi jAndy dalam komentar OP).1*
bisa diganti+
ketika mencoba mengubah boolean menjadi integer. Semua yang lain dalam jawaban saya tetap sama. Jawaban jAndy benar, tetapi jawaban saya lebih detail. Saya akan menambahkan solusinya pada jawaban saya.Untuk meringkas jawaban lain, komentar dan pendapat saya sendiri, saya sarankan menggabungkan dua hal:
Berikut adalah fungsi yang bisa Anda tempatkan di perpustakaan atau mungkin membungkusnya dalam Plugin untuk Javascript Framework lainnya.
Dan penggunaannya sederhana:
Keuntungannya adalah:
sumber
function toggle(i){ return i == 0 ? 1 : 0 }
?Saya tidak tahu mengapa Anda ingin membangun boolean Anda sendiri? Saya suka sintaks yang funky, tapi mengapa tidak menulis kode yang bisa dimengerti?
Ini bukan yang terpendek / tercepat, tetapi yang paling jelas (dan dapat dibaca untuk semua orang) menggunakan status if / else yang terkenal:
Jika Anda ingin benar-benar jelas, Anda harus menggunakan boolean alih-alih angka untuk ini. Mereka cukup cepat untuk kebanyakan kasus. Dengan booleans, Anda bisa menggunakan sintaks ini, yang akan menang dalam waktu singkat:
sumber
=== 0
. Dengan input sampel7
, output yang benar adalah0
, tetapi ini akan menampilkan1
.Bentuk lain dari solusi asli Anda:
EDIT: Terima kasih TehShrike dan Guffa untuk menunjukkan kesalahan dalam solusi asli saya.
sumber
'opacity:'+true
dan Anda berakhir denganopacity:true
alih - alihopacity:1
.Saya akan membuatnya lebih eksplisit.
Apa
v
artinyaSebagai contoh ketika v adalah suatu keadaan. Buat Status objek. Dalam DDD objek nilai.
Terapkan logika dalam objek nilai ini. Kemudian Anda dapat menulis kode Anda dengan cara yang lebih fungsional yang lebih mudah dibaca. Pergantian status dapat dilakukan dengan membuat Status baru berdasarkan status saat ini. Pernyataan / logika if Anda kemudian dienkapsulasi dalam objek Anda, yang dapat Anda pisahkan. ValueObject selalu berubah, sehingga tidak memiliki identitas. Jadi untuk mengubah nilainya, Anda harus membuat yang baru.
Contoh:
sumber
Cara lain untuk melakukannya:
sumber
Ini tidak ada:
Ini berfungsi sebagai round robin juga:
Atau
Pesona solusi terakhir, ia bekerja dengan semua nilai lain juga.
Untuk kasus yang sangat khusus, ingin mendapatkan nilai (perubahan) dan
undefined
, pola ini mungkin membantu:sumber
Karena ini adalah JavaScript, kita dapat menggunakan unary
+
untuk mengonversi ke int:Ini akan logis
NOT
nilaiv
(memberitrue
jikav == 0
ataufalse
jikav == 1
). Kemudian kami mengubah nilai boolean yang dikembalikan ke representasi integer yang sesuai.sumber
Hanya untuk iseng:
v = Math.pow(v-1,v)
matikan juga antara 1 dan 0.sumber
Satu lagi:
v=++v%2
(dalam C itu akan sederhana
++v%=2
)ps. Ya, saya tahu ini penugasan ganda, tetapi ini hanya penulisan ulang mentah metode C (yang tidak berfungsi sebagaimana mestinya, menyebabkan operator pra-kenaikan JS tidak mengembalikan nilai l.
sumber
++
operator (ini bukan nilai tambah). Adapunv=++v%2
, Anda memodifikasiv
dua kali. Saya tidak tahu apakah itu didefinisikan dengan baik dalam JavaScript, tetapi itu tidak perlu.v = (v+1) % 2
.c++
dalamnya adalah - karena operator pra-kenaikan memiliki prioritas lebih tinggi dan memodifikasi variabel 'di tempat', sehingga dapat digunakan sebagai nilai. Saya berpikir bahwa implementasi JS++
adalah sedemikian rupa sehingga tidak dapat diperlakukan sebagai lvalue: / Dan ya, ini berlebihan, tetapi saya mencoba menunjukkan metode lain - sudah ada solusi yang diposting lebih baik :)Jika Anda dijamin input Anda adalah 1 atau 0, maka Anda dapat menggunakan:
sumber
tentukan array {1,0}, atur v ke v [v], oleh karena itu v dengan nilai 0 menjadi 1, dan vica sebaliknya.
sumber
Cara kreatif lain untuk melakukannya, dengan
v
setara dengan nilai apa pun, akan selalu kembali0
atau1
sumber
!!
menghasilkan apa-apa dalam matematika logis, Anda dapat dimasukkan!!!!
ke sana dan akan sama tetapi menghasilkan 4 operasi yang tidak diperlukan!!
akan dilemparkan ke bool.!!(1) === true
dan!!(0) === false
v = Boolean(v^1)
akan lebih informatif, terima kasih untuk menjelaskan - tidak berpikir tentang casting!
akan mengubahnya menjadi boolean. Menambahkan yang lain!
akan meniadakan boolean itu. Castingnya implisit di sini, dan hasil akhirnya bekerja. Tidak perlu untuk -1.Jika nilai yang mungkin untuk v hanya 0 dan 1, maka untuk sembarang bilangan bulat x, ekspresi: v = Math.pow ((Math.pow (x, v) - x), v); akan beralih nilainya.
Saya tahu ini adalah solusi yang jelek dan OP tidak mencari ini ... tapi saya hanya memikirkan solusi lain ketika saya di toilet: P
sumber
Tidak diuji, tetapi jika Anda mencari boolean, saya pikir
var v = !v
akan berhasil.Referensi: http://www.jackfranklin.co.uk/blog/2011/05/a-better-way-to-reverse-variables
sumber
akan bekerja untuk v = 0 dan v = 1; dan beralih negara;
sumber
Jika hanya ada dua nilai, seperti dalam hal ini (0, 1), saya percaya itu boros untuk menggunakan int. Lebih baik pergi untuk boolean dan bekerja dalam bit. Saya tahu saya berasumsi tetapi dalam kasus beralih antara dua negara, boolean tampaknya menjadi pilihan ideal.
sumber
Nah, Seperti yang kita ketahui bahwa dalam javascript hanya itu perbandingan Boolean juga akan memberi Anda hasil yang diharapkan.
yaitu
v = v == 0
cukup untuk itu.Di bawah ini adalah kode untuk itu:
JSFiddle: https://jsfiddle.net/vikash2402/83zf2zz0/
Berharap ini akan membantu Anda :)
sumber
true
danfalse
. Anda dapat menggunakanv == 0
untuk menentukan nilai variabel dalam suatu kondisi, tetapi jika Anda ingin menggunakan nilai 0 atau 1 Anda harus menggunakan sesuatu sepertiv == 0 ? 0 : 1
atauNumber(v)
untuk mendapatkan itu. (Juga, Anda dapat menggunakanv = !v;
untuk beralih antaratrue
danfalse
.)Ini akan mengetikkan melemparkan nilai Boolean Terbalik ke Angka, yang merupakan output yang diinginkan.
sumber