확인란이 선택되어 있지 않습니까?


65

코드 검토를 수행하면서 확인란의 상태를 테스트하는 다음 코드를 발견했습니다.

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

코드에서 예상되는 실제 확인란 상태를 확인하기 위해 30 분 동안 브레인 스토밍해야했습니다. 이 바보 같은 표현을 단순화 할 수있는 프로그램을 작성해주세요!


프로그램은 단순화를 위해 표현식을 나타내는 문자열을 입력으로 받아 들여야합니다 (예 :) !isNotUnchecked(). 프로그램은 하나의 출력 논리적으로 등가 단순화 표현을해야 isChecked()하거나 !isChecked().

입력 표현식의 메소드 이름은 항상로 시작 is하고 0..n을 포함 Not하며 Checked()또는로 끝납니다 Unchecked(). 이 방법은 접두사로 지정할 수 있습니다 !.

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

텍스트는 항상 대소 문자를 구분합니까? 입력이 notunischecked될까요?
stevefestl

1
@SteveFest 아니요, 입력이 항상 위에서 설명한 형식이라고 가정 할 수 있습니다. isnotunchecked예를 들어 처리 할 필요가 없습니다 .
Arnaud

6
그런 함수 이름을 사용하면 실제로 명명 된 조건과 일치하는 검사 된 조건을 테스트하지 않았을 가능성이 10 대 1입니다.
Caleb

2
다시 말해, 체크되지 않은 박스가 무엇인지, 체크되지 않은 박스가 무엇인지 알고 있습니다. 확인란 : int, sign ...) 및이 특정 확인란의 경우 확인란이 선택되어 있지 않습니다 (체크 표시가 있는지 여부에 관계없이 "확인되지 않음"). 그렇다면, 체크 박스가 아무 것도 "체크"되지 않았 음을 확신합니다. false 인 경우 확인란이 선택되지 않은 확인란이라는 것을 알고 있지만 가능한 두 개의 상태 (확인 된 상태)가없는 한 반드시 선택되었음을 의미하지는 않습니다.
J Doe

1
@J Doe 설명해 주셔서 감사합니다!
Arnaud

답변:


31

파이썬 , 51 바이트

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

온라인으로 사용해보십시오!


당신은 순수한 천재입니다! 생각하지 않을 것이다s[-8:]
씨 Xcoder

확실히 'isC'+s[-8:]바이트보다 길 'isChecked'습니까?
Neil

9
'isChecked ()'보다 1 바이트 짧음
Andrew Smith

누군가가 무엇 s[-8:]을 / 설명 할 수 있습니까 ?
ESR

1
@EdmundReed 입력의 마지막 8자를 사용합니다 hecked(). 항상 .
xnor

24

레티 나 , 23 바이트

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

온라인으로 사용해보십시오!

설명

Unc
!C

돌려 Unchecked으로 !Checked.

Not
!

모든을로 Not바꿉니다 !. 우리는 이제 다음과 같은 것을 얻습니다 !!!is!!!!Checked().

