Là hộp kiểm không không được bỏ chọn?


65

Khi xem lại mã, tôi tình cờ tìm thấy đoạn mã sau, kiểm tra trạng thái của hộp kiểm:

if (!isNotUnchecked()) { ... }

Tôi đã phải động não trong 30 phút để tìm hiểu tình trạng hộp kiểm thực tế mà mã đang mong đợi. Hãy viết cho tôi một chương trình có thể đơn giản hóa những biểu hiện ngớ ngẩn này!


Chương trình nên chấp nhận làm đầu vào một chuỗi biểu thị biểu thức để đơn giản hóa (ví dụ !isNotUnchecked():). Chương trình sẽ xuất ra một biểu thức đơn giản hóa tương đương logic, isChecked()hoặc !isChecked().

Tên phương thức trong biểu thức nhập luôn bắt đầu bằng is, chứa 0..n Notvà kết thúc bằng Checked()hoặc Unchecked(). Phương thức có thể được bắt đầu bằng bất kỳ số lượng nào !.

Ví dụ

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()

Là văn bản luôn luôn phân biệt chữ hoa chữ thường? Đầu vào sẽ là notunischecked?
stevefestl

1
@SteveFest Không, bạn có thể giả sử đầu vào luôn ở định dạng mà tôi đã mô tả ở trên. Bạn không cần phải xử lý isnotuncheckedchẳng hạn.
Arnaud

6
Với một tên hàm như vậy tôi sẽ đặt cho nó tỷ lệ cược 10 đến 1 mà nó thậm chí không thực sự kiểm tra điều kiện đã kiểm tra phù hợp với cách đặt tên của nó.
Caleb

2
Nói cách khác, bạn biết hộp nào không được chọn, bạn biết hộp nào không được chọn (hộp được chọn, nếu và chỉ khi "được chọn" và "không được chọn" là hai trạng thái duy nhất có thể, nếu không nó có thể là bất cứ thứ gì trong hộp kiểm: int, ký ...) và đối với hộp kiểm cụ thể này, nó không phải (nó không phải là "được kiểm tra", cho dù đó là với dấu kiểm hay bất cứ thứ gì). Nếu đúng thì bạn chắc chắn rằng hộp kiểm không bị "kiểm tra" bởi bất cứ điều gì. Nếu sai, bạn biết hộp kiểm là một hộp không được chọn nhưng điều đó không nhất thiết có nghĩa là nó được chọn trừ khi chỉ có hai trạng thái có thể xảy ra (sau đó nó được chọn).
J Doe

1
@J Doe cảm ơn đã làm rõ!
Arnaud

Câu trả lời:


31

Python , 51 byte

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

Hãy thử trực tuyến!


Bạn là một thiên tài thuần túy! Sẽ không bao giờ nghĩ đếns[-8:]
Ông Xcoder

Chắc chắn 'isC'+s[-8:]là một byte dài hơn 'isChecked'?
Neil

9
nhưng ngắn hơn 1 byte so với 'isChecked ()'
Andrew Smith

Ai đó có thể giải thích những gì s[-8:]đang / không?
ESR

1
@EdmundReed Phải mất 8 ký tự cuối cùng của đầu vào, luôn luôn hecked().
xnor

24

Võng mạc , 23 byte

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

Hãy thử trực tuyến!

Giải trình

Unc
!C

Biến Uncheckedthành !Checked.

Not
!

Biến tất cả Notthành s !. Bây giờ chúng tôi nhận được một cái gì đó như !!!is!!!!Checked().

