Apakah kotak centang tidak dicentang?

65

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()
Arnaud
sumber
Apakah teks selalu peka huruf besar-kecil? Apakah inputnya notunischecked?
stevefestl
1
@SteveFest Tidak, Anda dapat menganggap input selalu dalam format yang telah saya jelaskan di atas. Anda tidak perlu menangani isnotuncheckedmisalnya.
Arnaud
6
Dengan nama fungsi seperti itu, saya akan memberikannya peluang 10 hingga 1 yang bahkan tidak benar-benar menguji kondisi yang diperiksa sesuai dengan penamaannya.
Caleb
2
Dengan kata lain, Anda tahu apa itu kotak yang tidak dicentang, Anda tahu apa itu kotak yang tidak dicentang (dicentang, jika dan hanya jika "dicentang" dan "tidak dicentang" adalah satu-satunya keadaan yang memungkinkan, jika tidak, itu bisa berupa apa saja di checkbox: int, sign ...) dan untuk checkbox khusus ini, itu bukan (tidak "dicentang", apakah itu dengan tanda centang atau apa pun). Jika benar, Anda yakin bahwa kotak centang tidak "dicentang" oleh apa pun. Jika salah, yah, Anda tahu bahwa kotak centang adalah kotak yang tidak dicentang tetapi itu tidak berarti dicentang kecuali hanya ada dua kemungkinan kondisi (maka dicentang).
J Doe
1
@J Doe terima kasih atas klarifikasi!
Arnaud

Jawaban:

31

Python , 51 byte

lambda s:sum(map(s.count,'!NU'))%2*'!'+'isC'+s[-8:]

Cobalah online!

Tidak
sumber
Anda adalah seorang jenius murni! Tidak akan pernah terpikirs[-8:]
Tn. Xcoder
Tentunya 'isC'+s[-8:]byte lebih panjang dari 'isChecked'?
Neil
9
tetapi 1 byte lebih pendek dari 'isChecked ()'
Andrew Smith
Adakah yang bisa menjelaskan apa s[-8:]yang saya lakukan?
ESR
1
@ EdmundReed Dibutuhkan 8 karakter input terakhir, yang selalu hecked().
xnor
24

Retina , 23 byte

Unc
!C
Not
!
O`is|!
!!

Cobalah online!

Penjelasan

Unc
!C

Berubah Uncheckedmenjadi !Checked.

Not
!

Ubah semua Notmenjadi !. Kami sekarang mendapatkan sesuatu seperti !!!is!!!!Checked().

O`is|!

Sortir semua kecocokan dari salah satu isatau !. Karena ! < is, ini memindahkan semua !ke awal string, jadi contoh di atas akan menjadi !!!!!!!isChecked().

!!

Hapus pasangan !untuk membatalkan negasi berulang.

Martin Ender
sumber
13

Python , 43 byte

lambda s:sum(map(ord,s))%2*'!'+'isC'+s[-8:]

Fungsi yang tidak disebutkan namanya mengambil string, sdan mengembalikan string.

Cobalah online!