O`is|!

is또는 의 모든 일치 항목을 정렬하십시오 !. 이 때문에 ! < is모든 !문자열을 문자열의 시작 부분으로 이동 하므로 위의 예제는 !!!!!!!isChecked()입니다.

!!

!반복되는 부정을 취소하려면 쌍을 제거하십시오 .



13

파이썬 , 43 바이트

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

명명되지 않은 함수는 문자열을 가져 와서 문자열 s을 반환합니다.

온라인으로 사용해보십시오!

필요가 때 문자의 존재를 확인 없습니다 !, Not그리고 Un정확히 하나의 홀수 순서가 (그리고 모두 cC모두 홀수), 그래서 그냥 서수를 요약하고 우리가 원하는 여부를 결정하는 값 모듈 2를 사용 !여부.

그 외에는 더 나은 것을 찾지 못했기 때문에 양식이 xnor의 답변 과 동일 합니다. 다음도 43입니다 :

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

10

자바 스크립트 (ES6), 51 50 바이트

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

를 찾아 작동 !, Nn체크 상태를 반전 문자. split기본적으로 홀수 배열 길이를 반환하므로 길이가 짝수 일 !때를 추가합니다 split. 편집 : @ETHproductions 덕분에 1 바이트가 절약되었습니다. 50 바이트를위한 대체 버전 :

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

허, 이제 돌아가서 다른 답변을 봅니다. 모두이 일을하고 있습니다.
Neil

바이트를 저장하기 위해 RegEx에서 전역 플래그를 삭제할 수 있어야합니다.
Shaggy

@Shaggy 사실 내 길이가 정확 g합니다. 최근 편집에서 를 제거하지 못했습니다 .
Neil

1
나는 당신이 바이트를 절약 할 수 있다고 생각합니다/!|N/i
ETHproductions

@ETHproductions 수정 자 /!|N/없이 의미한다고 생각합니다i
SplittyDev


7

자바 7, 100 77 바이트

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

확장 :

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

테스트 코드 :

여기에서 시도하십시오.

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

산출:

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

7

아세토 , 49 바이트

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

yadda yadda 힐버트 곡선.

우선, 세 가지 중요한 캐릭터를 스택에 넣습니다.

!'
'N'U

그런 다음 캐치 마크를 설정하고 단일 문자를 읽는 것으로 시작합니다. 우리는 d그것을 복제하고 부정하고, 그 결과가 진실이라면 (그래서 문자열이 비어 있으면 입력이 종료되면) 끝으로 점프합니다.

;`
d!
,@

입력 문자의 나머지 사본을 사용하여 나머지 문자가 포함되어 있는지 확인합니다 (즉,!, N, U 중 하나 인 경우). 그렇지 않으면 오류가 발생하여 다른 문자를 읽는 캐치 마크로 되돌아갑니다.

&c
`!

그렇지 않으면, 우리는 빠른 저장 장치 (기본적으로 빈 문자열 인 거짓 레지스터)에로드하고 그것을 무시하고 빠른 저장 장치로 다시 보낸 다음 오류를 발생시킵니다 (문자 읽기로 돌아 가기).

&M
L!

입력이 멈 추면 끝으로 보내집니다. 여기에서 방향을 바꾸고 느낌표를 밀고 빠른 저장을로드하고 무효화합니다. 그것이 진실 인 경우 (즉, 우리는 홀수 개의 부정을 가졌을 때), 우리가 밀어 낸 느낌표를 인쇄합니다 :

p !'
`!Lu

마지막으로 문자열을 두 부분으로 밀고 인쇄합니다 (공간 절약을 위해).

"pp"
)(de
  Che"
  sick
   "

그 후에도 프로그램은 여전히 ​​원래 시작으로 돌아가지만 어떤 명령도 아무것도 출력하지 않거나 루프 동작이 없으므로 중요하지 않습니다. 실제로, 우리가 도달하는 첫 번째 non-nopping 명령은 예외를 발생시킵니다. 캐치 마크로 점프하기 때문에 대부분의 코드를 건너 뜁니다.

&



!' @
'N'U

때문에 U지금은 작은 따옴표 문자 덧붙일되지 않고, 따라서 리터럴 문자로 보이지 않는다, 그것은 명령으로 해석됩니다 : U스택에 모든 요소를 반전 (지금 그것의 !, N, U, 위로부터)하고, 'N그리고 '!더 밀어 문자로, 스택으로 끝납니다 [U, N, !, N, !].

참고 :이 프로그램은 Aceto의 새로운 편집기를 사용하여 (부분적으로) 작성된 최초의 Aceto 프로그램입니다 .


6

C, 78 70 68 바이트

크리스토프 감사합니다!

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

온라인으로 사용해보십시오

산출:

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;}xor를 사용하여 뒤집 c으면 2 바이트가 절약됩니다.
Christoph

