Dalam matematika tanda seru !
sering berarti faktorial dan muncul setelah argumen.
Dalam pemrograman tanda seru !
seringkali berarti negasi dan muncul sebelum argumen.
Untuk tantangan ini, kami hanya akan menerapkan operasi ini ke nol dan satu.
Factorial
0! = 1
1! = 1
Negation
!0 = 1
!1 = 0
Ambil string nol atau lebih !
, diikuti oleh 0
atau 1
, diikuti dengan nol atau lebih !
( /!*[01]!*/
).
Misalnya, inputnya mungkin !!!0!!!!
atau !!!1
atau !0!!
atau 0!
atau 1
.
The !
's sebelum 0
atau 1
yang negations dan!
berikutnya adalah faktorial.
Faktorial lebih diutamakan daripada negasi sehingga faktorial selalu diterapkan terlebih dahulu.
Misalnya, !!!0!!!!
benar-benar berarti !!!(0!!!!)
, atau lebih baik lagi !(!(!((((0!)!)!)!)))
.
Keluarkan aplikasi yang dihasilkan dari semua faktorial dan negasi. Output akan selalu 0
atau 1
.
Uji Kasus
0 -> 0
1 -> 1
0! -> 1
1! -> 1
!0 -> 1
!1 -> 0
!0! -> 0
!1! -> 0
0!! -> 1
1!! -> 1
!!0 -> 0
!!1 -> 1
!0!! -> 0
!!!1 -> 0
!!!0!!!! -> 0
!!!1!!!! -> 0
Kode terpendek dalam byte menang.
Jawaban:
Mathematica,
2517 byteMengambil input dari prompt pengguna. Mengasumsikan lingkungan notebook Mathematica untuk pencetakan tersirat. Untuk membuatnya menjadi skrip baris perintah, bungkus dalam
Print[...]
atau untuk membuatnya menjadi fungsi tanpa argumen (yang kemudian mengambil input dari prompt), tambahkan&
.Mathematica memiliki kedua operator yang diperlukan (dengan prioritas yang diperlukan), jadi kita bisa "mengevaluasi" input (yang dilakukan secara otomatis oleh
Input[]
), tetapi operator negasi logis tidak bekerja pada bilangan bulat (sehingga akan tetap tidak dievaluasi). Jika ada yang!x
tersisa di hasilnya, kami ganti dengan1-x
.Beberapa fakta menyenangkan tentang evaluasi:
!!
, yang menghitungn*(n-2)*(n-4)*...
, tetapi diterapkan0
atau1
masih memberikan1
, sehingga tidak masalah yang0!!!!!
benar-benar akan diuraikan((0!!)!!)!
.!0
dan tidak!1
dievaluasi, ia tahu bahwa!
itu terbalik sendiri, sehingga secara otomatis akan membatalkan semua pasangan pemimpin!
. SetelahToExpression
kita selalu meninggalkan dengan salah satu0
,1
,!0
,!1
.sumber
x=${x/[01]!*/1};echo $(($x))
- tidak diizinkan memposting jawaban yang tepat :([Bash] + Utilitas Unix,
2117 byteIni harus disimpan dalam file dan dijalankan sebagai program. Jika Anda mencoba memasukkan perintah langsung dari baris perintah, itu tidak akan berhasil karena !! diperluas karena penggantian sejarah diaktifkan dalam mode interaktif bash. (Atau, Anda dapat menonaktifkan substitusi riwayat dengan
set +H
.)Uji kasus berjalan:
sumber
mkdir -p 's/.!!'{bunch,of,different,directories}\$/1
? Maka Anda akan mendapatkan Pathname Expansion dan Sed akan mencoba membaca direktori seolah-olah itu file, bukannya membaca input standar, dan itu tidak akan menghasilkan apa-apa! :)Retina ,
201514 byteTerima kasih kepada Leo karena telah menghemat 1 byte.
Cobalah online!
Penjelasan
Berubah
0!
menjadi1
. Kami tidak peduli tentang trailing lain!
, angka yang dihasilkan sama dengan jika kami telah menerapkan semua faktorial.Batalkan pasangan negasi. Ini juga dapat membatalkan beberapa faktorial, tetapi itu tidak relevan.
Hitung jumlah kecocokan regex ini, yang merupakan
1
atau0
dan memberikan hasil yang diinginkan.sumber
\d.+
...^
sebelumnya!0
Grime ,
14 129 byteCobalah online!
Penjelasan
Ini cocok dengan input terhadap suatu pola, mencetak
1
untuk kecocokan dan0
tanpa kecocokan.Idenya adalah ini. Jika input dimulai dengan digit, maka bagian rekursif
\!_
selalu gagal, dan\0!
berhasil kecuali kita memiliki satu0
. Xor mereka berhasil kecuali inputnya tunggal0
. Jika input dimulai dengan a!
, maka\0!
selalu berhasil, dan\!_
berhasil jika kecocokan rekursif berhasil. Xor mereka berhasil tepat ketika pertandingan rekursif gagal, sehingga meniadakannya.sumber
Brainfuck,
8572 (84) byteuntuk mengembalikan secara numerik, atau
untuk teks ASCII. > juga dapat diawali untuk menghindari pembungkus memori.
Cobalah online!
Atau untuk respons teks, ganti baris terakhir dengan
sumber
Brainfuck - cara menuju banyak byte (232 byte)
Jelas bahasa yang salah untuk menang dalam kode golf. Terutama saya perhatikan kurangnya siapa pun yang menggunakan esolang ini. Ada juru online yang baik bf interpeter atau Anda dapat benar-benar menonton apa program ini menggunakan ini bf visualisator .
sumber
Python,
-44-42byteDisimpan 2 byte berkat Zgarb!
Selangkah demi selangkah:
x[-1]!='0'
jika
x
diakhiri dengan1
atau!
⇔x
tidak berakhir dengan0
, bagian faktorial harus memiliki nilai1
, jika tidak0
^len(x.rstrip('!'))%2
mengeksploitasi properti xor sebagai "tidak bersyarat". Kondisi dalam kasus ini adalah jika panjang inisial
!
adalah ganjil. Namun,.rstrip
tidak menghapus nomor dari string sehingga panjang yang dihitung diimbangi oleh 1, karena itu kondisinya terbalik!=
ke==
dalam langkah 1. Zgarb menyarankan menggunakan operator pembanding yang berbeda daripada menerapkan inversi lain, menghemat 2 byte.Cobalah online!
sumber
!!0
; saat ini kembali1
.lambda x:(x[-1]=='0')^len(x.rstrip('!'))%2
menghindari inversi tambahan.JavaScript (ES6),
434129 byteMetode non-regex (
4131 byte)Di bawah ini adalah pendekatan awal saya. Ini sedikit lebih menarik, tetapi
secara signifikan lebih lamamasih sedikit lebih lama bahkan setelah optimasi yang signifikan oleh Neil (10 byte disimpan) .Uji kasus
Tampilkan cuplikan kode
sumber
f=([c,...s])=>1/c?c|s>'':1-f(s)
.Jelly , 5 byte
Cobalah online!
Fungsi monadik mengharapkan string. Input dengan
!
penyebab utama a1
dicetak ke STDOUT di sepanjang jalan, jadi tautan TIO yang saya berikan adalah test harness yang mencetak pasangan input-output di bawah baris pertama output.Bagaimana?
sumber
05AB1E , 9 byte
Kode:
Menggunakan pengkodean CP-1252 . Cobalah online! atau Verifikasi semua kasus uji!
Penjelasan:
sumber
Retina , 13 byte
Pendekatan yang agak aneh, tapi pendek dan berhasil.
Dengan dua baris pertama kita mengganti akhiran
0
dengan!1
: dengan penggantian ini kita sekarang tahu bahwa bagian dari string kita dari digit ke depan sama dengan 1.Berikutnya dua baris, hapus pasangan
!
: negasi ganda menghapus sendiri, dan kami sudah memperhitungkan faktorial dengan langkah sebelumnya.Baris terakhir, cocokkan angka di awal string dan kembalikan jumlah kecocokan: jika negasi semuanya dihilangkan kita akan menemukan kecocokan (dan seperti yang kita katakan sebelumnya kita tahu ini sama dengan 1), jika masih ada negasi ini tidak akan cocok.
Cobalah online!
sumber
1
daripada\d
.0!
akan tetap tidak berubah sampai baris terakhirRuby, 12 + 1 =
39241513 byteMenggunakan
-n
bendera. Berkat @GB untuk -9 byte!sumber
0
atau end-of-line!*$
lebih pendek dua!Perl , 20 byte
19 byte kode +
-p
bendera.Cobalah online!
Negasi Perl kembali
undef
atau1
, jadi saya gunakan0+
untuk menghitung hasil0+undef
pengembalian0
. Selain itu, tidak banyak bicara tentang kode.sumber
C,
68626153 byteDiperas beberapa byte lagi dengan beberapa penyalahgunaan
Cobalah online!
sumber
int
dari fungsi dan Anda dapat mengubah*a==33
ke*a<34
.*a%2
lebih pendek dari*a-48
for(;*a<34;a++)
dapat dipersingkat untukfor(;*a++<34;)
menghemat 1 bytePerl 6 ,
322823 byteBagaimana itu bekerja
sumber
Haskell , 39 byte
Menentukan fungsi
f
, yang mengambil string dan mengembalikan karakter. Cobalah online!Penjelasan
Ada tiga kasus: input dimulai dengan
!
, input memiliki panjang 1, dan yang lainnya.sumber
f('!':b)=[1,0]!!f b;f"0"=0;f _=1
.Befunge, 24 byte
Cobalah online!
Ini dimulai dengan menghitung jumlah
!
karakter yang dibaca dari stdin. Karakter pertama yang bukan merupakan!
salah satu0
atau1
, tetapi dalam proses pengujian untuk!
kami akan mengurangi 33, membuatnya menjadi 15 atau 16. Kami kemudian membaca satu karakter lagi, yang akan menjadi!
atau EOF, dan bandingkan jika itu kurang dari 0 (yaitu EOF).Dengan mengambil ketiga titik data - penghitungan seru ( c ), nilai digit, ( d ), dan kondisi akhir file ( e ) - kita dapat menghitung hasilnya sebagai berikut:
Mengalikan nilai digit dengan kondisi akhir file berarti itu akan dikonversi menjadi nol jika angka tersebut diikuti oleh a
!
, sehingga memberikan nilai modulo 2 yang sama dengan1
(yang ingat telah dikonversi ke 16). Tetapi sebelum menerapkan modulo 2, kami menambahkan jumlah tanda seru awal, yang secara efektif mengubah hasil modulo 2 sebanyak!
prefiksnya. Dan akhirnya kami bukan hasil karena nilai dasar kami untuk0
dan1
merupakan kebalikan dari apa yang kami butuhkan.Melihat kode lebih terinci:
sumber
Haskell , 27 byte
Cobalah online!
Masing-masing memimpin
!
melengkapi output untuk sisa ekspresi, dilakukan sebagai1-
. Kami terus membalik sampai kami menekan angka. Jika sisanya hanya"0"
, hasilnya adalah 0. Jika tidak, itu adalah1
atau diikuti oleh satu atau lebih!
, sehingga hasilnya adalah 1.sumber
Rubi,
22 2120 bytePenjelasan:
(-1 byte mencuri ide @Value Ink)
sumber
Jelly , 8 byte
Cobalah online!
Ini adalah fungsi (tautan monadik) yang mengambil satu argumen dan kembali melalui nilai pengembaliannya. (Ini juga sering menulis sampah ke output standar sebagai efek samping, tetapi kami tidak peduli tentang itu.)
Penjelasan
Pertama, perhatikan bahwa karena input selalu terdiri dari sejumlah
!
, diikuti oleh digit, diikuti oleh lebih banyak!
, bahwa jika kita menghapus trailing!
dan mengambil panjangnya, kita akan berakhir dengan satu ditambah jumlah yang terdepan!
dalam program. Mengambil paritas ini akan mengembalikan 0 jika ada angka ganjil!
, atau 1 jika ada angka genap!
. Membandingkan dengan 0 adalah fungsi "tidak", sedangkan membandingkan dengan 1 adalah fungsi identitas; dengan demikianœr”!LḂ=
secara efektif mengimplementasikan bagian "perlakukan!
sebagai operator BUKAN" dari pertanyaan.Sedangkan untuk babak kedua, penanganan faktorial,
!
adalah operasi faktorial di Jelly, jadi jika program tidak memiliki pengarah!
, kita dapat menyelesaikan masalah secara langsung dengan sederhanaeval
(V
). Jika program benar - benar telah memimpin!
, mereka akan ditafsirkan sebagai mengambil faktorial dari 0 (mungkin beberapa kali), menghasilkan nilai pengembalian 1, yang akan dicetak ke output standar dan dibuang setelah satu digit terlihat; dengan demikian, mereka tidak berdampak pada nilai pengembalian fungsi yang saya ajukan ke pertanyaan.sumber
Python, 38 byte
TryItOnline!
Fungsi tanpa nama mengambil string input
s
dan mengembalikan integer0
atau1
.s[1::2]
adalah irisan string input yang dimulai pada indeks 1 dan memiliki ukuran langkah dua:'Like this' -> 'ieti'
s[::2]
serupa tetapi dimulai pada indeks default 0:'Like this' -> 'Lk hs'
Tes
(s[1::2]>s[::2])
memeriksa apakah indeks berbasis 0'0'
atau'1'
ganjil, yaitu jika kita perlu melengkapi.Ini berfungsi karena urutan string diperiksa secara leksikografis dengan string tidak kosong lebih besar dari string kosong, dan dengan urutan ASCII, jadi
'1'>'0'>'!'
. Ini adalah satu byte lebih pendek dari yang lebih sederhanas.index(max(s))%2
.The
ord(s[-1])%2
memeriksa untuk melihat apakah karakter terakhir tidak'0'
(untuk input valid), dan menghasilkan integer (sedangkan panjang yang sama(s[-1]!='0')
akan kembali boolean).Ini bekerja karena karakter terakhir dari input,
s[-1]
, akan menjadi'0'
,'1'
atau'!'
yang memiliki kode ASCII menunjuk 48, 49, dan 33 masing-masing, yang adalah 0, 1, dan 1 modulo 2.The
^
kemudian melakukan bitwise eksklusif atau operasi pada dua nilai di atas, kembali integer sejak satu input, yang benar, adalah bilangan bulat. Jika kiri adalah Benar komplemen dari kanan dikembalikan, jika kiri adalah Palsu hak dikembalikan, sesuai kebutuhan.sumber
Java 7,
1058281 byteCobalah online!
Solusi regex-ish lama
sumber
c^=1
sangat pintar. Itu operator yang tidak digunakan jika saya pernah melihatnya.CJam ,
1211 byteCobalah online! Test suite (mencetak a
1
untuk setiap test case yang benar).sumber
Haskell ,
6765 byteCobalah online! Pemakaian:
f "!!!0!!!!"
Disimpan dua byte berkat @nimi.
sumber
Brainfuck, 115 byte
Cobalah online!
Tidak Terkumpul:
sumber
Batch, 62 byte
Mengambil input pada STDIN. Batch sebenarnya memahami memimpin
!
dengan benar untuk tantangan ini, tetapi trailing!
perlu ditangani, yang membutuhkan tiga langkah:0!
ke1
!!
(ini aman untuk!!
sebelum digit juga)!
(yang sekarang hanya bisa setelah a1
)sumber
IBM / Lotus Notes Formula - 77 byte
Tidak ada TIO untuk Formula Catatan sehingga tangkapan layar dari semua kasus uji ditunjukkan di bawah ini:
Bagaimana itu bekerja
@Eval()
mengevaluasi string sebagai ekspresiPertama kita periksa apakah string input dalam bidang (input)
a
berisi1
atau0
dan mengambil semua karakter ke kiri yang mana yang merupakan string!
karakter. Kami tidak peduli berapa banyak.@Eval()
akan mengurusnya.Selanjutnya kita melihat apakah ada
!
di bagian akhir string. Jika ada kita tambahkan1
ke!
string (0!
dan1!
keduanya 1 - tidak masalah berapa banyak!
karakter yang ada di akhir) jika tidak, kita menambahkan karakter terakhir tidak berubah karena itu bukan a!
dan bisa berupa a1
atau a0
.Kami sekarang memiliki string yang berisi inversi terkemuka ditambah angka yang ditentukan oleh apakah ada karakter faktorial sehingga kami dapat memberi makan ini
@Eval()
dan mendapatkan hasil di atas.sumber
sed,
363331 byteSed murni, tidak ada peralatan bc / shell. Bekerja pada GNU sed <4.3; 33 byte pada BSD dan GNU 4.3+.
Cukup mudah jika Anda terbiasa
sed
; berkomentar untuk mereka yang tidak:Uji:
sumber
sed
memungkinkan Anda untuk menggunakan string nol sebagai nama label. Jika Anda bisa membuatnya bekerja di sini, itu akan menghemat dua byte. Sebenarnya, saya tidak yakin label itu diperlukan; kecuali saya melewatkan sesuatu, baris pertama idempoten, jadi Anda mungkin bisa melompat kembali ke awal program daripada perlu label.:
(lebih dari bug diambil sebagai fitur), dalam hal baikt
danb
! perintah melompat ke posisi label. Plus, kode sed harus bekerja untuk setidaknya satu versi sed, mirip dengan bahasa lain, jadi Anda tidak perlu membuat kode yang juga berfungsi untuk BSD.PHP 7.1,
5855543735 byteCatatan: menggunakan pengkodean IBM-850
Jalankan seperti ini:
Penjelasan
Tweaks
-R
(yang menyediakan$argn
)sumber
Bean , 24 byte
Hexdump:
JavaScript Setara:
Maaf karena menginjak kakimu , Arnauld .
Penjelasan:
Membawa baris pertama masukan sebagai string diformat dalam
a
, dan menggantikan setiap digit diikuti oleh satu atau lebih!
dengan1
, sehingga sisanya bisaeval
'd oleh JavaScript.Coba demo , atau test suite
sumber