Czy pole wyboru nie jest niezaznaczone?

65

Dokonując przeglądu kodu, natknąłem się na następujący kod, który testuje status pola wyboru:

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

Musiałem burzy mózgów przez 30 minut, aby dowiedzieć się, jakiego rzeczywistego stanu pola wyboru oczekuje kod. Napisz do mnie program, który może uprościć te głupie wyrażenia!


Program powinien przyjmować jako dane wejściowe ciąg reprezentujący wyrażenie w celu uproszczenia (na przykład !isNotUnchecked():). Program powinien wypisać logicznie równoważne uproszczonego wyrażenia, albo isChecked()albo !isChecked().

Nazwa metody w wyrażeniu wejściowym zawsze zaczyna się od is, zawiera 0..n Not, a kończy się na Checked()lub Unchecked(). Metoda może być poprzedzona dowolną liczbą !.

Przykłady

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()
Arnaud
źródło
Czy w tekście zawsze rozróżniana jest wielkość liter? Czy wkład byłby notunischecked?
stevefestl
1
@ SteveFest Nie, możesz założyć, że dane wejściowe są zawsze w formacie, który opisałem powyżej. Nie musisz isnotuncheckedna przykład obsługiwać .
Arnaud
6
Przy takiej nazwie funkcji dałbym jej szanse 10 na 1, że nawet nie przetestował sprawdzonego warunku zgodnie z jego nazwą.
Caleb
2
Innymi słowy, wiesz, co to jest niezaznaczone pole, wiesz, co to jest niezaznaczone pole (jest zaznaczone, jeśli i tylko jeśli „zaznaczone” i „niezaznaczone” są jedynymi dwoma możliwymi stanami, w przeciwnym razie może to być cokolwiek pole wyboru: int, podpis ...) i dla tego konkretnego pola wyboru nie jest (nie jest „zaznaczone”, niezależnie od tego, czy jest zaznaczone, czy cokolwiek innego). Jeśli tak, to masz pewność, że pole wyboru nie jest „zaznaczone” przez nic. Jeśli false, to wiesz, że pole wyboru nie jest zaznaczone, ale niekoniecznie oznacza, że ​​jest zaznaczone, chyba że istnieją tylko dwa możliwe stany (wtedy jest zaznaczone).
J Doe
1
@J Doe dzięki za wyjaśnienia!
Arnaud

Odpowiedzi:

31

Python , 51 bajtów

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

Wypróbuj online!

xnor
źródło
Jesteś geniuszem! Nigdy bym nie pomyślałs[-8:]
Pan Xcoder
Z pewnością 'isC'+s[-8:]bajt jest dłuższy niż 'isChecked'?
Neil
9
ale o 1 bajt krótszy niż „isChecked ()”
Andrew Smith,
Czy ktoś może wyjaśnić, co s[-8:]jest / robi?
ESR
1
@EdmundReed Pobiera 8 ostatnich znaków wejściowych, które są zawsze hecked().
xnor
24

Siatkówka , 23 bajty

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

Wypróbuj online!

Wyjaśnienie

Unc
!C

Zamień się Uncheckedw !Checked.

Not
!

Zamień wszystkie Nots na !. Teraz mamy coś takiego !!!is!!!!Checked().

