Melakukan review kode, saya menemukan kode berikut, yang menguji status kotak centang:
if (!isNotUnchecked()) { ... }
Saya harus melakukan brainstorming selama 30 menit untuk mengetahui status checkbox aktual yang diharapkan dari kode tersebut. Tolong tuliskan saya sebuah program yang dapat menyederhanakan ungkapan konyol ini!
Program harus menerima sebagai input string yang mewakili ekspresi untuk disederhanakan (misalnya !isNotUnchecked()
:). Program harus menampilkan ekspresi sederhana yang disamakan secara logis, baik isChecked()
atau !isChecked()
.
Nama metode dalam ekspresi input selalu dimulai dengan is
, berisi 0..n Not
, dan diakhiri dengan Checked()
atau Unchecked()
. Metode ini dapat diawali dengan sejumlah !
.
Contohnya
isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()
notunischecked
?isnotunchecked
misalnya.Jawaban:
Python , 51 byte
Cobalah online!
sumber
s[-8:]
'isC'+s[-8:]
byte lebih panjang dari'isChecked'
?s[-8:]
yang saya lakukan?hecked()
.Retina , 23 byte
Cobalah online!
Penjelasan
Berubah
Unchecked
menjadi!Checked
.Ubah semua
Not
menjadi!
. Kami sekarang mendapatkan sesuatu seperti!!!is!!!!Checked()
.Sortir semua kecocokan dari salah satu
is
atau!
. Karena! < is
, ini memindahkan semua!
ke awal string, jadi contoh di atas akan menjadi!!!!!!!isChecked()
.Hapus pasangan
!
untuk membatalkan negasi berulang.sumber
/// , 26 byte
Cobalah online!
Port jawaban Retina saya .
sumber
Python , 43 byte
Fungsi yang tidak disebutkan namanya mengambil string,
s
dan mengembalikan string.Cobalah online!
Tidak perlu memeriksa keberadaan karakter ketika
!
,,Not
danUn
semua memiliki tepat satu ordinal ganjil (danc
danC
keduanya ganjil), jadi simpulkan saja ordinals dan gunakan nilai modulo 2 untuk memutuskan apakah kita mau!
atau tidak.Selain itu bentuknya sama dengan jawaban xnor , karena saya tidak menemukan yang lebih baik. Berikut ini juga 43:
sumber
JavaScript (ES6),
5150 byteBekerja dengan mencari
!
,N
dann
karakter, yang membalikkan keadaan diperiksa.split
mengembalikan panjang array aneh secara default, jadi kami menambahkan!
kapansplit
panjangnya genap. Sunting: Disimpan 1 byte berkat @ETHproductions. Versi alternatif, juga untuk 50 byte:sumber
g
dalam edit terbaru./!|N/i
/!|N/
tanpai
pengubahRetina , 24 byte
Cobalah online!
sumber
Java 7,
10077 bytePerluasan:
Kode uji:
Coba di sini.
Keluaran:
sumber
Aceto , 49 byte
yadda yadda Hilbert curve.
Pertama-tama, kami mendorong tiga karakter penting di tumpukan:
Kemudian kami menetapkan tanda tangkap dan mulai dengan membaca satu karakter. Kami
d
menggandakan dan meniadakannya, dan jika hasil ini benar (jadi jika string kosong; maka input berakhir), kami melompat ke akhir:Dengan sisa salinan karakter input, kami memeriksa apakah itu terdapat dalam sisa tumpukan (yaitu jika salah satu dari!, N, U). Jika tidak, kami membuat kesalahan, melempar kami kembali ke tanda tangkapan kami di mana kami membaca karakter lain:
Jika tidak, kami memuat apa yang ada di penyimpanan cepat (pada dasarnya register yang awalnya merupakan string kosong; palsu), meniadakannya dan mengirimkannya kembali ke penyimpanan cepat, kemudian meningkatkan kesalahan juga (kembali ke membaca karakter):
Ketika input berhenti, kami dikirim ke ujung. Di sana, kami membalikkan arah, mendorong tanda seru, dan memuat penyimpanan cepat dan meniadakannya. Jika itu benar (yaitu, kami memiliki banyak hal negasi), kami mencetak tanda seru yang kami dorong:
Akhirnya, kami mendorong string menjadi dua bagian dan mencetaknya (untuk alasan penghematan tempat):
Setelah itu, program masih berjalan kembali ke awal yang asli, tetapi karena tidak ada perintah yang menghasilkan apa pun atau memiliki perilaku gila, itu tidak masalah. Sebenarnya, perintah non-nopping pertama yang kita capai menimbulkan pengecualian, melewatkan sebagian besar kode karena kita melompat ke tanda tangkap, artinya semua yang dilihat Aceto di bagian itu adalah:
Karena
U
sekarang tidak diawali dengan karakter single-quote dan karena itu tidak dilihat sebagai karakter literal, hal itu akan ditafsirkan sebagai perintah:U
membalikkan semua elemen pada stack (sekarang itu!
,N
,U
, dari atas), dan'N
dan'!
mendorong lebih karakter, artinya kita akhiri dengan tumpukan[U, N, !, N, !]
.Catatan tambahan: Ini adalah program Aceto pertama yang ditulis (sebagian) dengan bantuan editor baru Aceto .
sumber
C,
787068 BytesChristoph terima kasih!
Cobalah online
Keluaran:
sumber
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}
menggunakan xor untuk flipc
menghemat 2 byte.Perl 5 , 31 byte
-2 byte terima kasih kepada @Dom Hastings .
30 byte kode +
-p
bendera.Cobalah online!
y/UN!//
menghitung jumlah kejadianUn
,Not
dan!
. Hasilnya adalah banyak!
modulo 2, diikuti olehisChecked()
.Upaya lain, berdasarkan regex, selama 38 byte (Dom Hastings menyimpan 1 byte pada yang itu):
Cobalah online!
sumber
c
s diUnchecked
./g
flag). Kasing uji terlihat bagus untuk saya (lihat tautan TryItOnline). Jadi saya tidak benar-benar mengerti apa yang Anda maksud ...c
diUnchecked
dalamnyaChecked
, jadi ketika Anda menggantinya Anda berakhir denganCheCked
.Scala ,
3930 byteCobalah online!
Sayangnya saya tidak bisa mendapatkannya untuk menyimpulkan tipe s.
Sunting: Memindahkan deklarasi tipe ke header (saya pikir ini diperbolehkan, jika tidak saya akan mengembalikannya).
sumber
Ruby , 40 byte
Cobalah online!
sumber
05AB1E , 22 byte
Cobalah online!
sumber
05AB1E , 16 byte
Cobalah online!
Menggunakan trik menjumlahkan tata cara dari jawaban python Jonathan Allan .
Penjelasan
sumber
Japt ,
2423 bytePenjelasan
Cobalah online!
sumber
o
case-sensitive? Saya tidak tahu bahwa ...PHP (5.5 - 5.6),
525049 BytesCoba di sini .
PHP (> = 5.5),
666561Tanpa regex ia mendapat sedikit lebih banyak :) :) Coba di sini .
sumber
error_reporting
nilai default adalahE_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED
.$b^=$a
Sangat bagus ditemukan! Anda juga dapat melakukannya tanpa tag PHP pada ukuran yang sama.for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Jelly ,
1615 byteProgram lengkap yang menggunakan string sebagai argumen baris perintah dan mencetak hasilnya
Cobalah online!
OSḂ⁾!iṫ-7³ṫṭ⁾sC
atauOSḂ⁾!iṫ-7³ṫ⁾sC;
keduanya juga akan bekerja untuk 15.Bagaimana?
Menggunakan ide yang sama dengan jawaban Python saya , tetapi menyimpan byte menggunakan konstruksi berbeda
!isC
atauisC
dan beberapa pencetakan implisit dalam Jelly ...sebelumnya @ 16 byte 9 (menggunakan penggabungan dan pemasangan dengan ide dasar yang sama):
sumber
OS1&”!x;“isC”;ṫ-7$
Perl 6 ,
3531 byteCobalah
Cobalah
(membutuhkan string input yang dapat diubah yang akan dimutilasi)
Diperluas:
sumber
Sed, 36 Bytes
Gagasan yang sama dengan semua jawaban substitusi langsung lainnya.
sumber
sed,
3738 byte37 +1 untuk
-r
sakelar:sumber
s/c/C/
menyebabkan masalah untuk jawaban Perl 5 ...s/c/C/
menangkap "c" kedua dalam kasus tanpa "Un"g
dan memindahkan bagians/!!//
dalam loop.Mathematica,
826160 BytesTweak kecil, tambah satu lagi operator infiks:
Sebelumnya:
Hitung semua o, n, dan! Lalu mod 2 dan masukkan sebanyak itu! di depan.
Versi lama:
sumber
Excel, 90 byte
sumber
Windows Batch, 120 byte
Sebelumnya 268 257 253 245 239 221 182 176 169 123 byte
Program menggantikan semua
!
menjadiN#
. Karena sekarang semua tanda negasi,! (Sekarang sudahN#
),,Not
danUn
berisiN
, program ini dapat menghitung jumlah kemunculanN
dan menentukan apakah sebuah pemimpin!
diperlukan.Setiap kali program menghitung
N
, penghitung ditambahkan oleh 5. Alasan untuk menambahkan 5 adalah karena setiap nilai bergantian ketika menambahkan 5 berakhir di 0 atau 5. Ini dapat digunakan untuk menentukan apakah nilainya ganjil atau genap dan terdepan!
kami menambahkan jika diperlukan.Selain itu, trik delapan karakter terakhir xnor digunakan.
sumber
Jelly ,
29282521 byteCobalah online!
-4 byte terima kasih kepada Jonathan Allan!
-4 byte terima kasih kepada Jonathan Allan! (dengan menggunakan string terkompresi)
sumber
jellyCompress.Compress().string("is").dictionary("Checked").string("()").go()
. (Jika Anda menjalankan Windows cmd, instal dan alihkan ke font DejaVu Sans Mono dan ubah codepage dengan perintahchcp 65001
sebelum meluncurkan Python untuk menampilkan karakter)PHP, 55 Bytes
Cobalah online!
PHP, 58 Bytes
sebagai gantinya
"#[!NU]#"
Anda dapat menggunakan"#[!N]#i"
Cobalah online!
PHP, 68 Bytes
Versi tanpa Regex
Cobalah online!
sumber
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()
-2 bytecount(split())
: D @Titus ide bagus!" !"[$d&1]
menyimpan byte lain jika spasi putih terkemuka ok.$d^=!trim($c,"UN!")
menghemat 3 byte (karena Anda tidak perlu&1
lagi)."!"[!$d]
sebaliknyaJapt , 19 byte
Cobalah online!
Dibongkar & Cara kerjanya
Menggunakan trik charcode-sum dari solusi Python Jonathan Allan's .
sumber
Pascal (FPC) , 119 byte
Cobalah online!
Menggunakan metode yang hampir setiap jawaban lakukan, menjumlahkan codepoint karakter dalam input, lalu memeriksa paritas jumlah.
sumber