6

펄 5 , 31 바이트

@Dom Hastings 덕분에 -2 바이트 .

30 바이트의 코드 + -p플래그

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

온라인으로 사용해보십시오!

y/UN!//의 발생 수를 계산 Un, Not하고 !. 결과는 많은 !모듈로 2와 그 뒤에옵니다 isChecked().


정규 표현식을 기반으로 38 바이트에 대한 또 다른 시도 (Dom Hastings는 1 바이트를 절약했습니다) :

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

온라인으로 사용해보십시오!


두 있기 때문에 귀하의 정규식 버전이 작동하지 않습니다 c들에 Unchecked.
Neil

1
@Neil 정규 표현식은 첫 번째 것을 대체합니다 ( /g플래그를 사용하지 않기 때문에 ). 테스트 사례가 나에게 잘 어울립니다 (TryItOnline 링크 참조). 그래서 난 당신이 무슨 뜻인지 모르겠어요 ...
Dada

죄송합니다, 정규 표현식 버전이 작동하지 않는 올바른 이유는에 cin Unchecked이 있지만 in을 ( Checked를) 대체 할 때로 끝나기 때문입니다 CheCked.
Neil

1
이봐, 당신이 잘하고 있기를 바랍니다! 나는 한 동안 여기에 없었다, 그러나 나는 이러한와 약간의 놀이를 했어 두 번째의 첫 번째에 -2 -1
돔 헤이스팅스

1
@DomHastings 이봐! 정말 고마워요! 다시 만나서
Dada





3

apt , 24 23 바이트

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

설명

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

온라인으로 사용해보십시오!


1
잠깐만 ... 어떻게 ... 왜 ... o대소 문자를 구분하지 않습니까? 나는 몰랐습니다 ...
ETHproductions

나도 몰랐지만 "! NU"로 테스트했을 때 알았습니다. "체크되지 않은"의 소문자 "n"도 남아 있으므로 "U"를 삭제할 수 있습니다.)
Luke

3

PHP (5.5-5.6), 52 50 49 바이트

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

여기에서 시도 하십시오 .

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

정규 표현식이 없으면 좀 더 compex를 얻 습니다 .

-4 Bytes by @Titus. Ty :)

1
error_reporting기본값은 E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED입니다.
Titus

1
@Titus는 정규식 도전에서 JS를 꺾습니다.
Christoph

$b^=$a아주 좋은 발견! 같은 크기의 PHP 태그 없이도 그렇게 할 수 있습니다.
Titus

1
선행 공백이 허용되는 경우 61 바이트 :for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Titus

@Titus 나는 이것이이 답변 에서 영감을 받았다는 것을 인정해야한다 .
Christoph

3

젤리 ,  16  15 바이트

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

문자열을 명령 행 인수로 사용하고 결과를 인쇄하는 전체 프로그램

온라인으로 사용해보십시오!

OSḂ⁾!iṫ-7³ṫṭ⁾sC또는 OSḂ⁾!iṫ-7³ṫ⁾sC;둘 다 15 일을 할 것입니다.

어떻게?

내 파이썬 답변 과 동일한 아이디어를 사용 하지만 젤리 의 다른 구성 !isC또는 isC일부 암시 적 인쇄를 사용하여 바이트를 절약합니다 ...

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 바이트 9 (연결 및 동일한 기본 아이디어와 페어링 사용) :

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

아, 젠장, 나는 mod 2 트릭으로 무언가에 있다고 생각했다. 그리고 나는 이것을 발견했다 : PI는 이것을 18 바이트 동안 가지고 있었고, 아마 도움이 될 수있다 :OS1&”!x;“isC”;ṫ-7$
Conor O'Brien

2

펄 6 ,  35  31 바이트

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

시도 해봐

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

시도해보십시오
(잘라 질 수있는 가변 입력 문자열이 필요합니다)

넓히는:

{
  #(
    '!'
  x               # string repeat

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

  ~                # string concat

    'isChecked()'
}

2

Sed, 36 바이트

다른 모든 직접 대체 답변과 동일한 아이디어입니다.

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

2

sed, 37 38 바이트

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

-r스위치의 경우 37 + 1 :

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

1
그것은 마지막 s/c/C/으로 Perl 5 답변에 문제를 일으켰습니다 ...
Neil

네, s/c/C/"Un"이없는 경우 두 번째 "c"를 잡는 것 같습니다
Kevin

1
또한을 삭제 하고 루프 내부를 g이동하여 바이트를 절약 할 수 있습니다 s/!!//.
케빈

2

매스 매 티카, 82 61 60 바이트

작은 조정, 하나의 추가 연산자가 추가되었습니다.

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

이전 :

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

모든 o, n 및!를 세고 mod 2를 세고 많은 수를 넣으십시오! 앞에.

구 버전:

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

2

엑셀, 90 바이트

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

2

Windows 배치, 120 바이트

이전 22685725324524539221182176169123 바이트

@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%

프로그램은 모든을 !로 바꿉니다 N#. 이제 모든 부정 기호! (지금 N#), NotUn포함하기 N때문에 프로그램은 모양의 수를 세고 N행간 !이 필요한지 여부를 판별 할 수 있습니다.

프로그램이을 계산할 때마다 N카운터가 5 씩 더해집니다. 5를 더하는 이유는 5를 더할 때 각 교대하는 값이 0 또는 5로 끝나기 때문입니다. !필요한 경우 추가했습니다.

또한 xnor의 마지막 8 자 트릭이 사용됩니다.


윈도우 배치에서의 프로그래밍은 불가능할 것이라고 생각할 것이다.
NieDzejkob

물론 ... 배치 스크립팅은 터무니없는 ....
stevefestl

1

젤리 , 29 28 25 21 바이트

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

온라인으로 사용해보십시오!

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

Jonathan Allan 덕분에 -4 바이트!
Jonathan Allan 덕분에 -4 바이트! (압축 된 문자열을 사용하여)


린 만든 인터페이스 저장 여기 모듈 (jellyCompress.py 말)로를, 그 다음이 형성되었을 것이다 jellyCompress.Compress().string("is").dictionary("Checked").string("()").go(). (Windows cmd 설치에서 실행 중이고 글꼴 DejaVu Sans Mono로 전환 chcp 65001하고 문자를 표시하기 위해 Python을 시작하기 전에 명령으로 코드 페이지를 변경하는 경우 )
Jonathan Allan

@JonathanAllan 오 그래. 감사!
HyperNeutrino

1

PHP, 55 바이트

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

온라인으로 사용해보십시오!

PHP, 58 바이트

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

대신에 "#[!NU]#"당신은 사용할 수 있습니다"#[!N]#i"

온라인으로 사용해보십시오!

PHP, 68 바이트

정규식없는 버전

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

온라인으로 사용해보십시오!


3
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()-2 바이트
Titus

내가 생각 해낸 전에 정확히 같은 대답했다 count(split())D @Titus 좋은 아이디어를!
Christoph

1
" !"[$d&1]선행 공백이 괜찮 으면 다른 바이트를 저장합니다. 더 이상 $d^=!trim($c,"UN!")필요하지 않기 때문에 3 바이트를 절약 &1합니다.
Titus

1
@Titus 예를 들어서 더 많은 지식을 가지십시오. 감사합니다. "!"[!$d]대신 공백 문제가 발생 했습니다.
Jörg Hülsermann

1
@Christoph 당신이 맞아요. 죄송합니다.
Jörg Hülsermann


1

파스칼 (FPC) 119 바이트

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.

온라인으로 사용해보십시오!

거의 모든 답변이 수행하는 방법을 사용하여 입력의 문자 코드 포인트를 합한 다음 합계의 패리티를 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.