O`is|!

Posortuj wszystkie dopasowania jednego islub drugiego !. Ponieważ ! < isprzesuwa to wszystko na !początek łańcucha, więc powyższy przykład stałby się !!!!!!!isChecked().

!!

Usuń pary, !aby anulować powtarzające się negowanie.

Martin Ender
źródło
13

Python , 43 bajty

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

Nienazwana funkcja pobierająca ciąg znaków si zwracająca ciąg znaków.

Wypróbuj online!

Nie ma potrzeby, aby sprawdzić istnienie znaków kiedy !, Noti Unwszyscy mają dokładnie jeden dziwny porządkowej (a ci Cto zarówno nieparzyste), więc po prostu zsumować porządkowych i wykorzystać wartość modulo 2, aby zdecydować, jeśli chcemy !, czy nie.

Poza tym formularz jest taki sam jak odpowiedź xnora , ponieważ nie znalazłem nic lepszego. Jest to również 43:

lambda s:'!isC'[~sum(map(ord,s))%2:]+s[-8:]
Jonathan Allan
źródło
10

JavaScript (ES6), 51 50 bajtów

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

Działa poprzez szuka !, Ni nznaki, które odwracają sprawdzenie stanu. splitdomyślnie zwraca nieparzystą długość tablicy, więc dodajemy, !kiedy splitdługość jest parzysta. Edycja: Zapisano 1 bajt dzięki @ETHproductions. Alternatywna wersja, również na 50 bajtów:

s=>`${s.split(/!|n/i).length%2?``:`!`}isChecked()`
Neil
źródło
Huh, teraz wracam i patrzę na inne odpowiedzi, oni wszyscy to robią.
Neil
Powinieneś być w stanie usunąć globalną flagę z RegEx, aby zapisać bajt.
Kudłaty
@Shaggy Właściwie moja długość jest prawidłowa, po prostu nie udało mi się usunąć gnajnowszej edycji.
Neil
1
Myślę, że możesz uratować bajt za pomocą/!|N/i
ETHproductions
@ETHproductions Myślę, że miałeś na myśli /!|N/bez imodyfikatora
SplittyDev
7

Java 7, 100 77 bajtów

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

Wyjaśnienie:

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

Kod testowy:

Wypróbuj tutaj.

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

Wynik:

isChecked()
!isChecked()
!isChecked()
isChecked()
isChecked()
Kevin Cruijssen
źródło
7

Aceto , 49 bajtów

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

yadda yadda Krzywa Hilberta.

Przede wszystkim pchamy trzy ważne postacie na stosie:

!'
'N'U

Następnie ustalamy znak połowu i zaczynamy od przeczytania jednego znaku. Stosujemy dgo i negujemy, a jeśli wynik tego jest prawdziwy (więc jeśli łańcuch był pusty; więc dane wejściowe zostały zakończone), przeskakujemy do końca:

;`
d!
,@

Z pozostałą kopią znaku wejściowego sprawdzamy, czy jest on zawarty w pozostałej części stosu (tj. Czy jest to jeden z!, N, U). Jeśli tak nie jest, zgłaszamy błąd, rzucając nas z powrotem do kreski, w której czytamy inną postać:

&c
`!

W przeciwnym razie ładujemy to, co jest w szybkim magazynie (zasadniczo rejestr, który początkowo jest pustym ciągiem; fałsz), negujemy go i odsyłamy z powrotem do szybkiego przechowywania, a następnie zgłaszamy błąd (wracając do czytania znaków):

&M
L!

Gdy wejście zatrzyma się, jesteśmy wysyłani do końca. Tam odwracamy kierunek, wciskamy wykrzyknik, ładujemy szybkie przechowywanie i negujemy je. Jeśli to prawda (tzn. Mieliśmy dziwną liczbę negacji), drukujemy wykrzyknik, który wypchnęliśmy:

p !'
`!Lu

Na koniec wciskamy sznurek na dwie części i drukujemy je (ze względu na oszczędność miejsca):

"pp"
)(de
  Che"
  sick
   "

Następnie program nadal powraca do pierwotnego początku, ale ponieważ żadne z poleceń niczego nie generuje ani nie zachowuje się w pętli, nie ma to znaczenia. W rzeczywistości pierwsze polecenie non-nopping, które osiągamy, powoduje wyjątek, pomijając większość kodu, ponieważ przeskakujemy do znaku catch, co oznacza, że ​​wszystkie Aceto widzi w tej części:

&



!' @
'N'U

Od Uteraz nie jest poprzedzone znakiem apostrofu, a zatem nie jest postrzegana jako postać dosłownym, to zostanie zinterpretowane jako polecenie: Uodwraca wszystkie elementy na stosie (obecnie jest to !, N, U, od góry), a 'Ni '!wcisnąć więcej znaków, co oznacza, że ​​kończymy stosem [U, N, !, N, !].

Uwaga dodatkowa: Jest to pierwszy napisany (częściowo) program Aceto przy pomocy nowego edytora Aceto .

L3viathan
źródło
6

C, 78 70 68 bajtów

Dziękuję Christoph!

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

Wypróbuj online

Wynik:

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()
Johan du Toit
źródło
1
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}użycie xor do odwrócenia coszczędza 2 bajty.
Christoph
6

Perl 5 , 31 bajtów

-2 bajty dzięki @Dom Hastings .

30 bajtów kodu + -pflaga.

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

Wypróbuj online!

y/UN!//zlicza liczbę wystąpień Un, Noti !. Rezultatem jest tyle !modulo 2, po których następuje isChecked().


Kolejna próba, oparta na wyrażeniu regularnym, dla 38 bajtów (Dom Hastings zapisał 1 bajt na tym):

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