Tidak perlu memeriksa keberadaan karakter ketika !,, Notdan Unsemua memiliki tepat satu ordinal ganjil (dan cdan Ckeduanya 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:

lambda s:'!isC'[~sum(map(ord,s))%2:]+s[-8:]
Jonathan Allan
sumber
10

JavaScript (ES6), 51 50 byte

f=
s=>(s.split(/!|n/i).length%2?'':'!')+'isChecked()'
<input oninput=o.textContent=f(this.value)><pre id=o>

Bekerja dengan mencari !, Ndan nkarakter, yang membalikkan keadaan diperiksa. splitmengembalikan panjang array aneh secara default, jadi kami menambahkan !kapan splitpanjangnya genap. Sunting: Disimpan 1 byte berkat @ETHproductions. Versi alternatif, juga untuk 50 byte:

s=>`${s.split(/!|n/i).length%2?``:`!`}isChecked()`
Neil
sumber
Huh, sekarang saya kembali dan melihat jawaban yang lain, mereka semua melakukan ini.
Neil
Anda harus dapat melepaskan flag global dari RegEx untuk menyimpan byte.
Shaggy
@ Shaggy Sebenarnya panjang saya benar, saya hanya gagal menghapus gdalam edit terbaru.
Neil
1
Saya pikir Anda dapat menyimpan byte dengan/!|N/i
ETHproduksi
@ ETHproductions Saya pikir maksud Anda /!|N/tanpa ipengubah
SplittyDev
7

Java 7, 100 77 byte

String c(String s){return(s.split("[!NU]").length%2<1?"!":"")+"isChecked()";}

Perluasan:

String c(String s){  // Method with String parameter and String return-type
  return(s.split("[!NU]").length
                     //  Count the amount of '!', 'N' and 'U' in the input String (+ 1)
    %2<1?            //  and if they are an even number:
     "!"             //   Start with an examination mark
    :                //  Else:
     "")             //   Start with nothing
    +"isChecked()";  //  And append "isChecked()" to that
}                    // End of method

Kode uji:

Coba di sini.

class M{
  static String c(String s){return(s.split("[!NU]").length%2<1?"!":"")+"isChecked()";}

  public static void main(String[] a){
    System.out.println(c("isChecked()"));
    System.out.println(c("isUnchecked()"));
    System.out.println(c("isNotChecked()"));
    System.out.println(c("!isNotChecked()"));
    System.out.println(c("!!!isNotNotUnchecked()"));
  }
}

Keluaran:

isChecked()
!isChecked()
!isChecked()
isChecked()
isChecked()
Kevin Cruijssen
sumber
7

Aceto , 49 byte

&M"pp"
L!)(de
&c;`Che"
`!d!sick
!',@p"!'
'N'U`!Lu

yadda yadda Hilbert curve.

Pertama-tama, kami mendorong tiga karakter penting di tumpukan:

!'
'N'U

Kemudian kami menetapkan tanda tangkap dan mulai dengan membaca satu karakter. Kami dmenggandakan dan meniadakannya, dan jika hasil ini benar (jadi jika string kosong; maka input berakhir), kami melompat ke akhir:

;`
d!
,@

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:

&c
`!

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):

&M
L!

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:

p !'
`!Lu

Akhirnya, kami mendorong string menjadi dua bagian dan mencetaknya (untuk alasan penghematan tempat):

"pp"
)(de
  Che"
  sick
   "

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:

&



!' @
'N'U

Karena Usekarang tidak diawali dengan karakter single-quote dan karena itu tidak dilihat sebagai karakter literal, hal itu akan ditafsirkan sebagai perintah: Umembalikkan semua elemen pada stack (sekarang itu !, N, U, dari atas), dan 'Ndan '!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 .

L3viathan
sumber
6

C, 78 70 68 Bytes

Christoph terima kasih!

c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}

Cobalah online

Keluaran:

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()
Johan du Toit
sumber
1
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}menggunakan xor untuk flip cmenghemat 2 byte.
Christoph
6

Perl 5 , 31 byte

-2 byte terima kasih kepada @Dom Hastings .

30 byte kode + -pbendera.

/c/i;$_="!"x(y/UN!//%2).isC.$'

Cobalah online!

y/UN!//menghitung jumlah kejadian Un, Notdan !. Hasilnya adalah banyak !modulo 2, diikuti oleh isChecked().


Upaya lain, berdasarkan regex, selama 38 byte (Dom Hastings menyimpan 1 byte pada yang itu):

s/isNot|isUn(c)/!is\u$1/?redo:s/!!//g

Cobalah online!

Dada
sumber
Versi regex Anda tidak berfungsi karena ada dua cs di Unchecked.
Neil
1
@Neil regex hanya menggantikan yang pertama (karena saya tidak menggunakan /gflag). Kasing uji terlihat bagus untuk saya (lihat tautan TryItOnline). Jadi saya tidak benar-benar mengerti apa yang Anda maksud ...
Dada
Maaf, alasan yang benar bahwa versi regex Anda tidak berfungsi adalah bahwa meskipun ada juga ada cdi Uncheckeddalamnya Checked, jadi ketika Anda menggantinya Anda berakhir dengan CheCked.
Neil
1
Hei, semoga kamu baik-baik saja! Saya belum pernah ke sini sebentar, tapi saya sudah bermain-main dengan ini untuk -2 pada yang pertama dan -1 pada yang kedua
Dom Hastings
1
@HomHastings Hey! Luar biasa, terima kasih banyak! Senang melihat Anda kembali sekitar :-)
Dada
6

Scala , 39 30 byte

s=>"!"*(s.sum%2)+"isChecked()"

Cobalah 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).

musicman523
sumber
5

Ruby , 40 byte

->x{?!*(x.count('!UN')%2)+'isChecked()'}

Cobalah online!

Alex
sumber
Selamat datang di PPCG! Jawaban bagus. :)
Martin Ender
@ MartinEnder terima kasih!
Alex
3

05AB1E , 16 byte

ÇOÉ'!×…isCyR8£RJ

Cobalah online!

Menggunakan trik menjumlahkan tata cara dari jawaban python Jonathan Allan .

Penjelasan

 ÇO                # sum of ascii values of input
   É               # is odd
    '!×            # repeat "!" that many times
       …isC        # push the string "isC"
           IR8£R   # push the last 8 chars of input
                J  # join everything to string
Emigna
sumber
3

Japt , 24 23 byte

o"!N" l u)ç'! +`‰C”×B()

Penjelasan

 o"!N" l u)ç'! +`‰C”×B()