O`is|!

Sắp xếp tất cả các trận đấu của một trong hai ishoặc !. Vì ! < is, điều này di chuyển tất cả !từ đầu chuỗi, vì vậy ví dụ trên sẽ trở thành !!!!!!!isChecked().

!!

Hủy bỏ các cặp !để hủy bỏ phủ định lặp đi lặp lại.



13

Python , 43 byte

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

Một hàm không tên lấy chuỗi svà trả về một chuỗi.

Hãy thử trực tuyến!

Không cần phải kiểm tra sự tồn tại của nhân vật khi !, NotUntất cả đều có đúng một thứ kỳ lạ (và cCđều lẻ), vì vậy chỉ cần tổng hợp các ordinals và sử dụng giá trị modulo 2 để quyết định nếu chúng ta muốn có một !hay không.

Ngoài ra, hình thức này giống như câu trả lời của xnor , vì tôi không tìm thấy gì tốt hơn. Sau đây cũng là 43:

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

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>

Hoạt động bằng cách tìm kiếm !, Nnnhân vật, trong đó đảo ngược tình trạng kiểm tra. splittrả về một chiều dài mảng lẻ theo mặc định, vì vậy chúng tôi thêm vào !khi splitđộ dài bằng nhau. Chỉnh sửa: Đã lưu 1 byte nhờ @ETHproductions. Phiên bản thay thế, cũng cho 50 byte:

s=>`${s.split(/!|n/i).length%2?``:`!`}isChecked()`

Huh, bây giờ tôi quay lại và xem các câu trả lời khác, tất cả họ đang làm điều này.
Neil

Bạn sẽ có thể thả cờ toàn cầu từ RegEx để lưu một byte.
Xù xì

@Shaggy Thật ra độ dài của tôi là chính xác, tôi chỉ không thể xóa gbản chỉnh sửa mới nhất.
Neil

1
Tôi nghĩ bạn có thể lưu một byte bằng/!|N/i
ETHproductions

@ETHproductions Tôi nghĩ bạn có nghĩa là /!|N/không có công cụ isửa đổi
SplittyDev


7

Java 7, 100 77 byte

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

Mở rộng:

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

Mã kiểm tra:

Hãy thử nó ở đây.

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()"));
  }
}

Đầu ra:

isChecked()
!isChecked()
!isChecked()
isChecked()
isChecked()

7

Aceto , 49 byte

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

đường cong yadda yadda Hilbert.

Trước hết, chúng tôi đẩy ba nhân vật quan trọng trên ngăn xếp:

!'
'N'U

Sau đó, chúng tôi đặt một dấu bắt và bắt đầu bằng cách đọc một ký tự. Chúng tôi phản đối dnó và phủ nhận nó, và nếu kết quả của điều này là đúng (vì vậy nếu chuỗi trống; vì vậy đầu vào kết thúc), chúng tôi sẽ nhảy đến cuối:

;`
d!
,@

Với bản sao còn lại của ký tự đầu vào, chúng tôi kiểm tra xem nó có được chứa trong phần còn lại của ngăn xếp không (tức là nếu nó là một trong !, N, U). Nếu không, chúng tôi sẽ đưa ra một lỗi, đưa chúng tôi trở lại điểm đánh dấu của chúng tôi, nơi chúng tôi đọc một nhân vật khác:

&c
`!

Mặt khác, chúng tôi tải những gì trên bộ lưu trữ nhanh (về cơ bản là một thanh ghi ban đầu là một chuỗi trống; giả mạo), phủ nhận nó và gửi lại cho bộ lưu trữ nhanh, sau đó cũng đưa ra lỗi (quay lại đọc các ký tự):

&M
L!

Khi đầu vào dừng lại, chúng tôi được gửi đến cuối. Ở đó, chúng tôi đảo ngược hướng, đẩy dấu chấm than và tải lưu trữ nhanh và phủ nhận nó. Nếu đó là sự thật (tức là chúng tôi đã có một số lượng điều phủ định lẻ), chúng tôi sẽ in dấu chấm than mà chúng tôi đã đẩy:

p !'
`!Lu

Cuối cùng, chúng tôi đẩy chuỗi thành hai phần và in chúng (vì lý do tiết kiệm không gian):

"pp"
)(de
  Che"
  sick
   "

Sau đó, chương trình vẫn chạy trở lại ban đầu, nhưng vì không có lệnh nào tạo ra bất cứ điều gì hoặc có hành vi khập khiễng, điều đó không thành vấn đề. Trên thực tế, lệnh không đầu tiên mà chúng ta đạt được sẽ tạo ra một ngoại lệ, bỏ qua phần lớn mã vì chúng ta nhảy đến dấu bắt, nghĩa là tất cả những gì Aceto thấy trong phần đó là:

&



!' @
'N'U

Kể từ Ubây giờ không preceeded bởi một nhân vật đơn báo giá và do đó không được coi là một nhân vật theo nghĩa đen, nó được hiểu như là một lệnh: Uđảo ngược tất cả các yếu tố trên stack (bây giờ là !, N, U, từ trên xuống), và 'N'!đẩy hơn ký tự, có nghĩa là chúng ta kết thúc với ngăn xếp [U, N, !, N, !].

Lưu ý bên lề: Đây là chương trình Aceto đầu tiên được viết (một phần) với sự trợ giúp của biên tập viên mới của Aceto .


6

C, 78 70 68 byte

Cảm ơn bạn Christoph!

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

Dùng thử trực tuyến

Đầu ra:

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()

1
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}sử dụng xor để lật cgiúp tiết kiệm 2 byte.
Christoph