Wypróbuj online!

Dada
źródło
Twoja wersja wyrażenia regularnego nie działa, ponieważ są dwa cs Unchecked.
Neil
1
@ Nee regex zastępuje tylko pierwszy (ponieważ nie używam /gflagi). Przypadki testowe wyglądają dla mnie dobrze (patrz link TryItOnline). Więc tak naprawdę nie rozumiem, co masz na myśli ...
Dada
Niestety, prawidłowa powodem, że twoja wersja regex nie działa jest to, że choć nie jest cw Uncheckedjest też jedna Checked, więc kiedy subsitute go skończyć się CheCked.
Neil
1
Hej, mam nadzieję, że wszystko w porządku! Nie byłem tu od dłuższego czasu, ale miałem trochę zabawy z nimi dla -2 na pierwszym i -1 na drugim
Dom Hastings
1
@DomHastings Hej! Wspaniale, wielkie dzięki! Miło cię widzieć z powrotem :-)
Dada
6

Scala , 39 30 bajtów

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

Wypróbuj online!

Niestety nie udało mi się wydedukować typu s.

Edycja: przeniesiono deklarację typu do nagłówka (myślę, że jest to dozwolone, jeśli nie, odłożę ją z powrotem).

musicman523
źródło
5

Rubinowy , 40 bajtów

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

Wypróbuj online!

Alex
źródło
Witamy w PPCG! Niezła odpowiedź. :)
Martin Ender
@MartinEnder dzięki!
Alex
3

05AB1E , 16 bajtów

ÇOÉ'!×…isCyR8£RJ

Wypróbuj online!

Wykorzystuje sztuczkę polegającą na sumowaniu porządków z odpowiedzi pytona Jonathana Allana .

Wyjaśnienie

 Ç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
źródło
3

Japt , 24 23 bajty

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

Wyjaśnienie

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

Wypróbuj online!

Łukasz
źródło
1
Poczekaj ... Jak ... Dlaczego ... orozróżnia się małe i wielkie litery? Nie wiedziałem, że ...
ETHprodukcje
Ja też tego nie wiedziałem, ale dowiedziałem się, kiedy testowałem z „! NU”. Małe litery „n” w „Niezaznaczone” również pozostały, więc mogłem upuścić „U”
Łukasz
3

PHP (5,5 - 5,6), 52 50 49 bajtów

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

Wypróbuj tutaj .

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

Bez wyrażenia regularnego robi się nieco więcej compex :) Wypróbuj tutaj .

-4 Bytes by @Titus. Ty :)
Christoph
źródło
1
error_reportingwartość domyślna to E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED.
Tytus
1
@Titus pokonuje JS w wyzwaniu regularnym yay!
Christoph
$b^=$aBardzo fajne znalezisko! Możesz to również zrobić bez tagów PHP o tym samym rozmiarze.
Tytus
1
61 bajtów, jeśli dozwolone są wiodące białe znaki:for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Tytus
@Titus Muszę przyznać, że inspiracją była ta odpowiedź .
Christoph
3

Galaretka ,  16  15 bajtów

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

Pełny program, który przyjmuje ciąg znaków jako argument wiersza poleceń i wypisuje wynik

Wypróbuj online!

OSḂ⁾!iṫ-7³ṫṭ⁾sClub OSḂ⁾!iṫ-7³ṫ⁾sC;oba będą również działać na 15.

W jaki sposób?

Używa tego samego pomysłu, co moja odpowiedź w języku Python , ale oszczędza bajty przy użyciu innej konstrukcji !isClub isCniektórych ukrytych wydruków w Galaretce ...

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

poprzednie @ 16 bajtów 9 (przy użyciu konkatenacji i parowania z tym samym pomysłem):

OSḂ⁾!iṫ;⁾sC,ṫ€-7
Jonathan Allan
źródło
Ach, cholera, myślałem, że jestem przy czymś z trikiem mod 2. Potem znalazłem to: PI miał to na 18 bajtów, może to może pomóc:OS1&”!x;“isC”;ṫ-7$
Conor O'Brien
2

Perl 6 ,  35  31 bajtów

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

Spróbuj

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

Spróbuj
(wymaga zmiennego ciągu wejściowego, który zostanie okaleczony)

Rozszerzony:

{
  #(
    '!'
  x               # string repeat

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

  ~                # string concat

    'isChecked()'
}
Brad Gilbert b2gills
źródło
2

Sed, 36 bajtów