Uo"!N" l u)ç'! +`‰C”×B()`
Uo"!N"                     # Only keep "!", "n" and "N" from the input
           ç'!             # Repeat the string "!" by
       l u)                # the parity of the length of the newly formed string
               +`‰C”×B()` # and concatenate with the string "isChecked()"

Cobalah online!

Luke
sumber
1
Tunggu ... Bagaimana ... Mengapa ... Apakah ocase-sensitive? Saya tidak tahu bahwa ...
ETHproduksi
Saya juga tidak tahu, tapi saya tahu ketika saya diuji dengan "! NU". Huruf kecil "n" dalam "Unchecked" juga tetap ada, jadi saya bisa menghapus "U"
Luke
3

PHP (5.5 - 5.6), 52 50 49 Bytes

<?='!'[count(spliti('!|N',$argn))%2]?>isChecked()

Coba di sini .

-2 Bytes by @Titus. Ty :)
-1 Byte  by @ETHproductions. Ty :)

PHP (> = 5.5), 66 65 61

for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";

Tanpa regex ia mendapat sedikit lebih banyak :) :) Coba di sini .

-4 Bytes by @Titus. Ty :)
Christoph
sumber
1
error_reportingnilai default adalah E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED.
Titus
1
@Titus mengalahkan JS dalam tantangan regex yay!
Christoph
$b^=$aSangat bagus ditemukan! Anda juga dapat melakukannya tanpa tag PHP pada ukuran yang sama.
Titus
1
61 byte jika spasi putih dibolehkan:for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Titus
@Itus saya harus mengakui bahwa itu terinspirasi oleh jawaban ini .
Christoph
3

Jelly ,  16  15 byte

OSḂ⁾!iṫ⁾sCø³ṫ-7

Program lengkap yang menggunakan string sebagai argumen baris perintah dan mencetak hasilnya

Cobalah online!

OSḂ⁾!iṫ-7³ṫṭ⁾sCatau OSḂ⁾!iṫ-7³ṫ⁾sC;keduanya juga akan bekerja untuk 15.

Bagaimana?

Menggunakan ide yang sama dengan jawaban Python saya , tetapi menyimpan byte menggunakan konstruksi berbeda !isCatau isCdan beberapa pencetakan implisit dalam Jelly ...

OSḂ⁾!iṫ⁾sCø³ṫ-7 - Main link: s
O               - cast to ordinals
 S              - sum
  Ḃ             - mod 2
   ⁾!i          - literal ['!','i']
      ṫ         - tail -> ['i'] if OSḂ was 0; ['!','i'] if OSḂ was 1
                - this is printed due to the following starting a new leading
                - constant chain. Printing smashes so either "i" or "!i" is printed.
       ⁾sC      - literal ['s','C']
                - this is printed (as "sC") due to the following niladic chain.
          ø     - start a new niladic chain
           ³    - program's first input (3rd command line argument), s
            ṫ-7 - tail from index -7 = ['h','e','c','k','e','d','(',')']
                - implicit print (of "hecked()")

sebelumnya @ 16 byte 9 (menggunakan penggabungan dan pemasangan dengan ide dasar yang sama):

OSḂ⁾!iṫ;⁾sC,ṫ€-7
Jonathan Allan
sumber
Ah, sial, kupikir aku melakukan sesuatu dengan trik mod 2. Kemudian saya menemukan ini: PI memiliki ini selama 18 byte, mungkin itu bisa membantu:OS1&”!x;“isC”;ṫ-7$
Conor O'Brien
2

Perl 6 ,  35  31 byte

{'!'x m:g/<[!NU]>/%2~'isChecked()'}

Cobalah