6

Perl 5 , 31 byte

-2 byte nhờ @Dom Hastings .

30 byte mã + -pcờ.

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

Hãy thử trực tuyến!

y/UN!//đếm số lần xuất hiện của Un, Not!. Kết quả là nhiều !modulo 2, tiếp theo là isChecked().


Một nỗ lực khác, dựa trên regex, cho 38 byte (Dom Hastings đã lưu 1 byte trên đó):

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

Hãy thử trực tuyến!


Phiên bản regex của bạn không hoạt động vì có hai cs Unchecked.
Neil

1
@Neil regex chỉ thay thế cái đầu tiên (vì tôi không sử dụng /gcờ). Các trường hợp thử nghiệm có vẻ tốt với tôi (cf liên kết TryItOnline). Vì vậy, tôi không thực sự hiểu ý của bạn ...
Dada

Xin lỗi, lý do chính xác khiến phiên bản regex của bạn không hoạt động là vì mặc dù có một ctrong Uncheckedđó cũng có một trong đó Checked, vì vậy khi bạn đăng ký nó, bạn sẽ kết thúc CheCked.
Neil

1
Hey, hy vọng bạn đang làm tốt! Tôi đã không ở đây trong một thời gian, nhưng tôi đã có một chút chơi với những thứ này cho -2 vào lần đầu tiên và -1 vào lần thứ hai
Dom Hastings

1
@DomHastings Này! Tuyệt vời, cảm ơn rất nhiều! Rất vui khi gặp lại bạn :-)
Dada

6

Scala , 39 30 byte

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

Hãy thử trực tuyến!

Thật không may, tôi không thể lấy nó để suy ra loại s.

Chỉnh sửa: Đã di chuyển khai báo kiểu vào tiêu đề (Tôi nghĩ rằng điều này được cho phép, nếu không tôi sẽ đặt lại).





3

Japt , 24 23 byte

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

Giải trình

 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()"

Hãy thử trực tuyến!


1
Đợi đã ... Làm thế nào ... Tại sao ... Không ophân biệt chữ hoa chữ thường? Tôi không biết rằng ...
Sản phẩm điện tử

Tôi cũng không biết, nhưng tôi phát hiện ra khi tôi thử nghiệm với "! NU". Chữ thường "n" trong "Không được chọn" vẫn còn, vì vậy tôi có thể bỏ chữ "U" :)
Luke

3

PHP (5,5 - 5,6), 52 50 49 byte

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

Hãy thử nó ở đây .

-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()";

Nếu không có regex, nó sẽ có thêm một chút compex :) Hãy thử ở đây .

-4 Bytes by @Titus. Ty :)

1
error_reportinggiá trị mặc định là E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED.
Tít

1
@Titus đánh bại JS trong một thử thách regex yay!
Christoph

$b^=$aRất đẹp tìm thấy! Bạn cũng có thể làm điều đó mà không cần các thẻ PHP ở cùng kích thước.
Tít

1
61 byte nếu khoảng trắng hàng đầu được cho phép:for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Titus

@Titus Tôi phải thừa nhận rằng nó được lấy cảm hứng từ câu trả lời này .
Christoph

3

Thạch ,  16  15 byte

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

Một chương trình đầy đủ lấy chuỗi làm đối số dòng lệnh và in kết quả

Hãy thử trực tuyến!

OSḂ⁾!iṫ-7³ṫṭ⁾sChoặc OSḂ⁾!iṫ-7³ṫ⁾sC;cả hai cũng sẽ làm việc cho 15.

Làm sao?

Sử dụng cùng một ý tưởng với câu trả lời Python của tôi , nhưng lưu byte bằng cách sử dụng một cấu trúc khác !isChoặc hoặc isCmột số in ngầm trong 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()")

@ 16 byte 9 trước đó (sử dụng nối và ghép với cùng một ý tưởng cơ bản):

OSḂ⁾!iṫ;⁾sC,ṫ€-7

Ah, chết tiệt, tôi nghĩ rằng tôi đã làm điều gì đó với thủ thuật mod 2. Sau đó, tôi tìm thấy cái này: PI có cái này trong 18 byte, có lẽ nó có thể giúp:OS1&”!x;“isC”;ṫ-7$
Conor O'Brien

2

Perl 6 ,  35  31 byte

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

Thử nó

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

Hãy thử nó
(yêu cầu chuỗi đầu vào có thể thay đổi sẽ bị cắt xén)