Ten sam pomysł, jak wszystkie inne bezpośrednie odpowiedzi na podstawienia.

:
s/Unc/NotC/
s/isNot/!is/
s/!!//
t
Kevin
źródło
2

sed, 37 38 bajtów

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

37 + 1 dla -rprzełącznika:

sed -r ':;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/'
F. Hauri
źródło
1
To ostatnie s/c/C/spowodowało problemy z odpowiedzią na Perla 5 ...
Neil
Tak, wygląda na s/c/C/to, że łapie drugie „c” w przypadkach bez „Un”
Kevin
1
Możesz także zapisać bajt, upuszczając gi przesuwając s/!!//wewnątrz pętli.
Kevin
2

Mathematica, 82 61 60 bajtów

Mała poprawka, dodano jeszcze jednego operatora poprawki:

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

Poprzednio:

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

Policz wszystkie o, n i !, a następnie mod 2 i umieść tyle! z przodu.

Stara wersja:

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

Excel, 90 bajtów

=IF(ISODD(SEARCH("C",SUBSTITUTE(SUBSTITUTE(A1,"Un","!"),"Not","!"))),"","!")&"isChecked()"
Wernisch
źródło
2

Pakiet Windows, 120 bajtów

Wcześniej 268 257 253 245 239 221 182 176 169 123 bajtów

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

Programy zamieniają wszystko !na N#. Ponieważ teraz wszystkie znaki negacji,! (Teraz jest N#), Noti Unzawiera N, program może zliczyć liczbę wyglądu Ni określa, czy !wymagane jest prowadzenie .

Za każdym razem, gdy program zlicza N, licznik jest dodawany przez 5. Powodem dodania 5 jest to, że każda naprzemienna wartość przy dodawaniu 5 kończy się na 0 lub 5. Można to wykorzystać do ustalenia, czy wartość jest nieparzysta, czy parzysta, i na początku !dodaliśmy w razie potrzeby.

Ponadto wykorzystywana jest sztuczka xnor z ostatnich ośmiu znaków.

stevefestl
źródło
Można by pomyśleć, że programowanie w
pakiecie
Oczywiście ......
Skrypty
1

Galaretka , 29 28 25 21 bajtów

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

Wypróbuj 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 bajty dzięki Jonathanowi Allanowi!
-4 bajty dzięki Jonathanowi Allanowi! (przy użyciu skompresowanych ciągów)

HyperNeutrino
źródło
Zapisz interfejs Lynn wykonany tutaj jako moduł (powiedzmy jellyCompress.py), to by go utworzono jellyCompress.Compress().string("is").dictionary("Checked").string("()").go(). (Jeśli korzystasz z instalacji cmd systemu Windows i przełącz się na czcionkę DejaVu Sans Mono i zmień stronę kodową za pomocą polecenia chcp 65001przed uruchomieniem Pythona, aby znaki były wyświetlane)
Jonathan Allan
@JonathanAllan Och dobrze. Dzięki!
HyperNeutrino
1

PHP, 55 bajtów

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

Wypróbuj online!

PHP, 58 bajtów

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

zamiast tego "#[!NU]#"możesz użyć"#[!N]#i"

Wypróbuj online!

PHP, 68 bajtów

Wersja bez Regex

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

Wypróbuj online!

Jörg Hülsermann
źródło
3
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()-2 bajty
Tytus
Miałem dokładnie tę samą odpowiedź, zanim count(split())wpadłem na pomysł: D @Titus fajny pomysł!
Christoph
1
" !"[$d&1]zapisuje kolejny bajt, jeśli wiodące białe znaki są prawidłowe. $d^=!trim($c,"UN!")oszczędza 3 bajty (ponieważ &1już nie potrzebujesz ).
Tytus
1
@Titus Tak, jeszcze jeden przykład, że masz więcej wiedzy niż ja. Dziękuję i za "!"[!$d]
ostatni
1
@Christoph masz rację, zapomniałem przykro z tego powodu
Jörg Hülsermann
1

Japt , 19 bajtów

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

Wypróbuj online!

Rozpakowane i jak to działa

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

Korzystanie ze sztuczki suma znaków z rozwiązania Python Jonathana Allana .

Bubbler
źródło
1

Pascal (FPC) , 119 bajtów

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.

Wypróbuj online!

Używając metody, którą robi prawie każda odpowiedź, sumując punkty kodowe znaków na wejściu, a następnie sprawdzając parzystość sumy.

AlexRacer
źródło