{'!'x tr/!NU//%2~'isChecked()'}

Cobalah
(membutuhkan string input yang dapat diubah yang akan dimutilasi)

Diperluas:

{
  #(
    '!'
  x               # string repeat

    # m:g/<[!NU]>/
    tr/!NU//      # find the number of negatives
      % 2         # modulus 2
  #)

  ~                # string concat

    'isChecked()'
}
Brad Gilbert b2gills
sumber
2

Sed, 36 Bytes

Gagasan yang sama dengan semua jawaban substitusi langsung lainnya.

:
s/Unc/NotC/
s/isNot/!is/
s/!!//
t
Kevin
sumber
2

sed, 37 38 byte

:;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/

37 +1 untuk -rsakelar:

sed -r ':;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/'
F. Hauri
sumber
1
Yang terakhir itu s/c/C/menyebabkan masalah untuk jawaban Perl 5 ...
Neil
Ya, sepertinya s/c/C/menangkap "c" kedua dalam kasus tanpa "Un"
Kevin
1
Anda juga dapat menyimpan byte dengan menjatuhkan gdan memindahkan bagian s/!!//dalam loop.
Kevin
2

Mathematica, 82 61 60 Bytes

Tweak kecil, tambah satu lagi operator infiks:

"!"~Table~Mod[#~StringCount~{"o","n","!"},2]<>"isChecked()"&

Sebelumnya:

"!"~Table~Mod[StringCount[#,{"o","n","!"}],2]<>"isChecked()"&

Hitung semua o, n, dan! Lalu mod 2 dan masukkan sebanyak itu! di depan.

Versi lama:

"!"~Table~Mod[StringCount[StringReplace[#,{{"o","n"}->"!"}],"!"],2]<>"isChecked()"&
Ian Miller
sumber
2

Excel, 90 byte

=IF(ISODD(SEARCH("C",SUBSTITUTE(SUBSTITUTE(A1,"Un","!"),"Not","!"))),"","!")&"isChecked()"
Wernisch
sumber
2

Windows Batch, 120 byte

Sebelumnya 268 257 253 245 239 221 182 176 169 123 byte

@set a=%1
@set s=#%a:~,-2%
@set s=%s:!=N#%
@for %%a in (%s:N= %)do @set/ac+=5
@if %c:~-1%==0 cd|set/p=!
@echo isC%a:~-8%

Program menggantikan semua !menjadi N#. Karena sekarang semua tanda negasi,! (Sekarang sudah N#),, Notdan Unberisi N, program ini dapat menghitung jumlah kemunculan Ndan 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.

stevefestl
sumber
Orang akan berpikir pemrograman dalam batch windows tidak mungkin ...
NieDzejkob
Tentu saja ...... Batch scripting tidak masuk akal ....
stevefestl
1

Jelly , 29 28 25 21 byte

f“NU!”LḂ”!x;“µịÆẹṠƊẹ»

Cobalah online!

f“NU!”LḂ”!x;“µịÆẹṠƊẹ»  Main link, argument is z
f“NU!”                 Filter to only keep "NU!"
      LḂ”!x            Repeat exclamation mark by the parity of the length
           ;“µịÆẹṠƊẹ»  Concatenate to "isChecked()"

-4 byte terima kasih kepada Jonathan Allan!
-4 byte terima kasih kepada Jonathan Allan! (dengan menggunakan string terkompresi)

HyperNeutrino
sumber
Simpan antarmuka yang dibuat Lynn di sini sebagai modul (katakanlah jellyCompress.py), maka itu akan dibentuk dengan 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 perintah chcp 65001sebelum meluncurkan Python untuk menampilkan karakter)
Jonathan Allan
@ Jonathan Allan Oh oke. Terima kasih!
HyperNeutrino
1

PHP, 55 Bytes

<?=preg_match_all("#!|N#i",$argn)&1?"!":""?>isChecked()

Cobalah online!

PHP, 58 Bytes

<?=preg_match_all("#[!NU]#",$argn)%2?"!":"","isChecked()";

sebagai gantinya "#[!NU]#"Anda dapat menggunakan"#[!N]#i"

Cobalah online!

PHP, 68 Bytes

Versi tanpa Regex

for(;$c=$argn[$i++];)$d^=!trim($c,"UN!");echo"!"[!$d],"isChecked()";

Cobalah online!

Jörg Hülsermann
sumber
3
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()-2 byte
Titus
Memiliki jawaban yang persis sama sebelum saya datang dengan count(split()): D @Titus ide bagus!
Christoph
1
" !"[$d&1]menyimpan byte lain jika spasi putih terkemuka ok. $d^=!trim($c,"UN!")menghemat 3 byte (karena Anda tidak perlu &1lagi).
Titus
1
@Itus Ya satu contoh lagi bahwa Anda memiliki lebih banyak pengetahuan daripada diri saya sendiri. Terima kasih dan untuk masalah spasi membuntuti saya harus membuat "!"[!$d]sebaliknya
Jörg Hülsermann
1
@Christoph kau benar, aku sudah lupa maaf tentang hal itu
Jörg Hülsermann
1

Japt , 19 byte

`‰C”×B()`i'!pU¬xc u

Cobalah online!

Dibongkar & Cara kerjanya

`‰C”×B()`i'!pUq xc u

`‰C”×B()`   Compressed string for "isChecked()"
i     Insert the following string at the beginning...
'!p     "!" repeated the following number of times...
Uq        Split the input into chars
xc        Sum the charcodes
u         Modulo 2

Menggunakan trik charcode-sum dari solusi Python Jonathan Allan's .

Bubbler
sumber
1

Pascal (FPC) , 119 byte

var s:string;j:word;c:char;begin read(s);for c in s do j:=j+ord(c);if 1=j mod 2then write('!');write('isChecked()')end.

Cobalah online!

Menggunakan metode yang hampir setiap jawaban lakukan, menjumlahkan codepoint karakter dalam input, lalu memeriksa paritas jumlah.

AlexRacer
sumber