Mở rộng:

{
  #(
    '!'
  x               # string repeat

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

  ~                # string concat

    'isChecked()'
}

2

Sed, 36 byte

Cùng một ý tưởng như tất cả các câu trả lời thay thế trực tiếp khác.

:
s/Unc/NotC/
s/isNot/!is/
s/!!//
t

2

sed, 37 38 byte

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

37 + 1 cho -rcông tắc:

sed -r ':;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/'

1
Điều đó s/c/C/đã gây ra vấn đề cho câu trả lời Perl 5 ...
Neil

Vâng, có vẻ như s/c/C/là bắt được "c" thứ hai trong trường hợp không có "Un"
Kevin

1
Ngoài ra, bạn có thể lưu một byte bằng cách thả gvà di chuyển s/!!//bên trong vòng lặp.
Kevin

2

Toán học, 82 61 60 byte

Tinh chỉnh nhỏ, thêm một toán tử infix:

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

Trước đây:

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

Đếm tất cả các o, n và! Sau đó là mod 2 và đặt thật nhiều! ở phía trước

Phiên bản cũ:

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

2

Excel, 90 byte

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

2

Batch Windows, 120 byte

Trước đây là 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%

Các chương trình thay thế tất cả !vào N#. Bởi vì bây giờ tất cả các dấu hiệu phủ định ,! (Bây giờ là N#), NotUncó chứa N, chương trình có thể đếm số lần xuất hiện Nvà xác định xem có !cần phải dẫn đầu hay không .

Mỗi khi chương trình đếm một N, bộ đếm được thêm vào 5. Lý do thêm 5 là vì mỗi giá trị xen kẽ khi thêm 5 kết thúc bằng 0 hoặc 5. Điều này có thể được sử dụng để xác định xem giá trị là số lẻ hay chẵn và dẫn đầu !chúng tôi thêm nếu cần.

Ngoài ra, thủ thuật tám ký tự cuối cùng của xnor được sử dụng.



Tất nhiên ...... Kịch bản hàng loạt là vô lý ....
stevefestl

1

Thạch , 29 28 25 21 byte

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

Hãy thử trực tuyến!

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 nhờ Jonathan Allan!
-4 byte nhờ Jonathan Allan! (bằng cách sử dụng chuỗi nén)


Lưu giao diện mà Lynn thực hiện ở đây dưới dạng một mô-đun (giả sử là JellyCompress.py), sau đó sẽ được hình thành với jellyCompress.Compress().string("is").dictionary("Checked").string("()").go(). (Nếu bạn đang chạy trong cài đặt cmd của Windows và chuyển sang phông chữ DejaVu Sans Mono và thay đổi bảng mã bằng lệnh chcp 65001trước khi khởi chạy Python để hiển thị các ký tự)
Jonathan Allan

@Jonathan ALLan ơi được rồi. Cảm ơn!
HyperNeutrino

1

PHP, 55 byte

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

Hãy thử trực tuyến!

PHP, 58 byte

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

thay vào đó "#[!NU]#"bạn có thể sử dụng"#[!N]#i"

Hãy thử trực tuyến!

PHP, 68 byte

Phiên bản không có Regex

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

Hãy thử trực tuyến!


3
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()-2 byte
Tít

Có chính xác câu trả lời trước khi tôi nghĩ ra count(split()): D @Titus ý tưởng hay!
Christoph

1
" !"[$d&1]lưu một byte khác nếu khoảng trắng hàng đầu là ok. $d^=!trim($c,"UN!")tiết kiệm 3 byte (vì bạn không cần &1nữa).
Tít

1
@Titus Có một ví dụ nữa là bạn có nhiều kiến ​​thức hơn bản thân mình. Cảm ơn bạn và vì vấn đề khoảng trắng kéo dài mà tôi đã thực hiện "!"[!$d]thay vào đó
Jörg Hülsermann

1
@Christoph bạn nói đúng Tôi đã quên nó xin lỗi về điều đó
Jörg Hülsermann

1

Japt , 19 byte

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

Hãy thử trực tuyến!

Giải nén & Cách thức hoạt động

`‰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

Sử dụng thủ thuật tổng hợp mã từ giải pháp Python của Jonathan Allan .


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.

Hãy thử trực tuyến!

Sử dụng phương pháp mà hầu hết mọi câu trả lời đều thực hiện, tổng hợp các điểm mã của các ký tự trong đầu vào, sau đó kiểm tra tính chẵn lẻ của tổng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.